@neutrium/quantity
Version:
The NeutriumJS unit conversion module.
64 lines (53 loc) • 1.21 kB
text/typescript
import { Lexer, Token } from 'moo'
import moo from 'moo/moo.js'
import { UnitTokenManager } from '../UnitTokenManager.js';
export class MooQtyLexer
{
private _lexer: Lexer
constructor()
{
let rules = {
"ws": " ",
"pwr": "^",
"mul": ["*", "."],
"div": "/",
"lParen": '(',
"rParen": ')',
"signedFloat" : /[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?/,
"integer": /[-+]?[0-9]+/
}
const tm = UnitTokenManager.instance;
rules["unit"] = [
...Object.keys(tm.getMap('prefix')),
...Object.keys(tm.getMap('unit'))
].sort((a, b) => b.length - a.length)
this._lexer = moo.compile(rules)
}
get lexer()
{
return this._lexer;
}
//
// Converts a string representing a quantity with units into an array
// of tokens
//
// @param {string} val - The string to tokenize
//
// @returns {Token[]} An array of tokens from the string
//
// @throws {QtyError} if target units are incompatible???
//
// @example
// const lex = new MooUnitTokenizer();
// lex.tokenize("meter"); // Output:
//
public tokenize(val: string) : Token[]
{
this.lexer.reset(val);
return Array.from(this.lexer)
}
public next() : Token | undefined
{
return this.lexer.next();
}
}