pydev-ts
authorMichael Wagner <michael@wagnertech.de>
Wed, 1 Apr 2020 21:37:47 +0000 (23:37 +0200)
committerMichael Wagner <michael@wagnertech.de>
Wed, 1 Apr 2020 21:37:47 +0000 (23:37 +0200)
doc/README [new file with mode: 0644]
python/mDoc/mdoc.py
python/mDoc/mdoc/worker.py
python/mDoc/tpl/latex.tpl

diff --git a/doc/README b/doc/README
new file mode 100644 (file)
index 0000000..fb03237
--- /dev/null
@@ -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 <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
index 5c4fd5f..bf66a57 100755 (executable)
@@ -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]
index 120bf5e..a3d7c36 100644 (file)
@@ -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"], '<string>', "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)
     
index 266d650..ee432c3 100644 (file)
@@ -1,6 +1,47 @@
 <?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>
@@ -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 @@
 ]]>
 </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>