5 import docutils.writers.html4css1
6 from datetime import datetime
7 from jinja2 import Environment, Template
8 from jinja2.filters import do_dictsort
9 from spec_util import is_dynamic_pinned, verify_node, isAbstract, setdefault, trim_docstring
10 from ir_spec import nodes
15 def format_doxygrouplink(string, link=None):
21 e = tags.xpath("//compound[name/text()='%s']" % link)
25 anchorfile = e.xpath("filename/text()")
26 if len(anchorfile) == 0:
29 return "<a href=\"%s%s\">%s</a>" % (linkbase, anchorfile[0], string)
31 def format_doxylink(string, link=None):
37 e = tags.xpath("//member[name/text()='%s']" % link)
41 anchorfile = e.xpath("anchorfile/text()")
42 anchor = e.xpath("anchor/text()")
43 if len(anchorfile) == 0 or len(anchor) == 0:
46 return "<a href=\"%s%s#%s\">%s</a>" % (linkbase, anchorfile[0], anchor[0], string)
48 def format_docutils(string):
49 writer = docutils.writers.html4css1.Writer()
50 document = docutils.core.publish_parts(string, writer=writer)['body']
54 env.filters['docutils'] = format_docutils
55 env.filters['doxylink'] = format_doxylink
56 env.filters['doxygrouplink'] = format_doxygrouplink
58 docu_template = env.from_string(
61 <title>libFirm node specifications</title>
62 <link rel='stylesheet' type='text/css' href='style.css'/>
65 <div class="document">
66 <div class="documentwrapper">
67 <div class="bodywrapper"><div class="body">
68 <h1>Firm Node Types</h1>
69 {% for node in nodes %}
70 <div class="section" id="{{node.name}}">
71 <h3>{{node.name}}</h3>
75 {% for input in node.ins %}
76 <dt>{{input[0]}}</dt><dd>{{input[1]}}</dd>
78 {% if node.arity == "variable" %}
79 <dt>...</dt><dd>additional inputs (oparity_variable)</dd>
80 {% elif node.arity == "dynamic" %}
81 <dt>...</dt><dd>inputs dynamically mananged (oparity_dynamic)</dd>
87 {% for output in node.outs %}
88 <dt>{{output[0]}}</dt><dd>{{output[1]}}</dd>
95 {% for attr in node.attrs %}
96 <dt>{{attr.name}}</dt><dd>{{attr.comment}} ({{attr.type}})</dd>
100 {% set comma = joiner(", ") %}
102 {% if node.flags.__len__() > 0 %}
103 {% for flag in node.flags -%}
104 {{comma()}}{{flag|doxylink("irop_flag_" + flag)}}
109 <h5>{{"API"|doxygrouplink(node.name)}}</h5>
115 <div class="sidebar">
116 <div class="sidebarwrapper">
117 <h3>Table Of Contents</h3>
119 <li><a href="#">Firm Node Types</a>
121 {% for node in nodes %}
122 <li><a href="#{{node.name}}">{{node.name}}</a></li>
136 #############################
138 def preprocess_node(node):
139 node.doc = trim_docstring(node.__doc__)
144 preprocess_node(node)
147 real_nodes.append(node)
155 output = open(argv[-1], "w")
157 tagfile = open(argv[-3], "r")
163 from lxml import etree
164 tags = etree.parse(tagfile)
168 real_nodes = prepare_nodes()
169 time = datetime.now().replace(microsecond=0).isoformat(' ')
170 output.write(docu_template.render(nodes=real_nodes, time=time))
171 if output != sys.stdout: