Skip to content

Instantly share code, notes, and snippets.

@OdatNurd
Created February 15, 2019 19:22
Show Gist options
  • Select an option

  • Save OdatNurd/f7fa74c59d6b0ffef6263e002ef11ddf to your computer and use it in GitHub Desktop.

Select an option

Save OdatNurd/f7fa74c59d6b0ffef6263e002ef11ddf to your computer and use it in GitHub Desktop.
HTML Syntax from Sublime Text 3 - 3176 modified to support GLSL
%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
variables:
attribute_char: (?:[^ "'>/=\x00-\x1f\x7f-\x9f])
unquoted_attribute_value: (?:[^\s<>/''"]|/(?!>))+
not_equals_lookahead: (?=\s*[^\s=])
block_tag_name: |-
(?ix)(?:
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
)\b
inline_tag_name: |-
(?ix)(?:
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
)\b
form_tag_name: |-
(?ix)(?:
button|datalist|input|label|legend|meter|optgroup|option|output|progress|select|template|textarea
)\b
javascript_mime_type: |-
(?ix)(?:
# https://mimesniff.spec.whatwg.org/#javascript-mime-type
(?:application|text)/(?:x-)?(?:java|ecma)script
| text/javascript1\.[0-5]
| text/jscript
| text/livescript
)
shader_mime_type: |-
(?ix)(?:
x-shader/x-fragment
)
contexts:
immediately-pop:
- match: ''
pop: true
else-pop:
- match: (?=\S)
pop: true
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: (<!--)(-?>)?
captures:
1: punctuation.definition.comment.begin.html
2: invalid.illegal.bad-comments-or-CDATA.html
push:
- meta_scope: comment.block.html
- match: '(<!-)?(--\s*>)'
captures:
1: invalid.illegal.bad-comments-or-CDATA.html
2: punctuation.definition.comment.end.html
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-attributes
- match: (<)((?i:style))\b
captures:
0: meta.tag.style.begin.html
1: punctuation.definition.tag.begin.html
2: entity.name.tag.style.html
push: style-css
- match: '(<)((?i:script))\b'
captures:
0: meta.tag.script.begin.html
1: punctuation.definition.tag.begin.html
2: entity.name.tag.script.html
push: script-javascript
- 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-attributes
- match: (</?)({{block_tag_name}})
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-attributes
- match: (</?)((?i:hr)\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-attributes
- 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-attributes
- match: (</?)({{inline_tag_name}})
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-attributes
- match: (</?)({{form_tag_name}})
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-attributes
- 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-attributes
- 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-attributes
- 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-attributes
- 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-attributes
- include: entities
- match: <>
scope: invalid.illegal.incomplete.html
entities:
- match: (&#[xX])(\h+)(;)
scope: constant.character.entity.hexadecimal.html
captures:
1: punctuation.definition.entity.html
3: punctuation.definition.entity.html
- match: (&#)([0-9]+)(;)
scope: constant.character.entity.decimal.html
captures:
1: punctuation.definition.entity.html
3: punctuation.definition.entity.html
- match: (&)([a-zA-Z0-9]+)(;)
scope: constant.character.entity.named.html
captures:
1: punctuation.definition.entity.html
3: punctuation.definition.entity.html
style-css:
- meta_content_scope: meta.tag.style.begin.html
- include: style-common
- match: '>'
scope: punctuation.definition.tag.end.html
set:
- include: style-close-tag
- match: ''
embed: scope:source.css
embed_scope: source.css.embedded.html
escape: (?i)(?=(?:-->\s*)?</style)
style-other:
- meta_content_scope: meta.tag.style.begin.html
- include: style-common
- match: '>'
scope: punctuation.definition.tag.end.html
set:
- include: style-close-tag
style-close-tag:
- match: (?i)(</)(style)(>)
scope: meta.tag.style.end.html
captures:
1: punctuation.definition.tag.begin.html
2: entity.name.tag.style.html
3: punctuation.definition.tag.end.html
pop: true
style-common:
- include: style-type-attribute
- include: tag-attributes
- match: '/>'
scope: punctuation.definition.tag.end.html
pop: true
style-type-attribute:
- match: (?i)\btype\b
scope: meta.attribute-with-value.html entity.other.attribute-name.html
set:
- meta_content_scope: meta.tag.style.begin.html meta.attribute-with-value.html
- match: =
scope: punctuation.separator.key-value.html
set:
- meta_content_scope: meta.tag.style.begin.html meta.attribute-with-value.html
- include: style-type-decider
- match: (?=\S)
set: style-css
style-type-decider:
- match: (?i)(?=text/css(?!{{unquoted_attribute_value}})|'text/css'|"text/css")
set:
- style-css
- tag-generic-attribute-meta
- tag-generic-attribute-value
- match: (?i)(?=>|''|"")
set:
- style-css
- tag-generic-attribute-meta
- tag-generic-attribute-value
- match: (?=\S)
set:
- style-other
- tag-generic-attribute-meta
- tag-generic-attribute-value
script-javascript:
- meta_content_scope: meta.tag.script.begin.html
- include: script-common
- match: '>'
scope: punctuation.definition.tag.end.html
set:
- include: script-close-tag
- match: (?=\S)
embed: scope:source.js
embed_scope: source.js.embedded.html
escape: (?i)(?=(?:-->\s*)?</script)
script-glsl:
- meta_content_scope: meta.tag.script.begin.html
- include: script-common
- match: '>'
scope: punctuation.definition.tag.end.html
set:
- include: script-close-tag
- match: (?=\S)
embed: scope:source.glsl
embed_scope: source.glsl.embedded.html
escape: (?i)(?=(?:-->\s*)?</script)
script-html:
- meta_content_scope: meta.tag.script.begin.html
- include: script-common
- match: '>'
scope: punctuation.definition.tag.end.html
set:
- meta_content_scope: text.html.embedded.html
- include: script-close-tag
- include: main
script-other:
- meta_content_scope: meta.tag.script.begin.html
- include: script-common
- match: '>'
scope: punctuation.definition.tag.end.html
set:
- include: script-close-tag
script-close-tag:
- match: \s*(<!--)
captures:
1: comment.block.html punctuation.definition.comment.begin.html
- match: (?i)(?:(-->)\s*)?(</)(script)(>)
scope: meta.tag.script.end.html
captures:
1: comment.block.html punctuation.definition.comment.end.html
2: punctuation.definition.tag.begin.html
3: entity.name.tag.script.html
4: punctuation.definition.tag.end.html
pop: true
script-common:
- include: script-type-attribute
- include: tag-attributes
- match: '/>'
scope: punctuation.definition.tag.end.html
pop: true
script-type-attribute:
- match: (?i)\btype\b
scope: meta.attribute-with-value.html entity.other.attribute-name.html
set:
- meta_content_scope: meta.tag.script.begin.html meta.attribute-with-value.html
- match: =
scope: punctuation.separator.key-value.html
set:
- meta_content_scope: meta.tag.script.begin.html meta.attribute-with-value.html
- include: script-type-decider
- match: (?=\S)
set: script-javascript
script-type-decider:
- match: (?i)(?={{javascript_mime_type}}(?!{{unquoted_attribute_value}})|'{{javascript_mime_type}}'|"{{javascript_mime_type}}")
set:
- script-javascript
- tag-generic-attribute-meta
- tag-generic-attribute-value
- match: (?i)(?={{shader_mime_type}}(?!{{unquoted_attribute_value}})|'{{shader_mime_type}}'|"{{shader_mime_type}}")
set:
- script-glsl
- tag-generic-attribute-meta
- tag-generic-attribute-value
- match: (?i)(?=module(?!{{unquoted_attribute_value}})|'module'|"module")
set:
- script-javascript
- tag-generic-attribute-meta
- tag-generic-attribute-value
- match: (?i)(?=>|''|"")
set:
- script-javascript
- tag-generic-attribute-meta
- tag-generic-attribute-value
- match: (?i)(?=text/html(?!{{unquoted_attribute_value}})|'text/html'|"text/html")
set:
- script-html
- tag-generic-attribute-meta
- tag-generic-attribute-value
- match: (?=\S)
set:
- script-other
- tag-generic-attribute-meta
- tag-generic-attribute-value
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: (?={{attribute_char}})
scope: entity.other.attribute-name.html
push:
- tag-generic-attribute-meta
- tag-generic-attribute-equals
- generic-attribute-name
generic-attribute-name:
- meta_scope: entity.other.attribute-name.html
- match: (?!{{attribute_char}})
pop: true
tag-generic-attribute-meta:
- meta_scope: meta.attribute-with-value.html
- include: immediately-pop
tag-generic-attribute-equals:
- match: '='
scope: punctuation.separator.key-value.html
set: tag-generic-attribute-value
- match: '{{not_equals_lookahead}}'
pop: true
tag-generic-attribute-value:
- match: '"'
scope: punctuation.definition.string.begin.html
set:
- meta_scope: 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: string.quoted.single.html
- match: "'"
scope: punctuation.definition.string.end.html
pop: true
- include: entities
- match: '{{unquoted_attribute_value}}'
scope: string.unquoted.html
pop: true
- include: else-pop
tag-class-attribute:
- match: '\bclass\b'
scope: entity.other.attribute-name.class.html
push:
- tag-class-attribute-meta
- tag-class-attribute-equals
tag-class-attribute-meta:
- meta_scope: meta.attribute-with-value.class.html
- include: immediately-pop
tag-class-attribute-equals:
- match: '='
scope: punctuation.separator.key-value.html
set: tag-class-attribute-value
- match: '{{not_equals_lookahead}}'
pop: true
tag-class-attribute-value:
- match: '"'
scope: punctuation.definition.string.begin.html
set:
- meta_scope: 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: string.quoted.single.html
- meta_content_scope: meta.class-name.html
- match: "'"
scope: punctuation.definition.string.end.html
pop: true
- include: entities
- match: '{{unquoted_attribute_value}}'
scope: string.unquoted.html meta.class-name.html
pop: true
- include: else-pop
tag-id-attribute:
- match: '\bid\b'
scope: entity.other.attribute-name.id.html
push:
- tag-id-attribute-meta
- tag-id-attribute-equals
tag-id-attribute-meta:
- meta_scope: meta.attribute-with-value.id.html
- include: immediately-pop
tag-id-attribute-equals:
- match: '='
scope: punctuation.separator.key-value.html
set: tag-id-attribute-value
- match: '{{not_equals_lookahead}}'
pop: true
tag-id-attribute-value:
- match: '"'
scope: punctuation.definition.string.begin.html
set:
- meta_scope: 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: string.quoted.single.html
- meta_content_scope: meta.toc-list.id.html
- match: "'"
scope: punctuation.definition.string.end.html
pop: true
- include: entities
- match: '{{unquoted_attribute_value}}'
scope: string.unquoted.html meta.toc-list.id.html
pop: true
- include: else-pop
tag-style-attribute:
- match: '\bstyle\b'
scope: entity.other.attribute-name.style.html
push:
- tag-style-attribute-meta
- tag-style-attribute-equals
tag-style-attribute-meta:
- meta_scope: meta.attribute-with-value.style.html
- include: immediately-pop
tag-style-attribute-equals:
- match: '='
scope: punctuation.separator.key-value.html
set: tag-style-attribute-value
- match: '{{not_equals_lookahead}}'
pop: true
tag-style-attribute-value:
- match: '"'
scope: string.quoted.double punctuation.definition.string.begin.html
embed: scope:source.css#rule-list-body
embed_scope: source.css
escape: '"'
escape_captures:
0: string.quoted.double punctuation.definition.string.end.html
- match: "'"
scope: string.quoted.single punctuation.definition.string.begin.html
embed: scope:source.css#rule-list-body
embed_scope: source.css
escape: "'"
escape_captures:
0: string.quoted.single punctuation.definition.string.end.html
- include: else-pop
tag-event-attribute:
- match: |-
(?x)\bon(
abort|autocomplete|autocompleteerror|auxclick|blur|cancel|canplay
|canplaythrough|change|click|close|contextmenu|cuechange|dblclick|drag
|dragend|dragenter|dragexit|dragleave|dragover|dragstart|drop
|durationchange|emptied|ended|error|focus|input|invalid|keydown
|keypress|keyup|load|loadeddata|loadedmetadata|loadstart|mousedown
|mouseenter|mouseleave|mousemove|mouseout|mouseover|mouseup|mousewheel
|pause|play|playing|progress|ratechange|reset|resize|scroll|seeked
|seeking|select|show|sort|stalled|submit|suspend|timeupdate|toggle
|volumechange|waiting
)\b
scope: entity.other.attribute-name.event.html
push:
- tag-event-attribute-meta
- tag-event-attribute-equals
tag-event-attribute-meta:
- meta_scope: meta.attribute-with-value.event.html
- include: immediately-pop
tag-event-attribute-equals:
- match: '='
scope: punctuation.separator.key-value.html
set: tag-event-attribute-value
- match: '{{not_equals_lookahead}}'
pop: true
tag-event-attribute-value:
- match: '"'
scope: string.quoted.double punctuation.definition.string.begin.html
embed: scope:source.js
embed_scope: meta.attribute-with-value.event.html
escape: '"'
escape_captures:
0: string.quoted.double punctuation.definition.string.end.html
- match: "'"
scope: string.quoted.single punctuation.definition.string.begin.html meta.attribute-with-value.event.html
embed: scope:source.js
embed_scope: meta.attribute-with-value.event.html
escape: "'"
escape_captures:
0: string.quoted.single punctuation.definition.string.end.html
- include: else-pop
# This is to prevent breaking syntaxes referencing the old context name
tag-stuff:
- include: tag-attributes
tag-attributes:
- include: tag-id-attribute
- include: tag-class-attribute
- include: tag-style-attribute
- include: tag-event-attribute
- include: tag-generic-attribute
@OdatNurd

OdatNurd commented Feb 15, 2019 •

Copy link
Copy Markdown
Author

This is a modified HTML syntax file based on Sublime Text 3 build 3176 to use the GLSL shading in the Shader Syntax (GLSL HLSL Cg) package. Companion reading on what this change is for and how it works is available at this SO question.

The change is done here by using the base file in revision one and the modified file in revision 2, allowing an easy diff of exactly how the contents changed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment