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)
  