text: # ext/pygmentplugin.py
  # Copyright (C) 2006-2016 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.lexers.web import HtmlLexer, XmlLexer, JavascriptLexer, CssLexer
  from pygments.lexers.agile import PythonLexer, Python3Lexer
  from pygments.lexer import DelegatingLexer, RegexLexer, bygroups, include, using
  from pygments.token import Text, Comment, Operator, Keyword, Name, String, Other
  from pygments.formatters.html import HtmlFormatter
  from pygments import highlight
  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)
  