From 5f31120d927a46e2581808329e3b240ec6575326 Mon Sep 17 00:00:00 2001 From: esdoppio Date: Sat, 18 Jun 2016 10:37:08 +0800 Subject: [PATCH 1/4] SCSS: Add specs for @-rule `mixin` --- spec/scss-spec.coffee | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/spec/scss-spec.coffee b/spec/scss-spec.coffee index a8f33a5..dabbe7f 100644 --- a/spec/scss-spec.coffee +++ b/spec/scss-spec.coffee @@ -40,6 +40,29 @@ describe 'SCSS grammar', -> expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.at-root.scss', 'keyword.control.at-rule.at-root.scss', 'punctuation.definition.keyword.scss'] expect(tokens[1]).toEqual value: 'at-root', scopes: ['source.css.scss', 'meta.at-rule.at-root.scss', 'keyword.control.at-rule.at-root.scss'] + describe '@mixin', -> + it 'tokenizes solitary @mixin correctly', -> + {tokens} = grammar.tokenizeLine '@mixin' + + expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'keyword.control.at-rule.mixin.scss', 'punctuation.definition.keyword.scss'] + expect(tokens[1]).toEqual value: 'mixin', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'keyword.control.at-rule.mixin.scss'] + + it 'tokenizes @mixin with no arguments correctly', -> + {tokens} = grammar.tokenizeLine '@mixin media{}' + + expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'keyword.control.at-rule.mixin.scss', 'punctuation.definition.keyword.scss'] + expect(tokens[1]).toEqual value: 'mixin', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'keyword.control.at-rule.mixin.scss'] + expect(tokens[3]).toEqual value: 'media', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'entity.name.function.scss'] + expect(tokens[4]).toEqual value: '{', scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.section.property-list.begin.bracket.curly.scss'] + + it 'tokenizes @mixin with arguments correctly', -> + {tokens} = grammar.tokenizeLine '@mixin media ($width){}' + + expect(tokens[3]).toEqual value: 'media', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'entity.name.function.scss'] + expect(tokens[5]).toEqual value: '(', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'punctuation.definition.parameters.begin.bracket.round.scss'] + expect(tokens[7]).toEqual value: ')', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'punctuation.definition.parameters.end.bracket.round.scss'] + expect(tokens[8]).toEqual value: '{', scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.section.property-list.begin.bracket.curly.scss'] + describe '@page', -> it 'tokenizes it correctly', -> tokens = grammar.tokenizeLines """ From dea30c1533b4bd8f242f5a9c0abe60641d2fb727 Mon Sep 17 00:00:00 2001 From: esdoppio Date: Sat, 18 Jun 2016 11:03:05 +0800 Subject: [PATCH 2/4] SCSS: Rewrite #at_rule_mixin --- grammars/scss.cson | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/grammars/scss.cson b/grammars/scss.cson index c9ea0ff..a938bb6 100644 --- a/grammars/scss.cson +++ b/grammars/scss.cson @@ -396,16 +396,16 @@ 'at_rule_mixin': 'patterns': [ { - 'begin': '\\s*((@)mixin) ([\\w-]*)\\s*\\(' - 'captures': + 'begin': '(?<=@mixin)\\s+([\\w-]+)\\s*(\\()' + 'beginCaptures': '1': - 'name': 'keyword.control.at-rule.mixin.scss' - '2': - 'name': 'punctuation.definition.keyword.scss' - '3': 'name': 'entity.name.function.scss' - 'comment': 'Mixin with Attributes' + '2': + 'name': 'punctuation.definition.parameters.begin.bracket.round.scss' 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.definition.parameters.end.bracket.round.scss' 'name': 'meta.at-rule.mixin.scss' 'patterns': [ { @@ -414,15 +414,19 @@ ] } { + 'match': '(?<=@mixin)\\s+([\\w-]+)' + 'captures': + '1': + 'name': 'entity.name.function.scss' + 'name': 'meta.at-rule.mixin.scss' + } + { + 'match': '((@)mixin)\\b' 'captures': '1': 'name': 'keyword.control.at-rule.mixin.scss' '2': 'name': 'punctuation.definition.keyword.scss' - '3': - 'name': 'entity.name.function.scss' - 'comment': 'Simple Mixin' - 'match': '^\\s*((@)mixin) ([\\w-]{1,})' 'name': 'meta.at-rule.mixin.scss' } ] From 23b65e861790ecdcec1bc3bff4ad25ad95594b55 Mon Sep 17 00:00:00 2001 From: esdoppio Date: Sat, 18 Jun 2016 11:28:34 +0800 Subject: [PATCH 3/4] SCSS: Add specs for @-rule `namespace` --- spec/scss-spec.coffee | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/spec/scss-spec.coffee b/spec/scss-spec.coffee index dabbe7f..66bb9a2 100644 --- a/spec/scss-spec.coffee +++ b/spec/scss-spec.coffee @@ -63,6 +63,28 @@ describe 'SCSS grammar', -> expect(tokens[7]).toEqual value: ')', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'punctuation.definition.parameters.end.bracket.round.scss'] expect(tokens[8]).toEqual value: '{', scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.section.property-list.begin.bracket.curly.scss'] + describe '@namespace', -> + it 'tokenizes solitary @namespace correctly', -> + {tokens} = grammar.tokenizeLine '@namespace' + + expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss', 'punctuation.definition.keyword.scss'] + expect(tokens[1]).toEqual value: 'namespace', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss'] + + it 'tokenizes default namespace definition with url() correctly', -> + {tokens} = grammar.tokenizeLine '@namespace url(XML-namespace-URL);' + + expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss', 'punctuation.definition.keyword.scss'] + expect(tokens[1]).toEqual value: 'namespace', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss'] + expect(tokens[3]).toEqual value: 'url', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'support.function.misc.scss'] + + it 'tokenizes namespace prefix definition with url() correctly', -> + {tokens} = grammar.tokenizeLine '@namespace prefix url(XML-namespace-URL);' + + expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss', 'punctuation.definition.keyword.scss'] + expect(tokens[1]).toEqual value: 'namespace', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss'] + expect(tokens[3]).toEqual value: 'prefix', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'entity.name.namespace-prefix.scss'] + expect(tokens[5]).toEqual value: 'url', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'support.function.misc.scss'] + describe '@page', -> it 'tokenizes it correctly', -> tokens = grammar.tokenizeLines """ From 879422691bed2573545549d1a1d8a22800d9510e Mon Sep 17 00:00:00 2001 From: esdoppio Date: Sat, 18 Jun 2016 11:59:36 +0800 Subject: [PATCH 4/4] SCSS: Modify #at_rule_namespace --- grammars/scss.cson | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/grammars/scss.cson b/grammars/scss.cson index a938bb6..194126b 100644 --- a/grammars/scss.cson +++ b/grammars/scss.cson @@ -433,16 +433,10 @@ 'at_rule_namespace': 'patterns': [ { - 'begin': '\\s*((@)namespace)\\s+(?=url)' - 'captures': - '1': - 'name': 'keyword.control.at-rule.namespace.scss' - '2': - 'name': 'punctuation.definition.keyword.scss' - '3': - 'name': 'support.function.misc.scss' - 'comment': 'Namespace without prefix' - 'end': '\\s*((?=;|$))' + # Define the default namespace with url() + # MUST be on the top + 'begin': '(?<=@namespace)\\s+(?=url)' + 'end': '(?=;|$)' 'name': 'meta.at-rule.namespace.scss' 'patterns': [ { @@ -457,16 +451,13 @@ ] } { - 'begin': '\\s*((@)namespace) ([\\w-]*)\\s*' + # Define the default namespace with string, or + # a namespace prefix with string or url() + 'begin': '(?<=@namespace)\\s+([\\w-]*)' 'captures': '1': - 'name': 'keyword.control.at-rule.namespace.scss' - '2': - 'name': 'punctuation.definition.keyword.scss' - '3': - 'name': 'entity.name.function.scss' - 'comment': 'Namespace' - 'end': '\\s*((?=;|$))' + 'name': 'entity.name.namespace-prefix.scss' + 'end': '(?=;|$)' 'name': 'meta.at-rule.namespace.scss' 'patterns': [ { @@ -483,6 +474,15 @@ } ] } + { + 'match': '((@)namespace)\\b' + 'captures': + '1': + 'name': 'keyword.control.at-rule.namespace.scss' + '2': + 'name': 'punctuation.definition.keyword.scss' + 'name': 'meta.at-rule.namespace.scss' + } ] 'at_rule_option': 'captures':