Thread: [Epydoc-commits] SF.net SVN: epydoc: [1345] trunk/epydoc/src/epydoc/docwriter/html_colorize. py
Brought to you by:
edloper
From: <ed...@us...> - 2006-09-02 01:46:14
|
Revision: 1345 http://svn.sourceforge.net/epydoc/?rev=1345&view=rev Author: edloper Date: 2006-09-01 18:46:11 -0700 (Fri, 01 Sep 2006) Log Message: ----------- - Fixed javascript bug in kill_doclink() - Various optimizations to make the size of the generated HTML files a little smaller. Including: - Changed <span>..</span> to <tt>..</tt> in colorized html source, to make the files slightly smaller. - Modified javascript doclink() function so that the list of choices for a given variable only needs to be included once. This should cut down on the size of generated files where there are a large number of possible targets for each variable name. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html_colorize.py Modified: trunk/epydoc/src/epydoc/docwriter/html_colorize.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2006-09-02 01:40:35 UTC (rev 1344) +++ trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2006-09-02 01:46:11 UTC (rev 1345) @@ -341,13 +341,13 @@ var indent = elt.getAttribute("indent"); var pad = elt.getAttribute("pad"); - var s = "<span class=\'py-lineno\'>"; + var s = "<tt class=\'py-lineno\'>"; for (var i=0; i<pad.length; i++) { s += " " } - s += "</span>"; - s += " <span class=\'py-line\'>"; + s += "</tt>"; + s += " <tt class=\'py-line\'>"; for (var i=0; i<indent.length; i++) { s += " " } s += "<a href=\'#\' onclick=\'expand(\\"" + id; - s += "\\");return false\'>...</a></span><br />"; + s += "\\");return false\'>...</a></tt><br />"; elt.innerHTML = s; } } @@ -358,7 +358,9 @@ collapse(id); else expand(id); + return false; } + function highlight(id) { var elt = document.getElementById(id+"-def"); if (elt) elt.className = "py-highlight-hdr"; @@ -410,17 +412,18 @@ } function kill_doclink(id) { - if (id) { - var parent = document.getElementById(id); - parent.removeChild(parent.childNodes.item(0)); - } - else if (!this.contains(event.toElement)) { + var parent = document.getElementById(id); + parent.removeChild(parent.childNodes.item(0)); +} +function auto_kill_doclink(ev) { + if (!ev) var ev = window.event; + if (!this.contains(ev.toElement)) { var parent = document.getElementById(this.parentID); parent.removeChild(parent.childNodes.item(0)); } } -function doclink(id, name, targets) { +function doclink(id, name, targets_id) { var elt = document.getElementById(id); // If we already opened the box, then destroy it. @@ -452,9 +455,12 @@ box2.style.background = "white"; box2.style.padding = ".3em .4em .3em .4em"; box2.style.fontStyle = "normal"; - box2.onmouseout=kill_doclink; + box2.onmouseout=auto_kill_doclink; box2.parentID = id; + // Get the targets + var targets_elt = document.getElementById(targets_id); + var targets = targets_elt.getAttribute("targets"); var links = ""; target_list = targets.split(","); for (var i=0; i<target_list.length; i++) { @@ -477,6 +483,7 @@ "onclick=\'kill_doclink(\\""+id+"\\");return false;\'>"+ "<i>None of the above</i></a></li></ul>"; } + return false; } ''' @@ -702,7 +709,7 @@ def lineno_to_html(self): template = '%%%ds' % self.linenum_size n = template % self.lineno - return '<span class="py-lineno">%s</span>' % n + return '<tt class="py-lineno">%s</tt>' % n def colorize(self): """ @@ -719,6 +726,10 @@ self.def_name = None self.def_type = None + # Cache, used so we only need to list the target elements once + # for each variable. + self.doclink_targets_cache = {} + # Load the module's text. self.text = open(self.module_filename).read() self.text = self.text.expandtabs().rstrip()+'\n' @@ -828,7 +839,7 @@ self.lineno += 1 else: s = '' - s += ' <span class="py-line">' + s += ' <tt class="py-line">' # Loop through each token, and colorize it appropriately. for i, (toktype, toktext) in enumerate(line): @@ -846,7 +857,7 @@ css_class = None url = None tooltip = None - onclick = uid = None # these 3 are used together. + onclick = uid = targets = None # these 3 are used together. # Is this token the class name in a class definition? If # so, then make it a link back into the API docs. @@ -956,7 +967,7 @@ if len(docs) == 1 and self.GUESS_LINK_TARGETS: url = self.url_func(docs[0]) else: - uid, onclick = self.doclink(toktext, docs) + uid, onclick, targets = self.doclink(toktext, docs) # For all other tokens, look up the CSS class to use # based on the token's type. @@ -987,8 +998,10 @@ if css_class: css_class_html = ' class="%s"' % css_class else: css_class_html = '' if onclick: - s += ('<span id="%s"%s><a%s%s href="#" onclick="%s">' % - (uid, css_class_html, tooltip_html, + if targets: targets_html = ' targets="%s"' % targets + else: targets_html = '' + s += ('<tt id="%s"%s%s><a%s%s href="#" onclick="%s">' % + (uid, css_class_html, targets_html, tooltip_html, css_class_html, onclick)) elif url: if isinstance(url, unicode): @@ -996,9 +1009,9 @@ s += ('<a%s%s href="%s">' % (tooltip_html, css_class_html, url)) elif css_class_html or tooltip_html: - s += '<span%s%s>' % (tooltip_html, css_class_html) + s += '<tt%s%s>' % (tooltip_html, css_class_html) if i == len(line)-1: - s += ' </span>' # Closes <span class="py-line"> + s += ' </tt>' # Closes <tt class="py-line"> s += cgi.escape(toktext) else: try: @@ -1007,16 +1020,16 @@ print (toktext, css_class, toktext.encode('ascii')) raise - if onclick: s += "</a></span>" + if onclick: s += "</a></tt>" if url: s += '</a>' - elif css_class_html or tooltip_html: s += '</span>' + elif css_class_html or tooltip_html: s += '</tt>' if self.ADD_DEF_BLOCKS: for i in range(ended_def_blocks): self.out(self.END_DEF_BLOCK) - # Strip any empty <span>s. - s = re.sub(r'<span class="[\w+]"></span>', '', s) + # Strip any empty <tt>s. + s = re.sub(r'<tt class="[\w+]"></tt>', '', s) # Write the line. self.out(s) @@ -1048,13 +1061,20 @@ container = DottedName(self.module_name, *context) #else: # container = None - targets = ['%s=%s' % (str(self.doc_descr(d,container)), + targets = ','.join(['%s=%s' % (str(self.doc_descr(d,container)), str(self.url_func(d))) - for d in docs] - onclick = ("doclink('%s', '%s', '%s'); return false;" % - (uid, name, ','.join(targets))) - return uid, onclick + for d in docs]) + if targets in self.doclink_targets_cache: + onclick = ("return doclink('%s', '%s', '%s');" % + (uid, name, self.doclink_targets_cache[targets])) + return uid, onclick, None + else: + self.doclink_targets_cache[targets] = uid + onclick = ("return doclink('%s', '%s', '%s');" % + (uid, name, uid)) + return uid, onclick, targets + def doc_descr(self, doc, context): name = str(doc.canonical_name) descr = '%s %s' % (self.doc_kind(doc), name) @@ -1090,9 +1110,9 @@ def mark_def(self, s, name): replacement = ('<a name="%s"></a><div id="%s-def">\\1' '<a class="py-toggle" href="#" id="%s-toggle" ' - 'onclick="toggle(\'%s\'); return false;">-</a>\\2' % + 'onclick="return toggle(\'%s\');">-</a>\\2' % (name, name, name, name)) - return re.sub('(.*) (<span class="py-line">.*)\Z', replacement, s) + return re.sub('(.*) (<tt class="py-line">.*)\Z', replacement, s) def is_docstring(self, line, i): if line[i][0] != token.STRING: return False @@ -1108,13 +1128,13 @@ end = s.find('\n')+1 while end: result += s[start:end-1] - if css_class: result += '</span>' - result += ' </span>' # py-line + if css_class: result += '</tt>' + result += ' </tt>' # py-line result += '\n' if self.ADD_LINE_NUMBERS: result += self.lineno_to_html() - result += ' <span class="py-line">' - if css_class: result += '<span class="%s">' % css_class + result += ' <tt class="py-line">' + if css_class: result += '<tt class="%s">' % css_class start = end end = s.find('\n', end)+1 self.lineno += 1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-01-17 21:29:28
|
Revision: 1416 http://svn.sourceforge.net/epydoc/?rev=1416&view=rev Author: edloper Date: 2007-01-17 13:29:25 -0800 (Wed, 17 Jan 2007) Log Message: ----------- Removed import of 'sre' (not used, and causes a deprication warning in python 2.5 -- see SF bug #1563688) Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html_colorize.py Modified: trunk/epydoc/src/epydoc/docwriter/html_colorize.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2007-01-17 21:26:37 UTC (rev 1415) +++ trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2007-01-17 21:29:25 UTC (rev 1416) @@ -15,7 +15,7 @@ """ __docformat__ = 'epytext en' -import sys, sre_parse, sre, re, codecs +import sys, sre_parse, re, codecs import sre_constants from epydoc import log from epydoc.util import decode_with_backslashreplace, plaintext_to_html This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-02-06 13:40:22
|
Revision: 1438 http://svn.sourceforge.net/epydoc/?rev=1438&view=rev Author: dvarrazzo Date: 2007-02-06 05:40:13 -0800 (Tue, 06 Feb 2007) Log Message: ----------- - Added an anchor for each source code line The anchor has the form "Ln" where n is the line number without leading 0's. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html_colorize.py Modified: trunk/epydoc/src/epydoc/docwriter/html_colorize.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2007-02-05 02:37:15 UTC (rev 1437) +++ trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2007-02-06 13:40:13 UTC (rev 1438) @@ -709,7 +709,8 @@ def lineno_to_html(self): template = '%%%ds' % self.linenum_size n = template % self.lineno - return '<tt class="py-lineno">%s</tt>' % n + return '<a name="L%s" /><tt class="py-lineno">%s</tt>' \ + % (self.lineno, n) def colorize(self): """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-08 04:17:46
|
Revision: 1443 http://svn.sourceforge.net/epydoc/?rev=1443&view=rev Author: edloper Date: 2007-02-07 20:17:45 -0800 (Wed, 07 Feb 2007) Log Message: ----------- - Fixed a bug that generated an extra '</tt>' tag under some conditions. (an 'if' was replaced by an 'elif') Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html_colorize.py Modified: trunk/epydoc/src/epydoc/docwriter/html_colorize.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2007-02-07 07:34:49 UTC (rev 1442) +++ trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2007-02-08 04:17:45 UTC (rev 1443) @@ -1022,7 +1022,7 @@ raise if onclick: s += "</a></tt>" - if url: s += '</a>' + elif url: s += '</a>' elif css_class_html or tooltip_html: s += '</tt>' if self.ADD_DEF_BLOCKS: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-11 03:18:28
|
Revision: 1449 http://svn.sourceforge.net/epydoc/?rev=1449&view=rev Author: edloper Date: 2007-02-10 19:18:26 -0800 (Sat, 10 Feb 2007) Log Message: ----------- - Fixed SF bug 1657057, caused by using <a /> instead of <a></a> Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html_colorize.py Modified: trunk/epydoc/src/epydoc/docwriter/html_colorize.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2007-02-11 00:05:34 UTC (rev 1448) +++ trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2007-02-11 03:18:26 UTC (rev 1449) @@ -709,7 +709,7 @@ def lineno_to_html(self): template = '%%%ds' % self.linenum_size n = template % self.lineno - return '<a name="L%s" /><tt class="py-lineno">%s</tt>' \ + return '<a name="L%s"></a><tt class="py-lineno">%s</tt>' \ % (self.lineno, n) def colorize(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-13 20:27:32
|
Revision: 1477 http://svn.sourceforge.net/epydoc/?rev=1477&view=rev Author: edloper Date: 2007-02-13 12:27:31 -0800 (Tue, 13 Feb 2007) Log Message: ----------- - Removed regexp colorizer (it's been replaced by epydoc.markup.pyval_repr) Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html_colorize.py Modified: trunk/epydoc/src/epydoc/docwriter/html_colorize.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2007-02-13 20:26:12 UTC (rev 1476) +++ trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2007-02-13 20:27:31 UTC (rev 1477) @@ -8,300 +8,20 @@ """ Functions to produce colorized HTML code for various objects. -Currently, C{colorize} defines functions to colorize regular -expressions and doctest blocks. - -@group Regular Expression Tags: *_TAG +Currently, C{html_colorize} defines functions to colorize +Python source code. """ __docformat__ = 'epytext en' -import sys, sre_parse, re, codecs -import sre_constants +import re, codecs from epydoc import log -from epydoc.util import decode_with_backslashreplace, plaintext_to_html from epydoc.util import py_src_filename from epydoc.apidoc import * +import tokenize, token, cgi, keyword +try: from cStringIO import StringIO +except: from StringIO import StringIO ###################################################################### -## Regular expression colorizer -###################################################################### - -# HTML tags for colorize_re - -RE_TAG = 're' -r'''The CSS class for colorizing regular expressions.''' - -ANY_TAG = 're-char' -r'''The CSS class for colorizing C{"."} in regexps.''' - -ESCAPE_TAG = 're-char' -r'''The CSS class for colorizing escaped characters (such as C{r"\("}) -in regexps.''' - -CATEGORY_TAG = 're-char' -r'''The CSS class for colorizing character categories (such as -C{r"\d"})) in regexps.''' - -AT_TAG = 're-char' -r'''The CSS class for colorizing character locations (such as C{"^"}) -in regexps.''' - -BRANCH_TAG = 're-op' -r'''The CSS class for colorizing C{"|"} in regexps.''' - -STAR_TAG = 're-op' -r'''The CSS class for colorizing C{"*"} and C{"*?"} in regexps.''' - -PLUS_TAG = 're-op' -r'''The CSS class for colorizing C{"+"} and C{"+?"} in regexps.''' - -QMRK_TAG = 're-op' -r'''The CSS class for colorizing C{"?"} and C{"??"} in regexps.''' - -RNG_TAG = 're-op' -r'''The CSS class for colorizing repeat ranges (such as C{"a{3,8}"}) in -regexps.''' - -PAREN_TAG = 're-group' -r'''The CSS class for colorizing parenthases in regexps.''' - -CHOICE_TAG = 're-group' -r'''The CSS class for colorizing character choice expressions (such as -C{"[abc]"}) in regexps.''' - -ASSERT_TAG = 're-group' -r'''The CSS class for colorizing assertions (such as C{"(?=abc)"}) in -regexps.''' - -REF_TAG = 're-ref' -r'''The CSS class for colorizing references (such as C{r"\1"}) in -regexps.''' - -def colorize_re(regexp): - r""" - @return: The HTML code for a colorized version of the pattern for - the given SRE regular expression. If C{colorize_re} can't - figure out how to colorize the regexp, then it will simply return - the (uncolorized) pattern, with C{'&'}, C{'<'}, and C{'>'} - escaped as HTML entities. The colorized expression includes - spans with the following css classes: - - X{re}: The entire regular expression. - - X{re-char}: Special characters (such as C{'.'}, C{'\('}), - character categories (such as C{'\w'}), and locations - (such as C{'\b'}). - - X{re-op}: Operators (such as C{'*'} and C{'|'}). - - X{re-group}: Grouping constructs (such as C{'(...)'}). - - X{re-ref} References (such as C{'\1'}) - @rtype: C{string} - @param regexp: The regular expression to colorize. - @type regexp: C{SRE_Pattern} or C{string} - @raise sre_constants.error: If regexp is not a valid regular - expression. - """ - if isinstance(regexp, str): - pat = decode_with_backslashreplace(regexp) - tree = sre_parse.parse(pat) - - elif isinstance(regexp, unicode): - tree = sre_parse.parse(regexp) - - elif hasattr(regexp, 'pattern') and hasattr(regexp, 'flags'): - if isinstance(regexp.pattern, str): - pat = decode_with_backslashreplace(regexp.pattern) - tree = sre_parse.parse(pat, regexp.flags) - - elif isinstance(regexp.pattern, unicode): - tree = sre_parse.parse(regexp.pattern, regexp.flags) - - else: - raise TypeError("Bad regexp object -- pattern is not a string") - else: - raise TypeError("Expected a regexp or a string") - - return ('<span class="%s">%s</span>' % - (RE_TAG, _colorize_re(tree, 1))) - -def _colorize_re(tree, noparen=0): - """ - Recursively descend the given regexp parse tree to produce the - HTML code for a colorized version of the regexp. - - @param tree: The regexp parse tree for the regexp that should be - colorized. - @type tree: L{sre_parse.SubPattern} - @param noparen: If true, then don't include parenthases around the - expression in C{tree}, even if it contains multiple elements. - @type noparen: C{boolean} - @return: The HTML code for a colorized version of C{tree} - @rtype: C{string} - """ - result = [] - out = result.append - - if len(tree) > 1 and not noparen: - out('<span class="%s">(</span>' % PAREN_TAG) - for elt in tree: - op = elt[0] - args = elt[1] - - if op == sre_constants.LITERAL: - c = unichr(args) - if c == '\t': out(r'<span class="%s">\t</span>' % ESCAPE_TAG) - elif c == '\n': out(r'<span class="%s">\n</span>' % ESCAPE_TAG) - elif c == '\r': out(r'<span class="%s">\r</span>' % ESCAPE_TAG) - elif c == '\f': out(r'<span class="%s">\f</span>' % ESCAPE_TAG) - elif c == '\v': out(r'<span class="%s">\v</span>' % ESCAPE_TAG) - elif ord(c)<32 or ord(c)>=127: - if c < 256: template = r'<span class="%s">\x%02x</span>' - else: template = r'<span class="%s">\u%04x</span>' - out(template % (ESCAPE_TAG,ord(c))) - elif c in '.^$\\*+?{}[]|()': - out(r'<span class="%s">\%c</span>' % (ESCAPE_TAG, c)) - else: out(plaintext_to_html(unichr(args))) - continue - - elif op == sre_constants.ANY: - out('<span class="%s">.</span>' % ANY_TAG) - - elif op == sre_constants.BRANCH: - if args[0] is not None: - raise ValueError('Branch expected None arg but got %s' - % args[0]) - VBAR = '<span class="%s">|</span>' % BRANCH_TAG - out(VBAR.join([_colorize_re(item,1) for item in args[1]])) - - elif op == sre_constants.IN: - if (len(args) == 1 and args[0][0] == sre_constants.CATEGORY): - out(_colorize_re(args)) - else: - out('<span class="%s">[</span>' % CHOICE_TAG) - out(_colorize_re(args, 1)) - out('<span class="%s">]</span>' % CHOICE_TAG) - - elif op == sre_constants.CATEGORY: - out('<span class="%s">' % CATEGORY_TAG) - if args == sre_constants.CATEGORY_DIGIT: out(r'\d') - elif args == sre_constants.CATEGORY_NOT_DIGIT: out(r'\D') - elif args == sre_constants.CATEGORY_SPACE: out(r'\s') - elif args == sre_constants.CATEGORY_NOT_SPACE: out(r'\S') - elif args == sre_constants.CATEGORY_WORD: out(r'\w') - elif args == sre_constants.CATEGORY_NOT_WORD: out(r'\W') - else: raise ValueError('Unknown category %s' % args) - out('</span>') - - elif op == sre_constants.AT: - out('<span class="%s">' % AT_TAG) - if args == sre_constants.AT_BEGINNING_STRING: out(r'\A') - elif args == sre_constants.AT_BEGINNING: out(r'^') - elif args == sre_constants.AT_END: out(r'$') - elif args == sre_constants.AT_BOUNDARY: out(r'\b') - elif args == sre_constants.AT_NON_BOUNDARY: out(r'\B') - elif args == sre_constants.AT_END_STRING: out(r'\Z') - else: raise ValueError('Unknown position %s' % args) - out('</span>') - - elif op == sre_constants.MAX_REPEAT: - min = args[0] - max = args[1] - if max == sre_constants.MAXREPEAT: - if min == 0: - out(_colorize_re(args[2])) - out('<span class="%s">*</span>' % STAR_TAG) - elif min == 1: - out(_colorize_re(args[2])) - out('<span class="%s">+</span>' % PLUS_TAG) - else: - out(_colorize_re(args[2])) - out('<span class="%s">{%d,}</span>' % (RNG_TAG, min)) - elif min == 0: - if max == 1: - out(_colorize_re(args[2])) - out('<span class="%s">?</span>' % QMRK_TAG) - else: - out(_colorize_re(args[2])) - out('<span class="%s">{,%d}</span>' % (RNG_TAG, max)) - elif min == max: - out(_colorize_re(args[2])) - out('<span class="%s">{%d}</span>' % (RNG_TAG, max)) - else: - out(_colorize_re(args[2])) - out('<span class="%s">{%d,%d}</span>' % (RNG_TAG, min, max)) - - elif op == sre_constants.MIN_REPEAT: - min = args[0] - max = args[1] - if max == sre_constants.MAXREPEAT: - if min == 0: - out(_colorize_re(args[2])) - out('<span class="%s">*?</span>' % STAR_TAG) - elif min == 1: - out(_colorize_re(args[2])) - out('<span class="%s">+?</span>' % PLUS_TAG) - else: - out(_colorize_re(args[2])) - out('<span class="%s">{%d,}?</span>' % (RNG_TAG, min)) - elif min == 0: - if max == 1: - out(_colorize_re(args[2])) - out('<span class="%s">??</span>' % QMRK_TAG) - else: - out(_colorize_re(args[2])) - out('<span class="%s">{,%d}?</span>' % (RNG_TAG, max)) - elif min == max: - out(_colorize_re(args[2])) - out('<span class="%s">{%d}?</span>' % (RNG_TAG, max)) - else: - out(_colorize_re(args[2])) - out('<span class="%s">{%d,%d}?</span>'%(RNG_TAG, min, max)) - - elif op == sre_constants.SUBPATTERN: - if args[0] is None: - out('<span class="%s">(?:</span>' % PAREN_TAG) - elif isinstance(args[0], (int, long)): - # This is cheating: - out('<span class="%s">(</span>' % PAREN_TAG) - else: - out('<span class="%s">(?P<</span>' % PAREN_TAG) - out('<span class="%s">%s</span>' % - (REF_TAG, plaintext_to_html(args[0]))) - out('<span class="%s">></span>' % PAREN_TAG) - out(_colorize_re(args[1], 1)) - out('<span class="%s">)</span>' % PAREN_TAG) - - elif op == sre_constants.GROUPREF: - out('<span class="%s">\\%d</span>' % (REF_TAG, args)) - - elif op == sre_constants.RANGE: - start = _colorize_re( ((sre_constants.LITERAL, args[0]),) ) - end = _colorize_re( ((sre_constants.LITERAL, args[1]),) ) - out('%s<span class="%s">-</span>%s' % (start, CHOICE_TAG, end)) - - elif op == sre_constants.NEGATE: - out('<span class="%s">^</span>' % CHOICE_TAG) - - elif op == sre_constants.ASSERT: - if args[0]: out('<span class="%s">(?=</span>' % ASSERT_TAG) - else: out('<span class="%s">(?<=</span>' % ASSERT_TAG) - out(''.join(_colorize_re(args[1], 1))) - out('<span class="%s">)</span>' % ASSERT_TAG) - - elif op == sre_constants.ASSERT_NOT: - if args[0]: out('<span class="%s">(?!</span>' % ASSERT_TAG) - else: out('<span class="%s">(?<!</span>' % ASSERT_TAG) - out(''.join(_colorize_re(args[1], 1))) - out('<span class="%s">)</span>' % ASSERT_TAG) - - elif op == sre_constants.NOT_LITERAL: - lit = _colorize_re( ((sre_constants.LITERAL, args),) ) - out('<span class="%s">[^</span>%s<span class="%s">]</span>' % - (CHOICE_TAG, lit, CHOICE_TAG)) - else: - log.error("Error colorizing regexp: unknown elt %r" % elt) - if len(tree) > 1 and not noparen: - out('<span class="%s">)</span>' % PAREN_TAG) - return u''.join(result) - -###################################################################### ## Python source colorizer ###################################################################### """ @@ -495,10 +215,6 @@ </script> ''' -import tokenize, sys, token, cgi, keyword -try: from cStringIO import StringIO -except: from StringIO import StringIO - class PythonSourceColorizer: """ A class that renders a python module's source code into HTML @@ -1152,14 +868,7 @@ else: return '%s-module.html#%s' % (self.module_name, func_name) -# if __name__=='__main__': -# s = PythonSourceColorizer('../apidoc.py', 'epydoc.apidoc').colorize() -# import codecs -# f = codecs.open('/home/edloper/public_html/color.html', 'w', 'ascii', 'xmlcharrefreplace') -# f.write(s) -# f.close() - -HDR = '''\ +_HDR = '''\ <?xml version="1.0" encoding="ascii"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> @@ -1173,12 +882,12 @@ <body bgcolor="white" text="black" link="blue" vlink="#204080" alink="#204080"> ''' -FOOT = '</body></html>' +_FOOT = '</body></html>' if __name__=='__main__': #s = PythonSourceColorizer('../apidoc.py', 'epydoc.apidoc').colorize() s = PythonSourceColorizer('/tmp/fo.py', 'epydoc.apidoc').colorize() #print s import codecs f = codecs.open('/home/edloper/public_html/color3.html', 'w', 'ascii', 'xmlcharrefreplace') - f.write(HDR+'<pre id="py-src-top" class="py-src">'+s+'</pre>'+FOOT) + f.write(_HDR+'<pre id="py-src-top" class="py-src">'+s+'</pre>'+_FOOT) f.close() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-01-29 02:43:35
|
Revision: 1670 http://epydoc.svn.sourceforge.net/epydoc/?rev=1670&view=rev Author: edloper Date: 2008-01-28 18:43:32 -0800 (Mon, 28 Jan 2008) Log Message: ----------- - (partially) fixed sourceforge bug #1845188: the <div> for a function or method should include its decorators. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html_colorize.py Modified: trunk/epydoc/src/epydoc/docwriter/html_colorize.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2008-01-29 02:21:41 UTC (rev 1669) +++ trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2008-01-29 02:43:32 UTC (rev 1670) @@ -442,6 +442,7 @@ self.lineno = 1 self.def_name = None self.def_type = None + self.has_decorators = False # Cache, used so we only need to list the target elements once # for each variable. @@ -465,6 +466,8 @@ self.out = output.write tokenize.tokenize(StringIO(self.text).readline, self.tokeneater) html = output.getvalue() + if self.has_decorators: + html = self._FIX_DECORATOR_RE.sub(r'\2\1', html) except tokenize.TokenError, ex: html = self.text @@ -654,6 +657,7 @@ ((i>0 and line[i-1][1]=='@') or (i>1 and line[i-1][0]==None and line[i-2][1] == '@'))): css_class = self.CSS_CLASSES['DECORATOR'] + self.has_decorators = True # If it's a name, try to link it. elif toktype == token.NAME: @@ -868,6 +872,14 @@ else: return '%s-module.html#%s' % (self.module_name, func_name) + #: A regexp used to move the <div> that marks the beginning of a + #: function or method to just before the decorators. + _FIX_DECORATOR_RE = re.compile( + r'((?:^<a name="L\d+"></a><tt class="py-lineno">\s*\d+</tt>' + r'\s*<tt class="py-line">(?:<tt class="py-decorator">.*|\s*</tt>|' + r'\s*<tt class="py-comment">.*)\n)+)' + r'(<a name="\w+"></a><div id="\w+-def">)', re.MULTILINE) + _HDR = '''\ <?xml version="1.0" encoding="ascii"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-14 22:21:25
|
Revision: 1716 http://epydoc.svn.sourceforge.net/epydoc/?rev=1716&view=rev Author: edloper Date: 2008-02-14 14:21:23 -0800 (Thu, 14 Feb 2008) Log Message: ----------- - If the source file is not encoded correctly, then recover as well as we can, and issue a warning. Modified Paths: -------------- trunk/epydoc/src/epydoc/docwriter/html_colorize.py Modified: trunk/epydoc/src/epydoc/docwriter/html_colorize.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2008-02-13 19:19:47 UTC (rev 1715) +++ trunk/epydoc/src/epydoc/docwriter/html_colorize.py 2008-02-14 22:21:23 UTC (rev 1716) @@ -488,6 +488,12 @@ except LookupError: coding = 'iso-8859-1' html = html.decode(coding).encode('ascii', 'xmlcharrefreplace') + except UnicodeDecodeError, e: + log.warning("Unicode error while generating syntax-highlighted " + "source code: %s (%s)" % (e, self.module_filename)) + html = html.decode(coding, 'ignore').encode( + 'ascii', 'xmlcharrefreplace') + # Call expandto. html += PYSRC_EXPANDTO_JAVASCRIPT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |