119 lines
2.2 KiB
Plaintext
119 lines
2.2 KiB
Plaintext
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),
|
|
}
|
|
}
|