hgext/highlight/__init__.py
author Yuya Nishihara <yuya@tcha.org>
Tue, 16 Oct 2018 07:52:56 +0200
changeset 40356 756e9b1084fd
parent 38688 2570dca0f21c
child 41068 28a4fb793ba1
permissions -rw-r--r--
py3: import StringIO from test utility to test-commandserver.t
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8251
7fc30044b514 highlight: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 7216
diff changeset
     1
# highlight - syntax highlighting in hgweb, based on Pygments
7fc30044b514 highlight: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 7216
diff changeset
     2
#
7fc30044b514 highlight: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 7216
diff changeset
     3
#  Copyright 2008, 2009 Patrick Mezard <pmezard@gmail.com> and others
7fc30044b514 highlight: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 7216
diff changeset
     4
#
7fc30044b514 highlight: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 7216
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9409
diff changeset
     6
# GNU General Public License version 2 or any later version.
8251
7fc30044b514 highlight: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 7216
diff changeset
     7
#
7fc30044b514 highlight: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 7216
diff changeset
     8
# The original module was split in an interface and an implementation
7fc30044b514 highlight: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 7216
diff changeset
     9
# file to defer pygments loading and speedup extension setup.
7fc30044b514 highlight: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 7216
diff changeset
    10
8932
f87884329419 extensions: fix up description lines some more
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8894
diff changeset
    11
"""syntax highlighting for hgweb (requires Pygments)
6938
ce94b3236ea4 highlight: split code to improve startup times
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    12
9262
917e1d5674d6 highlight: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9210
diff changeset
    13
It depends on the Pygments syntax highlighting library:
917e1d5674d6 highlight: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9210
diff changeset
    14
http://pygments.org/
6938
ce94b3236ea4 highlight: split code to improve startup times
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    15
26680
7a3f6490ef97 highlight: add option to prevent content-only based fallback
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26679
diff changeset
    16
There are the following configuration options::
6938
ce94b3236ea4 highlight: split code to improve startup times
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    17
9210
2667ca525b59 highlight: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9064
diff changeset
    18
  [web]
26249
3166bcc0c538 highlight: add highlightfiles config option which takes a fileset (issue3005)
Anton Shestakov <av6@dwimlabs.net>
parents: 25602
diff changeset
    19
  pygments_style = <style> (default: colorful)
3166bcc0c538 highlight: add highlightfiles config option which takes a fileset (issue3005)
Anton Shestakov <av6@dwimlabs.net>
parents: 25602
diff changeset
    20
  highlightfiles = <fileset> (default: size('<5M'))
26680
7a3f6490ef97 highlight: add option to prevent content-only based fallback
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26679
diff changeset
    21
  highlightonlymatchfilename = <bool> (default False)
7a3f6490ef97 highlight: add option to prevent content-only based fallback
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26679
diff changeset
    22
7a3f6490ef97 highlight: add option to prevent content-only based fallback
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26679
diff changeset
    23
``highlightonlymatchfilename`` will only highlight files if their type could
7a3f6490ef97 highlight: add option to prevent content-only based fallback
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26679
diff changeset
    24
be identified by their filename. When this is not enabled (the default),
7a3f6490ef97 highlight: add option to prevent content-only based fallback
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26679
diff changeset
    25
Pygments will try very hard to identify the file type from content and any
7a3f6490ef97 highlight: add option to prevent content-only based fallback
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26679
diff changeset
    26
match (even matches with a low confidence score) will be used.
6938
ce94b3236ea4 highlight: split code to improve startup times
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    27
"""
ce94b3236ea4 highlight: split code to improve startup times
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    28
29485
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    29
from __future__ import absolute_import
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    30
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    31
from . import highlight
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    32
from mercurial.hgweb import (
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    33
    webcommands,
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    34
    webutil,
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    35
)
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    36
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    37
from mercurial import (
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    38
    extensions,
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    39
)
6a98f9408a50 py3: make files use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26680
diff changeset
    40
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29485
diff changeset
    41
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 19872
diff changeset
    42
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 19872
diff changeset
    43
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 19872
diff changeset
    44
# leave the attribute unspecified.
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29485
diff changeset
    45
testedwith = 'ships-with-hg-core'
6938
ce94b3236ea4 highlight: split code to improve startup times
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    46
26679
0d93df4d1e44 highlight: inline checkfctx()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26678
diff changeset
    47
def pygmentize(web, field, fctx, tmpl):
0d93df4d1e44 highlight: inline checkfctx()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26678
diff changeset
    48
    style = web.config('web', 'pygments_style', 'colorful')
0d93df4d1e44 highlight: inline checkfctx()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26678
diff changeset
    49
    expr = web.config('web', 'highlightfiles', "size('<5M')")
26680
7a3f6490ef97 highlight: add option to prevent content-only based fallback
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26679
diff changeset
    50
    filenameonly = web.configbool('web', 'highlightonlymatchfilename', False)
26679
0d93df4d1e44 highlight: inline checkfctx()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26678
diff changeset
    51
26249
3166bcc0c538 highlight: add highlightfiles config option which takes a fileset (issue3005)
Anton Shestakov <av6@dwimlabs.net>
parents: 25602
diff changeset
    52
    ctx = fctx.changectx()
38688
2570dca0f21c highlight: use matcher API to test if file should be pygmentized
Yuya Nishihara <yuya@tcha.org>
parents: 37018
diff changeset
    53
    m = ctx.matchfileset(expr)
2570dca0f21c highlight: use matcher API to test if file should be pygmentized
Yuya Nishihara <yuya@tcha.org>
parents: 37018
diff changeset
    54
    if m(fctx.path()):
