c302a6c0c53d7efa8767bd55da2a73535bea0cbf
[SubU] /
1 """
2     pygments.filters
3     ~~~~~~~~~~~~~~~~
4
5     Module containing filter lookup functions and default
6     filters.
7
8     :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS.
9     :license: BSD, see LICENSE for details.
10 """
11
12 import re
13
14 from pip._vendor.pygments.token import String, Comment, Keyword, Name, Error, Whitespace, \
15     string_to_tokentype
16 from pip._vendor.pygments.filter import Filter
17 from pip._vendor.pygments.util import get_list_opt, get_int_opt, get_bool_opt, \
18     get_choice_opt, ClassNotFound, OptionError
19 from pip._vendor.pygments.plugin import find_plugin_filters
20
21
22 def find_filter_class(filtername):
23     """Lookup a filter by name. Return None if not found."""
24     if filtername in FILTERS:
25         return FILTERS[filtername]
26     for name, cls in find_plugin_filters():
27         if name == filtername:
28             return cls
29     return None
30
31
32 def get_filter_by_name(filtername, **options):
33     """Return an instantiated filter.
34
35     Options are passed to the filter initializer if wanted.
36     Raise a ClassNotFound if not found.
37     """
38     cls = find_filter_class(filtername)
39     if cls:
40         return cls(**options)
41     else:
42         raise ClassNotFound('filter %r not found' % filtername)
43
44
45 def get_all_filters():
46     """Return a generator of all filter names."""
47     yield from FILTERS
48     for name, _ in find_plugin_filters():
49         yield name
50
51
52 def _replace_special(ttype, value, regex, specialttype,
53                      replacefunc=lambda x: x):
54     last = 0
55     for match in regex.finditer(value):
56         start, end = match.start(), match.end()
57         if start != last:
58             yield ttype, value[last:start]
59         yield specialttype, replacefunc(value[start:end])
60         last = end
61     if last != len(value):
62         yield ttype, value[last:]
63
64
65 class CodeTagFilter(Filter):
66     """Highlight special code tags in comments and docstrings.
67
68     Options accepted:
69
70     `codetags` : list of strings
71        A list of strings that are flagged as code tags.  The default is to
72        highlight ``XXX``, ``TODO``, ``FIXME``, ``BUG`` and ``NOTE``.
73
74     .. versionchanged:: 2.13
75        Now recognizes ``FIXME`` by default.
76     """
77
78     def __init__(self, **options):
79         Filter.__init__(self, **options)
80         tags = get_list_opt(options, 'codetags',
81                             ['XXX', 'TODO', 'FIXME', 'BUG', 'NOTE'])
82         self.tag_re = re.compile(r'\b(%s)\b' % '|'.join([
83             re.escape(tag) for tag in tags if tag
84         ]))
85
86     def filter(self, lexer, stream):
87         regex = self.tag_re
88         for ttype, value in stream:
89             if ttype in String.Doc or \
90                ttype in Comment and \
91                ttype not in Comment.Preproc:
92                 yield from _replace_special(ttype, value, regex, Comment.Special)
93             else:
94                 yield ttype, value
95
96
97 class SymbolFilter(Filter):
98     """Convert mathematical symbols such as \\<longrightarrow> in Isabelle
99     or \\longrightarrow in LaTeX into Unicode characters.
100
101     This is mostly useful for HTML or console output when you want to
102     approximate the source rendering you'd see in an IDE.
103
104     Options accepted:
105
106     `lang` : string
107        The symbol language. Must be one of ``'isabelle'`` or
108        ``'latex'``.  The default is ``'isabelle'``.
109     """
110
111     latex_symbols = {
112         '\\alpha'                : '\U000003b1',
113         '\\beta'                 : '\U000003b2',
114         '\\gamma'                : '\U000003b3',
115         '\\delta'                : '\U000003b4',
116         '\\varepsilon'           : '\U000003b5',
117         '\\zeta'                 : '\U000003b6',
118         '\\eta'                  : '\U000003b7',
119         '\\vartheta'             : '\U000003b8',
120         '\\iota'                 : '\U000003b9',
121         '\\kappa'                : '\U000003ba',
122         '\\lambda'               : '\U000003bb',
123         '\\mu'                   : '\U000003bc',
124         '\\nu'                   : '\U000003bd',
125         '\\xi'                   : '\U000003be',
126         '\\pi'                   : '\U000003c0',
127         '\\varrho'               : '\U000003c1',
128         '\\sigma'                : '\U000003c3',
129         '\\tau'                  : '\U000003c4',
130         '\\upsilon'              : '\U000003c5',
131         '\\varphi'               : '\U000003c6',
132         '\\chi'                  : '\U000003c7',
133         '\\psi'                  : '\U000003c8',
134         '\\omega'                : '\U000003c9',
135         '\\Gamma'                : '\U00000393',
136         '\\Delta'                : '\U00000394',
137         '\\Theta'                : '\U00000398',
138         '\\Lambda'               : '\U0000039b',
139         '\\Xi'                   : '\U0000039e',
140         '\\Pi'                   : '\U000003a0',
141         '\\Sigma'                : '\U000003a3',
142         '\\Upsilon'              : '\U000003a5',
143         '\\Phi'                  : '\U000003a6',
144         '\\Psi'                  : '\U000003a8',
145         '\\Omega'                : '\U000003a9',
146         '\\leftarrow'            : '\U00002190',
147         '\\longleftarrow'        : '\U000027f5',
148         '\\rightarrow'           : '\U00002192',
149         '\\longrightarrow'       : '\U000027f6',
150         '\\Leftarrow'            : '\U000021d0',
151         '\\Longleftarrow'        : '\U000027f8',
152         '\\Rightarrow'           : '\U000021d2',
153         '\\Longrightarrow'       : '\U000027f9',
154         '\\leftrightarrow'       : '\U00002194',
155         '\\longleftrightarrow'   : '\U000027f7',
156         '\\Leftrightarrow'       : '\U000021d4',
157         '\\Longleftrightarrow'   : '\U000027fa',
158         '\\mapsto'               : '\U000021a6',
159         '\\longmapsto'           : '\U000027fc',
160         '\\relbar'               : '\U00002500',
161         '\\Relbar'               : '\U00002550',
162         '\\hookleftarrow'        : '\U000021a9',
163         '\\hookrightarrow'       : '\U000021aa',
164         '\\leftharpoondown'      : '\U000021bd',
165         '\\rightharpoondown'     : '\U000021c1',
166         '\\leftharpoonup'        : '\U000021bc',
167         '\\rightharpoonup'       : '\U000021c0',
168         '\\rightleftharpoons'    : '\U000021cc',
169         '\\leadsto'              : '\U0000219d',
170         '\\downharpoonleft'      : '\U000021c3',
171         '\\downharpoonright'     : '\U000021c2',
172         '\\upharpoonleft'        : '\U000021bf',
173         '\\upharpoonright'       : '\U000021be',
174         '\\restriction'          : '\U000021be',
175         '\\uparrow'              : '\U00002191',
176         '\\Uparrow'              : '\U000021d1',
177         '\\downarrow'            : '\U00002193',
178         '\\Downarrow'            : '\U000021d3',
179         '\\updownarrow'          : '\U00002195',
180         '\\Updownarrow'          : '\U000021d5',
181         '\\langle'               : '\U000027e8',
182         '\\rangle'               : '\U000027e9',
183         '\\lceil'                : '\U00002308',
184         '\\rceil'                : '\U00002309',
185         '\\lfloor'               : '\U0000230a',
186         '\\rfloor'               : '\U0000230b',
187         '\\flqq'                 : '\U000000ab',
188         '\\frqq'                 : '\U000000bb',
189         '\\bot'                  : '\U000022a5',
190         '\\top'                  : '\U000022a4',
191         '\\wedge'                : '\U00002227',
192         '\\bigwedge'             : '\U000022c0',
193         '\\vee'                  : '\U00002228',
194         '\\bigvee'               : '\U000022c1',
195         '\\forall'               : '\U00002200',
196         '\\exists'               : '\U00002203',
197         '\\nexists'              : '\U00002204',
198         '\\neg'                  : '\U000000ac',
199         '\\Box'                  : '\U000025a1',
200         '\\Diamond'              : '\U000025c7',
201         '\\vdash'                : '\U000022a2',
202         '\\models'               : '\U000022a8',
203         '\\dashv'                : '\U000022a3',
204         '\\surd'                 : '\U0000221a',
205         '\\le'                   : '\U00002264',
206         '\\ge'                   : '\U00002265',
207         '\\ll'                   : '\U0000226a',
208         '\\gg'                   : '\U0000226b',
209         '\\lesssim'              : '\U00002272',
210         '\\gtrsim'               : '\U00002273',
211         '\\lessapprox'           : '\U00002a85',
212         '\\gtrapprox'            : '\U00002a86',
213         '\\in'                   : '\U00002208',
214         '\\notin'                : '\U00002209',
215         '\\subset'               : '\U00002282',
216         '\\supset'               : '\U00002283',
217         '\\subseteq'             : '\U00002286',
218         '\\supseteq'             : '\U00002287',
219         '\\sqsubset'             : '\U0000228f',
220         '\\sqsupset'             : '\U00002290',
221         '\\sqsubseteq'           : '\U00002291',
222         '\\sqsupseteq'           : '\U00002292',
223         '\\cap'                  : '\U00002229',
224         '\\bigcap'               : '\U000022c2',
225         '\\cup'                  : '\U0000222a',
226         '\\bigcup'               : '\U000022c3',
227         '\\sqcup'                : '\U00002294',
228         '\\bigsqcup'             : '\U00002a06',
229         '\\sqcap'                : '\U00002293',
230         '\\Bigsqcap'             : '\U00002a05',
231         '\\setminus'             : '\U00002216',
232         '\\propto'               : '\U0000221d',
233         '\\uplus'                : '\U0000228e',
234         '\\bigplus'              : '\U00002a04',
235         '\\sim'                  : '\U0000223c',
236         '\\doteq'                : '\U00002250',
237         '\\simeq'                : '\U00002243',
238         '\\approx'               : '\U00002248',
239         '\\asymp'                : '\U0000224d',
240         '\\cong'                 : '\U00002245',
241         '\\equiv'                : '\U00002261',
242         '\\Join'                 : '\U000022c8',
243         '\\bowtie'               : '\U00002a1d',
244         '\\prec'                 : '\U0000227a',
245         '\\succ'                 : '\U0000227b',
246         '\\preceq'               : '\U0000227c',
247         '\\succeq'               : '\U0000227d',
248         '\\parallel'             : '\U00002225',
249         '\\mid'                  : '\U000000a6',
250         '\\pm'                   : '\U000000b1',
251         '\\mp'                   : '\U00002213',
252         '\\times'                : '\U000000d7',
253         '\\div'                  : '\U000000f7',
254         '\\cdot'                 : '\U000022c5',
255         '\\star'                 : '\U000022c6',
256         '\\circ'                 : '\U00002218',
257         '\\dagger'               : '\U00002020',
258         '\\ddagger'              : '\U00002021',
259         '\\lhd'                  : '\U000022b2',
260         '\\rhd'                  : '\U000022b3',
261         '\\unlhd'                : '\U000022b4',
262         '\\unrhd'                : '\U000022b5',
263         '\\triangleleft'         : '\U000025c3',
264         '\\triangleright'        : '\U000025b9',
265         '\\triangle'             : '\U000025b3',
266         '\\triangleq'            : '\U0000225c',
267         '\\oplus'                : '\U00002295',
268         '\\bigoplus'             : '\U00002a01',
269         '\\otimes'               : '\U00002297',
270         '\\bigotimes'            : '\U00002a02',
271         '\\odot'                 : '\U00002299',
272         '\\bigodot'              : '\U00002a00',
273         '\\ominus'               : '\U00002296',
274         '\\oslash'               : '\U00002298',
275         '\\dots'                 : '\U00002026',
276         '\\cdots'                : '\U000022ef',
277         '\\sum'                  : '\U00002211',
278         '\\prod'                 : '\U0000220f',
279         '\\coprod'               : '\U00002210',
280         '\\infty'                : '\U0000221e',
281         '\\int'                  : '\U0000222b',
282         '\\oint'                 : '\U0000222e',
283         '\\clubsuit'             : '\U00002663',
284         '\\diamondsuit'          : '\U00002662',
285         '\\heartsuit'            : '\U00002661',
286         '\\spadesuit'            : '\U00002660',
287         '\\aleph'                : '\U00002135',
288         '\\emptyset'             : '\U00002205',
289         '\\nabla'                : '\U00002207',
290         '\\partial'              : '\U00002202',
291         '\\flat'                 : '\U0000266d',
292         '\\natural'              : '\U0000266e',
293         '\\sharp'                : '\U0000266f',
294         '\\angle'                : '\U00002220',
295         '\\copyright'            : '\U000000a9',
296         '\\textregistered'       : '\U000000ae',
297         '\\textonequarter'       : '\U000000bc',
298         '\\textonehalf'          : '\U000000bd',
299         '\\textthreequarters'    : '\U000000be',
300         '\\textordfeminine'      : '\U000000aa',
301         '\\textordmasculine'     : '\U000000ba',
302         '\\euro'                 : '\U000020ac',
303         '\\pounds'               : '\U000000a3',
304         '\\yen'                  : '\U000000a5',
305         '\\textcent'             : '\U000000a2',
306         '\\textcurrency'         : '\U000000a4',
307         '\\textdegree'           : '\U000000b0',
308     }
309
310     isabelle_symbols = {
311         '\\<zero>'                 : '\U0001d7ec',
312         '\\<one>'                  : '\U0001d7ed',
313         '\\<two>'                  : '\U0001d7ee',
314         '\\<three>'                : '\U0001d7ef',
315         '\\<four>'                 : '\U0001d7f0',
316         '\\<five>'                 : '\U0001d7f1',
317         '\\<six>'                  : '\U0001d7f2',
318         '\\<seven>'                : '\U0001d7f3',
319         '\\<eight>'                : '\U0001d7f4',
320         '\\<nine>'                 : '\U0001d7f5',
321         '\\<A>'                    : '\U0001d49c',
322         '\\<B>'                    : '\U0000212c',
323         '\\<C>'                    : '\U0001d49e',
324         '\\<D>'                    : '\U0001d49f',
325         '\\<E>'                    : '\U00002130',
326         '\\<F>'                    : '\U00002131',
327         '\\<G>'                    : '\U0001d4a2',
328         '\\<H>'                    : '\U0000210b',
329         '\\<I>'                    : '\U00002110',
330         '\\<J>'                    : '\U0001d4a5',
331         '\\<K>'                    : '\U0001d4a6',
332         '\\<L>'                    : '\U00002112',
333         '\\<M>'                    : '\U00002133',
334         '\\<N>'                    : '\U0001d4a9',
335         '\\<O>'                    : '\U0001d4aa',
336         '\\<P>'                    : '\U0001d4ab',
337         '\\<Q>'                    : '\U0001d4ac',
338         '\\<R>'                    : '\U0000211b',
339         '\\<S>'                    : '\U0001d4ae',
340         '\\<T>'                    : '\U0001d4af',
341         '\\<U>'                    : '\U0001d4b0',
342         '\\<V>'                    : '\U0001d4b1',
343         '\\<W>'                    : '\U0001d4b2',
344         '\\<X>'                    : '\U0001d4b3',
345         '\\<Y>'                    : '\U0001d4b4',
346         '\\<Z>'                    : '\U0001d4b5',
347         '\\<a>'                    : '\U0001d5ba',
348         '\\<b>'                    : '\U0001d5bb',
349         '\\<c>'                    : '\U0001d5bc',
350         '\\<d>'                    : '\U0001d5bd',
351         '\\<e>'                    : '\U0001d5be',
352         '\\<f>'                    : '\U0001d5bf',
353         '\\<g>'                    : '\U0001d5c0',
354         '\\<h>'                    : '\U0001d5c1',
355         '\\<i>'                    : '\U0001d5c2',
356         '\\<j>'                    : '\U0001d5c3',
357         '\\<k>'                    : '\U0001d5c4',
358         '\\<l>'                    : '\U0001d5c5',
359         '\\<m>'                    : '\U0001d5c6',
360         '\\<n>'                    : '\U0001d5c7',
361         '\\<o>'                    : '\U0001d5c8',
362         '\\<p>'                    : '\U0001d5c9',
363         '\\<q>'                    : '\U0001d5ca',
364         '\\<r>'                    : '\U0001d5cb',
365         '\\<s>'                    : '\U0001d5cc',
366         '\\<t>'                    : '\U0001d5cd',
367         '\\<u>'                    : '\U0001d5ce',
368         '\\<v>'                    : '\U0001d5cf',
369         '\\<w>'                    : '\U0001d5d0',
370         '\\<x>'                    : '\U0001d5d1',
371         '\\<y>'                    : '\U0001d5d2',
372         '\\<z>'                    : '\U0001d5d3',
373         '\\<AA>'                   : '\U0001d504',
374         '\\<BB>'                   : '\U0001d505',
375         '\\<CC>'                   : '\U0000212d',
376         '\\<DD>'                   : '\U0001d507',
377         '\\<EE>'                   : '\U0001d508',
378         '\\<FF>'                   : '\U0001d509',
379         '\\<GG>'                   : '\U0001d50a',
380         '\\<HH>'                   : '\U0000210c',
381         '\\<II>'                   : '\U00002111',
382         '\\<JJ>'                   : '\U0001d50d',
383         '\\<KK>'                   : '\U0001d50e',
384         '\\<LL>'                   : '\U0001d50f',
385         '\\<MM>'                   : '\U0001d510',
386         '\\<NN>'                   : '\U0001d511',
387         '\\<OO>'                   : '\U0001d512',
388         '\\<PP>'                   : '\U0001d513',
389         '\\<QQ>'                   : '\U0001d514',
390         '\\<RR>'                   : '\U0000211c',
391         '\\<SS>'                   : '\U0001d516',
392         '\\<TT>'                   : '\U0001d517',
393         '\\<UU>'                   : '\U0001d518',
394         '\\<VV>'                   : '\U0001d519',
395         '\\<WW>'                   : '\U0001d51a',
396         '\\<XX>'                   : '\U0001d51b',
397         '\\<YY>'                   : '\U0001d51c',
398         '\\<ZZ>'                   : '\U00002128',
399         '\\<aa>'                   : '\U0001d51e',
400         '\\<bb>'                   : '\U0001d51f',
401         '\\<cc>'                   : '\U0001d520',
402         '\\<dd>'                   : '\U0001d521',
403         '\\<ee>'                   : '\U0001d522',
404         '\\<ff>'                   : '\U0001d523',
405         '\\<gg>'                   : '\U0001d524',
406         '\\<hh>'                   : '\U0001d525',
407         '\\<ii>'                   : '\U0001d526',
408         '\\<jj>'                   : '\U0001d527',
409         '\\<kk>'                   : '\U0001d528',
410         '\\<ll>'                   : '\U0001d529',
411         '\\<mm>'                   : '\U0001d52a',
412         '\\<nn>'                   : '\U0001d52b',
413         '\\<oo>'                   : '\U0001d52c',
414         '\\<pp>'                   : '\U0001d52d',
415         '\\<qq>'                   : '\U0001d52e',
416         '\\<rr>'                   : '\U0001d52f',
417         '\\<ss>'                   : '\U0001d530',
418         '\\<tt>'                   : '\U0001d531',
419         '\\<uu>'                   : '\U0001d532',
420         '\\<vv>'                   : '\U0001d533',
421         '\\<ww>'                   : '\U0001d534',
422         '\\<xx>'                   : '\U0001d535',
423         '\\<yy>'                   : '\U0001d536',
424         '\\<zz>'                   : '\U0001d537',
425         '\\<alpha>'                : '\U000003b1',
426         '\\<beta>'                 : '\U000003b2',
427         '\\<gamma>'                : '\U000003b3',
428         '\\<delta>'                : '\U000003b4',
429         '\\<epsilon>'              : '\U000003b5',
430         '\\<zeta>'                 : '\U000003b6',
431         '\\<eta>'                  : '\U000003b7',
432         '\\<theta>'                : '\U000003b8',
433         '\\<iota>'                 : '\U000003b9',
434         '\\<kappa>'                : '\U000003ba',
435         '\\<lambda>'               : '\U000003bb',
436         '\\<mu>'                   : '\U000003bc',
437         '\\<nu>'                   : '\U000003bd',
438         '\\<xi>'                   : '\U000003be',
439         '\\<pi>'                   : '\U000003c0',
440         '\\<rho>'                  : '\U000003c1',
441         '\\<sigma>'                : '\U000003c3',
442         '\\<tau>'                  : '\U000003c4',
443         '\\<upsilon>'              : '\U000003c5',
444         '\\<phi>'                  : '\U000003c6',
445         '\\<chi>'                  : '\U000003c7',
446         '\\<psi>'                  : '\U000003c8',
447         '\\<omega>'                : '\U000003c9',
448         '\\<Gamma>'                : '\U00000393',
449         '\\<Delta>'                : '\U00000394',
450         '\\<Theta>'                : '\U00000398',
451         '\\<Lambda>'               : '\U0000039b',
452         '\\<Xi>'                   : '\U0000039e',
453         '\\<Pi>'                   : '\U000003a0',
454         '\\<Sigma>'                : '\U000003a3',
455         '\\<Upsilon>'              : '\U000003a5',
456         '\\<Phi>'                  : '\U000003a6',
457         '\\<Psi>'                  : '\U000003a8',
458         '\\<Omega>'                : '\U000003a9',
459         '\\<bool>'                 : '\U0001d539',
460         '\\<complex>'              : '\U00002102',
461         '\\<nat>'                  : '\U00002115',
462         '\\<rat>'                  : '\U0000211a',
463         '\\<real>'                 : '\U0000211d',
464         '\\<int>'                  : '\U00002124',
465         '\\<leftarrow>'            : '\U00002190',
466         '\\<longleftarrow>'        : '\U000027f5',
467         '\\<rightarrow>'           : '\U00002192',
468         '\\<longrightarrow>'       : '\U000027f6',
469         '\\<Leftarrow>'            : '\U000021d0',
470         '\\<Longleftarrow>'        : '\U000027f8',
471         '\\<Rightarrow>'           : '\U000021d2',
472         '\\<Longrightarrow>'       : '\U000027f9',
473         '\\<leftrightarrow>'       : '\U00002194',
474         '\\<longleftrightarrow>'   : '\U000027f7',
475         '\\<Leftrightarrow>'       : '\U000021d4',
476         '\\<Longleftrightarrow>'   : '\U000027fa',
477         '\\<mapsto>'               : '\U000021a6',
478         '\\<longmapsto>'           : '\U000027fc',
479         '\\<midarrow>'             : '\U00002500',
480         '\\<Midarrow>'             : '\U00002550',
481         '\\<hookleftarrow>'        : '\U000021a9',
482         '\\<hookrightarrow>'       : '\U000021aa',
483         '\\<leftharpoondown>'      : '\U000021bd',
484         '\\<rightharpoondown>'     : '\U000021c1',
485         '\\<leftharpoonup>'        : '\U000021bc',
486         '\\<rightharpoonup>'       : '\U000021c0',
487         '\\<rightleftharpoons>'    : '\U000021cc',
488         '\\<leadsto>'              : '\U0000219d',
489         '\\<downharpoonleft>'      : '\U000021c3',
490         '\\<downharpoonright>'     : '\U000021c2',
491         '\\<upharpoonleft>'        : '\U000021bf',
492         '\\<upharpoonright>'       : '\U000021be',
493         '\\<restriction>'          : '\U000021be',
494         '\\<Colon>'                : '\U00002237',
495         '\\<up>'                   : '\U00002191',
496         '\\<Up>'                   : '\U000021d1',
497         '\\<down>'                 : '\U00002193',
498         '\\<Down>'                 : '\U000021d3',
499         '\\<updown>'               : '\U00002195',
500         '\\<Updown>'               : '\U000021d5',
501         '\\<langle>'               : '\U000027e8',
502         '\\<rangle>'               : '\U000027e9',
503         '\\<lceil>'                : '\U00002308',
504         '\\<rceil>'                : '\U00002309',
505         '\\<lfloor>'               : '\U0000230a',
506         '\\<rfloor>'               : '\U0000230b',
507         '\\<lparr>'                : '\U00002987',
508         '\\<rparr>'                : '\U00002988',
509         '\\<lbrakk>'               : '\U000027e6',
510         '\\<rbrakk>'               : '\U000027e7',
511         '\\<lbrace>'               : '\U00002983',
512         '\\<rbrace>'               : '\U00002984',
513         '\\<guillemotleft>'        : '\U000000ab',
514         '\\<guillemotright>'       : '\U000000bb',
515         '\\<bottom>'               : '\U000022a5',
516         '\\<top>'                  : '\U000022a4',
517         '\\<and>'                  : '\U00002227',
518         '\\<And>'                  : '\U000022c0',
519         '\\<or>'                   : '\U00002228',
520         '\\<Or>'                   : '\U000022c1',
521         '\\<forall>'               : '\U00002200',
522         '\\<exists>'               : '\U00002203',
523         '\\<nexists>'              : '\U00002204',
524         '\\<not>'                  : '\U000000ac',
525         '\\<box>'                  : '\U000025a1',
526         '\\<diamond>'              : '\U000025c7',
527         '\\<turnstile>'            : '\U000022a2',
528         '\\<Turnstile>'            : '\U000022a8',
529         '\\<tturnstile>'           : '\U000022a9',
530         '\\<TTurnstile>'           : '\U000022ab',
531         '\\<stileturn>'            : '\U000022a3',
532         '\\<surd>'                 : '\U0000221a',
533         '\\<le>'                   : '\U00002264',
534         '\\<ge>'                   : '\U00002265',
535         '\\<lless>'                : '\U0000226a',
536         '\\<ggreater>'             : '\U0000226b',
537         '\\<lesssim>'              : '\U00002272',
538         '\\<greatersim>'           : '\U00002273',
539         '\\<lessapprox>'           : '\U00002a85',
540         '\\<greaterapprox>'        : '\U00002a86',
541         '\\<in>'                   : '\U00002208',
542         '\\<notin>'                : '\U00002209',
543         '\\<subset>'               : '\U00002282',
544         '\\<supset>'               : '\U00002283',
545         '\\<subseteq>'             : '\U00002286',
546         '\\<supseteq>'             : '\U00002287',
547         '\\<sqsubset>'             : '\U0000228f',
548         '\\<sqsupset>'             : '\U00002290',
549         '\\<sqsubseteq>'           : '\U00002291',
550         '\\<sqsupseteq>'           : '\U00002292',
551         '\\<inter>'                : '\U00002229',
552         '\\<Inter>'                : '\U000022c2',
553         '\\<union>'                : '\U0000222a',
554         '\\<Union>'                : '\U000022c3',
555         '\\<squnion>'              : '\U00002294',
556         '\\<Squnion>'              : '\U00002a06',
557         '\\<sqinter>'              : '\U00002293',
558         '\\<Sqinter>'              : '\U00002a05',
559         '\\<setminus>'             : '\U00002216',
560         '\\<propto>'               : '\U0000221d',
561         '\\<uplus>'                : '\U0000228e',
562         '\\<Uplus>'                : '\U00002a04',
563         '\\<noteq>'                : '\U00002260',
564         '\\<sim>'                  : '\U0000223c',
565         '\\<doteq>'                : '\U00002250',
566         '\\<simeq>'                : '\U00002243',
567         '\\<approx>'               : '\U00002248',
568         '\\<asymp>'                : '\U0000224d',
569         '\\<cong>'                 : '\U00002245',
570         '\\<smile>'                : '\U00002323',
571         '\\<equiv>'                : '\U00002261',
572         '\\<frown>'                : '\U00002322',
573         '\\<Join>'                 : '\U000022c8',
574         '\\<bowtie>'               : '\U00002a1d',
575         '\\<prec>'                 : '\U0000227a',
576         '\\<succ>'                 : '\U0000227b',
577         '\\<preceq>'               : '\U0000227c',
578         '\\<succeq>'               : '\U0000227d',
579         '\\<parallel>'             : '\U00002225',
580         '\\<bar>'                  : '\U000000a6',
581         '\\<plusminus>'            : '\U000000b1',
582         '\\<minusplus>'            : '\U00002213',
583         '\\<times>'                : '\U000000d7',
584         '\\<div>'                  : '\U000000f7',
585         '\\<cdot>'                 : '\U000022c5',
586         '\\<star>'                 : '\U000022c6',
587         '\\<bullet>'               : '\U00002219',
588         '\\<circ>'                 : '\U00002218',
589         '\\<dagger>'               : '\U00002020',
590         '\\<ddagger>'              : '\U00002021',
591         '\\<lhd>'                  : '\U000022b2',
592         '\\<rhd>'                  : '\U000022b3',
593         '\\<unlhd>'                : '\U000022b4',
594         '\\<unrhd>'                : '\U000022b5',
595         '\\<triangleleft>'         : '\U000025c3',
596         '\\<triangleright>'        : '\U000025b9',
597         '\\<triangle>'             : '\U000025b3',
598         '\\<triangleq>'            : '\U0000225c',
599         '\\<oplus>'                : '\U00002295',
600         '\\<Oplus>'                : '\U00002a01',
601         '\\<otimes>'               : '\U00002297',
602         '\\<Otimes>'               : '\U00002a02',
603         '\\<odot>'                 : '\U00002299',
604         '\\<Odot>'                 : '\U00002a00',
605         '\\<ominus>'               : '\U00002296',
606         '\\<oslash>'               : '\U00002298',
607         '\\<dots>'                 : '\U00002026',
608         '\\<cdots>'                : '\U000022ef',
609         '\\<Sum>'                  : '\U00002211',
610         '\\<Prod>'                 : '\U0000220f',
611         '\\<Coprod>'               : '\U00002210',
612         '\\<infinity>'             : '\U0000221e',
613         '\\<integral>'             : '\U0000222b',
614         '\\<ointegral>'            : '\U0000222e',
615         '\\<clubsuit>'             : '\U00002663',
616         '\\<diamondsuit>'          : '\U00002662',
617         '\\<heartsuit>'            : '\U00002661',
618         '\\<spadesuit>'            : '\U00002660',
619         '\\<aleph>'                : '\U00002135',
620         '\\<emptyset>'             : '\U00002205',
621         '\\<nabla>'                : '\U00002207',
622         '\\<partial>'              : '\U00002202',
623         '\\<flat>'                 : '\U0000266d',
624         '\\<natural>'              : '\U0000266e',
625         '\\<sharp>'                : '\U0000266f',
626         '\\<angle>'                : '\U00002220',
627         '\\<copyright>'            : '\U000000a9',
628         '\\<registered>'           : '\U000000ae',
629         '\\<hyphen>'               : '\U000000ad',
630         '\\<inverse>'              : '\U000000af',
631         '\\<onequarter>'           : '\U000000bc',
632         '\\<onehalf>'              : '\U000000bd',
633         '\\<threequarters>'        : '\U000000be',
634         '\\<ordfeminine>'          : '\U000000aa',
635         '\\<ordmasculine>'         : '\U000000ba',
636         '\\<section>'              : '\U000000a7',
637         '\\<paragraph>'            : '\U000000b6',
638         '\\<exclamdown>'           : '\U000000a1',
639         '\\<questiondown>'         : '\U000000bf',
640         '\\<euro>'                 : '\U000020ac',
641         '\\<pounds>'               : '\U000000a3',
642         '\\<yen>'                  : '\U000000a5',
643         '\\<cent>'                 : '\U000000a2',
644         '\\<currency>'             : '\U000000a4',
645         '\\<degree>'               : '\U000000b0',
646         '\\<amalg>'                : '\U00002a3f',
647         '\\<mho>'                  : '\U00002127',
648         '\\<lozenge>'              : '\U000025ca',
649         '\\<wp>'                   : '\U00002118',
650         '\\<wrong>'                : '\U00002240',
651         '\\<struct>'               : '\U000022c4',
652         '\\<acute>'                : '\U000000b4',
653         '\\<index>'                : '\U00000131',
654         '\\<dieresis>'             : '\U000000a8',
655         '\\<cedilla>'              : '\U000000b8',
656         '\\<hungarumlaut>'         : '\U000002dd',
657         '\\<some>'                 : '\U000003f5',
658         '\\<newline>'              : '\U000023ce',
659         '\\<open>'                 : '\U00002039',
660         '\\<close>'                : '\U0000203a',
661         '\\<here>'                 : '\U00002302',
662         '\\<^sub>'                 : '\U000021e9',
663         '\\<^sup>'                 : '\U000021e7',
664         '\\<^bold>'                : '\U00002759',
665         '\\<^bsub>'                : '\U000021d8',
666         '\\<^esub>'                : '\U000021d9',
667         '\\<^bsup>'                : '\U000021d7',
668         '\\<^esup>'                : '\U000021d6',
669     }
670
671     lang_map = {'isabelle' : isabelle_symbols, 'latex' : latex_symbols}
672
673     def __init__(self, **options):
674         Filter.__init__(self, **options)
675         lang = get_choice_opt(options, 'lang',
676                               ['isabelle', 'latex'], 'isabelle')
677         self.symbols = self.lang_map[lang]
678
679     def filter(self, lexer, stream):
680         for ttype, value in stream:
681             if value in self.symbols:
682                 yield ttype, self.symbols[value]
683             else:
684                 yield ttype, value
685
686
687 class KeywordCaseFilter(Filter):
688     """Convert keywords to lowercase or uppercase or capitalize them, which
689     means first letter uppercase, rest lowercase.
690
691     This can be useful e.g. if you highlight Pascal code and want to adapt the
692     code to your styleguide.
693
694     Options accepted:
695
696     `case` : string
697        The casing to convert keywords to. Must be one of ``'lower'``,
698        ``'upper'`` or ``'capitalize'``.  The default is ``'lower'``.
699     """
700
701     def __init__(self, **options):
702         Filter.__init__(self, **options)
703         case = get_choice_opt(options, 'case',
704                               ['lower', 'upper', 'capitalize'], 'lower')
705         self.convert = getattr(str, case)
706
707     def filter(self, lexer, stream):
708         for ttype, value in stream:
709             if ttype in Keyword:
710                 yield ttype, self.convert(value)
711             else:
712                 yield ttype, value
713
714
715 class NameHighlightFilter(Filter):
716     """Highlight a normal Name (and Name.*) token with a different token type.
717
718     Example::
719
720         filter = NameHighlightFilter(
721             names=['foo', 'bar', 'baz'],
722             tokentype=Name.Function,
723         )
724
725     This would highlight the names "foo", "bar" and "baz"
726     as functions. `Name.Function` is the default token type.
727
728     Options accepted:
729
730     `names` : list of strings
731       A list of names that should be given the different token type.
732       There is no default.
733     `tokentype` : TokenType or string
734       A token type or a string containing a token type name that is
735       used for highlighting the strings in `names`.  The default is
736       `Name.Function`.
737     """
738
739     def __init__(self, **options):
740         Filter.__init__(self, **options)
741         self.names = set(get_list_opt(options, 'names', []))
742         tokentype = options.get('tokentype')
743         if tokentype:
744             self.tokentype = string_to_tokentype(tokentype)
745         else:
746             self.tokentype = Name.Function
747
748     def filter(self, lexer, stream):
749         for ttype, value in stream:
750             if ttype in Name and value in self.names:
751                 yield self.tokentype, value
752             else:
753                 yield ttype, value
754
755
756 class ErrorToken(Exception):
757     pass
758
759
760 class RaiseOnErrorTokenFilter(Filter):
761     """Raise an exception when the lexer generates an error token.
762
763     Options accepted:
764
765     `excclass` : Exception class
766       The exception class to raise.
767       The default is `pygments.filters.ErrorToken`.
768
769     .. versionadded:: 0.8
770     """
771
772     def __init__(self, **options):
773         Filter.__init__(self, **options)
774         self.exception = options.get('excclass', ErrorToken)
775         try:
776             # issubclass() will raise TypeError if first argument is not a class
777             if not issubclass(self.exception, Exception):
778                 raise TypeError
779         except TypeError:
780             raise OptionError('excclass option is not an exception class')
781
782     def filter(self, lexer, stream):
783         for ttype, value in stream:
784             if ttype is Error:
785                 raise self.exception(value)
786             yield ttype, value
787
788
789 class VisibleWhitespaceFilter(Filter):
790     """Convert tabs, newlines and/or spaces to visible characters.
791
792     Options accepted:
793
794     `spaces` : string or bool
795       If this is a one-character string, spaces will be replaces by this string.
796       If it is another true value, spaces will be replaced by ``·`` (unicode
797       MIDDLE DOT).  If it is a false value, spaces will not be replaced.  The
798       default is ``False``.
799     `tabs` : string or bool
800       The same as for `spaces`, but the default replacement character is ``»``
801       (unicode RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK).  The default value
802       is ``False``.  Note: this will not work if the `tabsize` option for the
803       lexer is nonzero, as tabs will already have been expanded then.
804     `tabsize` : int
805       If tabs are to be replaced by this filter (see the `tabs` option), this
806       is the total number of characters that a tab should be expanded to.
807       The default is ``8``.
808     `newlines` : string or bool
809       The same as for `spaces`, but the default replacement character is ``¶``
810       (unicode PILCROW SIGN).  The default value is ``False``.
811     `wstokentype` : bool
812       If true, give whitespace the special `Whitespace` token type.  This allows
813       styling the visible whitespace differently (e.g. greyed out), but it can
814       disrupt background colors.  The default is ``True``.
815
816     .. versionadded:: 0.8
817     """
818
819     def __init__(self, **options):
820         Filter.__init__(self, **options)
821         for name, default in [('spaces',   '·'),
822                               ('tabs',     '»'),
823                               ('newlines', '¶')]:
824             opt = options.get(name, False)
825             if isinstance(opt, str) and len(opt) == 1:
826                 setattr(self, name, opt)
827             else:
828                 setattr(self, name, (opt and default or ''))
829         tabsize = get_int_opt(options, 'tabsize', 8)
830         if self.tabs:
831             self.tabs += ' ' * (tabsize - 1)
832         if self.newlines:
833             self.newlines += '\n'
834         self.wstt = get_bool_opt(options, 'wstokentype', True)
835
836     def filter(self, lexer, stream):
837         if self.wstt:
838             spaces = self.spaces or ' '
839             tabs = self.tabs or '\t'
840             newlines = self.newlines or '\n'
841             regex = re.compile(r'\s')
842
843             def replacefunc(wschar):
844                 if wschar == ' ':
845                     return spaces
846                 elif wschar == '\t':
847                     return tabs
848                 elif wschar == '\n':
849                     return newlines
850                 return wschar
851
852             for ttype, value in stream:
853                 yield from _replace_special(ttype, value, regex, Whitespace,
854                                             replacefunc)
855         else:
856             spaces, tabs, newlines = self.spaces, self.tabs, self.newlines
857             # simpler processing
858             for ttype, value in stream:
859                 if spaces:
860                     value = value.replace(' ', spaces)
861                 if tabs:
862                     value = value.replace('\t', tabs)
863                 if newlines:
864                     value = value.replace('\n', newlines)
865                 yield ttype, value
866
867
868 class GobbleFilter(Filter):
869     """Gobbles source code lines (eats initial characters).
870
871     This filter drops the first ``n`` characters off every line of code.  This
872     may be useful when the source code fed to the lexer is indented by a fixed
873     amount of space that isn't desired in the output.
874
875     Options accepted:
876
877     `n` : int
878        The number of characters to gobble.
879
880     .. versionadded:: 1.2
881     """
882     def __init__(self, **options):
883         Filter.__init__(self, **options)
884         self.n = get_int_opt(options, 'n', 0)
885
886     def gobble(self, value, left):
887         if left < len(value):
888             return value[left:], 0
889         else:
890             return '', left - len(value)
891
892     def filter(self, lexer, stream):
893         n = self.n
894         left = n  # How many characters left to gobble.
895         for ttype, value in stream:
896             # Remove ``left`` tokens from first line, ``n`` from all others.
897             parts = value.split('\n')
898             (parts[0], left) = self.gobble(parts[0], left)
899             for i in range(1, len(parts)):
900                 (parts[i], left) = self.gobble(parts[i], n)
901             value = '\n'.join(parts)
902
903             if value != '':
904                 yield ttype, value
905
906
907 class TokenMergeFilter(Filter):
908     """Merges consecutive tokens with the same token type in the output
909     stream of a lexer.
910
911     .. versionadded:: 1.2
912     """
913     def __init__(self, **options):
914         Filter.__init__(self, **options)
915
916     def filter(self, lexer, stream):
917         current_type = None
918         current_value = None
919         for ttype, value in stream:
920             if ttype is current_type:
921                 current_value += value
922             else:
923                 if current_type is not None:
924                     yield current_type, current_value
925                 current_type = ttype
926                 current_value = value
927         if current_type is not None:
928             yield current_type, current_value
929
930
931 FILTERS = {
932     'codetagify':     CodeTagFilter,
933     'keywordcase':    KeywordCaseFilter,
934     'highlight':      NameHighlightFilter,
935     'raiseonerror':   RaiseOnErrorTokenFilter,
936     'whitespace':     VisibleWhitespaceFilter,
937     'gobble':         GobbleFilter,
938     'tokenmerge':     TokenMergeFilter,
939     'symbols':        SymbolFilter,
940 }