Changeset - be4621c6de58
[Not reviewed]
default
0 3 0
Marcin Kuzminski - 15 years ago 2010-06-04 00:23:55
marcin@python-works.com
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.
3 files changed with 35 insertions and 95 deletions:
0 comments (0 inline, 0 general)
pylons_app/lib/helpers.py
Show inline comments
 
@@ -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 @@ class _FilesBreadCrumbs(object):
 

	
 
        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 @@ def pygmentize_annotation(annotate_list,
 
            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()
pylons_app/templates/files/files_annotate.html
Show inline comments
 
@@ -37,7 +37,7 @@
 
				<div class="commit" style="font-size:70%">"${c.file_msg}"</div>
 
			</div>
 
			<div class="code-body">
 
				${h.pygmentize_annotation(c.annotate,c.repo_name)}
 
				${h.pygmentize_annotation(c.file,linenos=True,anchorlinenos=True,lineanchors='S',cssclass="code-highlight")}
 
			</div>
 
		</div>
 
	</div>
pylons_app/templates/files/files_source.html
Show inline comments
 
@@ -23,6 +23,6 @@
 
		<div class="commit" style="font-size:70%">"${c.file_msg}"</div>
 
	</div>
 
	<div class="code-body">
 
		${h.pygmentize(c.files_list.content,linenos=True,anchorlinenos=True,cssclass="code-highlight")}
 
		${h.pygmentize(c.files_list,linenos=True,anchorlinenos=True,lineanchors='S',cssclass="code-highlight")}
 
	</div>
 
</div>
 
\ No newline at end of file
0 comments (0 inline, 0 general)