##// END OF EJS Templates
highlight: guess by text when path name is ambiguous...
highlight: guess by text when path name is ambiguous Although the docs claim that guess_lexer_for_filename will fall back to using file data, my ubuntu 7.10 pygments library seems to ignore the text argument. So call guess_lexer explicitly on failure.

File last commit:

r6198:358cc9cf default
r6198:358cc9cf default
Show More
highlight.py
103 lines | 2.9 KiB | text/x-python | PythonLexer
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532 """
This is Mercurial extension for syntax highlighting in the file
revision view of hgweb.
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>
The default is 'colorful'. If this is changed the corresponding CSS
file should be re-generated by running
# pygmentize -f html -S <newstyle>
-- Adam Hupp <adam@hupp.org>
"""
from mercurial import demandimport
demandimport.ignore.extend(['pkgutil',
'pkg_resources',
'__main__',])
import mimetypes
from mercurial.hgweb import hgweb_mod
from mercurial.hgweb.hgweb_mod import hgweb
from mercurial import util
from mercurial.hgweb.common import paritygen
from mercurial.node import hex
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
from pygments.lexers import guess_lexer_for_filename, TextLexer
from pygments.formatters import HtmlFormatter
Bryan O'Sullivan
highlight: clean up coding style a little
r5533 SYNTAX_CSS = ('\n<link rel="stylesheet" href="#staticurl#highlight.css" '
'type="text/css" />')
Adam Hupp
extension for synax highlighting in the hgweb file revision view...
r5532
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193 def pygmentize(self, tmpl, fctx, field):
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 style = self.config("web", "pygments_style", "colorful")
# To get multi-line strings right, we can't format line-by-line
try:
lexer = guess_lexer_for_filename(fctx.path(), text,
encoding=util._encoding)
except ClassNotFound:
Brendan Cully
highlight: guess by text when path name is ambiguous...
r6198 try:
lexer = guess_lexer(text, encoding=util._encoding)
except ClassNotFound:
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
def filerevision_highlight(self, tmpl, fctx):
pygmentize(self, tmpl, fctx, 'fileline')
return realrevision(self, tmpl, fctx)
def fileannotate_highlight(self, tmpl, fctx):
pygmentize(self, tmpl, fctx, 'annotateline')
return realannotate(self, tmpl, fctx)
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
# should be safer than overriding the method in a derived class
# and then patching the class
Brendan Cully
highlight: support annotate, and reduce layering violations.
r6193 realrevision = hgweb.filerevision
hgweb.filerevision = filerevision_highlight
realannotate = hgweb.fileannotate
hgweb.fileannotate = fileannotate_highlight