diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 7f947188..4af64789 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -1494,6 +1494,30 @@ } ] } + { + 'begin': '(hbs|handlebars)\\s*(`)' + 'beginCaptures': + '1': + 'name': 'entity.name.function.js' + '2': + 'name': 'punctuation.definition.string.begin.js' + 'end': '`' + 'endCaptures': + '0': + 'name': 'punctuation.definition.string.end.js' + 'name': 'string.quoted.template.hbs.js' + 'patterns': [ + { + 'include': '#string_escapes' + } + { + 'include': '#interpolated_js' + } + { + 'include': 'source.handlebars' + } + ] + } { 'begin': '`' 'beginCaptures': diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 192850ec..6e003f70 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -968,6 +968,25 @@ describe "JavaScript grammar", -> expect(tokens[5]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.sql.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] expect(tokens[6]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.sql.js', 'punctuation.definition.string.end.js'] + describe "ES6 tagged HBS string templates", -> + it "tokenizes them as strings", -> + {tokens} = grammar.tokenizeLine('hbs`{{#if isAdmin`') + expect(tokens[0]).toEqual value: 'hbs', scopes: ['source.js', 'string.quoted.template.hbs.js', 'entity.name.function.js'] + expect(tokens[1]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.hbs.js', 'punctuation.definition.string.begin.js'] + expect(tokens[2]).toEqual value: '{{#if isAdmin', scopes: ['source.js', 'string.quoted.template.hbs.js'] + expect(tokens[3]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.hbs.js', 'punctuation.definition.string.end.js'] + + describe "ES6 tagged HBS string templates with interpolation", -> + it "tokenizes them as strings", -> + {tokens} = grammar.tokenizeLine('hbs`{{#if ${isAdmin}`') + expect(tokens[0]).toEqual value: 'hbs', scopes: ['source.js', 'string.quoted.template.hbs.js', 'entity.name.function.js'] + expect(tokens[1]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.hbs.js', 'punctuation.definition.string.begin.js'] + expect(tokens[2]).toEqual value: '{{#if ', scopes: ['source.js', 'string.quoted.template.hbs.js'] + expect(tokens[3]).toEqual value: '${', scopes: ['source.js', 'string.quoted.template.hbs.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] + expect(tokens[4]).toEqual value: 'isAdmin', scopes: ['source.js', 'string.quoted.template.hbs.js', 'source.js.embedded.source'] + expect(tokens[5]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.hbs.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] + expect(tokens[6]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.hbs.js', 'punctuation.definition.string.end.js'] + describe "ES6 class", -> it "tokenizes class", -> {tokens} = grammar.tokenizeLine('class MyClass')