Skip to content

Commit 9f1b887

Browse files
committed
feat: allow escaping comma sign with hash
1 parent e4a072d commit 9f1b887

5 files changed

Lines changed: 492304 additions & 492380 deletions

File tree

grammar.js

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -896,15 +896,9 @@ module.exports = grammar({
896896
option: (_) => /@?[A-Za-z-_\d]+/,
897897

898898
hash_escape: (_) => token.immediate(prec(1, /#[#,}]/)),
899+
hash_escape_no_comma: (_) => token.immediate(prec(1, /#[#}]/)),
899900
_hash: (_) => token.immediate(prec(1, /#[^#,{}"'HhDPTSFIW]/)),
900901
hash_rgb: (_) => token.immediate(prec(1, /#[\dA-Fa-f]{6}/)),
901-
_hash_rules: ($) =>
902-
choice(
903-
$.hash_escape,
904-
$._hash,
905-
$.hash_rgb,
906-
token.immediate(prec(1, /#[\dA-Fa-f]{1,5}/)),
907-
),
908902
backslash_escape: (_) => BACKSLASH_ESCAPE,
909903
backslash_escape_immediate: (_) => token.immediate(BACKSLASH_ESCAPE),
910904
_expr_variable_name: (_) => /@?[A-Za-z][A-Za-z-_\d]+/,
@@ -914,7 +908,7 @@ module.exports = grammar({
914908
operator: (_) => /==|!=|<|>|<=|>=|\|\||&&/,
915909
attribute: (_) => /[a-z-]+/,
916910
_str_single_quotes_inner: ($) =>
917-
choice($.expr_single_quotes, $._hash_rules, /([^#'])+/),
911+
choice($.expr_single_quotes, hash_rules($, true), /([^#'])+/),
918912
str_single_quotes: ($) =>
919913
seq(
920914
"'",
@@ -931,7 +925,7 @@ module.exports = grammar({
931925
choice(
932926
$.expr_double_quotes,
933927
$.backslash_escape,
934-
$._hash_rules,
928+
hash_rules($, true),
935929
/([^#"\\]|\\\r?\n)+/,
936930
),
937931
str_double_quotes: ($) => seq('"', repeat($._str_double_quotes_inner), '"'),
@@ -988,10 +982,6 @@ function sep1(rule, separator) {
988982
return seq(rule, repeat(seq(separator, rule)));
989983
}
990984

991-
function commaSep1(rule) {
992-
return sep1(rule, ",");
993-
}
994-
995985
function spaceSep1($, rule) {
996986
return sep1(choice(rule, $.comment), token.immediate(prec(1, " ")));
997987
}
@@ -1008,6 +998,15 @@ function cmdOpts(...args) {
1008998
return repeat(choice(...args));
1009999
}
10101000

1001+
function hash_rules($, comma) {
1002+
return choice(
1003+
comma ? $.hash_escape : $.hash_escape_no_comma,
1004+
$._hash,
1005+
$.hash_rgb,
1006+
token.immediate(prec(1, /#[\dA-Fa-f]{1,5}/)),
1007+
);
1008+
}
1009+
10111010
function exprRule($, quote) {
10121011
const expr = quote == '"' ? $.expr_double_quotes : $.expr_single_quotes;
10131012
return choice(
@@ -1022,38 +1021,46 @@ function exprRule($, quote) {
10221021
seq(alias($._expr_variable_name, $.function_name), ":"),
10231022
seq($.operator, ":"),
10241023
),
1025-
commaSep1(
1024+
sep1(
10261025
repeat(
10271026
choice(
10281027
expr,
1029-
$._hash_rules,
1028+
hash_rules($, false),
10301029
token.immediate(
10311030
prec(1, quote == '"' ? /[^,}"#]+/ : /[^,}'#]+/),
10321031
),
10331032
),
10341033
),
1034+
choice(
1035+
token.immediate(prec(1, "#,")),
1036+
token.immediate(prec(1, ",")),
1037+
),
10351038
),
10361039
),
10371040
),
10381041
"}",
10391042
),
10401043
seq(
10411044
token.immediate(prec(1, "#[")),
1042-
commaSep1(
1043-
choice(
1045+
sep1(
1046+
seq(
10441047
$.attribute,
1045-
seq(
1046-
$.attribute,
1047-
"=",
1048-
choice(
1049-
expr,
1050-
$._hash_rules,
1051-
token.immediate(
1052-
prec(1, quote == '"' ? /[^,\]"#]+/ : /[^,\]'#]+/),
1048+
optional(
1049+
seq(
1050+
"=",
1051+
repeat(
1052+
choice(
1053+
expr,
1054+
hash_rules($, false),
1055+
token.immediate(
1056+
prec(1, quote == '"' ? /[^,\]"#]+/ : /[^,\]'#]+/),
1057+
),
1058+
),
10531059
),
10541060
),
10551061
),
10561062
),
1063+
choice(token.immediate(prec(1, "#,")), token.immediate(prec(1, ","))),
10571064
),
10581065
"]",
10591066
),

0 commit comments

Comments
 (0)