text/x-scss
*.scss
//
/*
*/
[^\x{0}-\x{2C}\x{2E}\x{2F}\x{3A}-\x{40}\x{5B}\x{5D}\x{5E}\x{60}\x{7B}-\x{7F}]
#{
}
\$\%{css:identifier}
[+*%] |
(?<! \%{css:keyword-code-point} )
-
(?! \%{css:keyword-code-point} )
\+
<=?|>=?|[=!]=
\%{css:keyword-start}
\%{css:keyword-end}
and
not
or
\%{css:keyword-start}
\%{css:keyword-end}
false
true
\%{css:keyword-start}
\%{css:keyword-end}
null
&
\[
]
\(
\)
\(
\)
\(
\)
\.\.\.
\%{css:keyword-start} url \(
\)
\%{css:keyword-start}
\%{css:keyword-end}
default
global
\%{css:keyword-start}
\%{css:keyword-end}
optional
{
}
(?(DEFINE)
(?<escape_interpolation_start> (?: \\ \#{ )+ )
(?<escape_comment_start> (?: \\ /[/*] )+ )
(?<escape> (?: \\ . )+ )
(?<interpolation_start_chars>
(?: (?: \# (?! { ) )+ | (?: (?<! \# ) { )+ )
)
(?<comment_start_chars>
(?: (?: (?<! / ) / (?! [/*] ) )+ | (?: (?<! / ) \* )+ )
)
(?<comment_end_chars>
(?: (?: \* (?! / ) )+ | (?: (?<! \* ) / )+ )
)
(?<single_line_comment> // .* )
(?<interpolation> # recursive subpattern to find matching braces
\#{
(?:
(?>
(?:
[^\\}#{(/*"']+ |
(?&escape_interpolation_start) |
(?&escape_comment_start) |
(?&escape) |
(?&interpolation_start_chars) |
(?&comment_start_chars)
)+
) |
(?&interpolation) |
(?&parentheses) |
(?&single_line_comment) |
(?&multiline_comment) |
(?&double_quote_string) |
(?&single_quote_string)
)*
}
)
(?<parentheses> # recursive subpattern to find matching parentheses
\(
(?:
(?>
(?:
[^\\)(#{/*"']+ |
(?&escape_interpolation_start) |
(?&escape_comment_start) |
(?&escape) |
(?&interpolation_start_chars) |
(?&comment_start_chars)
)+
) |
(?&interpolation) |
(?&parentheses) |
(?&single_line_comment) |
(?&multiline_comment) |
(?&double_quote_string) |
(?&single_quote_string)
)*
\)
)
(?<multiline_comment> # subpattern to find matching comment delimiters
/\*
(?:
(?>
(?:
[^*/#{]+ |
# no escapes
(?&comment_end_chars) |
(?&interpolation_start_chars)
)+
) |
(?&interpolation)
)*
\*/
)
(?<double_quote_string> # subpattern to find matching double quotes
"
(?:
(?>
(?:
[^\\"#{]+ |
(?&escape_interpolation_start) |
(?&escape) |
(?&interpolation_start_chars)
)+
) |
(?&interpolation)
)*
"
)
(?<single_quote_string> # subpattern to find matching single quotes
'
(?:
(?>
(?:
[^\\'#{]+ |
(?&escape_interpolation_start) |
(?&escape) |
(?&interpolation_start_chars)
)+
) |
(?&interpolation)
)*
'
)
)
:
(?:
(?! # not the start of a
\%{css:keyword-code-point} | # pseudo-class
[:\\] | # pseudo-element, escape
\#{ | # interpolation
/\* # comment
) | # or
(?= # ends like a normal declaration
(?>
(?:
(?>
(?:
[^\\;}{#(/*"']+ |
(?&escape_interpolation_start) |
(?&escape_comment_start) |
(?&escape) |
(?: \# (?! { ) )+ | # interpolation_start_chars allows {
(?&comment_start_chars)
)+
) |
(?&interpolation) |
(?&parentheses) |
(?&single_line_comment) |
(?&multiline_comment) |
(?&double_quote_string) |
(?&single_quote_string)
)*
)
\%{css:declaration-value-end} # with a semicolon or at the end of a block
)
)
\%{css:declaration-value-end}
@extend \%{css:keyword-end}
\%{css:keyword-start}
\%{css:keyword-end}
without
with
\%{css:keyword-start}
\%{css:keyword-end}
all
media
rule
supports
:
\%{css:test-value-end}
\(
\)
@at-root \%{css:keyword-end}
@ (?: debug | warn | error ) \%{css:keyword-end}
@ (?: if | else \s+ if ) \%{css:keyword-end}
@else \%{css:keyword-end}
\%{css:keyword-start}
\%{css:keyword-end}
from
through
to
@for \%{css:keyword-end}
\%{css:keyword-start}
\%{css:keyword-end}
in
@each \%{css:keyword-end}
@while \%{css:keyword-end}
\(
\)
@mixin \%{css:keyword-end}
@include \%{css:keyword-end}
@content \%{css:keyword-end}
\(
\)
@function \%{css:keyword-end}
@return \%{css:keyword-end}
(&)(\%{css:identifier-chars}?)
%\%{css:identifier}
(?<=})\%{css:identifier-chars}