| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- 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;
- }
|