1<lexer>
  2  <config>
  3    <name>Handlebars</name>
  4    <alias>handlebars</alias>
  5    <alias>hbs</alias>
  6    <filename>*.handlebars</filename>
  7    <filename>*.hbs</filename>
  8  </config>
  9  <rules>
 10    <state name="root">
 11      <rule pattern="[^{]+">
 12        <token type="Other"/>
 13      </rule>
 14      <rule pattern="\{\{!.*\}\}">
 15        <token type="Comment"/>
 16      </rule>
 17      <rule pattern="(\{\{\{)(\s*)">
 18        <bygroups>
 19          <token type="CommentSpecial"/>
 20          <token type="Text"/>
 21        </bygroups>
 22        <push state="tag"/>
 23      </rule>
 24      <rule pattern="(\{\{)(\s*)">
 25        <bygroups>
 26          <token type="CommentPreproc"/>
 27          <token type="Text"/>
 28        </bygroups>
 29        <push state="tag"/>
 30      </rule>
 31    </state>
 32    <state name="tag">
 33      <rule pattern="\s+">
 34        <token type="Text"/>
 35      </rule>
 36      <rule pattern="\}\}\}">
 37        <token type="CommentSpecial"/>
 38        <pop depth="1"/>
 39      </rule>
 40      <rule pattern="\}\}">
 41        <token type="CommentPreproc"/>
 42        <pop depth="1"/>
 43      </rule>
 44      <rule pattern="([#/]*)(each|if|unless|else|with|log|in(?:line)?)">
 45        <bygroups>
 46          <token type="Keyword"/>
 47          <token type="Keyword"/>
 48        </bygroups>
 49      </rule>
 50      <rule pattern="#\*inline">
 51        <token type="Keyword"/>
 52      </rule>
 53      <rule pattern="([#/])([\w-]+)">
 54        <bygroups>
 55          <token type="NameFunction"/>
 56          <token type="NameFunction"/>
 57        </bygroups>
 58      </rule>
 59      <rule pattern="([\w-]+)(=)">
 60        <bygroups>
 61          <token type="NameAttribute"/>
 62          <token type="Operator"/>
 63        </bygroups>
 64      </rule>
 65      <rule pattern="(>)(\s*)(@partial-block)">
 66        <bygroups>
 67          <token type="Keyword"/>
 68          <token type="Text"/>
 69          <token type="Keyword"/>
 70        </bygroups>
 71      </rule>
 72      <rule pattern="(#?>)(\s*)([\w-]+)">
 73        <bygroups>
 74          <token type="Keyword"/>
 75          <token type="Text"/>
 76          <token type="NameVariable"/>
 77        </bygroups>
 78      </rule>
 79      <rule pattern="(>)(\s*)(\()">
 80        <bygroups>
 81          <token type="Keyword"/>
 82          <token type="Text"/>
 83          <token type="Punctuation"/>
 84        </bygroups>
 85        <push state="dynamic-partial"/>
 86      </rule>
 87      <rule>
 88        <include state="generic"/>
 89      </rule>
 90    </state>
 91    <state name="dynamic-partial">
 92      <rule pattern="\s+">
 93        <token type="Text"/>
 94      </rule>
 95      <rule pattern="\)">
 96        <token type="Punctuation"/>
 97        <pop depth="1"/>
 98      </rule>
 99      <rule pattern="(lookup)(\s+)(\.|this)(\s+)">
100        <bygroups>
101          <token type="Keyword"/>
102          <token type="Text"/>
103          <token type="NameVariable"/>
104          <token type="Text"/>
105        </bygroups>
106      </rule>
107      <rule pattern="(lookup)(\s+)(\S+)">
108        <bygroups>
109          <token type="Keyword"/>
110          <token type="Text"/>
111          <usingself state="variable"/>
112        </bygroups>
113      </rule>
114      <rule pattern="[\w-]+">
115        <token type="NameFunction"/>
116      </rule>
117      <rule>
118        <include state="generic"/>
119      </rule>
120    </state>
121    <state name="variable">
122      <rule pattern="[a-zA-Z][\w-]*">
123        <token type="NameVariable"/>
124      </rule>
125      <rule pattern="\.[\w-]+">
126        <token type="NameVariable"/>
127      </rule>
128      <rule pattern="(this\/|\.\/|(\.\.\/)+)[\w-]+">
129        <token type="NameVariable"/>
130      </rule>
131    </state>
132    <state name="generic">
133      <rule>
134        <include state="variable"/>
135      </rule>
136      <rule pattern=":?"(\\\\|\\"|[^"])*"">
137        <token type="LiteralStringDouble"/>
138      </rule>
139      <rule pattern=":?'(\\\\|\\'|[^'])*'">
140        <token type="LiteralStringSingle"/>
141      </rule>
142      <rule pattern="[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?">
143        <token type="LiteralNumber"/>
144      </rule>
145    </state>
146  </rules>
147</lexer>