--- /dev/null
+mDoc-Dokumentenerstellung
+=========================
+
+mDoc wandelt ein Docbook-XML in ein beliebiges anderes Format anhand eines gleichfalls in
+XML vorliegenden Templates.
+
+Dabei gelten folgende Regeln:
+
+- Das Template hat den Namen <Zielformat>.tpl
+- Der oberste Knoten des Templates hat folgendes Format:
+ <mdoc format="<Zielformat>" extension="<Dateiextension des Ziels>">
+- Soll ein Knoten des Docbooks zu einer Ausgabe im Zielformat führen, muss das XML-Tag im
+ Template gefunden werden. Das Template hat zwei Sektionen:
+ x <global>:
+ Hier finden sich Definitionen, die in jeder XML-Tiefe auftreten dürfen
+ x <hierarchical>
+ Hier finden sich Definitionen in derselben hierarchischen Ordnung wie im Docbook
+- XML-Tags im Template können das "position"-Attribut haben:
+ x position="first" positioniert den tpl-Wert vor die weitere Verarbeitung
+ x Ohne Attribut wird mit der Ausgabe des Docbookinhalts fortgefahren.
+ Bei der Weiterverarbeitung wird zuerst der (allfällige) Wert des Docbook-Tags ausgegeben,
+ dann weitere Untertags verarbeitet.
+ x position="last" positioiniert den Wert nach die Verarbeitung
+- <verbatim target="format"> kann jeder Stelle verwendet werden. Falls "format" das aktuelle
+ Ausgabeformat ist, wird der Inhalt wörtlich übernommen.
+- Vorne im Template können Funktionen definiert werden.
+ x Input: Sie können direkt auf die Variablen value (der Wert des tags) und source (das XML-
+ Dokument) zugreifen.
+ x Output: Der Wert der Variablen out wird in die Zieldatei kopiert
+
# check runtime parameters
if len(args) < 2:
- raise RuntimeError("xets needs 2 arguments.")
+ raise RuntimeError("mdoc needs 2 arguments.")
file = args[0]
format = args[1]
if tpllayer["value"]:
print (file=outfile)
'''
-def process_file_layer(source, outfile, globals, hierarc):
+def process_file_layer(source, outfile, global_defs, hierarc, functions, target):
(ctl,elem, value, attrs) = source.extractElement(XMLE.EC_BEG)
nexthiera = {}
if elem in hierarc:
items = hierarc[elem]
- elif elem in globals:
- items = globals[elem]
+ elif elem in global_defs:
+ items = global_defs[elem]
+ elif elem == "verbatim" and attrs["target"] == target:
+ print (value, end="", file=outfile)
+ #elif elem == "exec":
+ # r = eval(functions[attrs["function"]])
+ # print (r, end="", file=outfile)
else:
print ("Warning: No mapping for item:" +elem)
if items:
# proceed working
for item in items:
if not "position" in item["attrs"]:
+ if "exec" in item["attrs"]:
+ # call function
+ l = {"out" : None, "source":source}
+ exec(functions[item["attrs"]["exec"]], globals(), l)
+ #exec('out = "Das kommt von foo()"', globals(), l)
+ print (l["out"], file=outfile)
+ # check "pre"
+ if "pre" in item["attrs"]:
+ print (item["attrs"]["pre"], end="", file=outfile)
+ # proceed working
nexthiera = item["items"]
if value:
print (value, end="", file=outfile)
- process_file_layer(source, outfile, globals, nexthiera)
+ process_file_layer(source, outfile, global_defs, nexthiera, functions, target)
+ # check "post"
+ if "post" in item["attrs"]:
+ print (item["attrs"]["post"], end="", file=outfile)
# search for "last"
for item in items:
if "position" in item["attrs"]:
if item["attrs"]["position"] == "last":
print (item["value"], end="", file=outfile)
+
(ctl,elem, value, attrs) = source.extractElement(ctl)
def convert (file, format):
# read whole template
tple = XmlExtractor()
tpl = tple.readFile("tpl/"+format+".tpl")
- globals = tpl["mdoc"][0]["items"]["global"][0]["items"]
+ functions_in_file = tpl["mdoc"][0]["items"]["functions"][0]["items"]["function"]
+ # compile functions
+ functions = {}
+ for f in functions_in_file:
+ name = f["attrs"]["name"]
+ functions[name] = compile(f["value"], '<string>', "exec")
+
+ global_defs = tpl["mdoc"][0]["items"]["global"][0]["items"]
hierarc = tpl["mdoc"][0]["items"]["hierarchical"][0]["items"]
# open output file
outfile = open(outname, "w")
#print ("hallo", file=outfile)
- process_file_layer(source, outfile, globals, hierarc)
+ process_file_layer(source, outfile, global_defs, hierarc, functions, format)
<?xml version="1.0" encoding="UTF-8"?>
<mdoc format="latex" extension="tex">
-<global/>
+<functions>
+<function name="informaltable">
+<![CDATA[
+# eval colums
+(ctl,elem, value, attrs) = source.extractElement(XMLE.EC_BEG) # reads tgroup
+if elem != "tgroup":
+ raise RuntimeError("unknown elem, <tgroup> expected in <informaltable>: "+elem)
+cols = int(attrs["cols"])
+colsep = ""
+if attrs["colsep"] == "1":
+ colsep = "|"
+rowsep = False
+if attrs["rowsep"] == "1":
+ rowsep = True
+align = "r"
+if attrs["align"] == "left":
+ align = "l"
+out = r"\begin{tabular}{" + (cols-1)*(align+colsep) + align + "}\n"
+(ctl,elem, value, attrs) = source.extractElement(XMLE.EC_BEG) # searches tbody
+while ctl != XMLE.EC_END:
+ if elem == "tbody": # tbody found
+ (ctl1,elem, value, attrs) = source.extractElement(XMLE.EC_BEG) # reads row
+ while ctl1 != XMLE.EC_END:
+ if elem != "row":
+ raise RuntimeError("Only <row> expected in <tbody>: "+elem)
+ (ctl2,elem, value, attrs) = source.extractElement(XMLE.EC_BEG) # reads entry
+ entry_sep = ""
+ while ctl2 != XMLE.EC_END:
+ if elem != "entry":
+ raise RuntimeError("Only <entry> expected in <row>: "+elem)
+ out += entry_sep + value
+ entry_sep = " & "
+ (ctl2,elem, value, attrs) = source.extractElement(ctl2) # reads entry
+ out += r" \\" + "\n"
+ (ctl1,elem, value, attrs) = source.extractElement(ctl1) # reads row
+ out += r"\end{tabular}"
+ (ctl,elem, value, attrs) = source.extractElement(ctl) # searches tbody
+]]></function>
+</functions>
+<global>
+<informaltable exec="informaltable"/>
+</global>
<hierarchical>
<article>
<test>testdata</test>
\renewcommand{\familydefault}{\sfdefault}
\author{Michael J.M. Wagner}
-\date{\vspace{-6ex}}
\CenterWallPaper{1}{wagner_tech_briefbogen_blau_fs1.pdf}
]]>
</articleinfo>
<articleinfo>
- <title position="first"><![CDATA[\title{]]></title>
- <title/>
- <title position="last"><![CDATA[}]]></title>
+ <title pre="\title{" post="}"/>
+ <pubdate pre="\date{" post="}"/>
</articleinfo>
<articleinfo position="last">
<![CDATA[
\maketitle
]]>
</articleinfo>
+<section pre="\section{">
+ <title post="}"/>
+</section>
+</article>
+<article position="last">
+<![CDATA[
+\end{document}
+
+]]>
</article>
+
</hierarchical>
</mdoc>