subscript
Version:
Modular expression parser & evaluator
33 lines (28 loc) • 862 B
JavaScript
/**
* Unit suffixes - parse half: 5px, 10rem, 2s, 500ms
*
* AST:
* 5px → ['px', [,5]]
* 2.5s → ['s', [,2.5]]
*
* Usage:
* import { unit } from 'subscript/feature/unit.js'
* unit('px', 'em', 'rem', 's', 'ms')
*/
import { lookup, next, parse, idx, seek } from '../parse.js';
export const units = {};
export const unit = (...names) => names.forEach(name => { units[name] = 1; });
// Wrap number handler to check for unit suffix
const wrapNum = cc => {
const orig = lookup[cc];
if (!orig) return;
lookup[cc] = (a, prec) => {
const r = orig(a, prec);
if (!r || r[0] !== undefined) return r;
const start = idx, u = next(c => parse.id(c) && !(c >= 48 && c <= 57));
return u && units[u] ? [u, r] : (u && seek(start), r);
};
};
// Wrap digit and period handlers
for (let i = 48; i <= 57; i++) wrapNum(i);
wrapNum(46);