1<lexer>
  2  <config>
  3    <name>HTML</name>
  4    <alias>html</alias>
  5    <filename>*.html</filename>
  6    <filename>*.htm</filename>
  7    <filename>*.xhtml</filename>
  8    <filename>*.xslt</filename>
  9    <mime_type>text/html</mime_type>
 10    <mime_type>application/xhtml+xml</mime_type>
 11    <case_insensitive>true</case_insensitive>
 12    <dot_all>true</dot_all>
 13    <not_multiline>true</not_multiline>
 14  </config>
 15  <rules>
 16    <state name="script-content">
 17      <rule pattern="(<)(\s*)(/)(\s*)(script)(\s*)(>)">
 18        <bygroups>
 19          <token type="Punctuation"/>
 20          <token type="Text"/>
 21          <token type="Punctuation"/>
 22          <token type="Text"/>
 23          <token type="NameTag"/>
 24          <token type="Text"/>
 25          <token type="Punctuation"/>
 26        </bygroups>
 27        <pop depth="1"/>
 28      </rule>
 29      <rule pattern=".+?(?=<\s*/\s*script\s*>)">
 30        <using lexer="Javascript"/>
 31      </rule>
 32    </state>
 33    <state name="style-content">
 34      <rule pattern="(<)(\s*)(/)(\s*)(style)(\s*)(>)">
 35        <bygroups>
 36          <token type="Punctuation"/>
 37          <token type="Text"/>
 38          <token type="Punctuation"/>
 39          <token type="Text"/>
 40          <token type="NameTag"/>
 41          <token type="Text"/>
 42          <token type="Punctuation"/>
 43        </bygroups>
 44        <pop depth="1"/>
 45      </rule>
 46      <rule pattern=".+?(?=<\s*/\s*style\s*>)">
 47        <using lexer="CSS"/>
 48      </rule>
 49    </state>
 50    <state name="attr">
 51      <rule pattern="".*?"">
 52        <token type="LiteralString"/>
 53        <pop depth="1"/>
 54      </rule>
 55      <rule pattern="'.*?'">
 56        <token type="LiteralString"/>
 57        <pop depth="1"/>
 58      </rule>
 59      <rule pattern="[^\s>]+">
 60        <token type="LiteralString"/>
 61        <pop depth="1"/>
 62      </rule>
 63    </state>
 64    <state name="root">
 65      <rule pattern="[^<&]+">
 66        <token type="Text"/>
 67      </rule>
 68      <rule pattern="&\S*?;">
 69        <token type="NameEntity"/>
 70      </rule>
 71      <rule pattern="\<\!\[CDATA\[.*?\]\]\>">
 72        <token type="CommentPreproc"/>
 73      </rule>
 74      <rule pattern="<!--">
 75        <token type="Comment"/>
 76        <push state="comment"/>
 77      </rule>
 78      <rule pattern="<\?.*?\?>">
 79        <token type="CommentPreproc"/>
 80      </rule>
 81      <rule pattern="<![^>]*>">
 82        <token type="CommentPreproc"/>
 83      </rule>
 84      <rule pattern="(<)(\s*)(script)(\s*)">
 85        <bygroups>
 86          <token type="Punctuation"/>
 87          <token type="Text"/>
 88          <token type="NameTag"/>
 89          <token type="Text"/>
 90        </bygroups>
 91        <push state="script-content" state="tag"/>
 92      </rule>
 93      <rule pattern="(<)(\s*)(style)(\s*)">
 94        <bygroups>
 95          <token type="Punctuation"/>
 96          <token type="Text"/>
 97          <token type="NameTag"/>
 98          <token type="Text"/>
 99        </bygroups>
100        <push state="style-content" state="tag"/>
101      </rule>
102      <rule pattern="(<)(\s*)([\w:.-]+)">
103        <bygroups>
104          <token type="Punctuation"/>
105          <token type="Text"/>
106          <token type="NameTag"/>
107        </bygroups>
108        <push state="tag"/>
109      </rule>
110      <rule pattern="(<)(\s*)(/)(\s*)([\w:.-]+)(\s*)(>)">
111        <bygroups>
112          <token type="Punctuation"/>
113          <token type="Text"/>
114          <token type="Punctuation"/>
115          <token type="Text"/>
116          <token type="NameTag"/>
117          <token type="Text"/>
118          <token type="Punctuation"/>
119        </bygroups>
120      </rule>
121    </state>
122    <state name="comment">
123      <rule pattern="[^-]+">
124        <token type="Comment"/>
125      </rule>
126      <rule pattern="-->">
127        <token type="Comment"/>
128        <pop depth="1"/>
129      </rule>
130      <rule pattern="-">
131        <token type="Comment"/>
132      </rule>
133    </state>
134    <state name="tag">
135      <rule pattern="\s+">
136        <token type="Text"/>
137      </rule>
138      <rule pattern="([\w:-]+\s*)(=)(\s*)">
139        <bygroups>
140          <token type="NameAttribute"/>
141          <token type="Operator"/>
142          <token type="Text"/>
143        </bygroups>
144        <push state="attr"/>
145      </rule>
146      <rule pattern="[\w:-]+">
147        <token type="NameAttribute"/>
148      </rule>
149      <rule pattern="(/?)(\s*)(>)">
150        <bygroups>
151          <token type="Punctuation"/>
152          <token type="Text"/>
153          <token type="Punctuation"/>
154        </bygroups>
155        <pop depth="1"/>
156      </rule>
157    </state>
158  </rules>
159</lexer>