|
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 |
|