UNPKG

subscript

Version:

Modular expression parser & evaluator

33 lines (28 loc) 862 B
/** * 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);