##// END OF EJS Templates
hgk: fix parent breakage
hgk: fix parent breakage

File last commit:

r6666:53465a74 default
r6768:e3bb0053 default
Show More
highlight.py
98 lines | 3.0 KiB | text/x-python | PythonLexer
Dirkjan Ochtman
convert comments to docstrings in a bunch of extensions
r6666 """a mercurial extension for syntax highlighting in hgweb
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532
It depends on the pygments syntax highlighting library:
http://pygments.org/
To enable the extension add this to hgrc:
[extensions]
hgext.highlight =
There is a single configuration option:
[web]
pygments_style = <style>
Isaac Jurado
highlight: Generate pygments style sheet dynamically...
r6485 The default is 'colorful'.
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532
-- Adam Hupp <adam@hupp.org>
"""
from mercurial import demandimport
Dirkjan Ochtman
highlight: some small cleanups
r6394 demandimport.ignore.extend(['pkgutil', 'pkg_resources', '__main__',])
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532
Isaac Jurado
highlight: Generate pygments style sheet dynamically...
r6485 from mercurial.hgweb import webcommands, webutil, common
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532 from mercurial import util
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193 from mercurial.templatefilters import filters
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532
from pygments import highlight
from pygments.util import ClassNotFound
Brendan Cully
highlight: forgot import
r6199 from pygments.lexers import guess_lexer, guess_lexer_for_filename, TextLexer
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532 from pygments.formatters import HtmlFormatter
Isaac Jurado
highlight: Generate pygments style sheet dynamically...
r6485 SYNTAX_CSS = ('\n<link rel="stylesheet" href="{url}highlightcss" '
Bryan O'Sullivan
highlight: clean up coding style a little
r5533 'type="text/css" />')
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532
Dirkjan Ochtman
highlight: some small cleanups
r6394 def pygmentize(field, fctx, style, tmpl):
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532 # append a <link ...> to the syntax highlighting css
Christian Ebert
highlight: adapt to hgweb_mode refactoring
r5616 old_header = ''.join(tmpl('header'))
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532 if SYNTAX_CSS not in old_header:
new_header = old_header + SYNTAX_CSS
Christian Ebert
highlight: adapt to hgweb_mode refactoring
r5616 tmpl.cache['header'] = new_header
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532
Brendan Cully
highlight: bail out if file is binary
r6194 text = fctx.data()
if util.binary(text):
return
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193 # To get multi-line strings right, we can't format line-by-line
try:
Brendan Cully
Truncate input to 1K when using pygments guess_lexer....
r6662 lexer = guess_lexer_for_filename(fctx.path(), text[:1024],
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193 encoding=util._encoding)
Benoit Allard
highlight: backward compatibility with pygments 0.5.1
r6494 except (ClassNotFound, ValueError):
Brendan Cully
highlight: guess by text when path name is ambiguous...
r6198 try:
Brendan Cully
Truncate input to 1K when using pygments guess_lexer....
r6662 lexer = guess_lexer(text[:1024], encoding=util._encoding)
Benoit Allard
highlight: backward compatibility with pygments 0.5.1
r6494 except (ClassNotFound, ValueError):
Brendan Cully
highlight: guess by text when path name is ambiguous...
r6198 lexer = TextLexer(encoding=util._encoding)
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193
formatter = HtmlFormatter(style=style, encoding=util._encoding)
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193 colorized = highlight(text, lexer, formatter)
# strip wrapping div
colorized = colorized[:colorized.find('\n</pre>')]
Brendan Cully
highlight: make div trimmer work when lexer fails to identify text....
r6197 colorized = colorized[colorized.find('<pre>')+5:]
Brendan Cully
highlight: use iter() instead of generator comprehension
r6196 coloriter = iter(colorized.splitlines())
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193
filters['colorize'] = lambda x: coloriter.next()
oldl = tmpl.cache[field]
newl = oldl.replace('line|escape', 'line|colorize')
tmpl.cache[field] = newl
Dirkjan Ochtman
hgweb: refactor hgweb code
r6393 web_filerevision = webcommands._filerevision
web_annotate = webcommands.annotate
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193
Dirkjan Ochtman
hgweb: refactor hgweb code
r6393 def filerevision_highlight(web, tmpl, fctx):
Dirkjan Ochtman
highlight: some small cleanups
r6394 style = web.config('web', 'pygments_style', 'colorful')
pygmentize('fileline', fctx, style, tmpl)
Dirkjan Ochtman
hgweb: refactor hgweb code
r6393 return web_filerevision(web, tmpl, fctx)
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193
Dirkjan Ochtman
hgweb: refactor hgweb code
r6393 def annotate_highlight(web, req, tmpl):
fctx = webutil.filectx(web.repo, req)
Dirkjan Ochtman
highlight: some small cleanups
r6394 style = web.config('web', 'pygments_style', 'colorful')
pygmentize('annotateline', fctx, style, tmpl)
Dirkjan Ochtman
hgweb: refactor hgweb code
r6393 return web_annotate(web, req, tmpl)
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193
Isaac Jurado
highlight: Generate pygments style sheet dynamically...
r6485 def generate_css(web, req, tmpl):
pg_style = web.config('web', 'pygments_style', 'colorful')
fmter = HtmlFormatter(style = pg_style)
req.respond(common.HTTP_OK, 'text/css')
return ['/* pygments_style = %s */\n\n' % pg_style, fmter.get_style_defs('')]
Bryan O'Sullivan
highlight: clean up coding style a little
r5533
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532 # monkeypatch in the new version
Dirkjan Ochtman
hgweb: refactor hgweb code
r6393
webcommands._filerevision = filerevision_highlight
webcommands.annotate = annotate_highlight
Isaac Jurado
highlight: Generate pygments style sheet dynamically...
r6485 webcommands.highlightcss = generate_css
webcommands.__all__.append('highlightcss')