diff options
author | David Peter <sharkdp@users.noreply.github.com> | 2020-04-12 19:42:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-12 19:42:36 +0200 |
commit | 61e47e0c13390e0433779f7ae5161c574a6fcc74 (patch) | |
tree | c6cd474bf1640f715b1bdab2c1407e32e98cc4b3 | |
parent | f5145ef1300ff89b671d6cf80de512397f3a19c0 (diff) |
Add Stylus syntax (#917)
closes #915
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | CHANGELOG.md | 1 | ||||
m--------- | assets/syntaxes/02_Extra/Stylus | 0 | ||||
-rw-r--r-- | assets/syntaxes/02_Extra/Stylus.sublime-syntax | 711 |
4 files changed, 715 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules index 62a3e51d..9506f824 100644 --- a/.gitmodules +++ b/.gitmodules @@ -176,3 +176,6 @@ [submodule "assets/syntaxes/CoffeeScript"] path = assets/syntaxes/02_Extra/CoffeeScript url = https://github.com/sustained/CoffeeScript-Sublime-Plugin +[submodule "assets/syntaxes/02_Extra/Stylus"] + path = assets/syntaxes/02_Extra/Stylus + url = https://github.com/billymoon/Stylus diff --git a/CHANGELOG.md b/CHANGELOG.md index efe306f7..431f4cec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ ## New syntaxes - Rego, see #872 (@patrick-east) +- Stylo, see #917 ## New themes diff --git a/assets/syntaxes/02_Extra/Stylus b/assets/syntaxes/02_Extra/Stylus new file mode 160000 +Subproject 30908e3b5757d6cab4bf2ce660ef89b0c614cf6 diff --git a/assets/syntaxes/02_Extra/Stylus.sublime-syntax b/assets/syntaxes/02_Extra/Stylus.sublime-syntax new file mode 100644 index 00000000..0b4e5156 --- /dev/null +++ b/assets/syntaxes/02_Extra/Stylus.sublime-syntax @@ -0,0 +1,711 @@ +%YAML 1.2 +--- +# http://www.sublimetext.com/docs/3/syntax.html +name: Stylus +file_extensions: + - styl + - stylus +scope: source.stylus +contexts: + main: + - include: comments + - match: '^\s*(@(?:import|charset|css|font-face|(?:-webkit-)?keyframes)(?:\s+([\w-]+))?)\b' + captures: + 1: keyword.control.at-rule.other.stylus + 2: variable.other.animation-name.stylus + push: + - match: '$|;|(?=\{)' + pop: true + - include: string-quoted + - match: ^\s*(@media)\s* + captures: + 1: keyword.control.at-rule.media.stylus + push: + - match: '$|(?=\{)' + pop: true + - include: media-query + - match: |- + (?x) + (?<=^|;|}) + \s* + (?= + [\[\]'".\w$-]+ + \s* + ([?:]?=) + (?![^\[]*\]) + ) + push: + - match: $|; + pop: true + - include: expression + - include: iteration + - include: conditionals + - include: return + - match: |- + (?x) # multi-line regex definition mode + + ^(\s*) # starts at the beginning of line + ([\w$-]+) # identifier (name) + (\() # start of argument list + (?= + .*? + \)\s*\{ # we see a curly brace afterwards + ) # which means this is a function definition + captures: + 2: entity.name.function.stylus + 3: punctuation.definition.parameters.start.stylus + push: + - meta_scope: meta.function-call.stylus + - match: (\)) + captures: + 1: punctuation.definition.parameters.end.stylus + pop: true + - include: expression + - match: |- + (?x) # multi-line regex definition mode + ( + + (^|;) # starts at the beginning of line or at a ; + \s* + (\+?\s* # for block mixins + [\w$-]+) # identifier (name) + (\() # start of argument list + (?= + .*? + \)\s*;?\s* # if there are only spaces and semicolons + $|; # then this a + ) + ) + captures: + 3: entity.other.attribute-name.mixin.stylus + 4: punctuation.definition.parameters.start.stylus + push: + - meta_scope: meta.function-call.stylus + - match: (\)) + captures: + 1: punctuation.definition.parameters.end.stylus + pop: true + - include: expression + - match: |- + (?x) # multi-line regex definition mode + (^|(?<=\*/|\}))\s* + (?= + font(?! + \s*:\s + | + - + | + .*? + (?: + \/|normal|bold|light(er?)|serif|sans|monospace| + \b\d+(?:\b|px|r?em|%)| + var\s*\(| + ['"][^\]]*$ + ) + ) | # we need to distinguish between tag and property `cursor` + cursor(?! + \s*[:;]\s + | + - + | + .*? + (?: + (?:url\s*\()| + (?:-moz-|-webkit-|-ms-)? + (?:auto|default|none|context-menu|help|pointer|progress| + wait|cell|crosshair|text|vertical-text|alias|copy| + move|no-drop|not-allowed|e-resize|n-resize|ne-resize| + nw-resize|s-resize|se-resize|sw-resize|w-resize| + ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize| + row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing + normal|bold|light(er?)|serif|sans|monospace) + ) + ) | ( + ( + altGlyph|altGlyphDef|altGlyphItem|animate|animateColor| + animateMotion|animateTransform|circle|clipPath|color-profile| + defs|desc|ellipse|feBlend|feColorMatrix| + feComponentTransfer|feComposite|feConvolveMatrix| + feDiffuseLighting|feDisplacementMap|feDistantLight|feFlood| + feFuncA|feFuncB|feFuncG|feFuncR|feGaussianBlur|feImage|feMerge| + feMergeNode|feMorphology|feOffset|fePointLight| + feSpecularLighting|feSpotLight|feTile|feTurbulence|filter| + font-face|font-face-format|font-face-name|font-face-src| + font-face-uri|foreignObject|g|glyph|glyphRef|hkern|image|line| + linearGradient|marker|mask|metadata|missing-glyph|mpath|path| + pattern|polygon|polyline|radialGradient|rect|set|stop|svg| + switch|symbol|text|textPath|tref|tspan|use|view|vkern| + a|abbr|acronym|address|applet|area|article|aside|audio|b|base| + basefont|bdi|bdo|bgsound|big|blink|blockquote|body|br|button| + canvas|caption|center|cite|code|col|colgroup|data| + datalist|dd|decorator|del|details|dfn|dir|div|dl|dt|element| + em|embed|fieldset|figcaption|figure|footer|form|frame| + frameset|h1|h2|h3|h4|h5|h6|head|header|hgroup|hr|html|i|iframe| + img|input|ins|isindex|kbd|keygen|label|legend|li|link|listing| + main|map|mark|marquee|menu|menuitem|meta|meter|nav|nobr| + noframes|noscript|object|ol|optgroup|option|output|p|param| + plaintext|pre|progress|q|rp|rt|ruby|s|samp|script|section| + select|shadow|small|source|spacer|span|strike|strong|style| + sub|summary|sup|table|tbody|td|template|textarea|tfoot|th| + thead|time|title|tr|track|tt|u|ul|var|video|wbr|xmp) + + \s*([\s,.#\[]|:[^\s]|(?=\{|$)) + + ) | ( + [:~>\[*\/] # symbols but they are valid for selector + + ) | ( + + \+\s*[\w$-]+\b\s* # are an identifier starting with $ + (?!\() # and they can't have anything besides + + ) | ( # for animtions + + \d+(\.\d+)?%|(from|to)\b + + ) | ( # Placeholder selectors + + \$[\w$-]+\b\s* # are an identifier starting with $ + (?=$|\{) # and they can't have anything besides + + ) | ( # CSS class + + \.[a-zA-Z0-9_-]+ + + ) | ( # CSS id + + \#[a-zA-Z0-9_-]+ + + ) | ( # Reference to parent + + ([\w\d_-]+)? # matching any word right before & + (&) # & itself, escaped because of plist + ([\w\d_-]+)? # matching any word right after & + ) + ) + push: + - meta_scope: meta.selector.stylus + - match: |- + + |$|(?=\{\s*\}.*$)|(?=\{.*?[:;])|(?=\{)(?!.+\}.*$) + pop: true + - include: comma + - match: \d+(\.\d+)?%|from|to + scope: entity.other.animation-keyframe.stylus + - include: selector-components + - match: . + scope: entity.other.attribute-name.stylus + - match: |- + (?x) # multi-line regex definition mode + (?<=^|;|{)\s* # starts after begining of line, '{' or ';'' + (?= # lookahead for + ( + [a-zA-Z0-9_-] # then a letter + | # or + (\{(.*?)\}) # interpolation + | # or + (/\*.*?\*/) # comment + )+ + + \s*[:\s]\s* # value is separted by colon or space + + (?!(\s*\{)) # if there are only spaces afterwards + + (?! + [^}]*? # checking for an unclosed curly braces on this + \{ # line because if one exists it means that + [^}]* # this is a selector and not a property + ($|\}) + ) + ) + push: + - match: '(?=\}|;)|(?<!,)\s*\n' + pop: true + - include: comments + - include: interpolation + - match: '(?<!^|;|{)\s*(?:(:)|\s)' + captures: + 1: punctuation.separator.key-value.stylus + push: + - match: '(;)|(?=\})|(?=(?<!\,)\s*\n)' + captures: + 1: punctuation.terminator.rule.stylus + pop: true + - include: comments + - include: expression + - match: "-(moz|o|ms|webkit|khtml)-" + scope: support.type.vendor-prefix.stylus + - match: . + scope: meta.property-name.stylus support.type.property-name.stylus + - match: '@extends?\s' + captures: + 0: keyword.language.stylus + push: + - match: (?=$|;) + pop: true + - include: selector-components + - include: string-quoted + - include: escape + - include: language-constants + - include: language-operators + - include: language-keywords + - include: property-reference + - include: function-call + - match: '\{' + scope: punctuation.section.start.stylus + - match: '\}' + scope: punctuation.section.end.stylus + attribute-selector: + - match: '\[(?=[^\]]*\])' + captures: + 0: punctuation.definition.entity.start.stylus + push: + - meta_scope: meta.attribute-selector.stylus + - match: '\]' + captures: + 0: punctuation.definition.entity.end.stylus + pop: true + - match: '(?<=\[)|(?<=\{)' + push: + - match: '(?=[|~=\]\s])' + pop: true + - include: interpolation + - match: . + captures: + 0: entity.other.attribute-name.stylus + - include: interpolation + - match: "([|~]?=)" + captures: + 1: keyword.operator.stylus + - include: string-quoted + - match: . + captures: + 0: string.unquoted.stylus + color-values: + - match: \b(aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)\b + scope: constant.color.w3c-standard-color-name.stylus + - match: (hsla?|rgba?)\s*(\() + captures: + 1: keyword.language.function.misc.stylus + 2: punctuation.definition.parameters.start.stylus + push: + - match: \) + captures: + 0: punctuation.definition.parameters.end.stylus + pop: true + - match: |- + (?x) # multi-line regex definition mode + \b + (?:0*((?:1?[0-9]{1,2})|(?:2(?:[0-4][0-9]|5[0-5])))\s*(,)\s*) + (?:0*((?:1?[0-9]{1,2})|(?:2(?:[0-4][0-9]|5[0-5])))\s*(,)\s*) + (?:0*((?:1?[0-9]{1,2})|(?:2(?:[0-4][0-9]|5[0-5])))\b) + captures: + 1: constant.other.color.rgb-value.stylus constant.other.color.rgb-value.red.stylus + 2: punctuation.delimiter.comma.stylus + 3: constant.other.color.rgb-value.stylus constant.other.color.rgb-value.green.stylus + 4: punctuation.delimiter.comma.stylus + 5: constant.other.color.rgb-value.stylus constant.other.color.rgb-value.blue.stylus + - match: |- + (?x) # multi-line regex definition mode + \b + ((?:[0-9]{1,2}|100)%)(,) # red + \s* + ((?:[0-9]{1,2}|100)%)(,) # green + \s* + ((?:[0-9]{1,2}|100)%) # blue + captures: + 1: constant.other.color.rgb-value.stylus constant.other.color.rgb-value.red.stylus + 2: punctuation.delimiter.comma.stylus + 3: constant.other.color.rgb-value.stylus constant.other.color.rgb-value.green.stylus + 4: punctuation.delimiter.comma.stylus + 5: constant.other.color.rgb-value.stylus constant.other.color.rgb-value.blue.stylus + - match: |- + (?x) # multi-line regex definition mode + (?:\s*(,)\s*((0?\.[0-9]+)|[0-1]))? + captures: + 1: punctuation.delimiter.comma.stylus + 2: constant.other.color.rgb-value.stylus constant.other.color.rgb-value.alpha.stylus + - include: numeric-values + - include: numeric-values + comma: + - match: \s*,\s* + scope: punctuation.delimiter.comma.stylus + comments: + - include: single-line-comment + - match: \/\* + captures: + 0: punctuation.definition.comment.stylus + push: + - meta_scope: comment.block.stylus + - match: \*\/ + captures: + 0: punctuation.definition.comment.stylus + pop: true + conditionals: + - match: '(^\s*|\s+)(if|unless|else)(?=[\s({]|$)\s*' + captures: + 2: keyword.control.stylus + push: + - match: '(?=$|\{)' + pop: true + - include: expression + escape: + - match: \\. + scope: constant.character.escape.stylus + expression: + - include: single-line-comment + - include: comma + - include: iteration + - include: conditionals + - include: language-operators + - include: language-keywords + - include: hash-definition + - include: color-values + - include: url + - include: function-call + - include: string-quoted + - include: escape + - include: hash-access + - include: language-constants + - include: language-property-value-constants + - include: property-reference + - include: variable + function-call: + - match: '([\w$-]+)(\()' + captures: + 1: entity.function-name.stylus + 2: punctuation.definition.parameters.start.stylus + push: + - meta_scope: meta.function-call.stylus + - match: (\)) + captures: + 1: punctuation.definition.parameters.end.stylus + pop: true + - include: expression + hash-access: + - match: '(?=[\w$-]+(?:\.|\[[^\]=]*\]))' + push: + - meta_scope: meta.hash-access.stylus + - match: '(?=[^''''""\[\]\w.$-]|\s|$)' + pop: true + - match: \. + scope: punctuation.delimiter.hash.stylus + - match: '\[' + scope: punctuation.definition.entity.start.stylus + - match: '\]' + scope: punctuation.definition.entity.end.stylus + - include: string-quoted + - include: variable + hash-definition: + - match: '\{' + captures: + 0: punctuation.section.embedded.start.stylus + push: + - meta_scope: meta.hash.stylus + - match: '\}' + captures: + 0: punctuation.section.embedded.end.stylus + pop: true + - include: single-line-comment + - match: |- + (?x) + (?: + ([\w$-]+) + | + ('[^']*') + | + ("[^"]*") + ) + \s* + (:) + \s* + captures: + 1: support.type.property-name.stylus + 2: string.quoted.single.stylus + 3: string.quoted.double.stylus + 4: punctuation.separator.key-value.stylus + push: + - match: '(;)|(?=\}|$)' + captures: + 1: punctuation.terminator.statement.stylus + pop: true + - include: expression + interpolation: + - match: '\{' + captures: + 0: punctuation.section.embedded.start.stylus + push: + - meta_scope: stylus.embedded.source + - match: '\}' + captures: + 0: punctuation.section.embedded.end.stylus + pop: true + - include: expression + iteration: + - match: (^\s*|\s+)(for)\s+(?=.*?\s+in\s+) + captures: + 2: keyword.control.stylus + push: + - match: '$|\{' + pop: true + - include: expression + language-constants: + - match: \b(true|false|null)\b + scope: constant.language.stylus + language-keywords: + - match: (\b|\s)(return|else)\b + scope: keyword.control.stylus + - match: (\b|\s)(!important|in|is defined|is a)\b + scope: keyword.other.stylus + - match: \barguments\b + scope: variable.language.stylus + language-operators: + - match: ((?:\?|:|!|~|\+|-|(?:\*)?\*|\/|%|(\.)?\.\.|<|>|(?:=|:|\?|\+|-|\*|\/|%|<|>)?=|!=)|\b(?:in|is(?:nt)?|(?<!:)not)\b) + scope: keyword.operator.stylus + language-property-value-constants: + - match: \b(absolute|all(-scroll)?|always|armenian|auto|avoid|baseline|below|bidi-override|block|bold(er)?|(border|content|padding)-box|both|bottom|break-all|break-word|capitalize|center|char|circle|cjk-ideographic|col-resize|collapse|crosshair|cursive|dashed|decimal-leading-zero|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fantasy|fixed|geometricPrecision|georgian|groove|hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|keep-all|left|lighter|line-edge|line-through|line|list-item|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|monospace|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|optimize(Legibility|Quality|Speed)|outset|outside|overline|pointer|pre(-(wrap|line))?|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|(sans-)?serif|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|sub|super|sw-resize|table(-(row|cell|footer-group|header-group))?|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|vertical(-(ideographic|text))?|visible(Painted|Fill|Stroke)?|w-resize|wait|whitespace|zero|smaller|larger|((xx?-)?(small(er)?|large(r)?))|painted|fill|stroke)\b + scope: constant.property-value.stylus + media-query: + - match: '\s*(?![{;]|$)' + push: + - meta_scope: meta.at-rule.media.stylus + - match: '\s*(?=[{;]|$)' + pop: true + - match: '(?i)\s*(only|not)?\s*(all|aural|braille|embossed|handheld|print|projection|screen|tty|tv)?(?![\w\d$-]+)' + captures: + 1: keyword.operator.logic.media.stylus + 2: support.constant.media.stylus + push: + - match: '\s*(?:(,)|(?=[{;]|$))' + pop: true + - include: media-query-list + - include: variable + media-query-list: + - match: \s*(and)?\s*(\()\s* + captures: + 1: keyword.operator.logic.media.stylus + 2: punctuation.definition.parameters.start.stylus + push: + - match: \) + captures: + 0: punctuation.definition.parameters.end.stylus + pop: true + - include: media-query-properties + - include: numeric-values + media-query-properties: + - match: \s*:\s* + captures: + 0: punctuation.separator.key-value.stylus + - match: |- + (?x) + ( + ((min|max)-)? + ( + ((device-)?(height|width|aspect-ratio))| + (color(-index)?)|monochrome|resolution + ) + )|grid|scan|orientation + captures: + 0: support.type.property-name.media.stylus + - match: \b(portrait|landscape|progressive|interlace)\b + captures: + 1: support.constant.property-value.stylus + numeric-values: + - match: |- + (?x) # multi-line regex definition mode + (\#)(?: + ([0-9a-fA-F]) + ([0-9a-fA-F]) + ([0-9a-fA-F]) + ([0-9a-fA-F])? + | ([0-9a-fA-F]{2}) + ([0-9a-fA-F]{2}) + ([0-9a-fA-F]{2}) + ([0-9a-fA-F]{2})? + )\b + scope: constant.other.color.rgb-value.stylus + captures: + 1: punctuation.definition.constant.stylus + 2: constant.other.color.rgb-value.red.stylus + 3: constant.other.color.rgb-value.green.stylus + 4: constant.other.color.rgb-value.blue.stylus + 5: constant.other.color.rgb-value.alpha.stylus + 6: constant.other.color.rgb-value.red.stylus + 7: constant.other.color.rgb-value.green.stylus + 8: constant.other.color.rgb-value.blue.stylus + 9: constant.other.color.rgb-value.alpha.stylus + - match: |- + (?x) # multi-line regex definition mode + (?:-|\+)? # negative / positive + (?: + (?: + [0-9]+ # integer part + (?:\.[0-9]+)? # fraction + ) | + (?:\.[0-9]+) # fraction without leading zero + ) + ((?: # units + px|pt|ch|cm|mm|in| + r?em|ex|pc|vw|vh|vmin|vmax|deg| + g?rad|turn|dpi|dpcm|dppx|m?s|k?Hz + )\b|%)? + scope: constant.numeric.stylus + captures: + 1: keyword.other.unit.stylus + property-reference: + - match: "@[a-z-]+" + scope: variable.other.property.stylus + pseudo: + - match: (:)(active|checked|default|disabled|empty|enabled|first-child|first-of-type|first|fullscreen|focus|hover|indeterminate|in-range|invalid|last-child|last-of-type|left|link|only-child|only-of-type|optional|out-of-range|read-only|read-write|required|right|root|scope|target|valid|visited)\b + scope: entity.other.attribute-name.pseudo-class.stylus + captures: + 1: puncutation.definition.entity.stylus + - match: (:?:)(before|after)\b + scope: entity.other.attribute-name.pseudo-element.stylus + captures: + 1: puncutation.definition.entity.stylus + - match: (::)(first-letter|first-number|selection)\b + scope: entity.other.attribute-name.pseudo-element.stylus + captures: + 1: puncutation.definition.entity.stylus + - match: ((:)dir)\s*(?:(\()(ltr|rtl)?(\)))? + captures: + 1: entity.other.attribute-name.pseudo-element.stylus + 2: puncutation.definition.entity.stylus + 3: puncutation.definition.parameters.start.stylus + 4: constant.language.stylus + 5: puncutation.definition.parameters.end.stylus + - match: ((:)lang)\s*(?:(\()(\w+(-\w+)?)?(\)))? + captures: + 1: entity.other.attribute-name.pseudo-element.stylus + 2: puncutation.definition.entity.stylus + 3: puncutation.definition.parameters.start.stylus + 4: constant.language.stylus + 5: puncutation.definition.parameters.end.stylus + - include: pseudo-nth + - include: pseudo-not + pseudo-not: + - match: ((:)not)\s*(\() + captures: + 1: entity.other.attribute-name.pseudo-element.stylus + 2: puncutation.definition.entity.stylus + 3: puncutation.definition.parameters.start.stylus + push: + - match: \) + captures: + 0: puncutation.definition.parameters.end.stylus + pop: true + - include: selector-components + pseudo-nth: + - match: ((:)(?:nth-child|nth-last-child|nth-of-type|nth-last-of-type|nth-match|nth-last-match|nth-column|nth-last-column))\s*(\() + captures: + 1: entity.other.attribute-name.pseudo-class.stylus + 2: puncutation.definition.entity.stylus + 3: puncutation.definition.parameters.start.stylus + push: + - match: \) + captures: + 0: puncutation.definition.parameters.end.stylus + pop: true + - include: language-operators + - include: interpolation + - match: \b(odd|even)\b + scope: constant.language.stylus + - match: \b(\d+)?n\b + scope: variable.language.stylus + captures: + 1: constant.numeric.stylus + - match: \d+ + scope: constant.numeric.stylus + return: + - match: ^\s*(return) + captures: + 1: keyword.control.stylus + push: + - match: (;)|(?=$) + captures: + 1: punctuation.terminator.statement.stylus + pop: true + - include: expression + selector-components: + - include: comments + - include: interpolation + - include: attribute-selector + - include: pseudo + - match: '\$[\w$-]+\b' + scope: entity.other.placeholder.stylus + - match: "[:~>]" + scope: keyword.operator.selector.stylus + - match: |- + (?x) # multi-line regex definition mode + \b( + altGlyph|altGlyphDef|altGlyphItem|animate|animateColor| + animateMotion|animateTransform|circle|clipPath|color-profile| + defs|desc|ellipse|feBlend|feColorMatrix| + feComponentTransfer|feComposite|feConvolveMatrix| + feDiffuseLighting|feDisplacementMap|feDistantLight|feFlood| + feFuncA|feFuncB|feFuncG|feFuncR|feGaussianBlur|feImage|feMerge| + feMergeNode|feMorphology|feOffset|fePointLight| + feSpecularLighting|feSpotLight|feTile|feTurbulence|filter| + font-face|font-face-format|font-face-name|font-face-src| + font-face-uri|foreignObject|g|glyph|glyphRef|hkern|image|line| + linearGradient|marker|mask|metadata|missing-glyph|mpath|path| + pattern|polygon|polyline|radialGradient|rect|set|stop|svg| + switch|symbol|text|textPath|tref|tspan|use|view|vkern| + a|abbr|acronym|address|applet|area|article|aside|audio|b|base| + basefont|bdi|bdo|bgsound|big|blink|blockquote|body|br|button| + canvas|caption|center|cite|code|col|colgroup|content|data| + datalist|dd|decorator|del|details|dfn|dir|div|dl|dt|element| + em|embed|fieldset|figcaption|figure|font|footer|form|frame| + frameset|h1|h2|h3|h4|h5|h6|head|header|hgroup|hr|html|i|iframe| + img|input|ins|isindex|kbd|keygen|label|legend|li|link|listing| + main|map|mark|marquee|menu|menuitem|meta|meter|nav|nobr| + noframes|noscript|object|ol|optgroup|option|output|p|param| + plaintext|pre|progress|q|rp|rt|ruby|s|samp|script|section| + select|shadow|small|source|spacer|span|strike|strong|style| + sub|summary|sup|table|tbody|td|template|textarea|tfoot|th| + thead|time|title|tr|track|tt|u|ul|var|video|wbr|xmp + )\b + scope: entity.name.tag.stylus + - match: '\.[a-zA-Z0-9_-]+' + scope: entity.other.attribute-name.class.stylus + - match: "#[a-zA-Z0-9_-]+" + scope: entity.other.attribute-name.id.stylus + - match: |- + (?x) # multi-line regex definition mode + ([\w\d_-]+)? # matching any word right before & + (&) # & itself, escaped because of plist + ([\w\d_-]+)? # matching any word right after & + captures: + 1: entity.other.attribute-name.stylus + 2: variable.language.stylus + 3: entity.other.attribute-name.stylus + single-line-comment: + - match: (\/\/).*$ + scope: comment.line.stylus + captures: + 1: punctuation.definition.comment.stylus + string-quoted: + - match: "'[^']*'" + scope: string.quoted.single.stylus + - match: '"[^"]*"' + scope: string.quoted.double.stylus + url: + - match: (url)\s*(\() + captures: + 1: entity.function-name.stylus + 2: punctuation.definition.parameters.start.stylus + push: + - meta_scope: meta.function-call.stylus + - match: (\)) + captures: + 1: punctuation.definition.parameters.end.stylus + pop: true + - include: string-quoted + - include: language-constants + - include: language-property-value-constants + - include: property-reference + - include: variable + variable: + - match: '([\w$-]+\b)' + scope: variable.other.stylus |