1.1 --- a/micropython/report.py Mon Aug 09 01:23:05 2010 +0200
1.2 +++ b/micropython/report.py Tue Aug 10 21:47:50 2010 +0200
1.3 @@ -73,14 +73,12 @@
1.4 z-index: 3;
1.5 }
1.6
1.7 - .assname,
1.8 .name {
1.9 position: relative;
1.10 background-color: #300;
1.11 color: white;
1.12 }
1.13
1.14 - .assname:hover,
1.15 .name:hover {
1.16 background-color: #500;
1.17 padding-top: 0.5ex;
1.18 @@ -88,7 +86,6 @@
1.19 z-index: 2;
1.20 }
1.21
1.22 - .assname:hover .popup,
1.23 .name:hover .popup {
1.24 display: block;
1.25 }
1.26 @@ -139,16 +136,40 @@
1.27
1.28 # Methods which write to the stream.
1.29
1.30 + def _span_start(self, classes=None):
1.31 + self.stream.write("<span class='%s'>" % (classes or ""))
1.32 +
1.33 def _span_end(self):
1.34 self.stream.write("</span>")
1.35
1.36 + def _span(self, value, classes=None):
1.37 + self._span_start(classes)
1.38 + self.stream.write(self._text(value))
1.39 + self._span_end()
1.40 +
1.41 + def _name_start(self, classes=None):
1.42 + self._span_start(classes or "name")
1.43 +
1.44 + _name_end = _span_end
1.45 +
1.46 + def _name(self, name, classes=None):
1.47 + self._name_start(classes)
1.48 + self.stream.write(self._text(name))
1.49 + self._name_end()
1.50 +
1.51 + def _popup_start(self):
1.52 + self._span_start("popup")
1.53 +
1.54 + _popup_end = _span_end
1.55 +
1.56 def _comment(self, comment):
1.57 - self.stream.write("<span class='comment'># %s</span>\n" % comment)
1.58 + self._span("# %s" % comment, "comment")
1.59 + self.stream.write("\n")
1.60
1.61 def _reserved(self, token, classes, leading=0, trailing=1):
1.62 if leading:
1.63 self.stream.write(" ")
1.64 - self.stream.write("<span class='%s'>%s</span>" % (classes, self._text(token)))
1.65 + self._span(token, classes)
1.66 if trailing:
1.67 self.stream.write(" ")
1.68
1.69 @@ -179,42 +200,27 @@
1.70
1.71 self._summary_link(module.full_name(), obj.full_name(), obj.name, classes)
1.72
1.73 - def _name_start(self, classes=None):
1.74 - self.stream.write("<span class='%s'>" % (classes or "name"))
1.75 -
1.76 - _name_end = _span_end
1.77 -
1.78 - def _name(self, name, classes=None):
1.79 - self._name_start(classes)
1.80 - self.stream.write(name)
1.81 - self._name_end()
1.82 -
1.83 def _name_link(self, module_name, full_name, name, classes=None):
1.84 self.stream.write("<a class='%s' href='%s%sxhtml#%s'>%s</a>" % (
1.85 classes or "name", module_name, os.path.extsep,
1.86 self._attr(full_name), self._text(name)))
1.87
1.88 - def _popup_start(self):
1.89 - self.stream.write("<span class='popup'>")
1.90 -
1.91 - _popup_end = _span_end
1.92 -
1.93 def _scope(self, scope):
1.94 self.stream.write("<div class='scope'><span class='label'>scope</span><br />%s</div>\n" % scope)
1.95
1.96 def _assname(self, name, node):
1.97 - self.stream.write("<span class='assname'>")
1.98 - if hasattr(node, "_attrnames"):
1.99 - attrnames = node._attrnames
1.100 + self._span_start("assname")
1.101 + if hasattr(node, "_attrnames") and node._attrnames[name]:
1.102 + attrnames = node._attrnames[name]
1.103 self._name_start()
1.104 self.stream.write(name)
1.105 self._popup_start()
1.106 - self._attrnames(attrnames[name])
1.107 + self._attrnames(attrnames)
1.108 self._popup_end()
1.109 self._name_end()
1.110 else:
1.111 - self._name(node.name)
1.112 - self.stream.write("</span>")
1.113 + self._span(name)
1.114 + self._span_end()
1.115
1.116 def _attrnames(self, attrnames):
1.117 if not attrnames:
1.118 @@ -654,27 +660,27 @@
1.119 # Expression-related helper methods.
1.120
1.121 def _visitBitBinary(self, node, name, symbol):
1.122 - self.stream.write("<span class='%s'>" % name)
1.123 + self._span_start(name)
1.124 first = 1
1.125 for node in node.nodes:
1.126 if not first:
1.127 self._op(symbol, 1)
1.128 self.dispatch(node)
1.129 first = 0
1.130 - self.stream.write("</span>")
1.131 + self._span_end()
1.132
1.133 def _visitBinary(self, node, name, symbol):
1.134 - self.stream.write("<span class='%s'>" % name)
1.135 + self._span_start(name)
1.136 self.dispatch(node.left)
1.137 self._op(symbol, 1)
1.138 self.dispatch(node.right)
1.139 - self.stream.write("</span>")
1.140 + self._span_end()
1.141
1.142 def _visitUnary(self, node, name, symbol):
1.143 - self.stream.write("<span class='%s'>" % name)
1.144 + self._span_start(name)
1.145 self._op(symbol)
1.146 self.dispatch(node.expr)
1.147 - self.stream.write("</span>")
1.148 + self._span_end()
1.149
1.150 # Expressions.
1.151
1.152 @@ -682,48 +688,48 @@
1.153 self._visitBinary(node, "add", "+")
1.154
1.155 def visitAnd(self, node):
1.156 - self.stream.write("<span class='and'>")
1.157 + self._span_start("and")
1.158 first = 1
1.159 for n in node.nodes:
1.160 if not first:
1.161 self._keyword("and", 1)
1.162 self.dispatch(n)
1.163 first = 0
1.164 - self.stream.write("</span>")
1.165 + self._span_end()
1.166
1.167 def visitAssAttr(self, node):
1.168 - self.stream.write("<span class='assattr'>")
1.169 + self._span_start("assattr")
1.170 self.dispatch(node.expr)
1.171 - self.stream.write("<span class='attr'>")
1.172 + self._span_start("attr")
1.173 self.stream.write(".")
1.174 self._name(node.attrname)
1.175 - self.stream.write("</span>")
1.176 - self.stream.write("</span>")
1.177 + self._span_end()
1.178 + self._span_end()
1.179
1.180 def visitAssList(self, node):
1.181 - self.stream.write("<span class='list'>")
1.182 + self._span_start("list")
1.183 self.stream.write("[")
1.184 self._sequence(node)
1.185 self.stream.write("]")
1.186 - self.stream.write("</span>")
1.187 + self._span_end()
1.188
1.189 def visitAssName(self, node):
1.190 self._assname(node.name, node)
1.191
1.192 def visitAssTuple(self, node):
1.193 - self.stream.write("<span class='tuple'>")
1.194 + self._span_start("tuple")
1.195 self.stream.write("(")
1.196 self._sequence(node)
1.197 self.stream.write(")")
1.198 - self.stream.write("</span>")
1.199 + self._span_end()
1.200
1.201 def visitBitand(self, node):
1.202 self._visitBitBinary(node, "bitand", "&")
1.203
1.204 def visitCallFunc(self, node):
1.205 - self.stream.write("<span class='callfunc'>")
1.206 + self._span_start("callfunc")
1.207 self.dispatch(node.node)
1.208 - self.stream.write("<span class='call'>")
1.209 + self._span_start("call")
1.210 self.stream.write("(")
1.211 first = 1
1.212 for arg in node.args:
1.213 @@ -742,30 +748,30 @@
1.214 self.dispatch(node.dstar_args)
1.215 first = 0
1.216 self.stream.write(")")
1.217 - self.stream.write("</span>")
1.218 - self.stream.write("</span>")
1.219 + self._span_end()
1.220 + self._span_end()
1.221
1.222 def visitCompare(self, node):
1.223 - self.stream.write("<span class='compare'>")
1.224 + self._span_start("compare")
1.225 self.dispatch(node.expr)
1.226 for op_name, expr in node.ops:
1.227 self._op(op_name, 1)
1.228 self.dispatch(expr)
1.229 - self.stream.write("</span>")
1.230 + self._span_end()
1.231
1.232 def visitConst(self, node):
1.233 if isinstance(node.value, (str, unicode)):
1.234 - self.stream.write("<span class='str'>")
1.235 + self._span_start("str")
1.236 self.stream.write(self._text(repr(node.value)))
1.237 if isinstance(node.value, (str, unicode)):
1.238 - self.stream.write("</span>")
1.239 + self._span_end()
1.240
1.241 def visitDict(self, node):
1.242 - self.stream.write("<span class='dict'>")
1.243 + self._span_start("dict")
1.244 self.stream.write("{")
1.245 self._mapping(node)
1.246 self.stream.write("}")
1.247 - self.stream.write("</span>")
1.248 + self._span_end()
1.249
1.250 def visitDiv(self, node):
1.251 self._visitBinary(node, "div", "/")
1.252 @@ -774,20 +780,20 @@
1.253 self._visitBinary(node, "floordiv", "//")
1.254
1.255 def visitGetattr(self, node):
1.256 - self.stream.write("<span class='getattr'>")
1.257 + self._span_start("getattr")
1.258 self.dispatch(node.expr)
1.259 - self.stream.write("<span class='attr'>")
1.260 + self._span_start("attr")
1.261 self.stream.write(".")
1.262 self._name(node.attrname)
1.263 - self.stream.write("</span>")
1.264 - self.stream.write("</span>")
1.265 + self._span_end()
1.266 + self._span_end()
1.267
1.268 def visitKeyword(self, node):
1.269 - self.stream.write("<span class='keyword-arg'>")
1.270 + self._span_start("keyword-arg")
1.271 self.stream.write(node.name)
1.272 self.stream.write("=")
1.273 self.dispatch(node.expr)
1.274 - self.stream.write("</span>")
1.275 + self._span_end()
1.276
1.277 def visitLambda(self, node):
1.278 if hasattr(node, "unit"):
1.279 @@ -796,46 +802,47 @@
1.280 print "Warning: function %s not recognised!" % node.name
1.281 return
1.282
1.283 - self.stream.write("<span class='lambda'>")
1.284 + self._span_start("lambda")
1.285 self._keyword("lambda")
1.286 self._parameters(fn, node)
1.287 - self.stream.write(": <span class='code'>")
1.288 + self.stream.write(": ")
1.289 + self._span_start("code")
1.290 self.dispatch(node.code)
1.291 - self.stream.write("</span>")
1.292 - self.stream.write("</span>")
1.293 + self._span_end()
1.294 + self._span_end()
1.295
1.296 visitList = visitAssList
1.297
1.298 def visitListComp(self, node):
1.299 - self.stream.write("<span class='listcomp'>")
1.300 + self._span_start("listcomp")
1.301 self.stream.write("[")
1.302 self.dispatch(node.expr)
1.303 for qual in node.quals:
1.304 self.dispatch(qual)
1.305 self.stream.write("]")
1.306 - self.stream.write("</span>")
1.307 + self._span_end()
1.308
1.309 def visitListCompFor(self, node):
1.310 - self.stream.write("<span class='listcompfor'>")
1.311 + self._span_start("listcompfor")
1.312 self._keyword("for")
1.313 - self.stream.write("<span class='iterator'>")
1.314 + self._span_start("item")
1.315 self.dispatch(node.assign)
1.316 - self.stream.write("</span>")
1.317 + self._span_end()
1.318 self._keyword("in", 1)
1.319 - self.stream.write("<span class='collection'>")
1.320 + self._span_start("collection")
1.321 self.dispatch(node.list)
1.322 - self.stream.write("</span>")
1.323 + self._span_end()
1.324 for if_ in node.ifs:
1.325 self.dispatch(if_)
1.326 - self.stream.write("</span>")
1.327 + self._span_end()
1.328
1.329 def visitListCompIf(self, node):
1.330 - self.stream.write("<span class='listcompif'>")
1.331 - self.stream.write("<span class='conditional'>")
1.332 + self._span_start("listcompif")
1.333 + self._span_start("conditional")
1.334 self._keyword("if", 1)
1.335 self.dispatch(node.test)
1.336 - self.stream.write("</span>")
1.337 - self.stream.write("</span>")
1.338 + self._span_end()
1.339 + self._span_end()
1.340
1.341 def visitMod(self, node):
1.342 self._visitBinary(node, "mod", "%")
1.343 @@ -853,7 +860,7 @@
1.344 self._popup_end()
1.345 self._name_end()
1.346 else:
1.347 - self._name(node.name)
1.348 + self._span(node.name)
1.349
1.350 # Output preparation methods.
1.351