Skip to content

Commit 016a444

Browse files
fix: handle plus sign before value (#79)
1 parent 4ae727f commit 016a444

File tree

2 files changed

+72
-14
lines changed

2 files changed

+72
-14
lines changed

src/__tests__/index.js

+56
Original file line numberDiff line numberDiff line change
@@ -744,3 +744,59 @@ test(
744744
'calc(calc(100% / 3) * 3)',
745745
'100%',
746746
);
747+
748+
test(
749+
'plus sign',
750+
testValue,
751+
'calc(+100px + +100px)',
752+
'200px',
753+
);
754+
755+
test(
756+
'plus sign (#1)',
757+
testValue,
758+
'calc(+100px - +100px)',
759+
'0px',
760+
);
761+
762+
test(
763+
'plus sign (#2)',
764+
testValue,
765+
'calc(200px * +1)',
766+
'200px',
767+
);
768+
769+
test(
770+
'plus sign (#3)',
771+
testValue,
772+
'calc(200px / +1)',
773+
'200px',
774+
);
775+
776+
test(
777+
'minus sign',
778+
testValue,
779+
'calc(-100px + -100px)',
780+
'-200px',
781+
);
782+
783+
test(
784+
'minus sign (#2)',
785+
testValue,
786+
'calc(-100px - -100px)',
787+
'0px',
788+
);
789+
790+
test(
791+
'minus sign (#3)',
792+
testValue,
793+
'calc(200px * -1)',
794+
'-200px',
795+
);
796+
797+
test(
798+
'minus sign (#4)',
799+
testValue,
800+
'calc(200px / -1)',
801+
'-200px',
802+
);

src/parser.jison

+16-14
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,20 @@
1717
"+" return 'ADD';
1818
"-" return 'SUB';
1919

20-
([0-9]+("."[0-9]+)?|"."[0-9]+)px\b return 'LENGTH';
20+
([0-9]+("."[0-9]+)?|"."[0-9]+)em\b return 'EMS';
21+
([0-9]+("."[0-9]+)?|"."[0-9]+)ex\b return 'EXS';
22+
([0-9]+("."[0-9]+)?|"."[0-9]+)ch\b return 'CHS';
23+
([0-9]+("."[0-9]+)?|"."[0-9]+)rem\b return 'REMS';
24+
([0-9]+("."[0-9]+)?|"."[0-9]+)vw\b return 'VWS';
25+
([0-9]+("."[0-9]+)?|"."[0-9]+)vh\b return 'VHS';
26+
([0-9]+("."[0-9]+)?|"."[0-9]+)vmin\b return 'VMINS';
27+
([0-9]+("."[0-9]+)?|"."[0-9]+)vmax\b return 'VMAXS';
2128
([0-9]+("."[0-9]+)?|"."[0-9]+)cm\b return 'LENGTH';
2229
([0-9]+("."[0-9]+)?|"."[0-9]+)mm\b return 'LENGTH';
2330
([0-9]+("."[0-9]+)?|"."[0-9]+)in\b return 'LENGTH';
2431
([0-9]+("."[0-9]+)?|"."[0-9]+)pt\b return 'LENGTH';
2532
([0-9]+("."[0-9]+)?|"."[0-9]+)pc\b return 'LENGTH';
33+
([0-9]+("."[0-9]+)?|"."[0-9]+)px\b return 'LENGTH';
2634
([0-9]+("."[0-9]+)?|"."[0-9]+)deg\b return 'ANGLE';
2735
([0-9]+("."[0-9]+)?|"."[0-9]+)grad\b return 'ANGLE';
2836
([0-9]+("."[0-9]+)?|"."[0-9]+)rad\b return 'ANGLE';
@@ -34,14 +42,6 @@
3442
([0-9]+("."[0-9]+)?|"."[0-9]+)dpi\b return 'RES';
3543
([0-9]+("."[0-9]+)?|"."[0-9]+)dpcm\b return 'RES';
3644
([0-9]+("."[0-9]+)?|"."[0-9]+)dppx\b return 'RES';
37-
([0-9]+("."[0-9]+)?|"."[0-9]+)em\b return 'EMS';
38-
([0-9]+("."[0-9]+)?|"."[0-9]+)ex\b return 'EXS';
39-
([0-9]+("."[0-9]+)?|"."[0-9]+)ch\b return 'CHS';
40-
([0-9]+("."[0-9]+)?|"."[0-9]+)rem\b return 'REMS';
41-
([0-9]+("."[0-9]+)?|"."[0-9]+)vw\b return 'VWS';
42-
([0-9]+("."[0-9]+)?|"."[0-9]+)vh\b return 'VHS';
43-
([0-9]+("."[0-9]+)?|"."[0-9]+)vmin\b return 'VMINS';
44-
([0-9]+("."[0-9]+)?|"."[0-9]+)vmax\b return 'VMAXS';
4545
([0-9]+("."[0-9]+)?|"."[0-9]+)\% return 'PERCENTAGE';
4646
([0-9]+("."[0-9]+)?|"."[0-9]+)\b return 'NUMBER';
4747

@@ -77,11 +77,6 @@ expression
7777
| value { $$ = $1; }
7878
;
7979

80-
value
81-
: NUMBER { $$ = { type: 'Value', value: parseFloat($1) }; }
82-
| SUB NUMBER { $$ = { type: 'Value', value: parseFloat($2) * -1 }; }
83-
;
84-
8580
function
8681
: FUNCTION { $$ = { type: 'Function', value: $1 }; }
8782
;
@@ -101,5 +96,12 @@ expression
10196
| VMINS { $$ = { type: 'VminValue', value: parseFloat($1), unit: 'vmin' }; }
10297
| VMAXS { $$ = { type: 'VmaxValue', value: parseFloat($1), unit: 'vmax' }; }
10398
| PERCENTAGE { $$ = { type: 'PercentageValue', value: parseFloat($1), unit: '%' }; }
99+
| ADD css_value { var prev = $2; $$ = prev; }
104100
| SUB css_value { var prev = $2; prev.value *= -1; $$ = prev; }
105101
;
102+
103+
value
104+
: NUMBER { $$ = { type: 'Value', value: parseFloat($1) }; }
105+
| ADD NUMBER { $$ = { type: 'Value', value: parseFloat($2) }; }
106+
| SUB NUMBER { $$ = { type: 'Value', value: parseFloat($2) * -1 }; }
107+
;

0 commit comments

Comments
 (0)