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), } }