From d83cd7fecf19c49a7fa75cd8b2124bfad13ec9d3 Mon Sep 17 00:00:00 2001 From: Evilebot Tnawi Date: Wed, 7 Aug 2019 21:03:34 +0300 Subject: [PATCH 1/2] fix: unit parsing (#58) --- lib/unit.js | 137 ++++++++++++++++++++++++++++++++++----------------- test/unit.js | 126 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 216 insertions(+), 47 deletions(-) diff --git a/lib/unit.js b/lib/unit.js index 09d6142..c349661 100644 --- a/lib/unit.js +++ b/lib/unit.js @@ -4,68 +4,117 @@ var dot = ".".charCodeAt(0); var exp = "e".charCodeAt(0); var EXP = "E".charCodeAt(0); +// Check if three code points would start a number +// https://www.w3.org/TR/css-syntax-3/#starts-with-a-number +function likeNumber(value) { + var code = value.charCodeAt(0); + var nextCode; + + if (code === plus || code === minus) { + nextCode = value.charCodeAt(1); + + if (nextCode >= 48 && nextCode <= 57) { + return true; + } + + var nextNextCode = value.charCodeAt(2); + + if (nextCode === dot && nextNextCode >= 48 && nextNextCode <= 57) { + return true; + } + + return false; + } + + if (code === dot) { + nextCode = value.charCodeAt(1); + + if (nextCode >= 48 && nextCode <= 57) { + return true; + } + + return false; + } + + if (code >= 48 && code <= 57) { + return true; + } + + return false; +} + +// Consume a number +// https://www.w3.org/TR/css-syntax-3/#consume-number module.exports = function(value) { var pos = 0; var length = value.length; - var dotted = false; - var sciPos = -1; - var containsNumber = false; var code; + var nextCode; + var nextNextCode; + + if (length === 0 || !likeNumber(value)) { + return false; + } + + code = value.charCodeAt(pos); + + if (code === plus || code === minus) { + pos++; + } while (pos < length) { code = value.charCodeAt(pos); - if (code >= 48 && code <= 57) { - containsNumber = true; - } else if (code === exp || code === EXP) { - if (sciPos > -1 || pos === 0) { - break; - } - sciPos = pos; + if (code < 48 || code > 57) { + break; + } - var nextCode = value.charCodeAt(pos + 1); + pos += 1; + } - if ( - nextCode === plus || - nextCode === minus || - (nextCode >= 48 && nextCode <= 57) - ) { - if (nextCode === plus || nextCode === minus) { - var nextNextCode = value.charCodeAt(pos + 2); + code = value.charCodeAt(pos); + nextCode = value.charCodeAt(pos + 1); - if (nextNextCode < 48 || nextNextCode > 57) { - break; - } + if (code === dot && nextCode >= 48 && nextCode <= 57) { + pos += 2; - pos += 1; - } + while (pos < length) { + code = value.charCodeAt(pos); - pos += 1; - } else { + if (code < 48 || code > 57) { break; } - } else if (code === dot) { - if (dotted) { - break; - } - dotted = true; - } else if (code === plus || code === minus) { - if (pos !== 0) { - break; - } - } else { - break; - } - pos += 1; + pos += 1; + } } - if (sciPos + 1 === pos) pos--; + code = value.charCodeAt(pos); + nextCode = value.charCodeAt(pos + 1); + nextNextCode = value.charCodeAt(pos + 2); + + if ( + (code === exp || code === EXP) && + ((nextCode >= 48 && nextCode <= 57) || + ((nextCode === plus || nextCode === minus) && + nextNextCode >= 48 && + nextNextCode <= 57)) + ) { + pos += nextCode === plus || nextCode === minus ? 3 : 2; + + while (pos < length) { + code = value.charCodeAt(pos); - return containsNumber - ? { - number: value.slice(0, pos), - unit: value.slice(pos) + if (code < 48 || code > 57) { + break; } - : false; + + pos += 1; + } + } + + return { + number: value.slice(0, pos), + unit: value.slice(pos) + }; }; diff --git a/test/unit.js b/test/unit.js index 57ec4fa..35c94e1 100644 --- a/test/unit.js +++ b/test/unit.js @@ -12,15 +12,15 @@ var tests = [ }, { fixture: "2.", - expected: { number: "2.", unit: "" } + expected: { number: "2", unit: "." } }, { fixture: "+2.", - expected: { number: "+2.", unit: "" } + expected: { number: "+2", unit: "." } }, { fixture: "-2.", - expected: { number: "-2.", unit: "" } + expected: { number: "-2", unit: "." } }, { fixture: "+-2.", @@ -149,6 +149,126 @@ var tests = [ { fixture: "-100.1e-1e-1px", expected: { number: "-100.1e-1", unit: "e-1px" } + }, + { + fixture: ".5px", + expected: { number: ".5", unit: "px" } + }, + { + fixture: "+.5px", + expected: { number: "+.5", unit: "px" } + }, + { + fixture: "-.5px", + expected: { number: "-.5", unit: "px" } + }, + { + fixture: ".5e1px", + expected: { number: ".5e1", unit: "px" } + }, + { + fixture: "-.5e1px", + expected: { number: "-.5e1", unit: "px" } + }, + { + fixture: "+.5e1px", + expected: { number: "+.5e1", unit: "px" } + }, + { + fixture: ".5e1e1px", + expected: { number: ".5e1", unit: "e1px" } + }, + { + fixture: ".5.5px", + expected: { number: ".5", unit: ".5px" } + }, + { + fixture: "1e", + expected: { number: "1", unit: "e" } + }, + { + fixture: "1e1", + expected: { number: "1e1", unit: "" } + }, + { + fixture: "1ee", + expected: { number: "1", unit: "ee" } + }, + { + fixture: "1e+", + expected: { number: "1", unit: "e+" } + }, + { + fixture: "1e-", + expected: { number: "1", unit: "e-" } + }, + { + fixture: "1e+1", + expected: { number: "1e+1", unit: "" } + }, + { + fixture: "1e++1", + expected: { number: "1", unit: "e++1" } + }, + { + fixture: "1e--1", + expected: { number: "1", unit: "e--1" } + }, + { + fixture: "+10", + expected: { number: "+10", unit: "" } + }, + { + fixture: "-10", + expected: { number: "-10", unit: "" } + }, + { + fixture: ".2px", + expected: { number: ".2", unit: "px" } + }, + { + fixture: "-.2px", + expected: { number: "-.2", unit: "px" } + }, + { + fixture: "+.2px", + expected: { number: "+.2", unit: "px" } + }, + { + fixture: ".a", + expected: false + }, + { + fixture: ".", + expected: false + }, + { + fixture: "+", + expected: false + }, + { + fixture: "-", + expected: false + }, + { + fixture: "-a", + expected: false + }, + { + fixture: "+a", + expected: false + }, + { + fixture: "+.a", + expected: false + }, + { + fixture: "-.a", + expected: false + }, + { + fixture: "", + expected: false } ]; From eb78a4768972a46e876472823d961a34c46784a1 Mon Sep 17 00:00:00 2001 From: evilebottnawi Date: Wed, 7 Aug 2019 21:37:38 +0300 Subject: [PATCH 2/2] chore(release): 4.0.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 875ad2d..fdee637 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-value-parser", - "version": "4.0.1", + "version": "4.0.2", "description": "Transforms css values and at-rule params into the tree", "main": "lib/index.js", "files": [