From 2f4befafaedd725f179bfdacd10b6d84a44baca4 Mon Sep 17 00:00:00 2001 From: Michael Wagner Date: Wed, 1 Apr 2020 23:37:47 +0200 Subject: [PATCH] pydev-ts --- doc/README | 30 +++++++++++++++++++ python/mDoc/mdoc.py | 2 +- python/mDoc/mdoc/worker.py | 38 ++++++++++++++++++++---- python/mDoc/tpl/latex.tpl | 59 ++++++++++++++++++++++++++++++++++---- 4 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 doc/README diff --git a/doc/README b/doc/README new file mode 100644 index 0000000..fb03237 --- /dev/null +++ b/doc/README @@ -0,0 +1,30 @@ +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 .tpl +- Der oberste Knoten des Templates hat folgendes Format: + +- 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 : + Hier finden sich Definitionen, die in jeder XML-Tiefe auftreten dürfen + x + 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 +- 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 + diff --git a/python/mDoc/mdoc.py b/python/mDoc/mdoc.py index 5c4fd5f..bf66a57 100755 --- a/python/mDoc/mdoc.py +++ b/python/mDoc/mdoc.py @@ -14,7 +14,7 @@ def command_dispatch(args): # 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] diff --git a/python/mDoc/mdoc/worker.py b/python/mDoc/mdoc/worker.py index 120bf5e..a3d7c36 100644 --- a/python/mDoc/mdoc/worker.py +++ b/python/mDoc/mdoc/worker.py @@ -19,7 +19,7 @@ def outlast(outfile, tpllayer, attrs, value): 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) @@ -28,8 +28,13 @@ def process_file_layer(source, outfile, globals, hierarc): 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: @@ -41,15 +46,29 @@ def process_file_layer(source, outfile, globals, hierarc): # 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): @@ -60,7 +79,14 @@ 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"], '', "exec") + + global_defs = tpl["mdoc"][0]["items"]["global"][0]["items"] hierarc = tpl["mdoc"][0]["items"]["hierarchical"][0]["items"] # open output file @@ -69,5 +95,5 @@ def convert (file, format): 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) diff --git a/python/mDoc/tpl/latex.tpl b/python/mDoc/tpl/latex.tpl index 266d650..ee432c3 100644 --- a/python/mDoc/tpl/latex.tpl +++ b/python/mDoc/tpl/latex.tpl @@ -1,6 +1,47 @@ - + + + expected in : "+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 expected in : "+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 expected in : "+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 +]]> + + + +
testdata @@ -17,7 +58,6 @@ \renewcommand{\familydefault}{\sfdefault} \author{Michael J.M. Wagner} -\date{\vspace{-6ex}} \CenterWallPaper{1}{wagner_tech_briefbogen_blau_fs1.pdf} @@ -25,9 +65,8 @@ ]]> - <![CDATA[\title{]]> - - <title position="last"><![CDATA[}]]> + + <pubdate pre="\date{" post="}"/> </articleinfo> <articleinfo position="last"> <![CDATA[ @@ -37,7 +76,17 @@ \maketitle ]]> </articleinfo> +<section pre="\section{"> + <title post="}"/> +</section> +</article> +<article position="last"> +<![CDATA[ +\end{document} + +]]> </article> + </hierarchical> </mdoc> -- 2.20.1