1<lexer>
  2  <config>
  3    <name>Mako</name>
  4    <alias>mako</alias>
  5    <filename>*.mao</filename>
  6    <mime_type>application/x-mako</mime_type>
  7  </config>
  8  <rules>
  9    <state name="root">
 10      <rule pattern="(\s*)(%)(\s*end(?:\w+))(\n|\Z)">
 11        <bygroups>
 12          <token type="Text"/>
 13          <token type="CommentPreproc"/>
 14          <token type="Keyword"/>
 15          <token type="Other"/>
 16        </bygroups>
 17      </rule>
 18      <rule pattern="(\s*)(%)([^\n]*)(\n|\Z)">
 19        <bygroups>
 20          <token type="Text"/>
 21          <token type="CommentPreproc"/>
 22          <using lexer="Python"/>
 23          <token type="Other"/>
 24        </bygroups>
 25      </rule>
 26      <rule pattern="(\s*)(##[^\n]*)(\n|\Z)">
 27        <bygroups>
 28          <token type="Text"/>
 29          <token type="CommentPreproc"/>
 30          <token type="Other"/>
 31        </bygroups>
 32      </rule>
 33      <rule pattern="(?s)<%doc>.*?</%doc>">
 34        <token type="CommentPreproc"/>
 35      </rule>
 36      <rule pattern="(<%)([\w.:]+)">
 37        <bygroups>
 38          <token type="CommentPreproc"/>
 39          <token type="NameBuiltin"/>
 40        </bygroups>
 41        <push state="tag"/>
 42      </rule>
 43      <rule pattern="(</%)([\w.:]+)(>)">
 44        <bygroups>
 45          <token type="CommentPreproc"/>
 46          <token type="NameBuiltin"/>
 47          <token type="CommentPreproc"/>
 48        </bygroups>
 49      </rule>
 50      <rule pattern="<%(?=([\w.:]+))">
 51        <token type="CommentPreproc"/>
 52        <push state="ondeftags"/>
 53      </rule>
 54      <rule pattern="(<%(?:!?))(.*?)(%>)(?s)">
 55        <bygroups>
 56          <token type="CommentPreproc"/>
 57          <using lexer="Python"/>
 58          <token type="CommentPreproc"/>
 59        </bygroups>
 60      </rule>
 61      <rule pattern="(\$\{)(.*?)(\})">
 62        <bygroups>
 63          <token type="CommentPreproc"/>
 64          <using lexer="Python"/>
 65          <token type="CommentPreproc"/>
 66        </bygroups>
 67      </rule>
 68      <rule pattern="(?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
                )
            ">
 69        <bygroups>
 70          <token type="Other"/>
 71          <token type="Operator"/>
 72        </bygroups>
 73      </rule>
 74      <rule pattern="\s+">
 75        <token type="Text"/>
 76      </rule>
 77    </state>
 78    <state name="ondeftags">
 79      <rule pattern="<%">
 80        <token type="CommentPreproc"/>
 81      </rule>
 82      <rule pattern="(?<=<%)(include|inherit|namespace|page)">
 83        <token type="NameBuiltin"/>
 84      </rule>
 85      <rule>
 86        <include state="tag"/>
 87      </rule>
 88    </state>
 89    <state name="tag">
 90      <rule pattern="((?:\w+)\s*=)(\s*)(".*?")">
 91        <bygroups>
 92          <token type="NameAttribute"/>
 93          <token type="Text"/>
 94          <token type="LiteralString"/>
 95        </bygroups>
 96      </rule>
 97      <rule pattern="/?\s*>">
 98        <token type="CommentPreproc"/>
 99        <pop depth="1"/>
100      </rule>
101      <rule pattern="\s+">
102        <token type="Text"/>
103      </rule>
104    </state>
105    <state name="attr">
106      <rule pattern="".*?"">
107        <token type="LiteralString"/>
108        <pop depth="1"/>
109      </rule>
110      <rule pattern="'.*?'">
111        <token type="LiteralString"/>
112        <pop depth="1"/>
113      </rule>
114      <rule pattern="[^\s>]+">
115        <token type="LiteralString"/>
116        <pop depth="1"/>
117      </rule>
118    </state>
119  </rules>
120</lexer>