Created
September 12, 2017 18:15
-
-
Save zheeeng/fc63592bcfc4ea786e668d42bc0732ed to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%YAML 1.2 | |
--- | |
name: HTML | |
file_extensions: | |
- html | |
- htm | |
- shtml | |
- xhtml | |
- inc | |
- tmpl | |
- tpl | |
first_line_match: (?i)<(!DOCTYPE\s*)?html | |
scope: text.html.basic | |
contexts: | |
main: | |
- match: (<\?)(xml) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.xml.html | |
push: | |
- meta_scope: meta.tag.preprocessor.xml.html | |
- match: '\?>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-generic-attribute | |
- include: string-double-quoted | |
- include: string-single-quoted | |
- match: <!-- | |
scope: punctuation.definition.comment.html | |
push: | |
- meta_scope: comment.block.html | |
- match: '--\s*>' | |
pop: true | |
- match: "--" | |
scope: invalid.illegal.bad-comments-or-CDATA.html | |
- match: <! | |
scope: punctuation.definition.tag.html | |
push: | |
- meta_scope: meta.tag.sgml.html | |
- match: ">" | |
scope: punctuation.definition.tag.html | |
pop: true | |
- match: (?i:DOCTYPE) | |
scope: entity.name.tag.doctype.html | |
push: | |
- meta_scope: meta.tag.sgml.doctype.html | |
- match: (?=>) | |
pop: true | |
- match: '"[^">]*"' | |
scope: string.quoted.double.doctype.identifiers-and-DTDs.html | |
- match: '\[CDATA\[' | |
push: | |
- meta_scope: constant.other.inline-data.html | |
- match: "]](?=>)" | |
pop: true | |
- match: (\s*)(?!--|>)\S(\s*) | |
scope: invalid.illegal.bad-comments-or-CDATA.html | |
- match: (</?)([a-z_][a-z0-9:_]*-[a-z0-9:_-]+) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.custom.html | |
push: | |
- meta_scope: meta.tag.custom.html | |
- match: '>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: '(?:^\s+)?(<)((?i:style))\b(?![^>]*/>)' | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.style.html | |
push: | |
- match: (?i)(</)(style)(>) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.html | |
3: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: '>' | |
scope: punctuation.definition.tag.end.html | |
push: | |
- meta_content_scope: source.css.embedded.html | |
- include: 'scope:source.css' | |
with_prototype: | |
- match: (?i)(?=</style) | |
pop: true | |
- match: '(<)((?i:script))\b(?![^>]*/>)(?![^>]*(?i:type.?=.?text/((?!javascript|babel).*)))' | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.script.html | |
push: | |
- match: (?i)(</)(script)(>) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.html | |
3: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: '>' | |
scope: punctuation.definition.tag.end.html | |
push: | |
- meta_content_scope: source.js.embedded.html | |
- include: 'scope:source.js' | |
with_prototype: | |
- match: (?i)(?=</script) | |
pop: true | |
- match: (</?)((?i:body|head|html)\b) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.structure.any.html | |
push: | |
- meta_scope: meta.tag.structure.any.html | |
- match: '>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: (</?)((?i:address|blockquote|dd|div|section|article|aside|header|footer|nav|menu|dl|dt|frame|frameset|h1|h2|h3|h4|h5|h6|iframe|noframes|object|ol|p|ul|applet|center|dir|hr|pre)\b) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.block.any.html | |
push: | |
- meta_scope: meta.tag.block.any.html | |
- match: '>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: (</?)((?i:form|fieldset)\b) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.block.form.html | |
push: | |
- meta_scope: meta.tag.block.form.html | |
- match: '>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: (</?)((?i:abbr|acronym|area|b|base|basefont|bdo|big|br|caption|cite|code|del|dfn|em|font|head|html|i|img|ins|isindex|kbd|li|link|map|meta|noscript|param|q|s|samp|script|small|span|strike|strong|style|sub|sup|title|tt|u|var)\b) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.inline.any.html | |
push: | |
- meta_scope: meta.tag.inline.any.html | |
- match: '(?: ?/)?>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: (</?)((?i:button|input|label|legend|optgroup|option|select|textarea)\b) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.inline.form.html | |
push: | |
- meta_scope: meta.tag.inline.form.html | |
- match: '(?: ?/)?>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: (</?)((?i:a)\b) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.inline.a.html | |
push: | |
- meta_scope: meta.tag.inline.a.html | |
- match: '(?: ?/)?>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: (</?)((?i:col|colgroup|table|tbody|td|tfoot|th|thead|tr)\b) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.inline.table.html | |
push: | |
- meta_scope: meta.tag.inline.table.html | |
- match: '(?: ?/)?>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: (</?)([A-Za-z0-9:_]+-[A-Za-z0-9:_-]+) | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: invalid.illegal.uppercase-custom-tag-name.html | |
push: | |
- meta_scope: meta.tag.custom.html | |
- match: '>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- match: "(</?)([a-zA-Z0-9:]+)" | |
captures: | |
1: punctuation.definition.tag.begin.html | |
2: entity.name.tag.other.html | |
push: | |
- meta_scope: meta.tag.other.html | |
- match: '>' | |
scope: punctuation.definition.tag.end.html | |
pop: true | |
- include: tag-stuff | |
- include: entities | |
- match: <> | |
scope: invalid.illegal.incomplete.html | |
entities: | |
- match: "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)" | |
scope: constant.character.entity.html | |
captures: | |
1: punctuation.definition.entity.html | |
3: punctuation.definition.entity.html | |
- match: "&" | |
scope: invalid.illegal.bad-ampersand.html | |
string-double-quoted: | |
- match: '"' | |
scope: punctuation.definition.string.begin.html | |
push: | |
- meta_scope: string.quoted.double.html | |
- match: '"' | |
scope: punctuation.definition.string.end.html | |
pop: true | |
- include: entities | |
string-single-quoted: | |
- match: "'" | |
scope: punctuation.definition.string.begin.html | |
push: | |
- meta_scope: string.quoted.single.html | |
- match: "'" | |
scope: punctuation.definition.string.end.html | |
pop: true | |
- include: entities | |
tag-generic-attribute: | |
- match: '\s+(([a-zA-Z0-9:-]+)\s*(=)\s*)' | |
captures: | |
1: meta.attribute-with-value.html | |
2: entity.other.attribute-name.html | |
3: punctuation.separator.key-value.html | |
push: | |
- match: '"' | |
scope: punctuation.definition.string.begin.html | |
set: | |
- meta_scope: meta.attribute-with-value.html string.quoted.double.html | |
- match: '"' | |
scope: punctuation.definition.string.end.html | |
pop: true | |
- include: entities | |
- match: "'" | |
scope: punctuation.definition.string.begin.html | |
set: | |
- meta_scope: meta.attribute-with-value.html string.quoted.single.html | |
- match: "'" | |
scope: punctuation.definition.string.end.html | |
pop: true | |
- include: entities | |
- match: '(?:[^\s<>/''"]|/(?!>))+' | |
scope: meta.attribute-with-value.html string.unquoted.html | |
- match: '' | |
pop: true | |
- match: '\s+([a-zA-Z0-9:-]+)' | |
captures: | |
1: entity.other.attribute-name.html | |
tag-class-attribute: | |
- match: '\s+\b((class)\b\s*(=)\s*)' | |
captures: | |
1: meta.attribute-with-value.class.html | |
2: entity.other.attribute-name.class.html | |
3: punctuation.separator.key-value.html | |
push: | |
- match: '"' | |
scope: punctuation.definition.string.begin.html | |
set: | |
- meta_scope: meta.attribute-with-value.class.html string.quoted.double.html | |
- meta_content_scope: meta.class-name.html | |
- match: '"' | |
scope: punctuation.definition.string.end.html | |
pop: true | |
- include: entities | |
- match: "'" | |
scope: punctuation.definition.string.begin.html | |
set: | |
- meta_scope: meta.attribute-with-value.class.html string.quoted.single.html | |
- meta_content_scope: meta.class-name.html | |
- match: "'" | |
scope: punctuation.definition.string.end.html | |
pop: true | |
- include: entities | |
- match: '(?:[^\s<>/''"]|/(?!>))+' | |
scope: meta.attribute-with-value.class.html string.unquoted.html meta.class-name.html | |
- match: '' | |
pop: true | |
tag-id-attribute: | |
- match: '\s+\b((id)\b\s*(=)\s*)' | |
captures: | |
1: meta.attribute-with-value.id.html | |
2: entity.other.attribute-name.id.html | |
3: punctuation.separator.key-value.html | |
push: | |
- match: '"' | |
scope: punctuation.definition.string.begin.html | |
set: | |
- meta_scope: meta.attribute-with-value.id.html string.quoted.double.html | |
- meta_content_scope: meta.toc-list.id.html | |
- match: '"' | |
scope: punctuation.definition.string.end.html | |
pop: true | |
- include: entities | |
- match: "'" | |
scope: punctuation.definition.string.begin.html | |
set: | |
- meta_scope: meta.attribute-with-value.id.html string.quoted.single.html | |
- meta_content_scope: meta.toc-list.id.html | |
- match: "'" | |
scope: punctuation.definition.string.end.html | |
pop: true | |
- include: entities | |
- match: '(?:[^\s<>/''"]|/(?!>))+' | |
scope: meta.attribute-with-value.id.html string.unquoted.html meta.toc-list.id.html | |
- match: '' | |
pop: true | |
tag-style-attribute: | |
- match: '\s+\b((style)\b\s*(=)\s*)' | |
captures: | |
1: meta.attribute-with-value.style.html | |
2: entity.other.attribute-name.style.html | |
3: punctuation.separator.key-value.html | |
push: | |
- match: '"' | |
scope: string.quoted.double punctuation.definition.string.begin.html | |
set: | |
- meta_scope: meta.attribute-with-value.style.html | |
- meta_content_scope: source.css | |
- match: '"' | |
scope: string.quoted.double punctuation.definition.string.end.html | |
pop: true | |
- match: '' | |
# An anonymous context with an include is used here rather than | |
# a direct push, so that if the target context isn't found it's | |
# only a warning rather than an error. This will likely happen | |
# if the user has replaced the default CSS syntax | |
push: | |
- include: 'CSS.sublime-syntax#rule-list-body' | |
with_prototype: | |
- match: '(?=")' | |
pop: true | |
- include: entities | |
- match: "'" | |
scope: string.quoted.single punctuation.definition.string.begin.html | |
set: | |
- meta_scope: meta.attribute-with-value.style.html source.css | |
- match: "'" | |
scope: string.quoted.single punctuation.definition.string.end.html | |
pop: true | |
- match: '' | |
# An anonymous context with an include is used here rather than | |
# a direct push, so that if the target context isn't found it's | |
# only a warning rather than an error. This will likely happen | |
# if the user has replaced the default CSS syntax | |
push: | |
- include: 'CSS.sublime-syntax#rule-list-body' | |
with_prototype: | |
- match: "(?=')" | |
pop: true | |
- include: entities | |
- match: '' | |
pop: true | |
tag-event-attribute: | |
- match: |- | |
(?x)\s*\b(( | |
onabort|onautocomplete|onautocompleteerror|onblur|oncancel|oncanplay| | |
oncanplaythrough|onchange|onclick|onclose|oncontextmenu|oncuechange| | |
ondblclick|ondrag|ondragend|ondragenter|ondragexit|ondragleave|ondragover| | |
ondragstart|ondrop|ondurationchange|onemptied|onended|onerror|onfocus| | |
oninput|oninvalid|onkeydown|onkeypress|onkeyup|onload|onloadeddata| | |
onloadedmetadata|onloadstart|onmousedown|onmouseenter|onmouseleave| | |
onmousemove|onmouseout|onmouseover|onmouseup|onmousewheel|onpause|onplay| | |
onplaying|onprogress|onratechange|onreset|onresize|onscroll|onseeked| | |
onseeking|onselect|onshow|onsort|onstalled|onsubmit|onsuspend| | |
ontimeupdate|ontoggle|onvolumechange|onwaiting)\b\s*(=)\s*) | |
captures: | |
1: meta.attribute-with-value.event.html | |
2: entity.other.attribute-name.event.html | |
3: punctuation.separator.key-value.html | |
push: | |
- match: '"' | |
scope: string.quoted.double punctuation.definition.string.begin.html | |
set: | |
- meta_scope: meta.attribute-with-value.event.html | |
- match: '"' | |
scope: string.quoted.double punctuation.definition.string.end.html | |
pop: true | |
- match: '' | |
push: 'scope:source.js' | |
with_prototype: | |
- match: '(?=")' | |
pop: true | |
- include: entities | |
- match: "'" | |
scope: string.quoted.single punctuation.definition.string.begin.html | |
set: | |
- meta_scope: meta.attribute-with-value.event.html | |
- match: "'" | |
scope: string.quoted.single punctuation.definition.string.end.html | |
pop: true | |
- match: '' | |
push: 'scope:source.js' | |
with_prototype: | |
- match: "(?=')" | |
pop: true | |
- include: entities | |
- match: '' | |
pop: true | |
tag-stuff: | |
- include: tag-id-attribute | |
- include: tag-class-attribute | |
- include: tag-style-attribute | |
- include: tag-event-attribute | |
- include: tag-generic-attribute |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment