Skip to content

Commit 4d19a92

Browse files
committed
Update regex for var()
Fix #199
1 parent 973ba11 commit 4d19a92

File tree

4 files changed

+43
-15
lines changed

4 files changed

+43
-15
lines changed

lib/parsers.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ var angleRegEx = new RegExp(`^${NUMBER}(?:deg|g?rad|turn)$`);
3030
var urlRegEx = /^url\(\s*((?:[^)]|\\\))*)\s*\)$/;
3131
var keywordRegEx = /^[a-z]+(?:\-[a-z]+)*$/i;
3232
var stringRegEx = /^("[^"]*"|'[^']*')$/;
33-
var varRegEx = /^var\(|(?<=[*/\s(])var\(/;
33+
var varRegEx = /^var\(/;
34+
var varContainedRegEx = /(?<=[*/\s(])var\(/;
3435
var calcRegEx =
3536
/^(?:a?(?:cos|sin|tan)|abs|atan2|calc|clamp|exp|hypot|log|max|min|mod|pow|rem|round|sign|sqrt)\(/;
3637

@@ -143,6 +144,9 @@ exports.parseNumber = function parseNumber(val) {
143144
format: 'specifiedValue',
144145
});
145146
default:
147+
if (varContainedRegEx.test(val)) {
148+
return val;
149+
}
146150
return undefined;
147151
}
148152
};
@@ -162,6 +166,9 @@ exports.parseLength = function parseLength(val) {
162166
return `${parseFloat(numVal)}${unit}`;
163167
}
164168
default:
169+
if (varContainedRegEx.test(val)) {
170+
return val;
171+
}
165172
if (type === exports.TYPES.NUMBER && parseFloat(val) === 0) {
166173
return '0px';
167174
}
@@ -183,6 +190,9 @@ exports.parsePercent = function parsePercent(val) {
183190
const [, numVal, unit] = unitRegEx.exec(val);
184191
return `${parseFloat(numVal)}${unit}`;
185192
default:
193+
if (varContainedRegEx.test(val)) {
194+
return val;
195+
}
186196
if (type === exports.TYPES.NUMBER && parseFloat(val) === 0) {
187197
return '0%';
188198
}
@@ -206,6 +216,9 @@ exports.parseMeasurement = function parseMeasurement(val) {
206216
const [, numVal, unit] = unitRegEx.exec(val);
207217
return `${parseFloat(numVal)}${unit}`;
208218
default:
219+
if (varContainedRegEx.test(val)) {
220+
return val;
221+
}
209222
if (type === exports.TYPES.NUMBER && parseFloat(val) === 0) {
210223
return '0px';
211224
}
@@ -384,7 +397,10 @@ exports.parseImage = function parseImage(val) {
384397
if (type === exports.TYPES.UNDEFINED) {
385398
return undefined;
386399
}
387-
var values = splitValue(val, ',');
400+
var values = splitValue(val, {
401+
delimiter: ',',
402+
preserveComment: varContainedRegEx.test(val),
403+
});
388404
var isImage = !!values.length;
389405
var i;
390406
for (i = 0; i < values.length; i++) {

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
],
3838
"main": "./lib/CSSStyleDeclaration.js",
3939
"dependencies": {
40-
"@asamuzakjp/css-color": "^3.1.5",
40+
"@asamuzakjp/css-color": "^3.1.7",
4141
"rrweb-cssom": "^0.8.0"
4242
},
4343
"devDependencies": {

test/parsers.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,18 +89,18 @@ describe('valueType', () => {
8989
assert.strictEqual(output, parsers.TYPES.UNIDENT);
9090
});
9191

92-
it('returns var for url(var(--foo))', () => {
92+
it('returns unidentified for url(var(--foo))', () => {
9393
let input = 'url(var(--foo))';
9494
let output = parsers.valueType(input);
9595

96-
assert.strictEqual(output, parsers.TYPES.VAR);
96+
assert.strictEqual(output, parsers.TYPES.UNIDENT);
9797
});
9898

99-
it('returns var from calc(100px * var(--foo))', () => {
99+
it('returns calc from calc(100px * var(--foo))', () => {
100100
let input = 'calc(100px * var(--foo))';
101101
let output = parsers.valueType(input);
102102

103-
assert.strictEqual(output, parsers.TYPES.VAR);
103+
assert.strictEqual(output, parsers.TYPES.CALC);
104104
});
105105

106106
it('returns var from var(--foo)', () => {
@@ -800,6 +800,13 @@ describe('parseColor', () => {
800800

801801
assert.strictEqual(output, 'transparent');
802802
});
803+
804+
it('should return value as is with var()', () => {
805+
let input = 'rgb(var(--my-var, 0, 0, 0))';
806+
let output = parsers.parseColor(input);
807+
808+
assert.strictEqual(output, 'rgb(var(--my-var, 0, 0, 0))');
809+
});
803810
});
804811

805812
describe('parseAngle', () => {
@@ -887,18 +894,23 @@ describe('parseImage', () => {
887894

888895
assert.strictEqual(
889896
output,
890-
'radial-gradient(transparent, /* comment */ var(--custom-color)), url(example.png)'
897+
'radial-gradient(transparent, /* comment */ var(--custom-color)), url("example.png")'
891898
);
892899
});
893900

894-
it('should return value as is if var() is included and even if invalid image type is included', () => {
901+
it('should return undefined if invalid image type is included', () => {
895902
let input = 'radial-gradient(transparent, var(--custom-color)), red';
896903
let output = parsers.parseImage(input);
897904

898-
assert.strictEqual(output, 'radial-gradient(transparent, var(--custom-color)), red');
905+
assert.strictEqual(output, undefined);
899906
});
900907

901-
it.todo('test');
908+
it('should return undefined if value is not image type', () => {
909+
let input = 'rgb(var(--my-var, 0, 0, 0))';
910+
let output = parsers.parseImage(input);
911+
912+
assert.strictEqual(output, undefined);
913+
});
902914
});
903915

904916
describe('dashedToCamelCase', () => {

0 commit comments

Comments
 (0)