Skip to content

Commit 4424da4

Browse files
authored
Support interpolation on url (#551)
* feat: url interp * chore: use -no-interp suffix * chore: revert change * chore: revert more lol
1 parent a64e7a6 commit 4424da4

File tree

8 files changed

+36
-8
lines changed

8 files changed

+36
-8
lines changed

packages/css-property-parser/lib/Parser.re

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,6 +1974,7 @@ and symbol = [%value.rec "<string> | <image> | <custom-ident>"]
19741974
and target = [%value.rec
19751975
"<target-counter()> | <target-counters()> | <target-text()>"
19761976
]
1977+
and url = [%value.rec "<url-no-interp> | url( <interpolation> )"]
19771978
and extended_length = [%value.rec
19781979
"<length> | <calc()> | <interpolation> | <min()> | <max()>"
19791980
]

packages/css-property-parser/lib/Standard.re

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ let string =
217217

218218
// TODO: <url-modifier>
219219
// https://drafts.csswg.org/css-values-4/#urls
220-
let url = {
220+
let url_no_interp = {
221221
let url_token =
222222
token(
223223
fun

packages/css-property-parser/lib/Standard.rei

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ let dashed_ident: Rule.rule(string);
7373

7474
let string: Rule.rule(string);
7575

76-
let url: Rule.rule(string);
76+
let url_no_interp: Rule.rule(string);
7777

7878
/* let var: Rule.rule(string); */
7979

packages/css-property-parser/ppx/Generate.re

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ module Make = (Builder: Ppxlib.Ast_builder.S) => {
314314
type_("dashed_ident", [%type: string]),
315315
type_("custom_ident_without_span_or_auto", [%type: string]),
316316
// abstract_type("string"), already represented by OCaml string type
317-
type_("url", [%type: string]),
317+
type_("url_no_interp", [%type: string]),
318318
type_("hex_color", [%type: string]),
319319
type_("interpolation", [%type: list(string)]),
320320
type_("flex_value", [%type: [ | `Fr(float)]]),

packages/css-property-parser/test/Standard_test.re

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,8 @@ let tests = [
388388
expect(parse("--random"), Ok("--random"));
389389
expect(parse("random'"), Error("Expected a --variable."));
390390
}),
391-
test("<url>", () => {
392-
let parse = parse([%value "<url>"]);
391+
test("<url-no-interp>", () => {
392+
let parse = parse([%value "<url-no-interp>"]);
393393
let to_check = Alcotest.result(Alcotest.string, Alcotest.string);
394394
let expect = check(__POS__, to_check);
395395
expect(parse("url(https://google.com)"), Ok("https://google.com"));

packages/parser/lib/Lexer.re

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,8 @@ let consume_ident_like = lexbuf => {
558558
check(_ =>
559559
switch%sedlex (lexbuf) {
560560
| '\''
561-
| '"' => true
561+
| '"'
562+
| variable => true
562563
| _ => false
563564
}
564565
);
@@ -797,7 +798,8 @@ let consume_ident_like = lexbuf => {
797798
check(lexbuf =>
798799
switch%sedlex (lexbuf) {
799800
| '\''
800-
| '"' => true
801+
| '"'
802+
| variable => true
801803
| _ => false
802804
}
803805
);

packages/parser/test/Lexer_test.re

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ module Parser = Styled_ppx_css_parser.Parser;
66

77
let success_tests =
88
[
9+
(
10+
{|url($(Module.variable))|},
11+
[FUNCTION("url"), INTERPOLATION(["Module", "variable"]), RIGHT_PAREN],
12+
),
913
({|inset-3\.5|}, [IDENT("inset-3.5")]),
1014
({|-inset-3\.5|}, [IDENT("-inset-3.5")]),
1115
({|inset-1\/3|}, [IDENT("inset-1/3")]),
@@ -295,6 +299,20 @@ let test_with_location =
295299
({|--color-main|}, [IDENT("--color-main")], 12),
296300
({|>=|}, [GTE], 2),
297301
({|<=|}, [LTE], 2),
302+
(
303+
{|url($(Module.variable'))|},
304+
[
305+
FUNCTION("url"),
306+
DELIM("$"),
307+
LEFT_PAREN,
308+
IDENT("Module"),
309+
DELIM("."),
310+
IDENT("variable'"),
311+
RIGHT_PAREN,
312+
RIGHT_PAREN,
313+
],
314+
24,
315+
),
298316
]
299317
|> List.mapi((_index, (input, output, last_position)) => {
300318
let (loc, values) = parse(input);

packages/ppx/src/Property_to_runtime.re

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1553,7 +1553,14 @@ let render_gradient = (~loc, value: Types.gradient) =>
15531553
| `_legacy_gradient(_) => raise(Unsupported_feature)
15541554
};
15551555

1556-
let render_url = (~loc, url) => [%expr `url([%e render_string(~loc, url)])];
1556+
let render_url_no_interp = (~loc, url) => [%expr `url([%e render_string(~loc, url)])];
1557+
1558+
let render_url = (~loc, url: Types.url) => {
1559+
switch (url) {
1560+
| `Url(v) => [%expr `url([%e render_variable(~loc, v)])]
1561+
| `Url_no_interp(v) => render_url_no_interp(~loc, v)
1562+
};
1563+
};
15571564

15581565
let render_image = (~loc, value: Types.image) =>
15591566
switch (value) {

0 commit comments

Comments
 (0)