diff pylons_app/lib/helpers.py @ 250:be4621c6de58

Pygments code coloring rewrite, annotation was moved to vcs whitch had much better lib for that. Fixed code recognition based on mimetypes of filenodes, for better coloring.
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 04 Jun 2010 00:23:55 +0200
parents ea893ffb7f00
children 6ada8c223374
line wrap: on
line diff
--- a/pylons_app/lib/helpers.py	Thu Jun 03 21:13:05 2010 +0200
+++ b/pylons_app/lib/helpers.py	Fri Jun 04 00:23:55 2010 +0200
@@ -3,30 +3,26 @@
 Consists of functions to typically be used within templates, but also
 available to Controllers. This module is available to both as 'h'.
 """
+from pygments.formatters import HtmlFormatter
+from pygments import highlight as code_highlight
 from pylons import url, app_globals as g
 from pylons.i18n.translation import _, ungettext
-from webhelpers.html import (literal, HTML, escape)
+from vcs.utils.annotate import annotate_highlight
+from webhelpers.html import literal, HTML, escape
 from webhelpers.html.builder import make_tag
-from webhelpers.html.tools import (auto_link, button_to, highlight, js_obfuscate
-                                   , mail_to, strip_links, strip_tags, tag_re)
-from webhelpers.html.tags import (auto_discovery_link, checkbox, css_classes,
-                                  end_form, file, form, hidden, image,
-                                  javascript_link, link_to, link_to_if,
-                                  link_to_unless, ol, required_legend,
-                                  select, stylesheet_link,
-                                  submit, text, password, textarea, title,
-                                  ul, xml_declaration)
-from webhelpers.text import (chop_at, collapse, convert_accented_entities,
-                             convert_misc_entities, lchop, plural, rchop,
-                             remove_formatting, replace_whitespace, urlify)
-from webhelpers.number import (format_byte_size, format_bit_size)
+from webhelpers.html.tags import auto_discovery_link, checkbox, css_classes, \
+    end_form, file, form, hidden, image, javascript_link, link_to, link_to_if, \
+    link_to_unless, ol, required_legend, select, stylesheet_link, submit, text, \
+    password, textarea, title, ul, xml_declaration
+from webhelpers.html.tools import auto_link, button_to, highlight, js_obfuscate, \
+    mail_to, strip_links, strip_tags, tag_re
+from webhelpers.number import format_byte_size, format_bit_size
 from webhelpers.pylonslib import Flash as _Flash
 from webhelpers.pylonslib.secure_form import secure_form
+from webhelpers.text import chop_at, collapse, convert_accented_entities, \
+    convert_misc_entities, lchop, plural, rchop, remove_formatting, \
+    replace_whitespace, urlify
 
-from pygments import highlight
-from pygments.formatters import HtmlFormatter
-from pygments.lexers import guess_lexer
-from pygments.lexers import get_lexer_by_name
 
 #Custom helper here :)
 class _Link(object):
@@ -62,48 +58,23 @@
 
         return literal(' / '.join(url_l))
 
-def pygmentize(code, **kwargs):
+def pygmentize(filenode, **kwargs):
     """
-    Filter for chunks of html to replace code tags with pygmented code
+    pygmentize function using pygments
+    @param filenode:
     """
-    code = code.splitlines()
-    _html, _html2 = [], []   
-    _html.append("""<table class="code-highlighttable">""")
-    _html.append("""<tr>""")
-    _html.append("""<td class="linenos">""")
-    _html.append("""<div class="linenodiv">""")
-    _html.append("""<pre>""")
-    for cnt, code in enumerate(code, 1):
-        #generete lines nos
-        _html.append("""<a id="A%s" href="#A%s">%s</a>\n""" \
-                     % (cnt, cnt, cnt))
-        #propagate second list with code
-        _html2.append("""%s""" % (highlight(code, get_lexer_by_name('python'),
-                                       HtmlFormatter(nowrap=True))))        
-    _html.append("""</pre>""")
-    _html.append("""</div>""")
-    _html.append("""</td>""")
-    _html.append("""<td class="code">""")
-    _html.append("""<div class="code-highlight">""")
-    _html.append("""<pre>""")
-    _html.extend(_html2)
-    _html.append("""</pre>""")
-    _html.append("""</div>""")
-    _html.append("""</td>""")
-    _html.append("""</tr>""")
-    _html.append("""</table>""")
-    return literal(''.join(_html))    
-    #return literal(highlight(code, get_lexer_by_name('python'), HtmlFormatter(**kwargs)))
+    return literal(code_highlight(filenode.content, filenode.lexer, HtmlFormatter(**kwargs)))
 
-def pygmentize_annotation(annotate_list, repo_name):
+def pygmentize_annotation(filenode, **kwargs):
     """
-    Generate a dict of
-    @param annotate_lists:
+    pygmentize function for annotation
+    @param filenode:
     """
-    import random
+    
     color_dict = g.changeset_annotation_colors
     def gen_color():
-            return [str(random.randrange(0, 255)) for _ in xrange(3)]
+        import random
+        return [str(random.randrange(10, 235)) for _ in xrange(3)]
     def get_color_string(cs):
         if color_dict.has_key(cs):
             col = color_dict[cs]
@@ -111,46 +82,15 @@
             color_dict[cs] = gen_color()
             col = color_dict[cs]
         return "color: rgb(%s) ! important;" % (','.join(col))
-    _html, _html2, _html3 = [], [], []   
-    _html.append("""<table class="code-highlighttable">""")
-    _html.append("""<tr>""")
-    _html.append("""<td class="linenos">""")
-    _html.append("""<div class="linenodiv">""")
-    _html.append("""<pre>""")
-    for line in annotate_list:
-        #lines
-        _html.append("""<a id="A%s" href="#S%s">%s</a>\n""" \
-                     % (line[0], line[0], line[0]))
-        #annotation tags
-        _html2.append("""%s\n""" % link_to(line[1].raw_id,
-        url('changeset_home', repo_name=repo_name, revision=line[1].raw_id),
-        title=_('author') + ':%s rev:%s %s' % (line[1].author, line[1].revision,
-                                                line[1].message,),
-        style=get_color_string(line[1].raw_id)))
-        #code formated with pygments
-        _html3.append("""%s""" % (highlight(line[2], get_lexer_by_name('python')
-                                            , HtmlFormatter(nowrap=True))))        
-    _html.append("""</pre>""")
-    _html.append("""</div>""")
-    _html.append("""</td>""")
-    _html.append("""<td class="linenos">""")
-    _html.append("""<div class="linenodiv">""")                            
-    _html.append("""<pre>""")
-    _html.extend(_html2)
-    _html.append("""</pre>""")
-    _html.append("""</div>""")
-    _html.append("""</td>""")
-    _html.append("""<td class="code">""")
-    _html.append("""<div class="code-highlight">""")
-    _html.append("""<pre>""")
-    _html.extend(_html3)
-    _html.append("""</pre>""")
-    _html.append("""</div>""")
-    _html.append("""</td>""")
-    _html.append("""</tr>""")
-    _html.append("""</table>""")
-    return literal(''.join(_html))
-
+        
+    def url_func(changeset):
+        return '%s\n' % (link_to(changeset.raw_id,
+        url('changeset_home', repo_name='test', revision=changeset.raw_id),
+        title=_('author') + ':%s rev:%s %s' % (changeset.author, changeset.revision,
+                                                changeset.message,),
+        style=get_color_string(changeset.raw_id)))
+           
+    return literal(annotate_highlight(filenode, url_func, **kwargs))
 
 files_breadcrumbs = _FilesBreadCrumbs()
 link = _Link()