Changeset - ea893ffb7f00
[Not reviewed]
default
0 2 0
Marcin Kuzminski - 15 years ago 2010-05-21 02:07:49
marcin@python-works.com
implemented pygmentize codes into webhelpers. Together with color_dict caching into pylons globals
2 files changed with 89 insertions and 25 deletions:
0 comments (0 inline, 0 general)
pylons_app/lib/app_globals.py
Show inline comments
 
@@ -21,3 +21,4 @@ class Globals(object):
 
        self.baseui = make_ui('hgwebdir.config')
 
        self.paths = self.baseui.configitems('paths')
 
        self.base_path = self.paths[0][1].replace('*', '')
 
        self.changeset_annotation_colors = {}
pylons_app/lib/helpers.py
Show inline comments
 
@@ -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.html.tags import (auto_d
 
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 @@ class _GetError(object):
 
        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 @@ class _FilesBreadCrumbs(object):
 
        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()
0 comments (0 inline, 0 general)