Spaces:
Running
Running
var minus = "-".charCodeAt(0); | |
var plus = "+".charCodeAt(0); | |
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 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) { | |
break; | |
} | |
pos += 1; | |
} | |
code = value.charCodeAt(pos); | |
nextCode = value.charCodeAt(pos + 1); | |
if (code === dot && nextCode >= 48 && nextCode <= 57) { | |
pos += 2; | |
while (pos < length) { | |
code = value.charCodeAt(pos); | |
if (code < 48 || code > 57) { | |
break; | |
} | |
pos += 1; | |
} | |
} | |
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); | |
if (code < 48 || code > 57) { | |
break; | |
} | |
pos += 1; | |
} | |
} | |
return { | |
number: value.slice(0, pos), | |
unit: value.slice(pos) | |
}; | |
}; | |