1<lexer>
  2  <config>
  3    <name>Twig</name>
  4    <alias>twig</alias>
  5    <filename>*.twig</filename>
  6    <mime_type>application/x-twig</mime_type>
  7    <dot_all>true</dot_all>
  8  </config>
  9  <rules>
 10    <state name="var">
 11      <rule pattern="\s+">
 12        <token type="Text"/>
 13      </rule>
 14      <rule pattern="(-?)(\}\})">
 15        <bygroups>
 16          <token type="Text"/>
 17          <token type="CommentPreproc"/>
 18        </bygroups>
 19        <pop depth="1"/>
 20      </rule>
 21      <rule>
 22        <include state="varnames"/>
 23      </rule>
 24    </state>
 25    <state name="tag">
 26      <rule pattern="\s+">
 27        <token type="Text"/>
 28      </rule>
 29      <rule pattern="(-?)(%\})">
 30        <bygroups>
 31          <token type="Text"/>
 32          <token type="CommentPreproc"/>
 33        </bygroups>
 34        <pop depth="1"/>
 35      </rule>
 36      <rule>
 37        <include state="varnames"/>
 38      </rule>
 39      <rule pattern=".">
 40        <token type="Punctuation"/>
 41      </rule>
 42    </state>
 43    <state name="root">
 44      <rule pattern="[^{]+">
 45        <token type="Other"/>
 46      </rule>
 47      <rule pattern="\{\{">
 48        <token type="CommentPreproc"/>
 49        <push state="var"/>
 50      </rule>
 51      <rule pattern="\{\#.*?\#\}">
 52        <token type="Comment"/>
 53      </rule>
 54      <rule pattern="(\{%)(-?\s*)(raw)(\s*-?)(%\})(.*?)(\{%)(-?\s*)(endraw)(\s*-?)(%\})">
 55        <bygroups>
 56          <token type="CommentPreproc"/>
 57          <token type="Text"/>
 58          <token type="Keyword"/>
 59          <token type="Text"/>
 60          <token type="CommentPreproc"/>
 61          <token type="Other"/>
 62          <token type="CommentPreproc"/>
 63          <token type="Text"/>
 64          <token type="Keyword"/>
 65          <token type="Text"/>
 66          <token type="CommentPreproc"/>
 67        </bygroups>
 68      </rule>
 69      <rule pattern="(\{%)(-?\s*)(verbatim)(\s*-?)(%\})(.*?)(\{%)(-?\s*)(endverbatim)(\s*-?)(%\})">
 70        <bygroups>
 71          <token type="CommentPreproc"/>
 72          <token type="Text"/>
 73          <token type="Keyword"/>
 74          <token type="Text"/>
 75          <token type="CommentPreproc"/>
 76          <token type="Other"/>
 77          <token type="CommentPreproc"/>
 78          <token type="Text"/>
 79          <token type="Keyword"/>
 80          <token type="Text"/>
 81          <token type="CommentPreproc"/>
 82        </bygroups>
 83      </rule>
 84      <rule pattern="(\{%)(-?\s*)(filter)(\s+)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*)">
 85        <bygroups>
 86          <token type="CommentPreproc"/>
 87          <token type="Text"/>
 88          <token type="Keyword"/>
 89          <token type="Text"/>
 90          <token type="NameFunction"/>
 91        </bygroups>
 92        <push state="tag"/>
 93      </rule>
 94      <rule pattern="(\{%)(-?\s*)([a-zA-Z_]\w*)">
 95        <bygroups>
 96          <token type="CommentPreproc"/>
 97          <token type="Text"/>
 98          <token type="Keyword"/>
 99        </bygroups>
100        <push state="tag"/>
101      </rule>
102      <rule pattern="\{">
103        <token type="Other"/>
104      </rule>
105    </state>
106    <state name="varnames">
107      <rule pattern="(\|)(\s*)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*)">
108        <bygroups>
109          <token type="Operator"/>
110          <token type="Text"/>
111          <token type="NameFunction"/>
112        </bygroups>
113      </rule>
114      <rule pattern="(is)(\s+)(not)?(\s*)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*)">
115        <bygroups>
116          <token type="Keyword"/>
117          <token type="Text"/>
118          <token type="Keyword"/>
119          <token type="Text"/>
120          <token type="NameFunction"/>
121        </bygroups>
122      </rule>
123      <rule pattern="(?i)(true|false|none|null)\b">
124        <token type="KeywordPseudo"/>
125      </rule>
126      <rule pattern="(in|not|and|b-and|or|b-or|b-xor|isif|elseif|else|importconstant|defined|divisibleby|empty|even|iterable|odd|sameasmatches|starts\s+with|ends\s+with)\b">
127        <token type="Keyword"/>
128      </rule>
129      <rule pattern="(loop|block|parent)\b">
130        <token type="NameBuiltin"/>
131      </rule>
132      <rule pattern="(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*">
133        <token type="NameVariable"/>
134      </rule>
135      <rule pattern="\.(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*">
136        <token type="NameVariable"/>
137      </rule>
138      <rule pattern="\.[0-9]+">
139        <token type="LiteralNumber"/>
140      </rule>
141      <rule pattern=":?"(\\\\|\\"|[^"])*"">
142        <token type="LiteralStringDouble"/>
143      </rule>
144      <rule pattern=":?'(\\\\|\\'|[^'])*'">
145        <token type="LiteralStringSingle"/>
146      </rule>
147      <rule pattern="([{}()\[\]+\-*/,:~%]|\.\.|\?|:|\*\*|\/\/|!=|[><=]=?)">
148        <token type="Operator"/>
149      </rule>
150      <rule pattern="[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?">
151        <token type="LiteralNumber"/>
152      </rule>
153    </state>
154  </rules>
155</lexer>