##// END OF EJS Templates
highlight: mandatory arguments where possible
Christian Ebert -
r5654:831e34e1 default
parent child Browse files
Show More
@@ -1,147 +1,144 b''
1 1 """
2 2 This is Mercurial extension for syntax highlighting in the file
3 3 revision view of hgweb.
4 4
5 5 It depends on the pygments syntax highlighting library:
6 6 http://pygments.org/
7 7
8 8 To enable the extension add this to hgrc:
9 9
10 10 [extensions]
11 11 hgext.highlight =
12 12
13 13 There is a single configuration option:
14 14
15 15 [web]
16 16 pygments_style = <style>
17 17
18 18 The default is 'colorful'. If this is changed the corresponding CSS
19 19 file should be re-generated by running
20 20
21 21 # pygmentize -f html -S <newstyle>
22 22
23 23
24 24 -- Adam Hupp <adam@hupp.org>
25 25
26 26
27 27 """
28 28
29 29 from mercurial import demandimport
30 30 demandimport.ignore.extend(['pkgutil',
31 31 'pkg_resources',
32 32 '__main__',])
33 33
34 34 import mimetypes
35 35
36 36 from mercurial.hgweb import hgweb_mod
37 37 from mercurial.hgweb.hgweb_mod import hgweb
38 38 from mercurial import util
39 39 from mercurial.hgweb.common import paritygen
40 40 from mercurial.node import hex
41 41
42 42 from pygments import highlight
43 43 from pygments.util import ClassNotFound
44 44 from pygments.lexers import guess_lexer_for_filename, TextLexer
45 45 from pygments.formatters import HtmlFormatter
46 46
47 47 SYNTAX_CSS = ('\n<link rel="stylesheet" href="#staticurl#highlight.css" '
48 48 'type="text/css" />')
49 49
50 50 class StripedHtmlFormatter(HtmlFormatter):
51 51 def __init__(self, stripecount, *args, **kwargs):
52 52 super(StripedHtmlFormatter, self).__init__(*args, **kwargs)
53 53 self.stripecount = stripecount
54 54
55 55 def wrap(self, source, outfile):
56 56 yield 0, "<div class='highlight'>"
57 57 yield 0, "<pre>"
58 58 parity = paritygen(self.stripecount)
59 59
60 60 for n, i in source:
61 61 if n == 1:
62 62 i = "<div class='parity%s'>%s</div>" % (parity.next(), i)
63 63 yield n, i
64 64
65 65 yield 0, "</pre>"
66 66 yield 0, "</div>"
67 67
68 68
69 def pygments_format(filename, rawtext, forcetext=False, stripecount=1,
70 style='colorful'):
69 def pygments_format(filename, rawtext, forcetext, stripecount, style):
71 70 if not forcetext:
72 71 try:
73 72 lexer = guess_lexer_for_filename(filename, rawtext)
74 73 except ClassNotFound:
75 74 lexer = TextLexer()
76 75 else:
77 76 lexer = TextLexer()
78 77
79 78 formatter = StripedHtmlFormatter(stripecount, style=style,
80 79 linenos='inline')
81 80
82 81 return highlight(rawtext, lexer, formatter)
83 82
84 83
85 84 def filerevision_pygments(self, tmpl, fctx):
86 85 """Reimplement hgweb.filerevision to use syntax highlighting"""
87 86 f = fctx.path()
88 87
89 88 rawtext = fctx.data()
90 89 text = rawtext
91 90
92 91 fl = fctx.filelog()
93 92 n = fctx.filenode()
94 93
95 94 mt = mimetypes.guess_type(f)[0]
96 95
97 96 if util.binary(text):
98 97 mt = mt or 'application/octet-stream'
99 98 text = "(binary:%s)" % mt
100 99
101 100 # don't parse (binary:...) as anything
102 101 forcetext = True
103 102 else:
104 103 mt = mt or 'text/plain'
105 104 forcetext = False
106 105
107 106 def lines(text):
108 107 for line in text.splitlines(True):
109 108 yield {"line": line}
110 109
111 110 style = self.config("web", "pygments_style", "colorful")
112 111
113 text_formatted = lines(pygments_format(f, text,
114 forcetext=forcetext,
115 stripecount=self.stripecount,
116 style=style))
112 text_formatted = lines(pygments_format(f, text, forcetext,
113 self.stripecount, style))
117 114
118 115 # override per-line template
119 116 tmpl.cache['fileline'] = '#line#'
120 117
121 118 # append a <link ...> to the syntax highlighting css
122 119 old_header = ''.join(tmpl('header'))
123 120 if SYNTAX_CSS not in old_header:
124 121 new_header = old_header + SYNTAX_CSS
125 122 tmpl.cache['header'] = new_header
126 123
127 124 yield tmpl("filerevision",
128 125 file=f,
129 126 path=hgweb_mod._up(f), # fixme: make public
130 127 text=text_formatted,
131 128 raw=rawtext,
132 129 mimetype=mt,
133 130 rev=fctx.rev(),
134 131 node=hex(fctx.node()),
135 132 author=fctx.user(),
136 133 date=fctx.date(),
137 134 desc=fctx.description(),
138 135 parent=self.siblings(fctx.parents()),
139 136 child=self.siblings(fctx.children()),
140 137 rename=self.renamelink(fl, n),
141 138 permissions=fctx.manifest().flags(f))
142 139
143 140
144 141 # monkeypatch in the new version
145 142 # should be safer than overriding the method in a derived class
146 143 # and then patching the class
147 144 hgweb.filerevision = filerevision_pygments
General Comments 0
You need to be logged in to leave comments. Login now