26680
7a3f6490ef97 highlight: add option to prevent content-only based fallback
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26679
diff changeset
    55
        highlight.pygmentize(field, fctx, style, tmpl,
7a3f6490ef97 highlight: add option to prevent content-only based fallback
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26679
diff changeset
    56
                guessfilenameonly=filenameonly)
26678
613d850cce53 highlight: consolidate duplicate code
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26295
diff changeset
    57
36887
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
    58
def filerevision_highlight(orig, web, fctx):
37018
3e74d3cc500f highlight: peek Content-Type header set by hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 36887
diff changeset
    59
    mt = web.res.headers['Content-Type']
6987
d09e813b21e3 highlight: only pygmentize for HTML mimetypes
Rocco Rutte <pdmef@gmx.net>
parents: 6938
diff changeset
    60
    # only pygmentize for mimetype containing 'html' so we both match
d09e813b21e3 highlight: only pygmentize for HTML mimetypes
Rocco Rutte <pdmef@gmx.net>
parents: 6938
diff changeset
    61
    # 'text/html' and possibly 'application/xhtml+xml' in the future
d09e813b21e3 highlight: only pygmentize for HTML mimetypes
Rocco Rutte <pdmef@gmx.net>
parents: 6938
diff changeset
    62
    # so that we don't have to touch the extension when the mimetype
d09e813b21e3 highlight: only pygmentize for HTML mimetypes
Rocco Rutte <pdmef@gmx.net>
parents: 6938
diff changeset
    63
    # for a template changes; also hgweb optimizes the case that a
d09e813b21e3 highlight: only pygmentize for HTML mimetypes
Rocco Rutte <pdmef@gmx.net>
parents: 6938
diff changeset
    64
    # raw file is sent using rawfile() and doesn't call us, so we
d09e813b21e3 highlight: only pygmentize for HTML mimetypes
Rocco Rutte <pdmef@gmx.net>
parents: 6938
diff changeset
    65
    # can't clash with the file's content-type here in case we
d09e813b21e3 highlight: only pygmentize for HTML mimetypes
Rocco Rutte <pdmef@gmx.net>
parents: 6938
diff changeset
    66
    # pygmentize a html file
d09e813b21e3 highlight: only pygmentize for HTML mimetypes
Rocco Rutte <pdmef@gmx.net>
parents: 6938
diff changeset
    67
    if 'html' in mt:
36884
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36880
diff changeset
    68
        pygmentize(web, 'fileline', fctx, web.tmpl)
26678
613d850cce53 highlight: consolidate duplicate code
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26295
diff changeset
    69
36887
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
    70
    return orig(web, fctx)
6938
ce94b3236ea4 highlight: split code to improve startup times
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    71
36887
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
    72
def annotate_highlight(orig, web):
37018
3e74d3cc500f highlight: peek Content-Type header set by hgweb
Yuya Nishihara <yuya@tcha.org>
parents: 36887
diff changeset
    73
    mt = web.res.headers['Content-Type']
6987
d09e813b21e3 highlight: only pygmentize for HTML mimetypes
Rocco Rutte <pdmef@gmx.net>
parents: 6938
diff changeset
    74
    if 'html' in mt:
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36884
diff changeset
    75
        fctx = webutil.filectx(web.repo, web.req)
36884
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36880
diff changeset
    76
        pygmentize(web, 'annotateline', fctx, web.tmpl)
26678
613d850cce53 highlight: consolidate duplicate code
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26295
diff changeset
    77
36887
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
    78
    return orig(web)
6938
ce94b3236ea4 highlight: split code to improve startup times
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    79
36887
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
    80
def generate_css(web):
6938
ce94b3236ea4 highlight: split code to improve startup times
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    81
    pg_style = web.config('web', 'pygments_style', 'colorful')
19872
681f7b9213a4 check-code: check for spaces around = for named parameters
Mads Kiilerich <madski@unity3d.com>
parents: 16743
diff changeset
    82
    fmter = highlight.HtmlFormatter(style=pg_style)
36871
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29841
diff changeset
    83
    web.res.headers['Content-Type'] = 'text/css'
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29841
diff changeset
    84
    web.res.setbodybytes(''.join([
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29841
diff changeset
    85
        '/* pygments_style = %s */\n\n' % pg_style,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29841
diff changeset
    86
        fmter.get_style_defs(''),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29841
diff changeset
    87
    ]))
36880
67fb0dca29bc hgweb: always return iterable from @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
    88
    return web.res.sendresponse()
6938
ce94b3236ea4 highlight: split code to improve startup times
Patrick Mezard <pmezard@gmail.com>
parents:
diff changeset
    89
9409
57157a224037 highlight: move code from module top-level into extsetup
Martin Geisler <mg@lazybytes.net>
parents: 9262
diff changeset
    90
def extsetup():
57157a224037 highlight: move code from module top-level into extsetup
Martin Geisler <mg@lazybytes.net>
parents: 9262
diff changeset
    91
    # monkeypatch in the new version
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 10263
diff changeset
    92
    extensions.wrapfunction(webcommands, '_filerevision',
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 10263
diff changeset
    93
                            filerevision_highlight)
9409
57157a224037 highlight: move code from module top-level into extsetup
Martin Geisler <mg@lazybytes.net>
parents: 9262
diff changeset
    94
    extensions.wrapfunction(webcommands, 'annotate', annotate_highlight)
57157a224037 highlight: move code from module top-level into extsetup
Martin Geisler <mg@lazybytes.net>
parents: 9262
diff changeset
    95
    webcommands.highlightcss = generate_css
57157a224037 highlight: move code from module top-level into extsetup
Martin Geisler <mg@lazybytes.net>
parents: 9262
diff changeset
    96
    webcommands.__all__.append('highlightcss')