Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit 1a78bcd

Browse files
author
Wliu
authored
Merge pull request #139 from esdoppio/immediate-highlighting
Recognize solitary @mix and @namespace as @-rule
2 parents 50e674c + 8794226 commit 1a78bcd

File tree

2 files changed

+78
-29
lines changed

2 files changed

+78
-29
lines changed

grammars/scss.cson

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -396,16 +396,16 @@
396396
'at_rule_mixin':
397397
'patterns': [
398398
{
399-
'begin': '\\s*((@)mixin) ([\\w-]*)\\s*\\('
400-
'captures':
399+
'begin': '(?<=@mixin)\\s+([\\w-]+)\\s*(\\()'
400+
'beginCaptures':
401401
'1':
402-
'name': 'keyword.control.at-rule.mixin.scss'
403-
'2':
404-
'name': 'punctuation.definition.keyword.scss'
405-
'3':
406402
'name': 'entity.name.function.scss'
407-
'comment': 'Mixin with Attributes'
403+
'2':
404+
'name': 'punctuation.definition.parameters.begin.bracket.round.scss'
408405
'end': '\\)'
406+
'endCaptures':
407+
'0':
408+
'name': 'punctuation.definition.parameters.end.bracket.round.scss'
409409
'name': 'meta.at-rule.mixin.scss'
410410
'patterns': [
411411
{
@@ -414,31 +414,29 @@
414414
]
415415
}
416416
{
417+
'match': '(?<=@mixin)\\s+([\\w-]+)'
418+
'captures':
419+
'1':
420+
'name': 'entity.name.function.scss'
421+
'name': 'meta.at-rule.mixin.scss'
422+
}
423+
{
424+
'match': '((@)mixin)\\b'
417425
'captures':
418426
'1':
419427
'name': 'keyword.control.at-rule.mixin.scss'
420428
'2':
421429
'name': 'punctuation.definition.keyword.scss'
422-
'3':
423-
'name': 'entity.name.function.scss'
424-
'comment': 'Simple Mixin'
425-
'match': '^\\s*((@)mixin) ([\\w-]{1,})'
426430
'name': 'meta.at-rule.mixin.scss'
427431
}
428432
]
429433
'at_rule_namespace':
430434
'patterns': [
431435
{
432-
'begin': '\\s*((@)namespace)\\s+(?=url)'
433-
'captures':
434-
'1':
435-
'name': 'keyword.control.at-rule.namespace.scss'
436-
'2':
437-
'name': 'punctuation.definition.keyword.scss'
438-
'3':
439-
'name': 'support.function.misc.scss'
440-
'comment': 'Namespace without prefix'
441-
'end': '\\s*((?=;|$))'
436+
# Define the default namespace with url()
437+
# MUST be on the top
438+
'begin': '(?<=@namespace)\\s+(?=url)'
439+
'end': '(?=;|$)'
442440
'name': 'meta.at-rule.namespace.scss'
443441
'patterns': [
444442
{
@@ -453,16 +451,13 @@
453451
]
454452
}
455453
{
456-
'begin': '\\s*((@)namespace) ([\\w-]*)\\s*'
454+
# Define the default namespace with string, or
455+
# a namespace prefix with string or url()
456+
'begin': '(?<=@namespace)\\s+([\\w-]*)'
457457
'captures':
458458
'1':
459-
'name': 'keyword.control.at-rule.namespace.scss'
460-
'2':
461-
'name': 'punctuation.definition.keyword.scss'
462-
'3':
463-
'name': 'entity.name.function.scss'
464-
'comment': 'Namespace'
465-
'end': '\\s*((?=;|$))'
459+
'name': 'entity.name.namespace-prefix.scss'
460+
'end': '(?=;|$)'
466461
'name': 'meta.at-rule.namespace.scss'
467462
'patterns': [
468463
{
@@ -479,6 +474,15 @@
479474
}
480475
]
481476
}
477+
{
478+
'match': '((@)namespace)\\b'
479+
'captures':
480+
'1':
481+
'name': 'keyword.control.at-rule.namespace.scss'
482+
'2':
483+
'name': 'punctuation.definition.keyword.scss'
484+
'name': 'meta.at-rule.namespace.scss'
485+
}
482486
]
483487
'at_rule_option':
484488
'captures':

spec/scss-spec.coffee

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,51 @@ describe 'SCSS grammar', ->
4040
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']
4141
expect(tokens[1]).toEqual value: 'at-root', scopes: ['source.css.scss', 'meta.at-rule.at-root.scss', 'keyword.control.at-rule.at-root.scss']
4242

43+
describe '@mixin', ->
44+
it 'tokenizes solitary @mixin correctly', ->
45+
{tokens} = grammar.tokenizeLine '@mixin'
46+
47+
expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'keyword.control.at-rule.mixin.scss', 'punctuation.definition.keyword.scss']
48+
expect(tokens[1]).toEqual value: 'mixin', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'keyword.control.at-rule.mixin.scss']
49+
50+
it 'tokenizes @mixin with no arguments correctly', ->
51+
{tokens} = grammar.tokenizeLine '@mixin media{}'
52+
53+
expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'keyword.control.at-rule.mixin.scss', 'punctuation.definition.keyword.scss']
54+
expect(tokens[1]).toEqual value: 'mixin', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'keyword.control.at-rule.mixin.scss']
55+
expect(tokens[3]).toEqual value: 'media', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'entity.name.function.scss']
56+
expect(tokens[4]).toEqual value: '{', scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.section.property-list.begin.bracket.curly.scss']
57+
58+
it 'tokenizes @mixin with arguments correctly', ->
59+
{tokens} = grammar.tokenizeLine '@mixin media ($width){}'
60+
61+
expect(tokens[3]).toEqual value: 'media', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'entity.name.function.scss']
62+
expect(tokens[5]).toEqual value: '(', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'punctuation.definition.parameters.begin.bracket.round.scss']
63+
expect(tokens[7]).toEqual value: ')', scopes: ['source.css.scss', 'meta.at-rule.mixin.scss', 'punctuation.definition.parameters.end.bracket.round.scss']
64+
expect(tokens[8]).toEqual value: '{', scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.section.property-list.begin.bracket.curly.scss']
65+
66+
describe '@namespace', ->
67+
it 'tokenizes solitary @namespace correctly', ->
68+
{tokens} = grammar.tokenizeLine '@namespace'
69+
70+
expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss', 'punctuation.definition.keyword.scss']
71+
expect(tokens[1]).toEqual value: 'namespace', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss']
72+
73+
it 'tokenizes default namespace definition with url() correctly', ->
74+
{tokens} = grammar.tokenizeLine '@namespace url(XML-namespace-URL);'
75+
76+
expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss', 'punctuation.definition.keyword.scss']
77+
expect(tokens[1]).toEqual value: 'namespace', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss']
78+
expect(tokens[3]).toEqual value: 'url', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'support.function.misc.scss']
79+
80+
it 'tokenizes namespace prefix definition with url() correctly', ->
81+
{tokens} = grammar.tokenizeLine '@namespace prefix url(XML-namespace-URL);'
82+
83+
expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss', 'punctuation.definition.keyword.scss']
84+
expect(tokens[1]).toEqual value: 'namespace', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'keyword.control.at-rule.namespace.scss']
85+
expect(tokens[3]).toEqual value: 'prefix', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'entity.name.namespace-prefix.scss']
86+
expect(tokens[5]).toEqual value: 'url', scopes: ['source.css.scss', 'meta.at-rule.namespace.scss', 'support.function.misc.scss']
87+
4388
describe '@page', ->
4489
it 'tokenizes it correctly', ->
4590
tokens = grammar.tokenizeLines """

0 commit comments

Comments
 (0)