author | Patrick Mezard <pmezard@gmail.com> |
Sun, 30 Mar 2008 20:18:40 +0200 | |
changeset 6405 | b8346ae5d64b |
parent 6212 | e75aab656f46 |
child 6393 | 894875eae49b |
child 6494 | c30849d4c8ba |
permissions | -rw-r--r-- |
5532
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
1 |
""" |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
2 |
This is Mercurial extension for syntax highlighting in the file |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
3 |
revision view of hgweb. |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
4 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
5 |
It depends on the pygments syntax highlighting library: |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
6 |
http://pygments.org/ |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
7 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
8 |
To enable the extension add this to hgrc: |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
9 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
10 |
[extensions] |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
11 |
hgext.highlight = |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
12 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
13 |
There is a single configuration option: |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
14 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
15 |
[web] |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
16 |
pygments_style = <style> |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
17 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
18 |
The default is 'colorful'. If this is changed the corresponding CSS |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
19 |
file should be re-generated by running |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
20 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
21 |
# pygmentize -f html -S <newstyle> |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
22 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
23 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
24 |
-- Adam Hupp <adam@hupp.org> |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
25 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
26 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
27 |
""" |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
28 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
29 |
from mercurial import demandimport |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
30 |
demandimport.ignore.extend(['pkgutil', |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
31 |
'pkg_resources', |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
32 |
'__main__',]) |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
33 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
34 |
from mercurial.hgweb.hgweb_mod import hgweb |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
35 |
from mercurial import util |
6193
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
36 |
from mercurial.templatefilters import filters |
5532
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
37 |
|
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
38 |
from pygments import highlight |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
39 |
from pygments.util import ClassNotFound |
6199
0068809347d7
highlight: forgot import
Brendan Cully <brendan@kublai.com>
parents:
6198
diff
changeset
|
40 |
from pygments.lexers import guess_lexer, guess_lexer_for_filename, TextLexer |
5532
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
41 |
from pygments.formatters import HtmlFormatter |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
42 |
|
5533
6cf7d7fe7d3d
highlight: clean up coding style a little
Bryan O'Sullivan <bos@serpentine.com>
parents:
5532
diff
changeset
|
43 |
SYNTAX_CSS = ('\n<link rel="stylesheet" href="#staticurl#highlight.css" ' |
6cf7d7fe7d3d
highlight: clean up coding style a little
Bryan O'Sullivan <bos@serpentine.com>
parents:
5532
diff
changeset
|
44 |
'type="text/css" />') |
5532
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
45 |
|
6193
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
46 |
def pygmentize(self, tmpl, fctx, field): |
5532
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
47 |
# append a <link ...> to the syntax highlighting css |
5616
88ca3e0fb6e5
highlight: adapt to hgweb_mode refactoring
Christian Ebert <blacktrash@gmx.net>
parents:
5533
diff
changeset
|
48 |
old_header = ''.join(tmpl('header')) |
5532
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
49 |
if SYNTAX_CSS not in old_header: |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
50 |
new_header = old_header + SYNTAX_CSS |
5616
88ca3e0fb6e5
highlight: adapt to hgweb_mode refactoring
Christian Ebert <blacktrash@gmx.net>
parents:
5533
diff
changeset
|
51 |
tmpl.cache['header'] = new_header |
5532
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
52 |
|
6194
fe54e7501de1
highlight: bail out if file is binary
Brendan Cully <brendan@kublai.com>
parents:
6193
diff
changeset
|
53 |
text = fctx.data() |
fe54e7501de1
highlight: bail out if file is binary
Brendan Cully <brendan@kublai.com>
parents:
6193
diff
changeset
|
54 |
if util.binary(text): |
fe54e7501de1
highlight: bail out if file is binary
Brendan Cully <brendan@kublai.com>
parents:
6193
diff
changeset
|
55 |
return |
fe54e7501de1
highlight: bail out if file is binary
Brendan Cully <brendan@kublai.com>
parents:
6193
diff
changeset
|
56 |
|
6193
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
57 |
style = self.config("web", "pygments_style", "colorful") |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
58 |
# To get multi-line strings right, we can't format line-by-line |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
59 |
try: |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
60 |
lexer = guess_lexer_for_filename(fctx.path(), text, |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
61 |
encoding=util._encoding) |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
62 |
except ClassNotFound: |
6198
358cc9cf54db
highlight: guess by text when path name is ambiguous
Brendan Cully <brendan@kublai.com>
parents:
6197
diff
changeset
|
63 |
try: |
358cc9cf54db
highlight: guess by text when path name is ambiguous
Brendan Cully <brendan@kublai.com>
parents:
6197
diff
changeset
|
64 |
lexer = guess_lexer(text, encoding=util._encoding) |
358cc9cf54db
highlight: guess by text when path name is ambiguous
Brendan Cully <brendan@kublai.com>
parents:
6197
diff
changeset
|
65 |
except ClassNotFound: |
358cc9cf54db
highlight: guess by text when path name is ambiguous
Brendan Cully <brendan@kublai.com>
parents:
6197
diff
changeset
|
66 |
lexer = TextLexer(encoding=util._encoding) |
6193
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
67 |
|
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
68 |
formatter = HtmlFormatter(style=style, encoding=util._encoding) |
5532
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
69 |
|
6193
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
70 |
colorized = highlight(text, lexer, formatter) |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
71 |
# strip wrapping div |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
72 |
colorized = colorized[:colorized.find('\n</pre>')] |
6197
f6565f7d9489
highlight: make div trimmer work when lexer fails to identify text.
Brendan Cully <brendan@kublai.com>
parents:
6196
diff
changeset
|
73 |
colorized = colorized[colorized.find('<pre>')+5:] |
6196
fc9535ae6fe2
highlight: use iter() instead of generator comprehension
Brendan Cully <brendan@kublai.com>
parents:
6194
diff
changeset
|
74 |
coloriter = iter(colorized.splitlines()) |
6193
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
75 |
|
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
76 |
filters['colorize'] = lambda x: coloriter.next() |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
77 |
|
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
78 |
oldl = tmpl.cache[field] |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
79 |
newl = oldl.replace('line|escape', 'line|colorize') |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
80 |
tmpl.cache[field] = newl |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
81 |
|
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
82 |
def filerevision_highlight(self, tmpl, fctx): |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
83 |
pygmentize(self, tmpl, fctx, 'fileline') |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
84 |
|
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
85 |
return realrevision(self, tmpl, fctx) |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
86 |
|
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
87 |
def fileannotate_highlight(self, tmpl, fctx): |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
88 |
pygmentize(self, tmpl, fctx, 'annotateline') |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
89 |
|
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
90 |
return realannotate(self, tmpl, fctx) |
5533
6cf7d7fe7d3d
highlight: clean up coding style a little
Bryan O'Sullivan <bos@serpentine.com>
parents:
5532
diff
changeset
|
91 |
|
5532
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
92 |
# monkeypatch in the new version |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
93 |
# should be safer than overriding the method in a derived class |
40a06e39f010
extension for synax highlighting in the hgweb file revision view
Adam Hupp <adam@hupp.org>
parents:
diff
changeset
|
94 |
# and then patching the class |
6193
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
95 |
realrevision = hgweb.filerevision |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
96 |
hgweb.filerevision = filerevision_highlight |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
97 |
realannotate = hgweb.fileannotate |
2344da8eb9b4
highlight: support annotate, and reduce layering violations.
Brendan Cully <brendan@kublai.com>
parents:
5991
diff
changeset
|
98 |
hgweb.fileannotate = fileannotate_highlight |