1.1 --- a/viewer.py Sat Oct 14 02:17:40 2006 +0200
1.2 +++ b/viewer.py Sun Oct 15 01:03:44 2006 +0200
1.3 @@ -109,11 +109,18 @@
1.4
1.5 .types {
1.6 display: none; z-index: 2;
1.7 - position: absolute; top: 3em; left: 0.5em;
1.8 + position: absolute; top: 1em; left: 6.5em;
1.9 padding: 0.5em; background-color: #0000FF;
1.10 }
1.11
1.12 - .name:hover > .types
1.13 + .scopes {
1.14 + display: none; z-index: 2;
1.15 + position: absolute; top: 1em; left: 0.5em;
1.16 + padding: 0.5em; background-color: #007700;
1.17 + }
1.18 +
1.19 + .name:hover > .types,
1.20 + .name:hover > .scopes
1.21 {
1.22 display: block;
1.23 }
1.24 @@ -146,34 +153,86 @@
1.25 def visitModule(self, node):
1.26 self.default(node)
1.27
1.28 + # Statements.
1.29 +
1.30 def visitPass(self, node):
1.31 self._keyword("pass")
1.32
1.33 def visitClass(self, node):
1.34 - structure = node._node.expr.types[0].type
1.35 - self.stream.write("<div class='class' id='%s'>\n" % self._url(structure.full_name))
1.36 + definition = node._node
1.37 + structure = definition.expr.types[0].type
1.38 + self.stream.write("<div class='class' id='%s'>\n" % self._url(structure.full_name()))
1.39 self.stream.write("<p>\n")
1.40 self._keyword("class")
1.41 - self._name(structure)
1.42 + self._name_start(structure)
1.43 + self._scopes(definition)
1.44 + self._name_end()
1.45 bases = structure.bases
1.46 if bases:
1.47 - self.stream.write("(\n")
1.48 + self.stream.write("(")
1.49 first = 1
1.50 for base in bases:
1.51 if not first:
1.52 self.stream.write(",\n")
1.53 - self._name_and_types(base)
1.54 + self._name_start(base)
1.55 + self._types(base)
1.56 + self._scopes(base)
1.57 + self._name_end()
1.58 first = 0
1.59 self.stream.write(")")
1.60 self.stream.write(":\n")
1.61 - self._comment(self._text(structure.full_name))
1.62 + self._comment(self._text(structure.full_name()))
1.63 self.stream.write("</p>\n")
1.64
1.65 self.stream.write("<div class='body'>\n")
1.66 - self.default(node)
1.67 + self._doc(node)
1.68 + self.dispatch(node.code)
1.69 self.stream.write("</div>\n")
1.70 self.stream.write("</div>\n")
1.71
1.72 + def visitAssign(self, node):
1.73 + self.stream.write("<div class='assign'>\n")
1.74 + for lvalue in node.nodes:
1.75 + self.dispatch(lvalue)
1.76 + self.stream.write("=\n")
1.77 + self.dispatch(node.expr)
1.78 + self.stream.write("</div>\n")
1.79 +
1.80 + # Expressions.
1.81 +
1.82 + def visitTuple(self, node):
1.83 + self.stream.write("<span class='tuple'>\n")
1.84 + self.stream.write("(")
1.85 + self._sequence(node)
1.86 + self.stream.write(")\n")
1.87 + self.stream.write("</span>\n")
1.88 +
1.89 + visitAssTuple = visitTuple
1.90 +
1.91 + def visitList(self, node):
1.92 + self.stream.write("<span class='list'>\n")
1.93 + self.stream.write("[")
1.94 + self._sequence(node)
1.95 + self.stream.write("]\n")
1.96 + self.stream.write("</span>\n")
1.97 +
1.98 + visitAssList = visitList
1.99 +
1.100 + def visitName(self, node):
1.101 + self._name_start(node._node)
1.102 + self._types(node._node)
1.103 + self._scopes(node._node)
1.104 + self._name_end()
1.105 +
1.106 + def visitAssName(self, node):
1.107 + self._name_start(node._node)
1.108 + self._types(node._node.expr)
1.109 + self._scopes(node._node)
1.110 + self._name_end()
1.111 +
1.112 + def visitConst(self, node):
1.113 + self.stream.write(repr(node.value))
1.114 +
1.115 # Output preparation methods.
1.116
1.117 def _text(self, text):
1.118 @@ -191,17 +250,46 @@
1.119 def _keyword(self, kw):
1.120 self.stream.write("<span class='keyword'>%s</span> " % kw)
1.121
1.122 - def _name(self, node):
1.123 - self.stream.write("<span class='name'>%s</span> " % node.name)
1.124 + def _doc(self, node):
1.125 + if node.doc is not None:
1.126 + self.stream.write("<div class='doc'>%s</div>\n" % self._text(node.doc))
1.127 +
1.128 + def _sequence(self, node):
1.129 + first = 1
1.130 + for n in node.nodes:
1.131 + if not first:
1.132 + self.stream.write(",\n")
1.133 + self.dispatch(n)
1.134 + first = 0
1.135
1.136 - def _name_and_types(self, node):
1.137 - self.stream.write("<span class='name'>%s\n<div class='types'>\n" % node.name)
1.138 + def _name(self, node):
1.139 + self.stream.write("<span class='name'>%s</span>\n" % node.name)
1.140 +
1.141 + def _name_start(self, node):
1.142 + self.stream.write("<span class='name'>%s\n" % node.name)
1.143 +
1.144 + def _name_end(self):
1.145 + self.stream.write("</span>\n")
1.146 +
1.147 + def _types(self, node):
1.148 + self.stream.write("<div class='types'>\n")
1.149 for type in node.types:
1.150 - fn = type.type.full_name
1.151 - self.stream.write("<div class='ref'>\n")
1.152 + fn = type.type.full_name()
1.153 + self.stream.write("<div class='type'>")
1.154 self.stream.write(self._text(fn))
1.155 self.stream.write("</div>\n")
1.156 - self.stream.write("</div>\n</span>\n")
1.157 + self.stream.write("</div>\n")
1.158 +
1.159 + def _scopes(self, node):
1.160 + self.stream.write("<div class='scopes'>\n")
1.161 + if not hasattr(node, "writes") and not hasattr(node, "accesses"):
1.162 + raise AttributeError, node
1.163 + for ref in getattr(node, "writes", getattr(node, "accesses", {})).keys():
1.164 + fn = ref.full_name()
1.165 + self.stream.write("<div class='scope'>")
1.166 + self.stream.write(self._text(fn))
1.167 + self.stream.write("</div>\n")
1.168 + self.stream.write("</div>\n")
1.169
1.170 # Convenience functions.
1.171