Blame tools/dblatex_config.py

Packit Service 76cb02
#
Packit Service 76cb02
# Simple converter from text configuration to XML configuration
Packit Service 76cb02
#
Packit Service 76cb02
import sys
Packit Service 76cb02
import os
Packit Service 76cb02
import xml.etree.ElementTree as ET
Packit Service 76cb02
import xml.dom.minidom
Packit Service 76cb02
Packit Service 76cb02
package_base = os.path.join(os.path.dirname(sys.argv[0]), "..")
Packit Service 76cb02
sys.path.append(os.path.realpath(os.path.join(package_base, "lib")))
Packit Service 76cb02
Packit Service 76cb02
from dbtexmf.core.txtparser import TextConfig
Packit Service 76cb02
Packit Service 76cb02
class XmlMapper:
Packit Service 76cb02
    """
Packit Service 76cb02
    Make a correspondence beetween text keywords to equivalent XML nodes
Packit Service 76cb02
    and how to convert the keyword data to XML content (fill_method)
Packit Service 76cb02
    """
Packit Service 76cb02
    def __init__(self, fill_method, *args):
Packit Service 76cb02
        self.tags = args
Packit Service 76cb02
        self.value = None
Packit Service 76cb02
        self.fill_method = fill_method
Packit Service 76cb02
Packit Service 76cb02
    def format(self, dir, value):
Packit Service 76cb02
        self.value = value
Packit Service 76cb02
        return [self]
Packit Service 76cb02
Packit Service 76cb02
Packit Service 76cb02
class TextXmlMapper(TextConfig):
Packit Service 76cb02
    """
Packit Service 76cb02
    Use the original class to parse the text config file the same way,
Packit Service 76cb02
    but give to this class the role to map the config data to XML equivalent
Packit Service 76cb02
    """
Packit Service 76cb02
    conf_mapping = {
Packit Service 76cb02
        'TexInputs' : XmlMapper("text", 'latex','texinputs'),
Packit Service 76cb02
        'TexPost'   : XmlMapper("mod_or_file", 'latex','texpost'),
Packit Service 76cb02
        'FigPath'   : XmlMapper("file", 'imagedata','figpath'),
Packit Service 76cb02
        'XslParam'  : XmlMapper("file", 'xslt','stylesheet'),
Packit Service 76cb02
        'TexStyle'  : XmlMapper("mod_or_file", 'latex','texstyle'),
Packit Service 76cb02
        'Options'   : XmlMapper("text", 'options')
Packit Service 76cb02
    }
Packit Service 76cb02
Packit Service 76cb02
class XmlConfig:
Packit Service 76cb02
    """
Packit Service 76cb02
    Build an XML configuration file from an XML mapping
Packit Service 76cb02
    """
Packit Service 76cb02
    xmlns = "http://dblatex.sourceforge.net/config"
Packit Service 76cb02
    def __init__(self, config_dir=""):
Packit Service 76cb02
        self.root = ET.Element("config")
Packit Service 76cb02
        self.root.set("xmlns", self.xmlns)
Packit Service 76cb02
        self.tree = ET.ElementTree(self.root)
Packit Service 76cb02
        ET.register_namespace("", self.xmlns)
Packit Service 76cb02
        self.config_dir = config_dir
Packit Service 76cb02
Packit Service 76cb02
    def add_element(self, xmldesc):
Packit Service 76cb02
        xmlnode = self.root
Packit Service 76cb02
        for tag in xmldesc.tags[:-1]:
Packit Service 76cb02
            element = xmlnode.find(tag)
Packit Service 76cb02
            if not(element is None):
Packit Service 76cb02
                xmlnode = element
Packit Service 76cb02
            else:
Packit Service 76cb02
                xmlnode = ET.SubElement(xmlnode, tag)
Packit Service 76cb02
Packit Service 76cb02
        last_node = ET.SubElement(xmlnode, xmldesc.tags[-1])
Packit Service 76cb02
        self.fill_node(last_node, xmldesc.value, xmldesc.fill_method)
Packit Service 76cb02
Packit Service 76cb02
    def write(self, stream):
Packit Service 76cb02
        data = ET.tostring(self.root)
Packit Service 76cb02
        doc = xml.dom.minidom.parseString(data)
Packit Service 76cb02
        stream.write(doc.toprettyxml(indent="  "))
Packit Service 76cb02
Packit Service 76cb02
    def fill_node(self, xmlnode, value, fill_method):
Packit Service 76cb02
        fill_calls = {
Packit Service 76cb02
            "file": self.fill_file,
Packit Service 76cb02
            "text": self.fill_text,
Packit Service 76cb02
            "mod_or_file": self.fill_mod_or_file
Packit Service 76cb02
        }
Packit Service 76cb02
        fill_function = fill_calls.get(fill_method, None)
Packit Service 76cb02
        if fill_function: fill_function(xmlnode, value)
Packit Service 76cb02
Packit Service 76cb02
    def fill_file(self, xmlnode, value):
Packit Service 76cb02
        xmlnode.set("fileref", value)
Packit Service 76cb02
Packit Service 76cb02
    def fill_mod(self, xmlnode, value):
Packit Service 76cb02
        xmlnode.set("use", value)
Packit Service 76cb02
Packit Service 76cb02
    def fill_text(self, xmlnode, value):
Packit Service 76cb02
        xmlnode.text = value
Packit Service 76cb02
        
Packit Service 76cb02
    def fill_mod_or_file(self, xmlnode, value):
Packit Service 76cb02
        if os.path.isabs(value) and os.path.isfile(value):
Packit Service 76cb02
            self.fill_file(xmlnode, value)
Packit Service 76cb02
        elif os.path.isfile(os.path.join(self.config_dir, value)):
Packit Service 76cb02
            self.fill_file(xmlnode, value)
Packit Service 76cb02
        else:
Packit Service 76cb02
            self.fill_mod(xmlnode, value)
Packit Service 76cb02
Packit Service 76cb02
Packit Service 76cb02
if __name__ == "__main__":
Packit Service 76cb02
    from optparse import OptionParser
Packit Service 76cb02
    parser = OptionParser(usage="%s <config_input.txt> <config_output.xml>" \
Packit Service 76cb02
                          % sys.argv[0])
Packit Service 76cb02
Packit Service 76cb02
    (options, args) = parser.parse_args()
Packit Service 76cb02
Packit Service 76cb02
    if len(args) != 2:
Packit Service 76cb02
        print >> sys.stderr, "Invalid argument count: expected 2"
Packit Service 76cb02
        parser.parse_args(["-h"])
Packit Service 76cb02
Packit Service 76cb02
    txt_file = args[0]
Packit Service 76cb02
    xml_file = args[1]
Packit Service 76cb02
Packit Service 76cb02
    txt_config = TextXmlMapper()
Packit Service 76cb02
    txt_config.fromfile(txt_file)
Packit Service 76cb02
Packit Service 76cb02
    xml_config = XmlConfig(os.path.dirname(txt_file))
Packit Service 76cb02
    for xmldesc in txt_config.options():
Packit Service 76cb02
        xml_config.add_element(xmldesc)
Packit Service 76cb02
Packit Service 76cb02
    f = open(xml_file, "w")
Packit Service 76cb02
    xml_config.write(f)
Packit Service 76cb02
    f.close()
Packit Service 76cb02