# ext/pygmentplugin.py
# Copyright 2006-2020 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
from pygments
import highlight
from pygments.formatters.html
import HtmlFormatter
from pygments.lexer
import bygroups
from pygments.lexer
import DelegatingLexer
from pygments.lexer
import include
from pygments.lexer
import RegexLexer
from pygments.lexer
import using
from pygments.lexers.agile
import Python3Lexer
from pygments.lexers.agile
import PythonLexer
from pygments.lexers.web
import CssLexer
from pygments.lexers.web
import HtmlLexer
from pygments.lexers.web
import JavascriptLexer
from pygments.lexers.web
import XmlLexer
from pygments.token
import Comment
from pygments.token
import Keyword
from pygments.token
import Name
from pygments.token
import Operator
from pygments.token
import Other
from pygments.token
import String
from pygments.token
import Text
from mako
import compat
class MakoLexer(RegexLexer):
name =
"Mako"
aliases = [
"mako"]
filenames = [
"*.mao"]
tokens = {
"root": [
(
r
"(\s*)(\%)(\s*end(?:\w+))(\n|\Z)",
bygroups(Text, Comment.Preproc, Keyword, Other),
),
(
r
"(\s*)(\%(?!%))([^\n]*)(\n|\Z)",
bygroups(Text, Comment.Preproc, using(PythonLexer), Other),
),
(
r
"(\s*)(##[^\n]*)(\n|\Z)",
bygroups(Text, Comment.Preproc, Other),
),
(r
"""(?s)<%doc>.*?%doc>""", Comment.Preproc),
(
r
"(<%)([\w\.\:]+)",
bygroups(Comment.Preproc, Name.Builtin),
"tag",
),
(
r
"(%)([\w\.\:]+)(>)",
bygroups(Comment.Preproc, Name.Builtin, Comment.Preproc),
),
(r
"<%(?=([\w\.\:]+))", Comment.Preproc,
"ondeftags"),
(
r
"(?s)(<%(?:!?))(.*?)(%>)",
bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc),
),
(
r
"(\$\{)(.*?)(\})",
bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc),
),
(
r
"""(?sx)
(.+?)
# anything, followed by:
(?:
(?<=\n)(?=%(?!%)|\
#\#) | # an eval or comment line
(?=\
#\*) | # multiline comment
(?=</?%) |
# a python block
# call start or end
(?=\$\{) |
# a substitution
(?<=\n)(?=\s*%) |
# - don't consume
(\\\n) |
# an escaped newline
\Z
# end of string
)
""",
bygroups(Other, Operator),
),
(r
"\s+", Text),
],
"ondeftags": [
(r
"<%", Comment.Preproc),
(r
"(?<=<%)(include|inherit|namespace|page)", Name.Builtin),
include(
"tag"),
],
"tag": [
(r
'((?:\w+)\s*=)\s*(".*?")', bygroups(Name.Attribute, String)),
(r
"/?\s*>", Comment.Preproc,
"#pop"),
(r
"\s+", Text),
],
"attr": [
(
'".*?"', String,
"#pop"),
(
"'.*?'", String,
"#pop"),
(r
"[^\s>]+", String,
"#pop"),
],
}
class MakoHtmlLexer(DelegatingLexer):
name =
"HTML+Mako"
aliases = [
"html+mako"]
def __init__(self, **options):
super(MakoHtmlLexer, self).__init__(HtmlLexer, MakoLexer, **options)
class MakoXmlLexer(DelegatingLexer):
name =
"XML+Mako"
aliases = [
"xml+mako"]
def __init__(self, **options):
super(MakoXmlLexer, self).__init__(XmlLexer, MakoLexer, **options)
class MakoJavascriptLexer(DelegatingLexer):
name =
"JavaScript+Mako"
aliases = [
"js+mako",
"javascript+mako"]
def __init__(self, **options):
super(MakoJavascriptLexer, self).__init__(
JavascriptLexer, MakoLexer, **options
)
class MakoCssLexer(DelegatingLexer):
name =
"CSS+Mako"
aliases = [
"css+mako"]
def __init__(self, **options):
super(MakoCssLexer, self).__init__(CssLexer, MakoLexer, **options)
pygments_html_formatter = HtmlFormatter(
cssclass=
"syntax-highlighted", linenos=
True
)
def syntax_highlight(filename=
"", language=
None):
mako_lexer = MakoLexer()
if compat.py3k:
python_lexer = Python3Lexer()
else:
python_lexer = PythonLexer()
if filename.startswith(
"memory:")
or language ==
"mako":
return lambda string: highlight(
string, mako_lexer, pygments_html_formatter
)
return lambda string: highlight(
string, python_lexer, pygments_html_formatter
)