# ext/pygmentplugin.py # Copyright 2006-2023 the Mako authors and contributors # # 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 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>.*?""", Comment.Preproc), ( r"(<%)([\w\.\:]+)", bygroups(Comment.Preproc, Name.Builtin), "tag", ), ( r"()", 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 (?=", 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().__init__(HtmlLexer, MakoLexer, **options) class MakoXmlLexer(DelegatingLexer): name = "XML+Mako" aliases = ["xml+mako"] def __init__(self, **options): super().__init__(XmlLexer, MakoLexer, **options) class MakoJavascriptLexer(DelegatingLexer): name = "JavaScript+Mako" aliases = ["js+mako", "javascript+mako"] def __init__(self, **options): super().__init__(JavascriptLexer, MakoLexer, **options) class MakoCssLexer(DelegatingLexer): name = "CSS+Mako" aliases = ["css+mako"] def __init__(self, **options): super().__init__(CssLexer, MakoLexer, **options) pygments_html_formatter = HtmlFormatter( cssclass="syntax-highlighted", linenos=True ) def syntax_highlight(filename="", language=None): mako_lexer = MakoLexer() python_lexer = Python3Lexer() 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 )