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