changeset 165:ea893ffb7f00

implemented pygmentize codes into webhelpers. Together with color_dict caching into pylons globals
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 21 May 2010 02:07:49 +0200
parents 1231bbe1ab36
children 664cc7341278
files pylons_app/lib/app_globals.py pylons_app/lib/helpers.py
diffstat 2 files changed, 89 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/pylons_app/lib/app_globals.py	Wed May 19 21:33:10 2010 +0200
+++ b/pylons_app/lib/app_globals.py	Fri May 21 02:07:49 2010 +0200
@@ -21,3 +21,4 @@
         self.baseui = make_ui('hgwebdir.config')
         self.paths = self.baseui.configitems('paths')
         self.base_path = self.paths[0][1].replace('*', '')
+        self.changeset_annotation_colors = {}
--- a/pylons_app/lib/helpers.py	Wed May 19 21:33:10 2010 +0200
+++ b/pylons_app/lib/helpers.py	Fri May 21 02:07:49 2010 +0200
@@ -3,7 +3,7 @@
 Consists of functions to typically be used within templates, but also
 available to Controllers. This module is available to both as 'h'.
 """
-from pylons import url
+from pylons import url, app_globals as g
 from pylons.i18n.translation import _, ungettext
 from webhelpers.html import (literal, HTML, escape)
 from webhelpers.html.builder import make_tag
@@ -19,7 +19,7 @@
 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.pylonslib import Flash as _Flash
 from webhelpers.pylonslib.secure_form import secure_form
 
@@ -50,25 +50,6 @@
         if form_errors and form_errors.has_key(field_name):
             return literal(tmpl % form_errors.get(field_name))
 
-class _FileSizeFormat(object):
-    """
-    Formats the value like a 'human-readable' file size (i.e. 13 KB, 4.1 MB,
-    102 bytes, etc).
-    """
-    def __call__(self, bytes):
-        try:
-            bytes = float(bytes)
-        except TypeError:
-            return u"0 bytes"
-    
-        if bytes < 1024:
-            return ungettext("%(size)d byte", "%(size)d bytes", bytes) % {'size': bytes}
-        if bytes < 1024 * 1024:
-            return _("%.1f KB") % (bytes / 1024)
-        if bytes < 1024 * 1024 * 1024:
-            return _("%.1f MB") % (bytes / (1024 * 1024))
-        return _("%.1f GB") % (bytes / (1024 * 1024 * 1024))
-
 class _FilesBreadCrumbs(object):
     
     def __call__(self, repo_name, rev, paths):
@@ -82,14 +63,96 @@
         return literal(' / '.join(url_l))
 
 def pygmentize(code, **kwargs):
-    '''
+    """
     Filter for chunks of html to replace code tags with pygmented code
-    '''
-    return literal(highlight(code, guess_lexer(code), HtmlFormatter(**kwargs)))
+    """
+    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)))
+
+def pygmentize_annotation(annotate_list, repo_name):
+    """
+    Generate a dict of
+    @param annotate_lists:
+    """
+    import random
+    color_dict = g.changeset_annotation_colors
+    def gen_color():
+            return [str(random.randrange(0, 255)) for _ in xrange(3)]
+    def get_color_string(cs):
+        if color_dict.has_key(cs):
+            col = color_dict[cs]
+        else:
+            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))
 
 
 files_breadcrumbs = _FilesBreadCrumbs()
-filesizeformat = _FileSizeFormat()
 link = _Link()
 flash = _Flash()
 get_error = _GetError()