Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/mako/ext/pygmentplugin.py: 2%
52 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:02 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:02 +0000
1# ext/pygmentplugin.py
2# Copyright 2006-2023 the Mako authors and contributors <see AUTHORS file>
3#
4# This module is part of Mako and is released under
5# the MIT License: http://www.opensource.org/licenses/mit-license.php
7from pygments import highlight
8from pygments.formatters.html import HtmlFormatter
9from pygments.lexer import bygroups
10from pygments.lexer import DelegatingLexer
11from pygments.lexer import include
12from pygments.lexer import RegexLexer
13from pygments.lexer import using
14from pygments.lexers.agile import Python3Lexer
15from pygments.lexers.agile import PythonLexer
16from pygments.lexers.web import CssLexer
17from pygments.lexers.web import HtmlLexer
18from pygments.lexers.web import JavascriptLexer
19from pygments.lexers.web import XmlLexer
20from pygments.token import Comment
21from pygments.token import Keyword
22from pygments.token import Name
23from pygments.token import Operator
24from pygments.token import Other
25from pygments.token import String
26from pygments.token import Text
29class MakoLexer(RegexLexer):
30 name = "Mako"
31 aliases = ["mako"]
32 filenames = ["*.mao"]
34 tokens = {
35 "root": [
36 (
37 r"(\s*)(\%)(\s*end(?:\w+))(\n|\Z)",
38 bygroups(Text, Comment.Preproc, Keyword, Other),
39 ),
40 (
41 r"(\s*)(\%(?!%))([^\n]*)(\n|\Z)",
42 bygroups(Text, Comment.Preproc, using(PythonLexer), Other),
43 ),
44 (
45 r"(\s*)(##[^\n]*)(\n|\Z)",
46 bygroups(Text, Comment.Preproc, Other),
47 ),
48 (r"""(?s)<%doc>.*?</%doc>""", Comment.Preproc),
49 (
50 r"(<%)([\w\.\:]+)",
51 bygroups(Comment.Preproc, Name.Builtin),
52 "tag",
53 ),
54 (
55 r"(</%)([\w\.\:]+)(>)",
56 bygroups(Comment.Preproc, Name.Builtin, Comment.Preproc),
57 ),
58 (r"<%(?=([\w\.\:]+))", Comment.Preproc, "ondeftags"),
59 (
60 r"(?s)(<%(?:!?))(.*?)(%>)",
61 bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc),
62 ),
63 (
64 r"(\$\{)(.*?)(\})",
65 bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc),
66 ),
67 (
68 r"""(?sx)
69 (.+?) # anything, followed by:
70 (?:
71 (?<=\n)(?=%(?!%)|\#\#) | # an eval or comment line
72 (?=\#\*) | # multiline comment
73 (?=</?%) | # a python block
74 # call start or end
75 (?=\$\{) | # a substitution
76 (?<=\n)(?=\s*%) |
77 # - don't consume
78 (\\\n) | # an escaped newline
79 \Z # end of string
80 )
81 """,
82 bygroups(Other, Operator),
83 ),
84 (r"\s+", Text),
85 ],
86 "ondeftags": [
87 (r"<%", Comment.Preproc),
88 (r"(?<=<%)(include|inherit|namespace|page)", Name.Builtin),
89 include("tag"),
90 ],
91 "tag": [
92 (r'((?:\w+)\s*=)\s*(".*?")', bygroups(Name.Attribute, String)),
93 (r"/?\s*>", Comment.Preproc, "#pop"),
94 (r"\s+", Text),
95 ],
96 "attr": [
97 ('".*?"', String, "#pop"),
98 ("'.*?'", String, "#pop"),
99 (r"[^\s>]+", String, "#pop"),
100 ],
101 }
104class MakoHtmlLexer(DelegatingLexer):
105 name = "HTML+Mako"
106 aliases = ["html+mako"]
108 def __init__(self, **options):
109 super().__init__(HtmlLexer, MakoLexer, **options)
112class MakoXmlLexer(DelegatingLexer):
113 name = "XML+Mako"
114 aliases = ["xml+mako"]
116 def __init__(self, **options):
117 super().__init__(XmlLexer, MakoLexer, **options)
120class MakoJavascriptLexer(DelegatingLexer):
121 name = "JavaScript+Mako"
122 aliases = ["js+mako", "javascript+mako"]
124 def __init__(self, **options):
125 super().__init__(JavascriptLexer, MakoLexer, **options)
128class MakoCssLexer(DelegatingLexer):
129 name = "CSS+Mako"
130 aliases = ["css+mako"]
132 def __init__(self, **options):
133 super().__init__(CssLexer, MakoLexer, **options)
136pygments_html_formatter = HtmlFormatter(
137 cssclass="syntax-highlighted", linenos=True
138)
141def syntax_highlight(filename="", language=None):
142 mako_lexer = MakoLexer()
143 python_lexer = Python3Lexer()
144 if filename.startswith("memory:") or language == "mako":
145 return lambda string: highlight(
146 string, mako_lexer, pygments_html_formatter
147 )
148 return lambda string: highlight(
149 string, python_lexer, pygments_html_formatter
150 )