1.1 --- a/simplified.py Tue Oct 10 00:46:32 2006 +0200
1.2 +++ b/simplified.py Sat Oct 14 02:17:40 2006 +0200
1.3 @@ -30,6 +30,8 @@
1.4
1.5 "Maintain records of unique names for each simple name."
1.6
1.7 + index_separator = "-"
1.8 +
1.9 def __init__(self):
1.10 self.obj_to_name = {}
1.11 self.names = {}
1.12 @@ -44,7 +46,7 @@
1.13 self.names[name] = 0
1.14 n = self.names[name] + 1
1.15 self.names[name] = n
1.16 - self.obj_to_name[obj] = "%s#%d" % (name, n)
1.17 + self.obj_to_name[obj] = "%s%s%d" % (name, self.index_separator, n)
1.18
1.19 naming = Naming()
1.20
2.1 --- a/viewer.py Tue Oct 10 00:46:32 2006 +0200
2.2 +++ b/viewer.py Sat Oct 14 02:17:40 2006 +0200
2.3 @@ -81,10 +81,144 @@
2.4 self.stream.write("\nSimplified node was:\n\n")
2.5 exc.nodes[0].pprint(stream=self.stream)
2.6
2.7 +# HTML-related output production.
2.8 +
2.9 +html_header = """<?xml version="1.0" encoding="iso-8859-15"?>
2.10 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2.11 +<html xmlns="http://www.w3.org/1999/xhtml">
2.12 +<head>
2.13 + <title>Module</title>
2.14 + <style type="text/css">
2.15 + body {
2.16 + padding-top: 4em; padding-bottom: 4em;
2.17 + font-size: 14pt; font-family: monospace;
2.18 + background-color: black; color: white;
2.19 + }
2.20 +
2.21 + .class { margin-bottom: 1em; }
2.22 + .function { margin-bottom: 1em; }
2.23 + .body { padding-left: 2em; }
2.24 + .keyword { color: yellow; }
2.25 + .comment { color: blue; }
2.26 + .ref { color: cyan; }
2.27 + .ref a { color: cyan; text-decoration: none; }
2.28 +
2.29 + .name {
2.30 + position: relative;
2.31 + }
2.32 +
2.33 + .types {
2.34 + display: none; z-index: 2;
2.35 + position: absolute; top: 3em; left: 0.5em;
2.36 + padding: 0.5em; background-color: #0000FF;
2.37 + }
2.38 +
2.39 + .name:hover > .types
2.40 + {
2.41 + display: block;
2.42 + }
2.43 +
2.44 + </style>
2.45 +</head>
2.46 +<body>
2.47 +"""
2.48 +
2.49 +html_footer = """</body>
2.50 +</html>
2.51 +"""
2.52 +
2.53 +class Browser(ASTVisitor):
2.54 +
2.55 + """
2.56 + A browsing visitor for AST nodes.
2.57 + """
2.58 +
2.59 + def __init__(self, stream):
2.60 + ASTVisitor.__init__(self)
2.61 + self.visitor = self
2.62 + self.stream = stream
2.63 +
2.64 + def process(self, module):
2.65 + self.stream.write(html_header)
2.66 + self.dispatch(module)
2.67 + self.stream.write(html_footer)
2.68 +
2.69 + def visitModule(self, node):
2.70 + self.default(node)
2.71 +
2.72 + def visitPass(self, node):
2.73 + self._keyword("pass")
2.74 +
2.75 + def visitClass(self, node):
2.76 + structure = node._node.expr.types[0].type
2.77 + self.stream.write("<div class='class' id='%s'>\n" % self._url(structure.full_name))
2.78 + self.stream.write("<p>\n")
2.79 + self._keyword("class")
2.80 + self._name(structure)
2.81 + bases = structure.bases
2.82 + if bases:
2.83 + self.stream.write("(\n")
2.84 + first = 1
2.85 + for base in bases:
2.86 + if not first:
2.87 + self.stream.write(",\n")
2.88 + self._name_and_types(base)
2.89 + first = 0
2.90 + self.stream.write(")")
2.91 + self.stream.write(":\n")
2.92 + self._comment(self._text(structure.full_name))
2.93 + self.stream.write("</p>\n")
2.94 +
2.95 + self.stream.write("<div class='body'>\n")
2.96 + self.default(node)
2.97 + self.stream.write("</div>\n")
2.98 + self.stream.write("</div>\n")
2.99 +
2.100 + # Output preparation methods.
2.101 +
2.102 + def _text(self, text):
2.103 + return text.replace("&", "&").replace("<", "<").replace(">", ">")
2.104 +
2.105 + def _attr(self, attr):
2.106 + return self._text(attr).replace("'", "'").replace('"', """)
2.107 +
2.108 + def _url(self, url):
2.109 + return self._attr(url).replace("#", "%23").replace("-", "%2d")
2.110 +
2.111 + def _comment(self, comment):
2.112 + self.stream.write("<span class='comment'># %s</span>\n" % comment)
2.113 +
2.114 + def _keyword(self, kw):
2.115 + self.stream.write("<span class='keyword'>%s</span> " % kw)
2.116 +
2.117 + def _name(self, node):
2.118 + self.stream.write("<span class='name'>%s</span> " % node.name)
2.119 +
2.120 + def _name_and_types(self, node):
2.121 + self.stream.write("<span class='name'>%s\n<div class='types'>\n" % node.name)
2.122 + for type in node.types:
2.123 + fn = type.type.full_name
2.124 + self.stream.write("<div class='ref'>\n")
2.125 + self.stream.write(self._text(fn))
2.126 + self.stream.write("</div>\n")
2.127 + self.stream.write("</div>\n</span>\n")
2.128 +
2.129 # Convenience functions.
2.130
2.131 def view(module, stream=None):
2.132 viewer = Viewer(stream or sys.stdout)
2.133 viewer.process(module.original)
2.134
2.135 +def browse(module, stream=None):
2.136 + browser = Browser(stream or sys.stdout)
2.137 + browser.process(module.original)
2.138 +
2.139 +def makedoc(module, filename):
2.140 + stream = open(filename, "wb")
2.141 + try:
2.142 + browser = Browser(stream)
2.143 + browser.process(module.original)
2.144 + finally:
2.145 + stream.close()
2.146 +
2.147 # vim: tabstop=4 expandtab shiftwidth=4