Mercurial > hg-stable
view hgext/highlight/__init__.py @ 26249:3166bcc0c538
highlight: add highlightfiles config option which takes a fileset (issue3005)
Highlight extension lacked a way to limit files by size, by extension, and/or
by any other part of file path. A good solution would be to use a fileset,
since it can check file path, extension and size (and more) in one expression.
So this change introduces such an option, highlighfiles, which takes a fileset
and on each request decides if the requested file should be highlighted.
The default "size('<5M')" is, in a way, suggested in issue3005.
checkfctx() limits the amount of work to just one file (subset kwarg in
fileset.matchctx()).
Monkey-patching works around issue4568, otherwise using filesets here while
running hgweb in directory mode would say, for example, "Abort: **.py not under
root", but this fix is very local and probably far from ideal. I suspect there
to be a way to fix this for the whole hgweb and resolve the issue, but I don't
know how to do it.
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Wed, 16 Sep 2015 22:30:36 +0800 |
parents | 85fb416f2fa7 |
children | e7cb19b1ef2b |
line wrap: on
line source
# 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 # GNU General Public License version 2 or any later version. # # The original module was split in an interface and an implementation # file to defer pygments loading and speedup extension setup. """syntax highlighting for hgweb (requires Pygments) It depends on the Pygments syntax highlighting library: http://pygments.org/ There are two configuration options:: [web] pygments_style = <style> (default: colorful) highlightfiles = <fileset> (default: size('<5M')) """ import highlight from mercurial.hgweb import webcommands, webutil, common from mercurial import extensions, encoding, fileset # Note for extension authors: ONLY specify testedwith = 'internal' for # 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. testedwith = 'internal' def checkfctx(fctx, expr): ctx = fctx.changectx() tree = fileset.parse(expr) mctx = fileset.matchctx(ctx, subset=[fctx.path()], status=None) repo = ctx.repo() # To allow matching file names in the fileset in hgweb directory mode. # See issue4568. object.__setattr__(repo, 'getcwd', lambda: repo.root) return fctx.path() in fileset.getset(mctx, tree) def filerevision_highlight(orig, web, req, tmpl, fctx): mt = ''.join(tmpl('mimetype', encoding=encoding.encoding)) # 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 if 'html' in mt: style = web.config('web', 'pygments_style', 'colorful') expr = web.config('web', 'highlightfiles', "size('<5M')") if checkfctx(fctx, expr): highlight.pygmentize('fileline', fctx, style, tmpl) return orig(web, req, tmpl, fctx) def annotate_highlight(orig, web, req, tmpl): mt = ''.join(tmpl('mimetype', encoding=encoding.encoding)) if 'html' in mt: fctx = webutil.filectx(web.repo, req) style = web.config('web', 'pygments_style', 'colorful') expr = web.config('web', 'highlightfiles', "size('<5M')") if checkfctx(fctx, expr): highlight.pygmentize('annotateline', fctx, style, tmpl) return orig(web, req, tmpl) def generate_css(web, req, tmpl): pg_style = web.config('web', 'pygments_style', 'colorful') fmter = highlight.HtmlFormatter(style=pg_style) req.respond(common.HTTP_OK, 'text/css') return ['/* pygments_style = %s */\n\n' % pg_style, fmter.get_style_defs('')] def extsetup(): # monkeypatch in the new version extensions.wrapfunction(webcommands, '_filerevision', filerevision_highlight) extensions.wrapfunction(webcommands, 'annotate', annotate_highlight) webcommands.highlightcss = generate_css webcommands.__all__.append('highlightcss')