messageformat-number-skeleton
Version:
A parser & formatter for ICU NumberFormat skeleton strings & patterns
58 lines (57 loc) • 1.81 kB
JavaScript
import { BadOptionError, TooManyOptionsError } from '../errors.js';
function parseBlueprintDigits(src, style) {
const re = style === 'fraction' ? /^\.(0*)(\+|#*)$/ : /^(@+)(\+|#*)$/;
const match = src && src.match(re);
if (match) {
const min = match[1].length;
switch (match[2].charAt(0)) {
case '':
return { min, max: min };
case '+':
return { min, max: null };
case '#': {
return { min, max: min + match[2].length };
}
}
}
return null;
}
export function parsePrecisionBlueprint(stem, options, onError) {
const fd = parseBlueprintDigits(stem, 'fraction');
if (fd) {
if (options.length > 1)
onError(new TooManyOptionsError(stem, options, 1));
const res = {
style: 'precision-fraction',
source: stem,
minFraction: fd.min
};
if (fd.max != null)
res.maxFraction = fd.max;
const option = options[0];
const sd = parseBlueprintDigits(option, 'significant');
if (sd) {
res.source = `${stem}/${option}`;
res.minSignificant = sd.min;
if (sd.max != null)
res.maxSignificant = sd.max;
}
else if (option)
onError(new BadOptionError(stem, option));
return res;
}
const sd = parseBlueprintDigits(stem, 'significant');
if (sd) {
for (const opt of options)
onError(new BadOptionError(stem, opt));
const res = {
style: 'precision-fraction',
source: stem,
minSignificant: sd.min
};
if (sd.max != null)
res.maxSignificant = sd.max;
return res;
}
return null;
}