__init__.py
108 lines
| 3.5 KiB
| text/x-python
|
PythonLexer
Martin Geisler
|
r8251 | # highlight - syntax highlighting in hgweb, based on Pygments | ||
# | ||||
# Copyright 2008, 2009 Patrick Mezard <pmezard@gmail.com> and others | ||||
# | ||||
# This software may be used and distributed according to the terms of the | ||||
Matt Mackall
|
r10263 | # GNU General Public License version 2 or any later version. | ||
Martin Geisler
|
r8251 | # | ||
# The original module was split in an interface and an implementation | ||||
# file to defer pygments loading and speedup extension setup. | ||||
Dirkjan Ochtman
|
r8932 | """syntax highlighting for hgweb (requires Pygments) | ||
Patrick Mezard
|
r6938 | |||
Martin Geisler
|
r9262 | It depends on the Pygments syntax highlighting library: | ||
http://pygments.org/ | ||||
Patrick Mezard
|
r6938 | |||
Gregory Szorc
|
r26680 | There are the following configuration options:: | ||
Patrick Mezard
|
r6938 | |||
Martin Geisler
|
r9210 | [web] | ||
r26249 | pygments_style = <style> (default: colorful) | |||
highlightfiles = <fileset> (default: size('<5M')) | ||||
Gregory Szorc
|
r26680 | highlightonlymatchfilename = <bool> (default False) | ||
``highlightonlymatchfilename`` will only highlight files if their type could | ||||
be identified by their filename. When this is not enabled (the default), | ||||
Pygments will try very hard to identify the file type from content and any | ||||
match (even matches with a low confidence score) will be used. | ||||
Patrick Mezard
|
r6938 | """ | ||
Pulkit Goyal
|
r29485 | |||
from . import highlight | ||||
from mercurial.hgweb import ( | ||||
webcommands, | ||||
webutil, | ||||
) | ||||
from mercurial import ( | ||||
extensions, | ||||
Connor Sheehan
|
r43193 | pycompat, | ||
Pulkit Goyal
|
r29485 | ) | ||
Augie Fackler
|
r29841 | # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for | ||
Augie Fackler
|
r25186 | # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should | ||
# be specifying the version(s) of Mercurial they are tested with, or | ||||
# leave the attribute unspecified. | ||||
Augie Fackler
|
r43347 | testedwith = b'ships-with-hg-core' | ||
Patrick Mezard
|
r6938 | |||
Augie Fackler
|
r43346 | |||
Gregory Szorc
|
r26679 | def pygmentize(web, field, fctx, tmpl): | ||
Augie Fackler
|
r43347 | style = web.config(b'web', b'pygments_style', b'colorful') | ||
expr = web.config(b'web', b'highlightfiles', b"size('<5M')") | ||||
filenameonly = web.configbool(b'web', b'highlightonlymatchfilename', False) | ||||
Gregory Szorc
|
r26679 | |||
r26249 | ctx = fctx.changectx() | |||
Matt Harbison
|
r44461 | m = ctx.matchfileset(fctx.repo().root, expr) | ||
Yuya Nishihara
|
r38710 | if m(fctx.path()): | ||
Augie Fackler
|
r43346 | highlight.pygmentize( | ||
field, fctx, style, tmpl, guessfilenameonly=filenameonly | ||||
) | ||||
Gregory Szorc
|
r26678 | |||
Gregory Szorc
|
r36903 | def filerevision_highlight(orig, web, fctx): | ||
Augie Fackler
|
r43347 | mt = web.res.headers[b'Content-Type'] | ||
Rocco Rutte
|
r6987 | # only pygmentize for mimetype containing 'html' so we both match | ||
# 'text/html' and possibly 'application/xhtml+xml' in the future | ||||
# so that we don't have to touch the extension when the mimetype | ||||
# for a template changes; also hgweb optimizes the case that a | ||||
# raw file is sent using rawfile() and doesn't call us, so we | ||||
# can't clash with the file's content-type here in case we | ||||
# pygmentize a html file | ||||
Augie Fackler
|
r43347 | if b'html' in mt: | ||
pygmentize(web, b'fileline', fctx, web.tmpl) | ||||
Gregory Szorc
|
r26678 | |||
Gregory Szorc
|
r36903 | return orig(web, fctx) | ||
Patrick Mezard
|
r6938 | |||
Augie Fackler
|
r43346 | |||
Gregory Szorc
|
r36903 | def annotate_highlight(orig, web): | ||
Augie Fackler
|
r43347 | mt = web.res.headers[b'Content-Type'] | ||
if b'html' in mt: | ||||
Gregory Szorc
|
r36902 | fctx = webutil.filectx(web.repo, web.req) | ||
Augie Fackler
|
r43347 | pygmentize(web, b'annotateline', fctx, web.tmpl) | ||
Gregory Szorc
|
r26678 | |||
Gregory Szorc
|
r36903 | return orig(web) | ||
Patrick Mezard
|
r6938 | |||
Augie Fackler
|
r43346 | |||
Gregory Szorc
|
r36903 | def generate_css(web): | ||
Augie Fackler
|
r43347 | pg_style = web.config(b'web', b'pygments_style', b'colorful') | ||
Connor Sheehan
|
r43193 | fmter = highlight.HtmlFormatter(style=pycompat.sysstr(pg_style)) | ||
Augie Fackler
|
r43347 | web.res.headers[b'Content-Type'] = b'text/css' | ||
style_defs = fmter.get_style_defs(pycompat.sysstr(b'')) | ||||
Augie Fackler
|
r43346 | web.res.setbodybytes( | ||
Augie Fackler
|
r43347 | b''.join( | ||
Augie Fackler
|
r43346 | [ | ||
Augie Fackler
|
r43347 | b'/* pygments_style = %s */\n\n' % pg_style, | ||
Augie Fackler
|
r43346 | pycompat.bytestr(style_defs), | ||
] | ||||
) | ||||
) | ||||
Gregory Szorc
|
r36896 | return web.res.sendresponse() | ||
Patrick Mezard
|
r6938 | |||
Augie Fackler
|
r43346 | |||
Matt Harbison
|
r41098 | def extsetup(ui): | ||
Martin Geisler
|
r9409 | # monkeypatch in the new version | ||
Augie Fackler
|
r43346 | extensions.wrapfunction( | ||
r51673 | webcommands, '_filerevision', filerevision_highlight | |||
Augie Fackler
|
r43346 | ) | ||
r51673 | extensions.wrapfunction(webcommands, 'annotate', annotate_highlight) | |||
Martin Geisler
|
r9409 | webcommands.highlightcss = generate_css | ||
Augie Fackler
|
r43347 | webcommands.__all__.append(b'highlightcss') | ||