From 5f81cd30e8ad832c6e224f55776c1bbb98823868 Mon Sep 17 00:00:00 2001 From: FichteFoll Date: Mon, 18 Nov 2024 15:05:42 +0100 Subject: [PATCH 1/4] Remove YAML macros file I find maintaining both files more cumbersome than the boilerplate from duplicate embeds and the two files have already deteriorated over time. --- Vue Component.sublime-syntax.yaml-macros | 405 ----------------------- src/macros.py | 45 --- 2 files changed, 450 deletions(-) delete mode 100644 Vue Component.sublime-syntax.yaml-macros delete mode 100644 src/macros.py diff --git a/Vue Component.sublime-syntax.yaml-macros b/Vue Component.sublime-syntax.yaml-macros deleted file mode 100644 index d060bca..0000000 --- a/Vue Component.sublime-syntax.yaml-macros +++ /dev/null @@ -1,405 +0,0 @@ -%YAML 1.2 -%TAG ! tag:yaml-macros:src.macros: ---- -name: Vue Component -scope: text.html.vue -version: 2 - -extends: Packages/HTML/HTML.sublime-syntax - -file_extensions: - - vue - -variables: - # Embedded script and style syntaxes may be wrapped into html comments for - # historical reasons. The following patterns match them, while maintaining - # correct boundaries of embedded source scopes. That's required to enable - # embedded syntax's comment toggling in the first and last line. - # - # see: - # - https://github.com/sublimehq/Packages/issues/2322 - # - https://github.com/sublimehq/sublime_text/issues/4701 - script_content_begin: |- - (?x: - # whitespace followed by opening html comment begin punctuation - \s*() \s* )? (?=) \s* $ - ) - style_content_begin: '{{script_content_begin}}' - style_content_end: |- - (?x: - # optional html comment end punctuation followed by tag - (?: (\s*) (-->) \s* )? (?=) \s* $ - ) - template_content_begin: '{{script_content_begin}}' - template_content_end: |- - (?x: - # optional html comment end punctuation followed by tag - (?: (\s*) (-->) \s* )? (?=) \s* $ - ) - -contexts: - -###[ HTML TAGS ]############################################################## - - prototype: - - meta_prepend: true - - include: mustache-templates - - tag-html: - - meta_prepend: true - - include: script-tag - - include: style-tag - - include: template-tag - -###[ SCRIPT TAG ]############################################################# - - script-tag: - # for compatibility with ST builds before 4114 - - match: (<)((?i:script)){{tag_name_break}} - captures: - 1: punctuation.definition.tag.begin.html - 2: entity.name.tag.script.html - push: script-javascript - - match: (' - scope: punctuation.definition.tag.end.html - set: script-javascript-content - - include: script-common - - script-javascript-content: - # for compatibility with ST builds before 4114 - - meta_include_prototype: false - - match: '{{script_content_begin}}' - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 # make sure to match only once - embed: scope:source.js - embed_scope: source.js.embedded.html - escape: '{{script_content_end}}' - escape_captures: - 1: source.js.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.js.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - - script-lang-attribute: - - match: (?i:lang){{attribute_name_break}} - scope: meta.attribute-with-value.html entity.other.attribute-name.html - set: script-lang-attribute-assignment - - script-lang-attribute-assignment: - - meta_content_scope: meta.tag.script.begin.html meta.attribute-with-value.html - - match: = - scope: punctuation.separator.key-value.html - set: script-lang-attribute-value - - match: (?=\S) - set: script-javascript - - script-lang-attribute-value: - - meta_include_prototype: false - - meta_scope: meta.tag.script.begin.html meta.attribute-with-value.html - - include: script-lang-decider - - script-lang-decider: - - !script_language [ coffee, source.coffee ] - - !script_language [ livescript, source.livescript ] - - !script_language [ ts, source.ts ] - - match: (?=\S) - set: - - script-javascript - - tag-generic-attribute-meta - - tag-generic-attribute-value - -###[ STYLE TAG ]############################################################## - - style-tag: - # for compatibility with ST builds before 4114 - - match: (<)((?i:style)){{tag_name_break}} - captures: - 1: punctuation.definition.tag.begin.html - 2: entity.name.tag.style.html - push: style-css - - match: (' - scope: punctuation.definition.tag.end.html - set: style-css-content - - include: style-common - - style-css-content: - # for compatibility with ST builds before 4114 - - meta_include_prototype: false - - match: '{{style_content_begin}}' - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 # make sure to match only once - embed: scope:source.css - embed_scope: source.css.embedded.html - escape: '{{style_content_end}}' - escape_captures: - 1: source.css.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.css.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - - style-lang-attribute: - - match: (?i:lang){{attribute_name_break}} - scope: meta.attribute-with-value.html entity.other.attribute-name.html - set: style-lang-attribute-assignment - - style-lang-attribute-assignment: - - meta_content_scope: meta.tag.style.begin.html meta.attribute-with-value.html - - match: = - scope: punctuation.separator.key-value.html - set: style-lang-attribute-value - - match: (?=\S) - set: style-css - - style-lang-attribute-value: - - meta_include_prototype: false - - meta_scope: meta.tag.style.begin.html meta.attribute-with-value.html - - include: style-lang-decider - - style-lang-decider: - - !style_language [ sass, source.sass ] - - !style_language [ scss, source.scss ] - - !style_language [ stylus, source.stylus ] - - !style_language [ postcss\?parser=sugarss, source.sss ] - - !style_language [ postcss, source.postcss ] - - !style_language [ less, source.less ] - - match: (?=\S) - set: - - style-css - - tag-generic-attribute-meta - - tag-generic-attribute-value - -###[ TEMPLATE TAG ]########################################################### - - template-tag: - - match: (<)((?i:template)){{tag_name_break}} - captures: - 1: punctuation.definition.tag.begin.html - 2: entity.name.tag.template.html - push: template-mustache - - match: (', - scope='punctuation.definition.tag.end.html', - set=[ - _rule( - match=r'{{%s_content_begin}}' % tag, - captures={ - 1: 'comment.block.html punctuation.definition.comment.begin.html', - }, - pop=1, - embed=('scope:%s' % embed), - embed_scope=('%s.embedded.html' % embed), - escape='{{%s_content_end}}' % tag, - escape_captures={ - 1: ('%s.embedded.html' % embed), - 2: 'comment.block.html punctuation.definition.comment.end.html', - 3: ('%s.embedded.html' % embed), - 4: 'comment.block.html punctuation.definition.comment.end.html', - }, - ) - ] - ), - _rule(include='%s-common' % tag), - ], - 'tag-generic-attribute-meta', - 'tag-generic-attribute-value', - ] - ) From 1016ba7a0143dec120454fd24e8615c8b91a6739 Mon Sep 17 00:00:00 2001 From: FichteFoll Date: Mon, 18 Nov 2024 15:06:27 +0100 Subject: [PATCH 2/4] Normalize indentation --- Vue Component.sublime-syntax | 408 +++++++++++++++++------------------ 1 file changed, 204 insertions(+), 204 deletions(-) diff --git a/Vue Component.sublime-syntax b/Vue Component.sublime-syntax index f2de041..f5d78a5 100644 --- a/Vue Component.sublime-syntax +++ b/Vue Component.sublime-syntax @@ -133,65 +133,65 @@ contexts: script-lang-decider: - match: (?i)(?=coffee{{unquoted_attribute_break}}|\'coffee\'|"coffee") set: - - - meta_scope: meta.tag.script.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{script_content_begin}}' - embed_scope: source.coffee.embedded.html - escape_captures: - 1: source.coffee.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.coffee.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:source.coffee - escape: '{{script_content_end}}' - - include: script-common + - - meta_scope: meta.tag.script.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{script_content_begin}}' + embed_scope: source.coffee.embedded.html + escape_captures: + 1: source.coffee.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: source.coffee.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:source.coffee + escape: '{{script_content_end}}' + - include: script-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?i)(?=livescript{{unquoted_attribute_break}}|\'livescript\'|"livescript") set: - - - meta_scope: meta.tag.script.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{script_content_begin}}' - embed_scope: source.livescript.embedded.html - escape_captures: - 1: source.livescript.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.livescript.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:source.livescript - escape: '{{script_content_end}}' - - include: script-common + - - meta_scope: meta.tag.script.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{script_content_begin}}' + embed_scope: source.livescript.embedded.html + escape_captures: + 1: source.livescript.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: source.livescript.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:source.livescript + escape: '{{script_content_end}}' + - include: script-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?i)(?=ts{{unquoted_attribute_break}}|\'ts\'|"ts") set: - - - meta_scope: meta.tag.script.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{script_content_begin}}' - embed_scope: source.ts.embedded.html - escape_captures: - 1: source.ts.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.ts.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:source.ts - escape: '{{script_content_end}}' - - include: script-common + - - meta_scope: meta.tag.script.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{script_content_begin}}' + embed_scope: source.ts.embedded.html + escape_captures: + 1: source.ts.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: source.ts.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:source.ts + escape: '{{script_content_end}}' + - include: script-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?=\S) @@ -268,128 +268,128 @@ contexts: style-lang-decider: - match: (?i)(?=sass{{unquoted_attribute_break}}|\'sass\'|"sass") set: - - - meta_scope: meta.tag.style.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{style_content_begin}}' - embed_scope: source.sass.embedded.html - escape_captures: - 1: source.sass.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.sass.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:source.sass - escape: '{{style_content_end}}' - - include: style-common + - - meta_scope: meta.tag.style.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{style_content_begin}}' + embed_scope: source.sass.embedded.html + escape_captures: + 1: source.sass.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: source.sass.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:source.sass + escape: '{{style_content_end}}' + - include: style-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?i)(?=scss{{unquoted_attribute_break}}|\'scss\'|"scss") set: - - - meta_scope: meta.tag.style.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{style_content_begin}}' - embed_scope: source.scss.embedded.html - escape_captures: - 1: source.scss.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.scss.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:source.scss - escape: '{{style_content_end}}' - - include: style-common + - - meta_scope: meta.tag.style.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{style_content_begin}}' + embed_scope: source.scss.embedded.html + escape_captures: + 1: source.scss.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: source.scss.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:source.scss + escape: '{{style_content_end}}' + - include: style-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?i)(?=stylus{{unquoted_attribute_break}}|\'stylus\'|"stylus") set: - - - meta_scope: meta.tag.style.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{style_content_begin}}' - embed_scope: source.stylus.embedded.html - escape_captures: - 1: source.stylus.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.stylus.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:source.stylus - escape: '{{style_content_end}}' - - include: style-common + - - meta_scope: meta.tag.style.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{style_content_begin}}' + embed_scope: source.stylus.embedded.html + escape_captures: + 1: source.stylus.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: source.stylus.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:source.stylus + escape: '{{style_content_end}}' + - include: style-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?i)(?=postcss\?parser=sugarss{{unquoted_attribute_break}}|\'postcss\?parser=sugarss\'|"postcss\?parser=sugarss") set: - - - meta_scope: meta.tag.style.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{style_content_begin}}' - embed_scope: source.sss.embedded.html - escape_captures: - 1: source.sss.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.sss.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:source.sss - escape: '{{style_content_end}}' - - include: style-common + - - meta_scope: meta.tag.style.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{style_content_begin}}' + embed_scope: source.sss.embedded.html + escape_captures: + 1: source.sss.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: source.sss.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:source.sss + escape: '{{style_content_end}}' + - include: style-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?i)(?=postcss{{unquoted_attribute_break}}|\'postcss\'|"postcss") set: - - - meta_scope: meta.tag.style.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{style_content_begin}}' - embed_scope: source.postcss.embedded.html - escape_captures: - 1: source.postcss.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.postcss.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:source.postcss - escape: '{{style_content_end}}' - - include: style-common + - - meta_scope: meta.tag.style.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{style_content_begin}}' + embed_scope: source.postcss.embedded.html + escape_captures: + 1: source.postcss.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: source.postcss.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:source.postcss + escape: '{{style_content_end}}' + - include: style-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?i)(?=less{{unquoted_attribute_break}}|\'less\'|"less") set: - - - meta_scope: meta.tag.style.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{style_content_begin}}' - embed_scope: source.less.embedded.html - escape_captures: - 1: source.less.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: source.less.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:source.less - escape: '{{style_content_end}}' - - include: style-common + - - meta_scope: meta.tag.style.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{style_content_begin}}' + embed_scope: source.less.embedded.html + escape_captures: + 1: source.less.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: source.less.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:source.less + escape: '{{style_content_end}}' + - include: style-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?=\S) @@ -448,65 +448,65 @@ contexts: template-lang-decider: - match: (?i)(?=jade{{unquoted_attribute_break}}|\'jade\'|"jade") set: - - - meta_scope: meta.tag.template.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{template_content_begin}}' - embed_scope: text.jade.embedded.html - escape_captures: - 1: text.jade.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: text.jade.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:text.jade - escape: '{{template_content_end}}' - - include: template-common + - - meta_scope: meta.tag.template.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{template_content_begin}}' + embed_scope: text.jade.embedded.html + escape_captures: + 1: text.jade.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: text.jade.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:text.jade + escape: '{{template_content_end}}' + - include: template-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?i)(?=pug{{unquoted_attribute_break}}|\'pug\'|"pug") set: - - - meta_scope: meta.tag.template.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{template_content_begin}}' - embed_scope: text.pug.embedded.html - escape_captures: - 1: text.pug.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: text.pug.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:text.pug - escape: '{{template_content_end}}' - - include: template-common + - - meta_scope: meta.tag.template.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{template_content_begin}}' + embed_scope: text.pug.embedded.html + escape_captures: + 1: text.pug.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: text.pug.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:text.pug + escape: '{{template_content_end}}' + - include: template-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?i)(?=slm{{unquoted_attribute_break}}|\'slm\'|"slm") set: - - - meta_scope: meta.tag.template.begin.html - - match: '>' - scope: punctuation.definition.tag.end.html - set: - - match: '{{template_content_begin}}' - embed_scope: text.slm.embedded.html - escape_captures: - 1: text.slm.embedded.html - 2: comment.block.html punctuation.definition.comment.end.html - 3: text.slm.embedded.html - 4: comment.block.html punctuation.definition.comment.end.html - captures: - 1: comment.block.html punctuation.definition.comment.begin.html - pop: 1 - embed: scope:text.slm - escape: '{{template_content_end}}' - - include: template-common + - - meta_scope: meta.tag.template.begin.html + - match: '>' + scope: punctuation.definition.tag.end.html + set: + - match: '{{template_content_begin}}' + embed_scope: text.slm.embedded.html + escape_captures: + 1: text.slm.embedded.html + 2: comment.block.html punctuation.definition.comment.end.html + 3: text.slm.embedded.html + 4: comment.block.html punctuation.definition.comment.end.html + captures: + 1: comment.block.html punctuation.definition.comment.begin.html + pop: 1 + embed: scope:text.slm + escape: '{{template_content_end}}' + - include: template-common - tag-generic-attribute-meta - tag-generic-attribute-value - match: (?=\S) From 414fa9af331001c6dcfa93245cdc347932799c47 Mon Sep 17 00:00:00 2001 From: FichteFoll Date: Mon, 18 Nov 2024 15:13:04 +0100 Subject: [PATCH 3/4] Update README to remove irrelevant stuff --- README.md | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index efde56a..b2866a2 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,9 @@ # Vue Syntax Highlight -**Note**: the `st4` branch hosts the new syntax that only works in Sublime build > 4107. +Sublime Text Syntax highlighting for single-file [Vue.js](http://vuejs.org) components. -* For Sublime Text 2 support (`.tmlanguage` files), see `master` branch. -* For Sublime Text 3 support, see `new` branch. - -Sublime Text Syntax highlighting for single-file [Vue.js](http://vuejs.org) components (enabled by [vue-loader](https://github.com/vuejs/vue-loader) or [vueify](https://github.com/vuejs/vueify)). +The `main` branch targets Sublime Text 4. +For the Sublime Text 2 and 3 support (`.tmlanguage` files), see `st2` branch.

@@ -18,20 +16,6 @@ Sublime Text Syntax highlighting for single-file [Vue.js](http://vuejs.org) comp **NOTE:** You still need to install corresponding packages for pre-processors (e.g. Pug, SASS, CoffeeScript) to get proper syntax highlighting for them. -### Enabling JSX Highlighting - -The `