lectures.alex.balgavy.eu

Lecture notes from university.
git clone git://git.alex.balgavy.eu/lectures.alex.balgavy.eu.git
Log | Files | Refs | Submodules

HTML.sublime-syntax (23064B)


      1 %YAML 1.2
      2 ---
      3 name: HTML
      4 file_extensions:
      5   - html
      6   - htm
      7   - shtml
      8   - xhtml
      9 first_line_match: (?i)<(!DOCTYPE\s*)?html
     10 scope: text.html.basic
     11 
     12 variables:
     13   ascii_space: '\t\n\f '
     14 
     15   # https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
     16   attribute_name_char: '[{{ascii_space}}=/>]'
     17   attribute_name_start: (?=[^{{attribute_name_char}}])
     18   attribute_name_break: (?={{attribute_name_char}})
     19 
     20   # https://html.spec.whatwg.org/multipage/syntax.html#syntax-attribute-value
     21   unquoted_attribute_start: (?=[^{{ascii_space}}=>])
     22   unquoted_attribute_break: (?=[{{ascii_space}}]|/?>)
     23 
     24   # https://html.spec.whatwg.org/multipage/parsing.html#tag-name-state
     25   tag_name_char: '[^{{ascii_space}}/<>]'
     26   tag_name_break: (?=[^{{tag_name_char}}])
     27   tag_name: '[A-Za-z]{{tag_name_char}}*'
     28 
     29   block_tag_name: |-
     30     (?ix:
     31       address|applet|article|aside|blockquote|center|dd|dir|div|dl|dt|figcaption|figure|footer|frame|frameset|h1|h2|h3|h4|h5|h6|header|iframe|menu|nav|noframes|object|ol|p|pre|section|ul
     32     ){{tag_name_break}}
     33 
     34   inline_tag_name: |-
     35     (?ix:
     36       abbr|acronym|area|audio|b|base|basefont|bdi|bdo|big|br|canvas|caption|cite|code|del|details|dfn|dialog|em|font|head|html|i|img|ins|isindex|kbd|li|link|map|mark|menu|menuitem|meta|noscript|param|picture|q|rp|rt|rtc|ruby|s|samp|script|small|source|span|strike|strong|style|sub|summary|sup|time|title|track|tt|u|var|video|wbr
     37     ){{tag_name_break}}
     38 
     39   form_tag_name: |-
     40     (?ix:
     41       button|datalist|input|label|legend|meter|optgroup|option|output|progress|select|template|textarea
     42     ){{tag_name_break}}
     43 
     44   javascript_mime_type: |-
     45     (?ix:
     46       # https://mimesniff.spec.whatwg.org/#javascript-mime-type
     47       (?:application|text)/(?:x-)?(?:java|ecma)script
     48       | text/javascript1\.[0-5]
     49       | text/jscript
     50       | text/livescript
     51     )
     52 
     53   custom_element_char: |-
     54     (?x:
     55       # https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-core-concepts
     56         [-_a-z0-9\x{00B7}]
     57       | \\\.
     58       | [\x{00C0}-\x{00D6}]
     59       | [\x{00D8}-\x{00F6}]
     60       | [\x{00F8}-\x{02FF}]
     61       | [\x{0300}-\x{037D}]
     62       | [\x{037F}-\x{1FFF}]
     63       | [\x{200C}-\x{200D}]
     64       | [\x{203F}-\x{2040}]
     65       | [\x{2070}-\x{218F}]
     66       | [\x{2C00}-\x{2FEF}]
     67       | [\x{3001}-\x{D7FF}]
     68       | [\x{F900}-\x{FDCF}]
     69       | [\x{FDF0}-\x{FFFD}]
     70       | [\x{10000}-\x{EFFFF}]
     71     )
     72 
     73   script_close_lookahead: (?i:(?=(?:-->\s*)?</script))
     74 
     75 contexts:
     76   immediately-pop:
     77     - match: ''
     78       pop: true
     79 
     80   else-pop:
     81     - match: (?=\S)
     82       pop: true
     83 
     84   main:
     85     - include: comment
     86     - include: cdata
     87     - include: doctype
     88     - match: (<\?)(xml)
     89       captures:
     90         1: punctuation.definition.tag.begin.html
     91         2: entity.name.tag.xml.html
     92       push:
     93         - meta_scope: meta.tag.preprocessor.xml.html
     94         - match: '\?>'
     95           scope: punctuation.definition.tag.end.html
     96           pop: true
     97         - include: tag-generic-attribute
     98         - include: string-double-quoted
     99         - include: string-single-quoted
    100     - match: (<)((?i:style)){{tag_name_break}}
    101       captures:
    102         0: meta.tag.style.begin.html
    103         1: punctuation.definition.tag.begin.html
    104         2: entity.name.tag.style.html
    105       push: style-css
    106     - match: '(<)((?i:script)){{tag_name_break}}'
    107       captures:
    108         0: meta.tag.script.begin.html
    109         1: punctuation.definition.tag.begin.html
    110         2: entity.name.tag.script.html
    111       push: script-javascript
    112     - match: (</?)((?i:body|head|html){{tag_name_break}})
    113       captures:
    114         1: punctuation.definition.tag.begin.html
    115         2: entity.name.tag.structure.any.html
    116       push:
    117         - meta_scope: meta.tag.structure.any.html
    118         - include: tag-end
    119         - include: tag-attributes
    120     - match: (</?)({{block_tag_name}})
    121       captures:
    122         1: punctuation.definition.tag.begin.html
    123         2: entity.name.tag.block.any.html
    124       push:
    125         - meta_scope: meta.tag.block.any.html
    126         - include: tag-end
    127         - include: tag-attributes
    128     - match: (</?)((?i:hr){{tag_name_break}})
    129       captures:
    130         1: punctuation.definition.tag.begin.html
    131         2: entity.name.tag.block.any.html
    132       push:
    133         - meta_scope: meta.tag.block.any.html
    134         - include: tag-end-maybe-self-closing
    135         - include: tag-attributes
    136     - match: (</?)((?i:form|fieldset){{tag_name_break}})
    137       captures:
    138         1: punctuation.definition.tag.begin.html
    139         2: entity.name.tag.block.form.html
    140       push:
    141         - meta_scope: meta.tag.block.form.html
    142         - include: tag-end
    143         - include: tag-attributes
    144     - match: (</?)({{inline_tag_name}})
    145       captures:
    146         1: punctuation.definition.tag.begin.html
    147         2: entity.name.tag.inline.any.html
    148       push:
    149         - meta_scope: meta.tag.inline.any.html
    150         - include: tag-end-maybe-self-closing
    151         - include: tag-attributes
    152     - match: (</?)({{form_tag_name}})
    153       captures:
    154         1: punctuation.definition.tag.begin.html
    155         2: entity.name.tag.inline.form.html
    156       push:
    157         - meta_scope: meta.tag.inline.form.html
    158         - include: tag-end-maybe-self-closing
    159         - include: tag-attributes
    160     - match: (</?)((?i:a){{tag_name_break}})
    161       captures:
    162         1: punctuation.definition.tag.begin.html
    163         2: entity.name.tag.inline.a.html
    164       push:
    165         - meta_scope: meta.tag.inline.a.html
    166         - include: tag-end-maybe-self-closing
    167         - include: tag-attributes
    168     - match: (</?)((?i:col|colgroup|table|tbody|td|tfoot|th|thead|tr){{tag_name_break}})
    169       captures:
    170         1: punctuation.definition.tag.begin.html
    171         2: entity.name.tag.inline.table.html
    172       push:
    173         - meta_scope: meta.tag.inline.table.html
    174         - include: tag-end-maybe-self-closing
    175         - include: tag-attributes
    176     - match: </?(?=[A-Za-z]{{tag_name_char}}*?-)
    177       scope: punctuation.definition.tag.begin.html
    178       push:
    179         - tag-custom-body
    180         - tag-custom-name
    181     - match: </?(?=[A-Za-z])
    182       scope: punctuation.definition.tag.begin.html
    183       push:
    184         - tag-other-body
    185         - tag-other-name
    186     - include: entities
    187     - match: <>
    188       scope: invalid.illegal.incomplete.html
    189 
    190   tag-custom-name:
    191       - meta_content_scope: entity.name.tag.custom.html
    192       - match: '{{tag_name_break}}'
    193         pop: true
    194       - match: '{{custom_element_char}}+'
    195         # no scope
    196       - match: '{{tag_name_char}}'
    197         scope: invalid.illegal.custom-tag-name.html
    198 
    199   tag-custom-body:
    200       - meta_scope: meta.tag.custom.html
    201       - include: tag-end-maybe-self-closing
    202       - include: tag-attributes
    203 
    204   tag-other-name:
    205       - meta_content_scope: entity.name.tag.other.html
    206       - match: '{{tag_name_break}}'
    207         pop: true
    208 
    209   tag-other-body:
    210       - meta_scope: meta.tag.other.html
    211       - include: tag-end-maybe-self-closing
    212       - include: tag-attributes
    213 
    214   entities:
    215     - match: (&#[xX])\h+(;)
    216       scope: constant.character.entity.hexadecimal.html
    217       captures:
    218         1: punctuation.definition.entity.html
    219         2: punctuation.terminator.entity.html
    220     - match: (&#)[0-9]+(;)
    221       scope: constant.character.entity.decimal.html
    222       captures:
    223         1: punctuation.definition.entity.html
    224         2: punctuation.terminator.entity.html
    225     - match: (&)[a-zA-Z0-9]+(;)
    226       scope: constant.character.entity.named.html
    227       captures:
    228         1: punctuation.definition.entity.html
    229         2: punctuation.terminator.entity.html
    230 
    231   cdata:
    232     - match: (<!\[)(CDATA)(\[)
    233       captures:
    234         1: punctuation.definition.tag.begin.html
    235         2: keyword.declaration.cdata.html
    236         3: punctuation.definition.tag.begin.html
    237       push:
    238         - meta_scope: meta.tag.sgml.cdata.html
    239         - meta_content_scope: string.unquoted.cdata.html
    240         - match: ']]>'
    241           scope: punctuation.definition.tag.end.html
    242           pop: true
    243 
    244   comment:
    245     - match: (<!--)(-?>)?
    246       captures:
    247         1: punctuation.definition.comment.begin.html
    248         2: invalid.illegal.bad-comments-or-CDATA.html
    249       push:
    250         - meta_scope: comment.block.html
    251         - match: '(<!-)?(--\s*>)'
    252           captures:
    253             1: invalid.illegal.bad-comments-or-CDATA.html
    254             2: punctuation.definition.comment.end.html
    255           pop: true
    256         - match: '<!--(?!-?>)|--!>'
    257           scope: invalid.illegal.bad-comments-or-CDATA.html
    258 
    259   doctype:
    260     - match: (<!)(DOCTYPE)
    261       captures:
    262         1: punctuation.definition.tag.begin.html
    263         2: keyword.declaration.doctype.html
    264       push:
    265         - doctype-meta
    266         - doctype-content
    267         - doctype-content-type
    268         - doctype-name
    269 
    270   doctype-meta:
    271     - meta_scope: meta.tag.sgml.doctype.html
    272     - match: '>'
    273       scope: punctuation.definition.tag.end.html
    274       pop: true
    275 
    276   doctype-name:
    277     - match: '{{tag_name}}'
    278       scope: constant.language.doctype.html
    279       pop: true
    280     - include: else-pop
    281 
    282   doctype-content-type:
    283     - match: (?:PUBLIC|SYSTEM)\b
    284       scope: keyword.content.external.html
    285       pop: true
    286     - include: else-pop
    287 
    288   doctype-content:
    289     - match: \[
    290       scope: punctuation.section.brackets.begin.html
    291       set:
    292         - meta_scope: meta.brackets.html meta.internal-subset.xml.html
    293         - match: \]
    294           scope: punctuation.section.brackets.end.html
    295           pop: true
    296         - include: comment
    297     - include: string-double-quoted
    298     - include: string-single-quoted
    299     - include: else-pop
    300 
    301   style-css:
    302     - meta_content_scope: meta.tag.style.begin.html
    303     - include: style-common
    304     - match: '>'
    305       scope: punctuation.definition.tag.end.html
    306       set:
    307         - include: style-close-tag
    308         - match: (?=\S)
    309           embed: scope:source.css
    310           embed_scope: source.css.embedded.html
    311           escape: (?i)(?=(?:-->\s*)?</style)
    312 
    313   style-other:
    314     - meta_content_scope: meta.tag.style.begin.html
    315     - include: style-common
    316     - match: '>'
    317       scope: punctuation.definition.tag.end.html
    318       set:
    319         - include: style-close-tag
    320 
    321   style-close-tag:
    322     - match: (?i)(</)(style)(>)
    323       scope: meta.tag.style.end.html
    324       captures:
    325         1: punctuation.definition.tag.begin.html
    326         2: entity.name.tag.style.html
    327         3: punctuation.definition.tag.end.html
    328       pop: true
    329 
    330   style-common:
    331     - include: style-type-attribute
    332     - include: tag-attributes
    333     - include: tag-end-self-closing
    334 
    335   style-type-attribute:
    336     - match: (?i)\btype\b
    337       scope: meta.attribute-with-value.html entity.other.attribute-name.html
    338       set:
    339         - meta_content_scope: meta.tag.style.begin.html meta.attribute-with-value.html
    340         - match: =
    341           scope: punctuation.separator.key-value.html
    342           set:
    343             - meta_content_scope: meta.tag.style.begin.html meta.attribute-with-value.html
    344             - include: style-type-decider
    345         - match: (?=\S)
    346           set: style-css
    347 
    348   style-type-decider:
    349     - match: (?i)(?=text/css{{unquoted_attribute_break}}|'text/css'|"text/css")
    350       set:
    351         - style-css
    352         - tag-generic-attribute-meta
    353         - tag-generic-attribute-value
    354     - match: (?i)(?=>|''|"")
    355       set:
    356         - style-css
    357         - tag-generic-attribute-meta
    358         - tag-generic-attribute-value
    359     - match: (?=\S)
    360       set:
    361         - style-other
    362         - tag-generic-attribute-meta
    363         - tag-generic-attribute-value
    364 
    365   script-javascript:
    366     - meta_content_scope: meta.tag.script.begin.html
    367     - include: script-common
    368     - match: '>'
    369       scope: punctuation.definition.tag.end.html
    370       set:
    371         - include: script-close-tag
    372         - match: (?=\S)
    373           embed: scope:source.js
    374           embed_scope: source.js.embedded.html
    375           escape: '{{script_close_lookahead}}'
    376 
    377   script-html:
    378     - meta_content_scope: meta.tag.script.begin.html
    379     - include: script-common
    380     - match: '>'
    381       scope: punctuation.definition.tag.end.html
    382       set:
    383         - meta_content_scope: text.html.embedded.html
    384         - include: comment
    385         - include: script-close-tag
    386         - include: main
    387 
    388   script-other:
    389     - meta_content_scope: meta.tag.script.begin.html
    390     - include: script-common
    391     - match: '>'
    392       scope: punctuation.definition.tag.end.html
    393       set:
    394         - include: script-close-tag
    395 
    396   script-close-tag:
    397     - match: <!--
    398       scope: comment.block.html punctuation.definition.comment.begin.html
    399     - match: '{{script_close_lookahead}}'
    400       set:
    401         - match: '-->'
    402           scope: comment.block.html punctuation.definition.comment.end.html
    403         - match: (?i:(</)(script))
    404           captures:
    405             1: punctuation.definition.tag.begin.html
    406             2: entity.name.tag.script.html
    407           set:
    408             - meta_scope: meta.tag.script.end.html
    409             - include: tag-end
    410             - include: tag-attributes
    411 
    412   script-common:
    413     - include: script-type-attribute
    414     - include: tag-attributes
    415     - include: tag-end-self-closing
    416 
    417   script-type-attribute:
    418     - match: (?i)\btype\b
    419       scope: meta.attribute-with-value.html entity.other.attribute-name.html
    420       set:
    421         - meta_content_scope: meta.tag.script.begin.html meta.attribute-with-value.html
    422         - match: =
    423           scope: punctuation.separator.key-value.html
    424           set:
    425             - meta_content_scope: meta.tag.script.begin.html meta.attribute-with-value.html
    426             - include: script-type-decider
    427         - match: (?=\S)
    428           set: script-javascript
    429 
    430   script-type-decider:
    431     - match: (?i)(?={{javascript_mime_type}}{{unquoted_attribute_break}}|'{{javascript_mime_type}}'|"{{javascript_mime_type}}")
    432       set:
    433         - script-javascript
    434         - tag-generic-attribute-meta
    435         - tag-generic-attribute-value
    436     - match: (?i)(?=module{{unquoted_attribute_break}}|'module'|"module")
    437       set:
    438         - script-javascript
    439         - tag-generic-attribute-meta
    440         - tag-generic-attribute-value
    441     - match: (?i)(?=>|''|"")
    442       set:
    443         - script-javascript
    444         - tag-generic-attribute-meta
    445         - tag-generic-attribute-value
    446     - match: (?i)(?=text/html{{unquoted_attribute_break}}|'text/html'|"text/html")
    447       set:
    448         - script-html
    449         - tag-generic-attribute-meta
    450         - tag-generic-attribute-value
    451     - match: (?=\S)
    452       set:
    453         - script-other
    454         - tag-generic-attribute-meta
    455         - tag-generic-attribute-value
    456 
    457   string-double-quoted:
    458     - match: '"'
    459       scope: punctuation.definition.string.begin.html
    460       push:
    461         - meta_scope: string.quoted.double.html
    462         - match: '"'
    463           scope: punctuation.definition.string.end.html
    464           pop: true
    465         - include: entities
    466   string-single-quoted:
    467     - match: "'"
    468       scope: punctuation.definition.string.begin.html
    469       push:
    470         - meta_scope: string.quoted.single.html
    471         - match: "'"
    472           scope: punctuation.definition.string.end.html
    473           pop: true
    474         - include: entities
    475 
    476   tag-generic-attribute:
    477     - match: '{{attribute_name_start}}'
    478       push:
    479         - tag-generic-attribute-meta
    480         - tag-generic-attribute-equals
    481         - tag-generic-attribute-name
    482 
    483   tag-generic-attribute-name:
    484     - meta_scope: entity.other.attribute-name.html
    485     - match: '{{attribute_name_break}}'
    486       pop: true
    487     - match: '["''`<]'
    488       scope: invalid.illegal.attribute-name.html
    489 
    490   tag-generic-attribute-meta:
    491     - meta_scope: meta.attribute-with-value.html
    492     - include: immediately-pop
    493 
    494   tag-generic-attribute-equals:
    495     - match: '='
    496       scope: punctuation.separator.key-value.html
    497       set: tag-generic-attribute-value
    498     - include: else-pop
    499 
    500   tag-generic-attribute-value:
    501     - match: '"'
    502       scope: punctuation.definition.string.begin.html
    503       set:
    504         - meta_scope: string.quoted.double.html
    505         - match: '"'
    506           scope: punctuation.definition.string.end.html
    507           pop: true
    508         - include: entities
    509     - match: "'"
    510       scope: punctuation.definition.string.begin.html
    511       set:
    512         - meta_scope: string.quoted.single.html
    513         - match: "'"
    514           scope: punctuation.definition.string.end.html
    515           pop: true
    516         - include: entities
    517     - match: '{{unquoted_attribute_start}}'
    518       set:
    519         - meta_scope: string.unquoted.html
    520         - match: '{{unquoted_attribute_break}}'
    521           pop: true
    522         - match: '["''`<]'
    523           scope: invalid.illegal.attribute-value.html
    524         - include: entities
    525     - include: else-pop
    526 
    527   tag-class-attribute:
    528     - match: '\bclass\b'
    529       scope: entity.other.attribute-name.class.html
    530       push:
    531         - tag-class-attribute-meta
    532         - tag-class-attribute-equals
    533 
    534   tag-class-attribute-meta:
    535     - meta_scope: meta.attribute-with-value.class.html
    536     - include: immediately-pop
    537 
    538   tag-class-attribute-equals:
    539     - match: '='
    540       scope: punctuation.separator.key-value.html
    541       set: tag-class-attribute-value
    542     - include: else-pop
    543 
    544   tag-class-attribute-value:
    545     - match: '"'
    546       scope: punctuation.definition.string.begin.html
    547       set:
    548         - meta_scope: string.quoted.double.html
    549         - meta_content_scope: meta.class-name.html
    550         - match: '"'
    551           scope: punctuation.definition.string.end.html
    552           pop: true
    553         - include: tag-attribute-value-separator
    554         - include: entities
    555     - match: "'"
    556       scope: punctuation.definition.string.begin.html
    557       set:
    558         - meta_scope: string.quoted.single.html
    559         - meta_content_scope: meta.class-name.html
    560         - match: "'"
    561           scope: punctuation.definition.string.end.html
    562           pop: true
    563         - include: tag-attribute-value-separator
    564         - include: entities
    565     - match: '{{unquoted_attribute_start}}'
    566       set:
    567         - meta_scope: string.unquoted.html meta.class-name.html
    568         - match: '{{unquoted_attribute_break}}'
    569           pop: true
    570         - match: '["''`<]'
    571           scope: invalid.illegal.attribute-value.html
    572         - include: entities
    573     - include: else-pop
    574 
    575   tag-id-attribute:
    576     - match: '\bid\b'
    577       scope: entity.other.attribute-name.id.html
    578       push:
    579         - tag-id-attribute-meta
    580         - tag-id-attribute-equals
    581 
    582   tag-id-attribute-meta:
    583     - meta_scope: meta.attribute-with-value.id.html
    584     - include: immediately-pop
    585 
    586   tag-id-attribute-equals:
    587     - match: '='
    588       scope: punctuation.separator.key-value.html
    589       set: tag-id-attribute-value
    590     - include: else-pop
    591 
    592   tag-id-attribute-value:
    593     - match: '"'
    594       scope: punctuation.definition.string.begin.html
    595       set:
    596         - meta_scope: string.quoted.double.html
    597         - meta_content_scope: meta.toc-list.id.html
    598         - match: '"'
    599           scope: punctuation.definition.string.end.html
    600           pop: true
    601         - include: tag-attribute-value-separator
    602         - include: entities
    603     - match: "'"
    604       scope: punctuation.definition.string.begin.html
    605       set:
    606         - meta_scope: string.quoted.single.html
    607         - meta_content_scope: meta.toc-list.id.html
    608         - match: "'"
    609           scope: punctuation.definition.string.end.html
    610           pop: true
    611         - include: tag-attribute-value-separator
    612         - include: entities
    613     - match: '{{unquoted_attribute_start}}'
    614       set:
    615         - meta_scope: string.unquoted.html meta.toc-list.id.html
    616         - match: '{{unquoted_attribute_break}}'
    617           pop: true
    618         - match: '["''`<]'
    619           scope: invalid.illegal.attribute-value.html
    620         - include: entities
    621     - include: else-pop
    622 
    623   tag-style-attribute:
    624     - match: '\bstyle\b'
    625       scope: entity.other.attribute-name.style.html
    626       push:
    627         - tag-style-attribute-meta
    628         - tag-style-attribute-equals
    629 
    630   tag-style-attribute-meta:
    631     - meta_scope: meta.attribute-with-value.style.html
    632     - include: immediately-pop
    633 
    634   tag-style-attribute-equals:
    635     - match: '='
    636       scope: punctuation.separator.key-value.html
    637       set: tag-style-attribute-value
    638     - include: else-pop
    639 
    640   tag-style-attribute-value:
    641     - match: '"'
    642       scope: string.quoted.double punctuation.definition.string.begin.html
    643       embed: scope:source.css#rule-list-body
    644       embed_scope: source.css
    645       escape: '"'
    646       escape_captures:
    647         0: string.quoted.double punctuation.definition.string.end.html
    648     - match: "'"
    649       scope: string.quoted.single punctuation.definition.string.begin.html
    650       embed: scope:source.css#rule-list-body
    651       embed_scope: source.css
    652       escape: "'"
    653       escape_captures:
    654         0: string.quoted.single punctuation.definition.string.end.html
    655     - include: else-pop
    656 
    657   tag-event-attribute:
    658     - match: |-
    659         (?x)\bon(
    660           abort|autocomplete|autocompleteerror|auxclick|blur|cancel|canplay
    661           |canplaythrough|change|click|close|contextmenu|cuechange|dblclick|drag
    662           |dragend|dragenter|dragexit|dragleave|dragover|dragstart|drop
    663           |durationchange|emptied|ended|error|focus|input|invalid|keydown
    664           |keypress|keyup|load|loadeddata|loadedmetadata|loadstart|mousedown
    665           |mouseenter|mouseleave|mousemove|mouseout|mouseover|mouseup|mousewheel
    666           |pause|play|playing|progress|ratechange|reset|resize|scroll|seeked
    667           |seeking|select|show|sort|stalled|submit|suspend|timeupdate|toggle
    668           |volumechange|waiting
    669         )\b
    670       scope: entity.other.attribute-name.event.html
    671       push:
    672         - tag-event-attribute-meta
    673         - tag-event-attribute-equals
    674 
    675   tag-event-attribute-meta:
    676     - meta_scope: meta.attribute-with-value.event.html
    677     - include: immediately-pop
    678 
    679   tag-event-attribute-equals:
    680     - match: '='
    681       scope: punctuation.separator.key-value.html
    682       set: tag-event-attribute-value
    683     - include: else-pop
    684 
    685   tag-event-attribute-value:
    686     - match: '"'
    687       scope: string.quoted.double punctuation.definition.string.begin.html
    688       embed: scope:source.js
    689       embed_scope: meta.attribute-with-value.event.html
    690       escape: '"'
    691       escape_captures:
    692         0: string.quoted.double punctuation.definition.string.end.html
    693     - match: "'"
    694       scope: string.quoted.single punctuation.definition.string.begin.html meta.attribute-with-value.event.html
    695       embed: scope:source.js
    696       embed_scope: meta.attribute-with-value.event.html
    697       escape: "'"
    698       escape_captures:
    699         0: string.quoted.single punctuation.definition.string.end.html
    700     - include: else-pop
    701 
    702   # This is to prevent breaking syntaxes referencing the old context name
    703   tag-stuff:
    704     - include: tag-attributes
    705 
    706   tag-attributes:
    707     - include: tag-id-attribute
    708     - include: tag-class-attribute
    709     - include: tag-style-attribute
    710     - include: tag-event-attribute
    711     - include: tag-generic-attribute
    712 
    713   tag-attribute-value-separator:
    714     - match: (?=[{{ascii_space}}])
    715       push:
    716         - clear_scopes: 1 # clear `meta.class-name` or `meta.toc-list.id`
    717         - include: else-pop
    718 
    719   tag-end:
    720     - match: '>'
    721       scope: punctuation.definition.tag.end.html
    722       pop: true
    723 
    724   tag-end-self-closing:
    725     - match: '/>'
    726       scope: punctuation.definition.tag.end.html
    727       pop: true
    728 
    729   tag-end-maybe-self-closing:
    730     - match: '/?>'
    731       scope: punctuation.definition.tag.end.html
    732       pop: true