Blame tools/dblatex_config.py

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