[elbe-devel] [PATCH 1/1] Better mako templates for xsdtoasciidoc
dion at linutronix.de
dion at linutronix.de
Mon Jul 15 15:47:28 CEST 2019
From: Olivier Dion <dion at linutronix.de>
All elements and attributes should be list in the generated
documentation for complex type.
The template used to only generate examples and descriptions for
complex types with a 'sequence' tag. Other complex types with the
'all' and 'simpleContent' tag were left with a "no sequence" example
and description.
Now every tag at top level get a documentation generated:
- element
- simpleType
- complexType
- group
Signed-off-by: Olivier Dion <dion at linutronix.de>
---
elbepack/xsdtoasciidoc.mako | 154 +++++++++++++++++++++++++-------------------
1 file changed, 88 insertions(+), 66 deletions(-)
diff --git a/elbepack/xsdtoasciidoc.mako b/elbepack/xsdtoasciidoc.mako
index 577063da..1d9054f9 100644
--- a/elbepack/xsdtoasciidoc.mako
+++ b/elbepack/xsdtoasciidoc.mako
@@ -2,7 +2,6 @@
## Copyright (c) 2013, 2017 Manuel Traut <manut at linutronix.de>
##
## SPDX-License-Identifier: GPL-3.0-or-later
-
<%
import string
ELEM = "{http://www.w3.org/2001/XMLSchema}element"
@@ -11,6 +10,7 @@ DOC = "{http://www.w3.org/2001/XMLSchema}annotation/{http://www.w3.org/2001/XML
ATTR = "{http://www.w3.org/2001/XMLSchema}attribute"
SEQ = "{http://www.w3.org/2001/XMLSchema}sequence"
SIMP = "{http://www.w3.org/2001/XMLSchema}simpleType"
+GRP = "{http://www.w3.org/2001/XMLSchema}group"
RSTR = "{http://www.w3.org/2001/XMLSchema}restriction"
MAXI = "{http://www.w3.org/2001/XMLSchema}maxInclusive"
MINI = "{http://www.w3.org/2001/XMLSchema}minInclusive"
@@ -53,59 +53,37 @@ def cardinality(e):
retval += "*mandatory"
return retval
-%>
-
-Elbe XML Schema reference
-=========================
-<%def name="element(n)">
+def element_example(n):
+ name = n.et.attrib["name"]
+ _type = n.et.attrib["type"]
+ return "<%s> %s </%s>" % (name, _type, name)
+
+def doc(e):
+ if e.has(".//%s" % DOC):
+ return docindent(e.text(".//%s" % DOC), 2)
+ return ""
+
+def element_doc(e):
+ name = e.et.attrib["name"]
+ _type = e.et.attrib["type"]
+ return "%s %s %s::\n%s" % (name,
+ genlink(_type),
+ cardinality(n),
+ doc(e))
+def attr_doc(a):
+ if "name" in a.et.attrib:
+ return "[attr] %s" % element_doc(a)
+ return ""
+%>\
+##
+<%def name="do_element(n)">
== ${n.et.attrib["name"]} type: '${n.et.attrib["type"]}' ==
${docindent(n.text(DOC))}
-</%def>
-
-
-<%def name="elementexample(n)">
- <${n.et.attrib["name"]}> ${n.et.attrib["type"]} </${n.et.attrib["name"]}> \
-</%def>
-
-<%def name="elementseq(n)">
- ${n.et.attrib["name"]} ${genlink(n.et.attrib["type"])} ${cardinality(n)}::
-${docindent(n.text(DOC), 2)}
-</%def>
-
-<%def name="complextype(n)">
-[[${n.et.attrib["name"]}]]
-== TYPE: ${n.et.attrib["name"]} ==
-
-${docindent(n.text(DOC))}
-
-=== Example ===
-% if n.has(SEQ):
-[xml]
-source~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-<${n.et.attrib["name"]}> \
-% for s in n.node(SEQ):
-% if s.tag == ELEM:
-${elementexample(s)} \
-% endif
-% endfor
-
-</${n.et.attrib["name"]}>
-source~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-=== Element description ===
-% for s in n.node(SEQ):
-% if s.tag == ELEM:
-${elementseq(s)}
-% endif
-% endfor
-% else:
- no sequence
-% endif
-</%def>
-
-<%def name="simpletype(n)">
+</%def>\
+##
+<%def name="do_simple(n)">
[[${n.et.attrib["name"]}]]
== SIMPLE TYPE: ${n.et.attrib["name"]} ==
@@ -125,28 +103,72 @@ ${docindent(n.text(DOC))}
%endfor
|=====================================
%endif
-</%def>
+</%def>\
+##
+<%def name="do_group(n)">
+[[${n.et.attrib["name"]}]]
+== GROUP : ${n.et.attrib["name"]} ==
+
+${docindent(n.text(DOC))}
+
+
+% for e in n.all(".//%s" % ELEM):
+${printnode(e)}
+% endfor
+</%def>\
+##
<%def name="printnode(n)">
% if n.tag == ELEM:
-${element(n)}
-% elif n.tag == CPLX:
-${complextype(n)}
+${do_element(n)}
% elif n.tag == SIMP:
-${simpletype(n)}
-% endif
-</%def>
-
-<%def name="printnodeseq(n)">
-% if n.tag == ELEM:
-${elementseq(n)}
+${do_simple(n)}
% elif n.tag == CPLX:
-${complextype(n)}
-% elif n.tag == SIMP:
-${simpletype(n)}
+${do_complex(n)}
+% elif n.tag == GRP:
+${do_group(n)}
% endif
-</%def>
+</%def>\
+##
+<%def name="do_complex(n)">
+[[${n.et.attrib["name"]}]]
+== TYPE: ${n.et.attrib["name"]} ==
+
+${docindent(n.text(DOC))}
+
+=== Example ===
+[xml]
+source~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+<${n.et.attrib["name"]}>\
+% for e in n.all(".//%s" % ELEM):
+ ${element_example(e)}
+% endfor
+
+% for ref in n.all(".//%s" % GRP):
+% for g in xml.all('./%s[@name="%s"]' % (GRP, ref.et.attrib["ref"].strip("rfs:"))):
+% for e in g.all(".//%s" % ELEM):
+ ${element_example(e)}
+% endfor
+% endfor
+% endfor
+</${n.et.attrib["name"]}>
+source~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+=== Elements description ===
+
+% for a in n.all(".//%s" % ATTR):
+${attr_doc(a)}
+
+% endfor
+% for e in n.all(".//%s" % ELEM):
+${element_doc(e)}
+
+% endfor
+</%def>\
+##
+Elbe XML Schema reference
+=========================
% for n in xml.all('./'):
-${printnode(n)}
+${printnode(n)}\
% endfor
--
2.11.0
More information about the elbe-devel
mailing list