|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
import os, argparse, sys, re
|
|
|
|
import zippydoc
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
_ROOT = os.path.abspath(os.path.dirname(zippydoc.__file__))
|
|
|
|
|
|
|
|
def get_data(path):
|
|
|
|
return os.path.join(_ROOT, 'data', path)
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser(description='Converts ZippyDoc source files to HTML.')
|
|
|
|
|
|
|
|
parser.add_argument('files', metavar='FILE', type=str, nargs='+',
|
|
|
|
help='files to convert to HTML')
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
options = vars(args)
|
|
|
|
|
|
|
|
class HtmlRuleset(zippydoc.TransformationRuleset):
|
|
|
|
def create_anchor(self, title):
|
|
|
|
anchor = title.clean().replace("...", "").replace(".", "_")
|
|
|
|
anchor = re.sub("[^a-zA-Z0-9_]", "", anchor)
|
|
|
|
return anchor
|
|
|
|
|
|
|
|
def escape_html(self, text):
|
|
|
|
return text.replace("<", "<").replace(">", ">")
|
|
|
|
|
|
|
|
def transform_children(self, text):
|
|
|
|
return '<div class="children">%s</div>' % text
|
|
|
|
|
|
|
|
def transform_header(self, depth, text):
|
|
|
|
if depth <= 7:
|
|
|
|
title_type = "h%d" % depth
|
|
|
|
else:
|
|
|
|
title_type = "h7"
|
|
|
|
|
|
|
|
return "<%s>%s</%s>" % (title_type, text.transform(self), title_type)
|
|
|
|
|
|
|
|
def transform_definition(self, forms, children):
|
|
|
|
anchor = self.create_anchor(forms[0])
|
|
|
|
formlist = "<br>".join([form.transform(self) for form in forms])
|
|
|
|
return '<div class="definition"><a name="%s">%s %s</a></div>' % (anchor, formlist, children)
|
|
|
|
|
|
|
|
def transform_argument(self, name, description, children):
|
|
|
|
return "<dl><dt>%s</dt><dd>%s%s</dd></dl>" % (name, description.transform(self), children)
|
|
|
|
|
|
|
|
def transform_example(self, title, children):
|
|
|
|
return '<div class="example">Example: %s %s</div>' % (title.transform(self), children)
|
|
|
|
|
|
|
|
def transform_code(self, text):
|
|
|
|
return '<h7>Code:</h7><pre class="code">%s</pre>' % self.escape_html(text)
|
|
|
|
|
|
|
|
def transform_output(self, text):
|
|
|
|
return '<h7>Output:</h7><pre class="output">%s</pre>' % self.escape_html(text)
|
|
|
|
|
|
|
|
def transform_exclamation(self, text, children):
|
|
|
|
return '<div class="exclamation"><strong>Important:</strong> %s %s</div>' % (text.transform(self), children)
|
|
|
|
|
|
|
|
def transform_text(self, text):
|
|
|
|
return '<div class="text">%s</div>' % text.transform(self)
|
|
|
|
|
|
|
|
def transform_list(self, items):
|
|
|
|
return '<ul>%s</ul>' % "".join("<li>%s</li>" % item.transform(self) for item in items)
|
|
|
|
|
|
|
|
def transform_reference(self, target, description):
|
|
|
|
return '<a href="%s.html">%s</a>' % (target, description.transform(self))
|
|
|
|
|
|
|
|
def transform_external_reference(self, target, description):
|
|
|
|
return '<a href="%s">%s</a>' % (target, description.transform(self))
|
|
|
|
|
|
|
|
def transform_fixed_width(self, text):
|
|
|
|
return '<span class="fixed">%s</span>' % text
|
|
|
|
|
|
|
|
def transform_emphasis(self, text):
|
|
|
|
return "<em>%s</em>" % text.transform(self)
|
|
|
|
|
|
|
|
def transform_strong(self, text):
|
|
|
|
return "<strong>%s</strong>" % text.transform(self)
|
|
|
|
|
|
|
|
def transform_toc(self, items):
|
|
|
|
rendered = ""
|
|
|
|
|
|
|
|
for item in items:
|
|
|
|
forms = item[0].get_forms()
|
|
|
|
anchor = self.create_anchor(forms[0])
|
|
|
|
|
|
|
|
if len(forms) > 1:
|
|
|
|
alternatives = '<span class="alternatives">(also: %s)</span>' % ", ".join(form.clean() for form in forms[1:])
|
|
|
|
else:
|
|
|
|
alternatives = ""
|
|
|
|
|
|
|
|
description = item[1]
|
|
|
|
|
|
|
|
if len(description) > 80:
|
|
|
|
matches = re.match("^(.{0,80})\W", description)
|
|
|
|
description = matches.group(1) + "..."
|
|
|
|
|
|
|
|
description = zippydoc.Value(description).transform(self)
|
|
|
|
|
|
|
|
rendered += '<li><a href="#%s">%s</a> %s %s</li>' % (anchor, forms[0].clean(), description, alternatives)
|
|
|
|
|
|
|
|
return '<div class="toc"><h2>Table of contents</h2><ul>%s</ul></div>' % rendered
|
|
|
|
|
|
|
|
files = options["files"]
|
|
|
|
|
|
|
|
template = open(get_data("template.html")).read()
|
|
|
|
|
|
|
|
for zpy in files:
|
|
|
|
destination = os.path.splitext(zpy)[0] + ".html"
|
|
|
|
|
|
|
|
f = open(zpy, "r")
|
|
|
|
data = f.read()
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
doc = zippydoc.Document(data)
|
|
|
|
|
|
|
|
rendered = doc.transform(HtmlRuleset())
|
|
|
|
|
|
|
|
f = open(destination, "w")
|
|
|
|
f.write(template.replace("{CONTENT}", rendered))
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
print "Rendered %s" % destination
|