4 import docutils.writers.html4css1
5 from datetime import datetime
6 from jinja2 import Environment, Template
7 from spec_util import isAbstract, load_spec
12 def format_doxygrouplink(string, link=None):
18 e = tags.xpath("//compound[name/text()='%s']" % link)
22 anchorfile = e.xpath("filename/text()")
23 if len(anchorfile) == 0:
26 return "<a href=\"%s%s\">%s</a>" % (linkbase, anchorfile[0], string)
28 def format_doxylink(string, link=None):
34 e = tags.xpath("//member[name/text()='%s']" % link)
38 anchorfile = e.xpath("anchorfile/text()")
39 anchor = e.xpath("anchor/text()")
40 if len(anchorfile) == 0 or len(anchor) == 0:
43 return "<a href=\"%s%s#%s\">%s</a>" % (linkbase, anchorfile[0], anchor[0], string)
45 def format_docutils(string):
46 writer = docutils.writers.html4css1.Writer()
47 document = docutils.core.publish_parts(string, writer=writer)['body']
51 env.filters['docutils'] = format_docutils
52 env.filters['doxylink'] = format_doxylink
53 env.filters['doxygrouplink'] = format_doxygrouplink
55 docu_template = env.from_string(
58 <title>libFirm node specifications</title>
59 <link rel='stylesheet' type='text/css' href='style.css'/>
62 <div class="document">
63 <div class="documentwrapper">
64 <div class="bodywrapper"><div class="body">
65 <h1>Firm Node Types</h1>
66 {% for node in nodes %}
67 <div class="section" id="{{node.name}}">
68 <h3>{{node.name}}</h3>
72 {% for input in node.ins %}
73 <dt>{{input[0]}}</dt><dd>{{input[1]}}</dd>
75 {% if node.arity == "variable" %}
76 <dt>...</dt><dd>additional inputs (oparity_variable)</dd>
77 {% elif node.arity == "dynamic" %}
78 <dt>...</dt><dd>inputs dynamically mananged (oparity_dynamic)</dd>
84 {% for output in node.outs %}
85 <dt>{{output[0]}}</dt><dd>{{output[1]}}</dd>
92 {% for attr in node.attrs %}
93 <dt>{{attr.name}}</dt><dd>{{attr.comment}} ({{attr.type}})</dd>
97 {% set comma = joiner(", ") %}
99 {% if node.flags.__len__() > 0 %}
100 {% for flag in node.flags -%}
101 {{comma()}}{{flag|doxylink("irop_flag_" + flag)}}
106 <h5>{{"API"|doxygrouplink(node.name)}}</h5>
112 <div class="sidebar">
113 <div class="sidebarwrapper">
114 <h3>Table Of Contents</h3>
116 <li><a href="#">Firm Node Types</a>
118 {% for node in nodes %}
119 <li><a href="#{{node.name}}">{{node.name}}</a></li>
133 #############################
135 def prepare_nodes(nodes):
140 real_nodes.append(node)
149 output = open(argv[-1], "w")
151 tagfile = open(argv[-3], "r")
157 from lxml import etree
158 tags = etree.parse(tagfile)
162 spec = load_spec(specfile)
163 real_nodes = prepare_nodes(spec.nodes)
164 time = datetime.now().replace(microsecond=0).isoformat(' ')
165 output.write(docu_template.render(nodes=real_nodes, time=time))
166 if output != sys.stdout: