@itwin/core-quantity 4.8.0-dev.3 → 4.8.0-dev.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -1
- package/lib/cjs/Constants.js.map +1 -1
- package/lib/cjs/Exception.js.map +1 -1
- package/lib/cjs/Formatter/Format.js.map +1 -1
- package/lib/cjs/Formatter/FormatEnums.js.map +1 -1
- package/lib/cjs/Formatter/Formatter.js.map +1 -1
- package/lib/cjs/Formatter/FormatterSpec.js.map +1 -1
- package/lib/cjs/Formatter/Interfaces.js.map +1 -1
- package/lib/cjs/Interfaces.js.map +1 -1
- package/lib/cjs/Parser.js.map +1 -1
- package/lib/cjs/ParserSpec.js.map +1 -1
- package/lib/cjs/Quantity.js.map +1 -1
- package/lib/cjs/Unit.js.map +1 -1
- package/lib/cjs/core-quantity.js.map +1 -1
- package/lib/esm/Constants.js.map +1 -1
- package/lib/esm/Exception.js.map +1 -1
- package/lib/esm/Formatter/Format.js.map +1 -1
- package/lib/esm/Formatter/FormatEnums.js.map +1 -1
- package/lib/esm/Formatter/Formatter.js.map +1 -1
- package/lib/esm/Formatter/FormatterSpec.js.map +1 -1
- package/lib/esm/Formatter/Interfaces.js.map +1 -1
- package/lib/esm/Interfaces.js.map +1 -1
- package/lib/esm/Parser.js.map +1 -1
- package/lib/esm/ParserSpec.js.map +1 -1
- package/lib/esm/Quantity.js.map +1 -1
- package/lib/esm/Unit.js.map +1 -1
- package/lib/esm/core-quantity.js.map +1 -1
- package/package.json +4 -4
package/lib/cjs/Parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityConstants } from \"./Constants\";\nimport { Format } from \"./Formatter/Format\";\nimport { FormatTraits, FormatType } from \"./Formatter/FormatEnums\";\nimport { AlternateUnitLabelsProvider, PotentialParseUnit, QuantityProps, UnitConversionProps, UnitConversionSpec, UnitProps, UnitsProvider } from \"./Interfaces\";\nimport { ParserSpec } from \"./ParserSpec\";\nimport { Quantity } from \"./Quantity\";\n\n/** Possible parser errors\n * @beta\n */\nexport enum ParseError {\n UnableToGenerateParseTokens = 1,\n NoValueOrUnitFoundInString,\n UnitLabelSuppliedButNotMatched,\n UnknownUnit,\n UnableToConvertParseTokensToQuantity,\n InvalidParserSpec,\n}\n\n/** Parse error result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\n * @beta\n */\nexport interface ParseQuantityError {\n /** Union discriminator for [[QuantityParseResult]]. */\n ok: false;\n /** The specific error that occurred during parsing. */\n error: ParseError;\n}\n\n/** Successful result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\n * @beta\n */\nexport interface ParsedQuantity {\n /** Union discriminator for [[QuantityParseResult]]. */\n ok: true;\n /** The magnitude of the parsed quantity. */\n value: number;\n}\n\n/**\n * Defines Results of parsing a string input by a user into its desired value type\n * @beta\n */\nexport type QuantityParseResult = ParsedQuantity | ParseQuantityError;\n\n/** A ParseToken holds either a numeric or string token extracted from a string that represents a quantity value.\n * @beta\n */\nclass ParseToken {\n public value: number | string;\n\n constructor(value: string | number) {\n if (typeof value === \"string\")\n this.value = value.trim();\n else\n this.value = value;\n }\n\n public get isString(): boolean { return typeof this.value === \"string\"; }\n public get isNumber(): boolean { return typeof this.value === \"number\"; }\n}\n\n/** A ScientificToken holds an index and string representing the exponent.\n * @beta\n */\nclass ScientificToken {\n public index: number;\n public exponent = \"\";\n\n constructor(index: number, exponent?: string) {\n this.index = index;\n if (exponent)\n this.exponent = exponent;\n }\n}\n\n/** A FractionToken holds an index and the fraction value of numerator / denominator.\n * @beta\n */\nclass FractionToken {\n public index: number;\n public fraction = 0.0;\n public exponent = \"\";\n\n constructor(index: number, fraction?: number) {\n this.index = index;\n if (fraction)\n this.fraction = fraction;\n }\n}\n\n/** A Parser class that is used to break a string that represents a quantity value into tokens.\n * @beta\n */\nexport class Parser {\n private static _log = false;\n\n public static isParsedQuantity(item: QuantityParseResult): item is ParsedQuantity {\n return item.ok;\n }\n\n public static isParseError(item: QuantityParseResult): item is ParseQuantityError {\n return !item.ok;\n }\n\n private static checkForScientificNotation(index: number, stringToParse: string, uomSeparatorToIgnore: number): ScientificToken {\n let exponentString = \"\";\n let i = index + 1;\n\n for (; i < stringToParse.length; i++) {\n const charCode = stringToParse.charCodeAt(i);\n if (Parser.isDigit(charCode) || ((charCode === QuantityConstants.CHAR_MINUS || charCode === QuantityConstants.CHAR_PLUS) && (i === (index + 1)))) {\n exponentString = exponentString.concat(stringToParse[i]);\n } else {\n i = uomSeparatorToIgnore === charCode ? i : i - 1;\n break;\n }\n }\n\n if (exponentString.length > 1 || ((exponentString.length === 1) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_MINUS) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_PLUS)))\n return new ScientificToken(i, exponentString);\n\n return new ScientificToken(index);\n }\n\n private static checkForFractions(index: number, stringToParse: string, uomSeparatorToIgnore: number, numeratorStr?: string): FractionToken {\n let numeratorToken = \"\";\n let denominatorToken = \"\";\n let processingNumerator = true;\n let i = index;\n if (numeratorStr && numeratorStr.length > 0) {\n numeratorToken = numeratorStr;\n processingNumerator = false;\n }\n\n for (; i < stringToParse.length; i++) {\n const charCode = stringToParse.charCodeAt(i);\n if (Parser.isDigit(charCode)) {\n if (processingNumerator) {\n numeratorToken = numeratorToken.concat(stringToParse[i]);\n } else {\n denominatorToken = denominatorToken.concat(stringToParse[i]);\n }\n } else {\n if (processingNumerator && (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH)) {\n processingNumerator = false;\n } else {\n if (uomSeparatorToIgnore !== charCode)\n i = i - 1; // skip over uom separator after fraction\n\n break;\n }\n }\n }\n\n if (numeratorToken.length > 0 && denominatorToken.length > 0) {\n const numerator = parseInt(numeratorToken, 10);\n const denominator = parseInt(denominatorToken, 10);\n if (denominator > 0)\n return new FractionToken(i, numerator / denominator);\n return new FractionToken(i);\n }\n\n return new FractionToken(index + 1);\n }\n\n private static isDigit(charCode: number): boolean {\n return (charCode >= QuantityConstants.CHAR_DIGIT_ZERO) && (charCode <= QuantityConstants.CHAR_DIGIT_NINE);\n }\n\n private static isDigitOrDecimalSeparator(charCode: number, format: Format): boolean {\n return (charCode === format.decimalSeparator.charCodeAt(0)) || Parser.isDigit(charCode);\n }\n\n /** Parse the quantity string and return and array of ParseTokens that represent the component invariant values and unit labels.\n * @param quantitySpecification The quantity string to ba parsed.\n */\n public static parseQuantitySpecification(quantitySpecification: string, format: Format): ParseToken[] {\n const tokens: ParseToken[] = [];\n const str = quantitySpecification.trim();\n let processingNumber = false;\n let wipToken = \"\";\n let signToken = \"\";\n let uomSeparatorToIgnore = 0;\n let fractionDashCode = 0;\n\n const skipCodes: number[] = [format.thousandSeparator.charCodeAt(0)];\n\n if (format.type === FormatType.Station && format.stationSeparator && format.stationSeparator.length === 1)\n skipCodes.push(format.stationSeparator.charCodeAt(0));\n\n if (format.type === FormatType.Fractional && format.hasFormatTraitSet(FormatTraits.FractionDash)) {\n fractionDashCode = QuantityConstants.CHAR_MINUS;\n }\n\n if (format.uomSeparator && format.uomSeparator !== \" \" && format.uomSeparator.length === 1) {\n uomSeparatorToIgnore = format.uomSeparator.charCodeAt(0);\n skipCodes.push(uomSeparatorToIgnore);\n }\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < str.length; i++) {\n const charCode = str.charCodeAt(i);\n if (Parser.isDigitOrDecimalSeparator(charCode, format)) {\n if (!processingNumber) {\n if (wipToken.length > 0) {\n tokens.push(new ParseToken(wipToken));\n wipToken = \"\";\n }\n processingNumber = true;\n }\n // Decimal separators must be replaced with '.' before converting to a number - parseFloat() only supports '.' as the decimal separator.\n const charToAdd = charCode === format.decimalSeparator.charCodeAt(0) ? \".\" : str[i];\n wipToken = wipToken.concat(charToAdd);\n } else {\n if (processingNumber) {\n if (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_FRACTION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH) {\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore, wipToken);\n let fraction = fractSymbol.fraction;\n i = fractSymbol.index;\n if (fractSymbol.fraction !== 0.0) {\n wipToken = \"\";\n if (signToken.length > 0) {\n if (signToken === \"-\")\n fraction = 0 - fraction;\n\n signToken = \"\";\n }\n\n tokens.push(new ParseToken(fraction));\n processingNumber = false;\n continue;\n }\n } else {\n // a space may signify end of number or start of decimal\n if (charCode === QuantityConstants.CHAR_SPACE || charCode === fractionDashCode) {\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore);\n let fraction = fractSymbol.fraction;\n if (fractSymbol.fraction !== 0.0) {\n i = fractSymbol.index;\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n if (signToken === \"-\")\n fraction = 0 - fraction;\n\n signToken = \"\";\n }\n\n const valueWithFraction = parseFloat(wipToken) + fraction;\n tokens.push(new ParseToken(valueWithFraction));\n processingNumber = false;\n wipToken = \"\";\n }\n continue;\n } else {\n // an \"E\" or \"e\" may signify scientific notation\n if (charCode === QuantityConstants.CHAR_UPPER_E || charCode === QuantityConstants.CHAR_LOWER_E) {\n const exponentSymbol = Parser.checkForScientificNotation(i, str, uomSeparatorToIgnore);\n i = exponentSymbol.index;\n\n if (exponentSymbol.exponent && exponentSymbol.exponent.length > 0) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n\n wipToken = `${wipToken}e${exponentSymbol.exponent}`;\n const scientificValue = Number(wipToken);\n tokens.push(new ParseToken(scientificValue));\n processingNumber = false;\n wipToken = \"\";\n continue;\n }\n }\n }\n }\n\n // ignore any codes in skipCodes\n if (skipCodes.findIndex((ref) => ref === charCode) !== -1)\n continue;\n\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n\n tokens.push(new ParseToken(parseFloat(wipToken)));\n\n wipToken = (i < str.length) ? str[i] : \"\";\n processingNumber = false;\n } else {\n // not processing a number\n if ((charCode === QuantityConstants.CHAR_PLUS || charCode === QuantityConstants.CHAR_MINUS)) {\n if (0 === tokens.length) // sign token only needed for left most value\n signToken = str[i];\n continue;\n }\n\n wipToken = wipToken.concat(str[i]);\n }\n }\n }\n\n // handle case where end of input string is reached.\n if (wipToken.length > 0) {\n if (processingNumber) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n }\n tokens.push(new ParseToken(parseFloat(wipToken)));\n } else {\n tokens.push(new ParseToken(wipToken));\n }\n }\n\n return tokens;\n }\n\n private static async lookupUnitByLabel(unitLabel: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider) {\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n\n const labelToFind = unitLabel.toLowerCase();\n // First look in format for a label and matches\n if (format.units && format.units.length > 0) {\n const formatUnit = format.units.find(([unit, label]) => {\n if (label && label.toLowerCase() === labelToFind)\n return true;\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // check any alternate labels that may be defined for the Unit\n if (alternateLabels && alternateLabels.find((lbl) => lbl.toLowerCase() === labelToFind))\n return true;\n\n return false;\n });\n if (formatUnit)\n return formatUnit[0];\n }\n\n // now try to find a unit from the same family and system\n let foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined, defaultUnit ? defaultUnit.system : undefined);\n\n // if nothing found yet just limit to family\n if (!foundUnit.isValid && defaultUnit)\n foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined);\n return foundUnit;\n }\n\n private static async createQuantityFromParseTokens(tokens: ParseToken[], format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\n let defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n\n // common case where single value is supplied\n if (tokens.length === 1) {\n if (tokens[0].isNumber) {\n return new Quantity(defaultUnit, tokens[0].value as number);\n } else {\n const unit = await this.lookupUnitByLabel(tokens[0].value as string, format, unitsProvider, altUnitLabelsProvider);\n return new Quantity(unit);\n }\n }\n\n // common case where single value and single label are supplied\n if (tokens.length === 2) {\n // unit specification comes before value (like currency)\n if (tokens[1].isNumber && tokens[0].isString) {\n tokens = [tokens[1], tokens[0]];\n }\n if (tokens[0].isNumber && tokens[1].isString) {\n const unit = await this.lookupUnitByLabel(tokens[1].value as string, format, unitsProvider, altUnitLabelsProvider);\n if (undefined === defaultUnit)\n defaultUnit = unit;\n if (defaultUnit && defaultUnit.name === unit.name) {\n return new Quantity(defaultUnit, tokens[0].value as number);\n } else if (defaultUnit) {\n const conversion = await unitsProvider.getConversion(unit, defaultUnit);\n const mag = ((tokens[0].value as number * conversion.factor)) + conversion.offset;\n return new Quantity(defaultUnit, mag);\n }\n }\n }\n\n // common case where there are multiple value/label pairs\n if (tokens.length % 2 === 0) {\n let mag = 0.0;\n for (let i = 0; i < tokens.length; i = i + 2) {\n if (tokens[i].isNumber && tokens[i + 1].isString) {\n const value = tokens[i].value as number;\n const unit = await this.lookupUnitByLabel(tokens[i + 1].value as string, format, unitsProvider, altUnitLabelsProvider);\n if (undefined === defaultUnit)\n defaultUnit = unit;\n if (0 === i) {\n if (defaultUnit.name === unit.name)\n mag = value;\n else {\n const conversion = await unitsProvider.getConversion(unit, defaultUnit);\n mag = ((value * conversion.factor)) + conversion.offset;\n }\n } else {\n if (defaultUnit) {\n const conversion = await unitsProvider.getConversion(unit, defaultUnit);\n if (mag < 0.0)\n mag = mag - ((value * conversion.factor)) + conversion.offset;\n else\n mag = mag + ((value * conversion.factor)) + conversion.offset;\n }\n }\n }\n }\n return new Quantity(defaultUnit, mag);\n }\n\n return new Quantity(defaultUnit);\n }\n\n /** Async method to generate a Quantity given a string that represents a quantity value and likely a unit label.\n * @param inString A string that contains text represent a quantity.\n * @param format Defines the likely format of inString.\n * @param unitsProvider required to look up units that may be specified in inString\n */\n public static async parseIntoQuantity(inString: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\n if (tokens.length === 0)\n return new Quantity();\n\n return Parser.createQuantityFromParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);\n }\n\n /** method to get the Unit Conversion given a unit label */\n private static tryFindUnitConversion(unitLabel: string, unitsConversions: UnitConversionSpec[], preferredUnit?: UnitProps): UnitConversionProps | undefined {\n if (unitsConversions.length > 0) {\n const label = unitLabel.toLocaleLowerCase();\n\n /* A preferred unit is used to target a unit if a unit label is used in more that one unit definition from the same unit family.\n * An example is if \"ft\" is used as the unitLabel and the preferredUnit is \"SURVEY_FT\" since that unit has an alternate label of \"ft\" the\n * conversion to \"SURVEY_FT\" is returned. If no preferredUnit is specified then the unit \"FT\" would likely to have been found first.\n * If \"in\" is the unit label and \"SURVEY_FT\" is the preferredUnit then conversion to \"SURVEY_IN\" would be returned.\n */\n if (preferredUnit) {\n // if there is a preferred unit defined see if unit label matched it or one of its alternates\n const preferredConversion = unitsConversions.find((conversion) => conversion.name === preferredUnit.name);\n if (preferredConversion && preferredConversion.parseLabels) {\n if (-1 !== preferredConversion.parseLabels.findIndex((lbl) => lbl === label))\n return preferredConversion.conversion;\n }\n // see if we can find a matching unitLabel in any unit within the same system as the preferred unit\n const preferredSystemConversions = unitsConversions.filter((conversion) => conversion.system === preferredUnit.system);\n for (const conversion of preferredSystemConversions) {\n if (conversion.parseLabels) {\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\n return conversion.conversion;\n }\n }\n }\n\n // if no unit found based on preferredUnit see if an unit label matches\n for (const conversion of unitsConversions) {\n if (conversion.parseLabels) {\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\n return conversion.conversion;\n } else {\n // eslint-disable-next-line no-console\n console.log(\"ERROR: Parser expects to find parseLabels array populate with all possible unit labels for the unit.\");\n }\n }\n }\n\n return undefined;\n }\n\n private static getQuantityValueFromParseTokens(tokens: ParseToken[], format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n // common case where single value is supplied\n if (tokens.length === 1) {\n if (tokens[0].isNumber) {\n if (defaultUnit) {\n const conversion = Parser.tryFindUnitConversion(defaultUnit.label, unitsConversions, defaultUnit);\n if (conversion) {\n const value = (tokens[0].value as number) * conversion.factor + conversion.offset;\n return { ok: true, value };\n }\n } else {\n // if no conversion or no defaultUnit, just return parsed number\n return { ok: true, value: tokens[0].value as number };\n }\n } else {\n // only the unit label was specified so assume magnitude of 1\n const conversion = Parser.tryFindUnitConversion(tokens[0].value as string, unitsConversions, defaultUnit);\n if (undefined !== conversion)\n return { ok: true, value: conversion.factor + conversion.offset };\n else\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n }\n }\n\n // common case where single value and single label are supplied\n if (tokens.length === 2) {\n // unit specification comes before value (like currency)\n if (tokens[1].isNumber && tokens[0].isString) {\n tokens = [tokens[1], tokens[0]];\n }\n if (tokens[0].isNumber && tokens[1].isString) {\n let conversion = Parser.tryFindUnitConversion(tokens[1].value as string, unitsConversions, defaultUnit);\n // if no conversion, ignore value in second token. If we have defaultUnit, use it.\n if (!conversion && defaultUnit) {\n conversion = Parser.tryFindUnitConversion(defaultUnit.label, unitsConversions, defaultUnit);\n }\n if (conversion) {\n const value = (tokens[0].value as number) * conversion.factor + conversion.offset;\n return { ok: true, value };\n }\n // if no conversion, just return parsed number and ignore value in second token\n return { ok: true, value: tokens[0].value as number };\n }\n }\n\n // common case where there are multiple value/label pairs\n if (tokens.length % 2 === 0) {\n let mag = 0.0;\n for (let i = 0; i < tokens.length; i = i + 2) {\n if (tokens[i].isNumber && tokens[i + 1].isString) {\n const value = tokens[i].value as number;\n const conversion = Parser.tryFindUnitConversion(tokens[i + 1].value as string, unitsConversions, defaultUnit);\n if (conversion) {\n if (mag < 0.0)\n mag = mag - ((value * conversion.factor)) + conversion.offset;\n else\n mag = mag + ((value * conversion.factor)) + conversion.offset;\n }\n }\n }\n return { ok: true, value: mag };\n }\n\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n }\n\n /** Method to generate a Quantity given a string that represents a quantity value.\n * @param inString A string that contains text represent a quantity.\n * @param parserSpec unit label if not explicitly defined by user. Must have matching entry in supplied array of unitsConversions.\n * @param defaultValue default value to return if parsing is un successful\n */\n public static parseQuantityString(inString: string, parserSpec: ParserSpec): QuantityParseResult {\n return Parser.parseToQuantityValue(inString, parserSpec.format, parserSpec.unitConversions);\n }\n\n /** Method to generate a Quantity given a string that represents a quantity value and likely a unit label.\n * @param inString A string that contains text represent a quantity.\n * @param format Defines the likely format of inString. Primary unit serves as a default unit if no unit label found in string.\n * @param unitsConversions dictionary of conversions used to convert from unit used in inString to output quantity\n */\n public static parseToQuantityValue(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\n // ensure any labels defined in composite unit definition are specified in unitConversions\n if (format.units) {\n format.units.forEach(([unit, label]) => {\n if (label) {\n if (unit.label !== label) { // if default unit label does not match composite label ensure the label is in the list of parse labels for the conversion\n const unitConversion = unitsConversions.find((conversion) => conversion.name === unit.name);\n if (unitConversion && unitConversion.parseLabels && !unitConversion.parseLabels.find((entry) => entry === label))\n unitConversion.parseLabels.push(label);\n }\n }\n });\n }\n\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\n if (tokens.length === 0)\n return { ok: false, error: ParseError.UnableToGenerateParseTokens };\n\n if (Parser._log) {\n // eslint-disable-next-line no-console\n console.log(`Parse tokens`);\n let i = 0;\n for (const token of tokens) {\n // eslint-disable-next-line no-console\n console.log(` [${i++}] isNumber=${token.isNumber} isString=${token.isString} token=${token.value}`);\n }\n }\n\n return Parser.getQuantityValueFromParseTokens(tokens, format, unitsConversions);\n }\n\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\n public static async createUnitConversionSpecsForUnit(unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\n const unitConversionSpecs: UnitConversionSpec[] = [];\n\n const familyUnits = await unitsProvider.getUnitsByFamily(outUnit.phenomenon);\n for (const unit of familyUnits) {\n const conversion = await unitsProvider.getConversion(unit, outUnit);\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // add any alternate labels that may be defined for the Unit\n if (alternateLabels) {\n alternateLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n\n unitConversionSpecs.push({\n name: unit.name,\n label: unit.label,\n conversion,\n parseLabels,\n system: unit.system,\n });\n }\n return unitConversionSpecs;\n }\n\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\n public static async createUnitConversionSpecs(unitsProvider: UnitsProvider, outUnitName: string, potentialParseUnits: PotentialParseUnit[], altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\n const unitConversionSpecs: UnitConversionSpec[] = [];\n\n const outUnit = await unitsProvider.findUnitByName(outUnitName);\n if (!outUnit || !outUnit.name || 0 === outUnit.name.length) {\n // eslint-disable-next-line no-console\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate out unit ${outUnitName}.`);\n return unitConversionSpecs;\n }\n\n for (const potentialParseUnit of potentialParseUnits) {\n const unit = await unitsProvider.findUnitByName(potentialParseUnit.unitName);\n if (!unit || !unit.name || 0 === unit.name.length) {\n // eslint-disable-next-line no-console\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate potential unit ${potentialParseUnit.unitName}.`);\n continue;\n }\n\n const conversion = await unitsProvider.getConversion(unit, outUnit);\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // add any alternate labels that may be defined for the Unit\n if (alternateLabels) {\n alternateLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n\n // add any alternate labels that where provided by caller\n if (potentialParseUnit.altLabels) {\n potentialParseUnit.altLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n unitConversionSpecs.push({\n name: unit.name,\n label: unit.label,\n conversion,\n parseLabels,\n system: unit.system,\n });\n }\n return unitConversionSpecs;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { QuantityConstants } from \"./Constants\";\r\nimport { Format } from \"./Formatter/Format\";\r\nimport { FormatTraits, FormatType } from \"./Formatter/FormatEnums\";\r\nimport { AlternateUnitLabelsProvider, PotentialParseUnit, QuantityProps, UnitConversionProps, UnitConversionSpec, UnitProps, UnitsProvider } from \"./Interfaces\";\r\nimport { ParserSpec } from \"./ParserSpec\";\r\nimport { Quantity } from \"./Quantity\";\r\n\r\n/** Possible parser errors\r\n * @beta\r\n */\r\nexport enum ParseError {\r\n UnableToGenerateParseTokens = 1,\r\n NoValueOrUnitFoundInString,\r\n UnitLabelSuppliedButNotMatched,\r\n UnknownUnit,\r\n UnableToConvertParseTokensToQuantity,\r\n InvalidParserSpec,\r\n}\r\n\r\n/** Parse error result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\r\n * @beta\r\n */\r\nexport interface ParseQuantityError {\r\n /** Union discriminator for [[QuantityParseResult]]. */\r\n ok: false;\r\n /** The specific error that occurred during parsing. */\r\n error: ParseError;\r\n}\r\n\r\n/** Successful result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\r\n * @beta\r\n */\r\nexport interface ParsedQuantity {\r\n /** Union discriminator for [[QuantityParseResult]]. */\r\n ok: true;\r\n /** The magnitude of the parsed quantity. */\r\n value: number;\r\n}\r\n\r\n/**\r\n * Defines Results of parsing a string input by a user into its desired value type\r\n * @beta\r\n */\r\nexport type QuantityParseResult = ParsedQuantity | ParseQuantityError;\r\n\r\n/** A ParseToken holds either a numeric or string token extracted from a string that represents a quantity value.\r\n * @beta\r\n */\r\nclass ParseToken {\r\n public value: number | string;\r\n\r\n constructor(value: string | number) {\r\n if (typeof value === \"string\")\r\n this.value = value.trim();\r\n else\r\n this.value = value;\r\n }\r\n\r\n public get isString(): boolean { return typeof this.value === \"string\"; }\r\n public get isNumber(): boolean { return typeof this.value === \"number\"; }\r\n}\r\n\r\n/** A ScientificToken holds an index and string representing the exponent.\r\n * @beta\r\n */\r\nclass ScientificToken {\r\n public index: number;\r\n public exponent = \"\";\r\n\r\n constructor(index: number, exponent?: string) {\r\n this.index = index;\r\n if (exponent)\r\n this.exponent = exponent;\r\n }\r\n}\r\n\r\n/** A FractionToken holds an index and the fraction value of numerator / denominator.\r\n * @beta\r\n */\r\nclass FractionToken {\r\n public index: number;\r\n public fraction = 0.0;\r\n public exponent = \"\";\r\n\r\n constructor(index: number, fraction?: number) {\r\n this.index = index;\r\n if (fraction)\r\n this.fraction = fraction;\r\n }\r\n}\r\n\r\n/** A Parser class that is used to break a string that represents a quantity value into tokens.\r\n * @beta\r\n */\r\nexport class Parser {\r\n private static _log = false;\r\n\r\n public static isParsedQuantity(item: QuantityParseResult): item is ParsedQuantity {\r\n return item.ok;\r\n }\r\n\r\n public static isParseError(item: QuantityParseResult): item is ParseQuantityError {\r\n return !item.ok;\r\n }\r\n\r\n private static checkForScientificNotation(index: number, stringToParse: string, uomSeparatorToIgnore: number): ScientificToken {\r\n let exponentString = \"\";\r\n let i = index + 1;\r\n\r\n for (; i < stringToParse.length; i++) {\r\n const charCode = stringToParse.charCodeAt(i);\r\n if (Parser.isDigit(charCode) || ((charCode === QuantityConstants.CHAR_MINUS || charCode === QuantityConstants.CHAR_PLUS) && (i === (index + 1)))) {\r\n exponentString = exponentString.concat(stringToParse[i]);\r\n } else {\r\n i = uomSeparatorToIgnore === charCode ? i : i - 1;\r\n break;\r\n }\r\n }\r\n\r\n if (exponentString.length > 1 || ((exponentString.length === 1) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_MINUS) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_PLUS)))\r\n return new ScientificToken(i, exponentString);\r\n\r\n return new ScientificToken(index);\r\n }\r\n\r\n private static checkForFractions(index: number, stringToParse: string, uomSeparatorToIgnore: number, numeratorStr?: string): FractionToken {\r\n let numeratorToken = \"\";\r\n let denominatorToken = \"\";\r\n let processingNumerator = true;\r\n let i = index;\r\n if (numeratorStr && numeratorStr.length > 0) {\r\n numeratorToken = numeratorStr;\r\n processingNumerator = false;\r\n }\r\n\r\n for (; i < stringToParse.length; i++) {\r\n const charCode = stringToParse.charCodeAt(i);\r\n if (Parser.isDigit(charCode)) {\r\n if (processingNumerator) {\r\n numeratorToken = numeratorToken.concat(stringToParse[i]);\r\n } else {\r\n denominatorToken = denominatorToken.concat(stringToParse[i]);\r\n }\r\n } else {\r\n if (processingNumerator && (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH)) {\r\n processingNumerator = false;\r\n } else {\r\n if (uomSeparatorToIgnore !== charCode)\r\n i = i - 1; // skip over uom separator after fraction\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (numeratorToken.length > 0 && denominatorToken.length > 0) {\r\n const numerator = parseInt(numeratorToken, 10);\r\n const denominator = parseInt(denominatorToken, 10);\r\n if (denominator > 0)\r\n return new FractionToken(i, numerator / denominator);\r\n return new FractionToken(i);\r\n }\r\n\r\n return new FractionToken(index + 1);\r\n }\r\n\r\n private static isDigit(charCode: number): boolean {\r\n return (charCode >= QuantityConstants.CHAR_DIGIT_ZERO) && (charCode <= QuantityConstants.CHAR_DIGIT_NINE);\r\n }\r\n\r\n private static isDigitOrDecimalSeparator(charCode: number, format: Format): boolean {\r\n return (charCode === format.decimalSeparator.charCodeAt(0)) || Parser.isDigit(charCode);\r\n }\r\n\r\n /** Parse the quantity string and return and array of ParseTokens that represent the component invariant values and unit labels.\r\n * @param quantitySpecification The quantity string to ba parsed.\r\n */\r\n public static parseQuantitySpecification(quantitySpecification: string, format: Format): ParseToken[] {\r\n const tokens: ParseToken[] = [];\r\n const str = quantitySpecification.trim();\r\n let processingNumber = false;\r\n let wipToken = \"\";\r\n let signToken = \"\";\r\n let uomSeparatorToIgnore = 0;\r\n let fractionDashCode = 0;\r\n\r\n const skipCodes: number[] = [format.thousandSeparator.charCodeAt(0)];\r\n\r\n if (format.type === FormatType.Station && format.stationSeparator && format.stationSeparator.length === 1)\r\n skipCodes.push(format.stationSeparator.charCodeAt(0));\r\n\r\n if (format.type === FormatType.Fractional && format.hasFormatTraitSet(FormatTraits.FractionDash)) {\r\n fractionDashCode = QuantityConstants.CHAR_MINUS;\r\n }\r\n\r\n if (format.uomSeparator && format.uomSeparator !== \" \" && format.uomSeparator.length === 1) {\r\n uomSeparatorToIgnore = format.uomSeparator.charCodeAt(0);\r\n skipCodes.push(uomSeparatorToIgnore);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\r\n for (let i = 0; i < str.length; i++) {\r\n const charCode = str.charCodeAt(i);\r\n if (Parser.isDigitOrDecimalSeparator(charCode, format)) {\r\n if (!processingNumber) {\r\n if (wipToken.length > 0) {\r\n tokens.push(new ParseToken(wipToken));\r\n wipToken = \"\";\r\n }\r\n processingNumber = true;\r\n }\r\n // Decimal separators must be replaced with '.' before converting to a number - parseFloat() only supports '.' as the decimal separator.\r\n const charToAdd = charCode === format.decimalSeparator.charCodeAt(0) ? \".\" : str[i];\r\n wipToken = wipToken.concat(charToAdd);\r\n } else {\r\n if (processingNumber) {\r\n if (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_FRACTION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH) {\r\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore, wipToken);\r\n let fraction = fractSymbol.fraction;\r\n i = fractSymbol.index;\r\n if (fractSymbol.fraction !== 0.0) {\r\n wipToken = \"\";\r\n if (signToken.length > 0) {\r\n if (signToken === \"-\")\r\n fraction = 0 - fraction;\r\n\r\n signToken = \"\";\r\n }\r\n\r\n tokens.push(new ParseToken(fraction));\r\n processingNumber = false;\r\n continue;\r\n }\r\n } else {\r\n // a space may signify end of number or start of decimal\r\n if (charCode === QuantityConstants.CHAR_SPACE || charCode === fractionDashCode) {\r\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore);\r\n let fraction = fractSymbol.fraction;\r\n if (fractSymbol.fraction !== 0.0) {\r\n i = fractSymbol.index;\r\n if (signToken.length > 0) {\r\n wipToken = signToken + wipToken;\r\n if (signToken === \"-\")\r\n fraction = 0 - fraction;\r\n\r\n signToken = \"\";\r\n }\r\n\r\n const valueWithFraction = parseFloat(wipToken) + fraction;\r\n tokens.push(new ParseToken(valueWithFraction));\r\n processingNumber = false;\r\n wipToken = \"\";\r\n }\r\n continue;\r\n } else {\r\n // an \"E\" or \"e\" may signify scientific notation\r\n if (charCode === QuantityConstants.CHAR_UPPER_E || charCode === QuantityConstants.CHAR_LOWER_E) {\r\n const exponentSymbol = Parser.checkForScientificNotation(i, str, uomSeparatorToIgnore);\r\n i = exponentSymbol.index;\r\n\r\n if (exponentSymbol.exponent && exponentSymbol.exponent.length > 0) {\r\n if (signToken.length > 0) {\r\n wipToken = signToken + wipToken;\r\n signToken = \"\";\r\n }\r\n\r\n wipToken = `${wipToken}e${exponentSymbol.exponent}`;\r\n const scientificValue = Number(wipToken);\r\n tokens.push(new ParseToken(scientificValue));\r\n processingNumber = false;\r\n wipToken = \"\";\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ignore any codes in skipCodes\r\n if (skipCodes.findIndex((ref) => ref === charCode) !== -1)\r\n continue;\r\n\r\n if (signToken.length > 0) {\r\n wipToken = signToken + wipToken;\r\n signToken = \"\";\r\n }\r\n\r\n tokens.push(new ParseToken(parseFloat(wipToken)));\r\n\r\n wipToken = (i < str.length) ? str[i] : \"\";\r\n processingNumber = false;\r\n } else {\r\n // not processing a number\r\n if ((charCode === QuantityConstants.CHAR_PLUS || charCode === QuantityConstants.CHAR_MINUS)) {\r\n if (0 === tokens.length) // sign token only needed for left most value\r\n signToken = str[i];\r\n continue;\r\n }\r\n\r\n wipToken = wipToken.concat(str[i]);\r\n }\r\n }\r\n }\r\n\r\n // handle case where end of input string is reached.\r\n if (wipToken.length > 0) {\r\n if (processingNumber) {\r\n if (signToken.length > 0) {\r\n wipToken = signToken + wipToken;\r\n }\r\n tokens.push(new ParseToken(parseFloat(wipToken)));\r\n } else {\r\n tokens.push(new ParseToken(wipToken));\r\n }\r\n }\r\n\r\n return tokens;\r\n }\r\n\r\n private static async lookupUnitByLabel(unitLabel: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider) {\r\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\r\n\r\n const labelToFind = unitLabel.toLowerCase();\r\n // First look in format for a label and matches\r\n if (format.units && format.units.length > 0) {\r\n const formatUnit = format.units.find(([unit, label]) => {\r\n if (label && label.toLowerCase() === labelToFind)\r\n return true;\r\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\r\n // check any alternate labels that may be defined for the Unit\r\n if (alternateLabels && alternateLabels.find((lbl) => lbl.toLowerCase() === labelToFind))\r\n return true;\r\n\r\n return false;\r\n });\r\n if (formatUnit)\r\n return formatUnit[0];\r\n }\r\n\r\n // now try to find a unit from the same family and system\r\n let foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined, defaultUnit ? defaultUnit.system : undefined);\r\n\r\n // if nothing found yet just limit to family\r\n if (!foundUnit.isValid && defaultUnit)\r\n foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined);\r\n return foundUnit;\r\n }\r\n\r\n private static async createQuantityFromParseTokens(tokens: ParseToken[], format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\r\n let defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\r\n\r\n // common case where single value is supplied\r\n if (tokens.length === 1) {\r\n if (tokens[0].isNumber) {\r\n return new Quantity(defaultUnit, tokens[0].value as number);\r\n } else {\r\n const unit = await this.lookupUnitByLabel(tokens[0].value as string, format, unitsProvider, altUnitLabelsProvider);\r\n return new Quantity(unit);\r\n }\r\n }\r\n\r\n // common case where single value and single label are supplied\r\n if (tokens.length === 2) {\r\n // unit specification comes before value (like currency)\r\n if (tokens[1].isNumber && tokens[0].isString) {\r\n tokens = [tokens[1], tokens[0]];\r\n }\r\n if (tokens[0].isNumber && tokens[1].isString) {\r\n const unit = await this.lookupUnitByLabel(tokens[1].value as string, format, unitsProvider, altUnitLabelsProvider);\r\n if (undefined === defaultUnit)\r\n defaultUnit = unit;\r\n if (defaultUnit && defaultUnit.name === unit.name) {\r\n return new Quantity(defaultUnit, tokens[0].value as number);\r\n } else if (defaultUnit) {\r\n const conversion = await unitsProvider.getConversion(unit, defaultUnit);\r\n const mag = ((tokens[0].value as number * conversion.factor)) + conversion.offset;\r\n return new Quantity(defaultUnit, mag);\r\n }\r\n }\r\n }\r\n\r\n // common case where there are multiple value/label pairs\r\n if (tokens.length % 2 === 0) {\r\n let mag = 0.0;\r\n for (let i = 0; i < tokens.length; i = i + 2) {\r\n if (tokens[i].isNumber && tokens[i + 1].isString) {\r\n const value = tokens[i].value as number;\r\n const unit = await this.lookupUnitByLabel(tokens[i + 1].value as string, format, unitsProvider, altUnitLabelsProvider);\r\n if (undefined === defaultUnit)\r\n defaultUnit = unit;\r\n if (0 === i) {\r\n if (defaultUnit.name === unit.name)\r\n mag = value;\r\n else {\r\n const conversion = await unitsProvider.getConversion(unit, defaultUnit);\r\n mag = ((value * conversion.factor)) + conversion.offset;\r\n }\r\n } else {\r\n if (defaultUnit) {\r\n const conversion = await unitsProvider.getConversion(unit, defaultUnit);\r\n if (mag < 0.0)\r\n mag = mag - ((value * conversion.factor)) + conversion.offset;\r\n else\r\n mag = mag + ((value * conversion.factor)) + conversion.offset;\r\n }\r\n }\r\n }\r\n }\r\n return new Quantity(defaultUnit, mag);\r\n }\r\n\r\n return new Quantity(defaultUnit);\r\n }\r\n\r\n /** Async method to generate a Quantity given a string that represents a quantity value and likely a unit label.\r\n * @param inString A string that contains text represent a quantity.\r\n * @param format Defines the likely format of inString.\r\n * @param unitsProvider required to look up units that may be specified in inString\r\n */\r\n public static async parseIntoQuantity(inString: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\r\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\r\n if (tokens.length === 0)\r\n return new Quantity();\r\n\r\n return Parser.createQuantityFromParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);\r\n }\r\n\r\n /** method to get the Unit Conversion given a unit label */\r\n private static tryFindUnitConversion(unitLabel: string, unitsConversions: UnitConversionSpec[], preferredUnit?: UnitProps): UnitConversionProps | undefined {\r\n if (unitsConversions.length > 0) {\r\n const label = unitLabel.toLocaleLowerCase();\r\n\r\n /* A preferred unit is used to target a unit if a unit label is used in more that one unit definition from the same unit family.\r\n * An example is if \"ft\" is used as the unitLabel and the preferredUnit is \"SURVEY_FT\" since that unit has an alternate label of \"ft\" the\r\n * conversion to \"SURVEY_FT\" is returned. If no preferredUnit is specified then the unit \"FT\" would likely to have been found first.\r\n * If \"in\" is the unit label and \"SURVEY_FT\" is the preferredUnit then conversion to \"SURVEY_IN\" would be returned.\r\n */\r\n if (preferredUnit) {\r\n // if there is a preferred unit defined see if unit label matched it or one of its alternates\r\n const preferredConversion = unitsConversions.find((conversion) => conversion.name === preferredUnit.name);\r\n if (preferredConversion && preferredConversion.parseLabels) {\r\n if (-1 !== preferredConversion.parseLabels.findIndex((lbl) => lbl === label))\r\n return preferredConversion.conversion;\r\n }\r\n // see if we can find a matching unitLabel in any unit within the same system as the preferred unit\r\n const preferredSystemConversions = unitsConversions.filter((conversion) => conversion.system === preferredUnit.system);\r\n for (const conversion of preferredSystemConversions) {\r\n if (conversion.parseLabels) {\r\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\r\n return conversion.conversion;\r\n }\r\n }\r\n }\r\n\r\n // if no unit found based on preferredUnit see if an unit label matches\r\n for (const conversion of unitsConversions) {\r\n if (conversion.parseLabels) {\r\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\r\n return conversion.conversion;\r\n } else {\r\n // eslint-disable-next-line no-console\r\n console.log(\"ERROR: Parser expects to find parseLabels array populate with all possible unit labels for the unit.\");\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private static getQuantityValueFromParseTokens(tokens: ParseToken[], format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\r\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\r\n // common case where single value is supplied\r\n if (tokens.length === 1) {\r\n if (tokens[0].isNumber) {\r\n if (defaultUnit) {\r\n const conversion = Parser.tryFindUnitConversion(defaultUnit.label, unitsConversions, defaultUnit);\r\n if (conversion) {\r\n const value = (tokens[0].value as number) * conversion.factor + conversion.offset;\r\n return { ok: true, value };\r\n }\r\n } else {\r\n // if no conversion or no defaultUnit, just return parsed number\r\n return { ok: true, value: tokens[0].value as number };\r\n }\r\n } else {\r\n // only the unit label was specified so assume magnitude of 1\r\n const conversion = Parser.tryFindUnitConversion(tokens[0].value as string, unitsConversions, defaultUnit);\r\n if (undefined !== conversion)\r\n return { ok: true, value: conversion.factor + conversion.offset };\r\n else\r\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\r\n }\r\n }\r\n\r\n // common case where single value and single label are supplied\r\n if (tokens.length === 2) {\r\n // unit specification comes before value (like currency)\r\n if (tokens[1].isNumber && tokens[0].isString) {\r\n tokens = [tokens[1], tokens[0]];\r\n }\r\n if (tokens[0].isNumber && tokens[1].isString) {\r\n let conversion = Parser.tryFindUnitConversion(tokens[1].value as string, unitsConversions, defaultUnit);\r\n // if no conversion, ignore value in second token. If we have defaultUnit, use it.\r\n if (!conversion && defaultUnit) {\r\n conversion = Parser.tryFindUnitConversion(defaultUnit.label, unitsConversions, defaultUnit);\r\n }\r\n if (conversion) {\r\n const value = (tokens[0].value as number) * conversion.factor + conversion.offset;\r\n return { ok: true, value };\r\n }\r\n // if no conversion, just return parsed number and ignore value in second token\r\n return { ok: true, value: tokens[0].value as number };\r\n }\r\n }\r\n\r\n // common case where there are multiple value/label pairs\r\n if (tokens.length % 2 === 0) {\r\n let mag = 0.0;\r\n for (let i = 0; i < tokens.length; i = i + 2) {\r\n if (tokens[i].isNumber && tokens[i + 1].isString) {\r\n const value = tokens[i].value as number;\r\n const conversion = Parser.tryFindUnitConversion(tokens[i + 1].value as string, unitsConversions, defaultUnit);\r\n if (conversion) {\r\n if (mag < 0.0)\r\n mag = mag - ((value * conversion.factor)) + conversion.offset;\r\n else\r\n mag = mag + ((value * conversion.factor)) + conversion.offset;\r\n }\r\n }\r\n }\r\n return { ok: true, value: mag };\r\n }\r\n\r\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\r\n }\r\n\r\n /** Method to generate a Quantity given a string that represents a quantity value.\r\n * @param inString A string that contains text represent a quantity.\r\n * @param parserSpec unit label if not explicitly defined by user. Must have matching entry in supplied array of unitsConversions.\r\n * @param defaultValue default value to return if parsing is un successful\r\n */\r\n public static parseQuantityString(inString: string, parserSpec: ParserSpec): QuantityParseResult {\r\n return Parser.parseToQuantityValue(inString, parserSpec.format, parserSpec.unitConversions);\r\n }\r\n\r\n /** Method to generate a Quantity given a string that represents a quantity value and likely a unit label.\r\n * @param inString A string that contains text represent a quantity.\r\n * @param format Defines the likely format of inString. Primary unit serves as a default unit if no unit label found in string.\r\n * @param unitsConversions dictionary of conversions used to convert from unit used in inString to output quantity\r\n */\r\n public static parseToQuantityValue(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\r\n // ensure any labels defined in composite unit definition are specified in unitConversions\r\n if (format.units) {\r\n format.units.forEach(([unit, label]) => {\r\n if (label) {\r\n if (unit.label !== label) { // if default unit label does not match composite label ensure the label is in the list of parse labels for the conversion\r\n const unitConversion = unitsConversions.find((conversion) => conversion.name === unit.name);\r\n if (unitConversion && unitConversion.parseLabels && !unitConversion.parseLabels.find((entry) => entry === label))\r\n unitConversion.parseLabels.push(label);\r\n }\r\n }\r\n });\r\n }\r\n\r\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\r\n if (tokens.length === 0)\r\n return { ok: false, error: ParseError.UnableToGenerateParseTokens };\r\n\r\n if (Parser._log) {\r\n // eslint-disable-next-line no-console\r\n console.log(`Parse tokens`);\r\n let i = 0;\r\n for (const token of tokens) {\r\n // eslint-disable-next-line no-console\r\n console.log(` [${i++}] isNumber=${token.isNumber} isString=${token.isString} token=${token.value}`);\r\n }\r\n }\r\n\r\n return Parser.getQuantityValueFromParseTokens(tokens, format, unitsConversions);\r\n }\r\n\r\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\r\n public static async createUnitConversionSpecsForUnit(unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\r\n const unitConversionSpecs: UnitConversionSpec[] = [];\r\n\r\n const familyUnits = await unitsProvider.getUnitsByFamily(outUnit.phenomenon);\r\n for (const unit of familyUnits) {\r\n const conversion = await unitsProvider.getConversion(unit, outUnit);\r\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\r\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\r\n // add any alternate labels that may be defined for the Unit\r\n if (alternateLabels) {\r\n alternateLabels.forEach((label: string) => {\r\n const potentialLabel = label.toLocaleLowerCase();\r\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\r\n parseLabels.push(label.toLocaleLowerCase());\r\n });\r\n }\r\n\r\n unitConversionSpecs.push({\r\n name: unit.name,\r\n label: unit.label,\r\n conversion,\r\n parseLabels,\r\n system: unit.system,\r\n });\r\n }\r\n return unitConversionSpecs;\r\n }\r\n\r\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\r\n public static async createUnitConversionSpecs(unitsProvider: UnitsProvider, outUnitName: string, potentialParseUnits: PotentialParseUnit[], altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\r\n const unitConversionSpecs: UnitConversionSpec[] = [];\r\n\r\n const outUnit = await unitsProvider.findUnitByName(outUnitName);\r\n if (!outUnit || !outUnit.name || 0 === outUnit.name.length) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate out unit ${outUnitName}.`);\r\n return unitConversionSpecs;\r\n }\r\n\r\n for (const potentialParseUnit of potentialParseUnits) {\r\n const unit = await unitsProvider.findUnitByName(potentialParseUnit.unitName);\r\n if (!unit || !unit.name || 0 === unit.name.length) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate potential unit ${potentialParseUnit.unitName}.`);\r\n continue;\r\n }\r\n\r\n const conversion = await unitsProvider.getConversion(unit, outUnit);\r\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\r\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\r\n // add any alternate labels that may be defined for the Unit\r\n if (alternateLabels) {\r\n alternateLabels.forEach((label: string) => {\r\n const potentialLabel = label.toLocaleLowerCase();\r\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\r\n parseLabels.push(label.toLocaleLowerCase());\r\n });\r\n }\r\n\r\n // add any alternate labels that where provided by caller\r\n if (potentialParseUnit.altLabels) {\r\n potentialParseUnit.altLabels.forEach((label: string) => {\r\n const potentialLabel = label.toLocaleLowerCase();\r\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\r\n parseLabels.push(label.toLocaleLowerCase());\r\n });\r\n }\r\n unitConversionSpecs.push({\r\n name: unit.name,\r\n label: unit.label,\r\n conversion,\r\n parseLabels,\r\n system: unit.system,\r\n });\r\n }\r\n return unitConversionSpecs;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParserSpec.js","sourceRoot":"","sources":["../../src/ParserSpec.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH,qCAAuD;AAEvD;;GAEG;AACH,MAAa,UAAU;IAKrB;;;;OAIG;IACH,YAAY,OAAkB,EAAE,MAAc,EAAE,WAAiC;QARzE,iBAAY,GAAyB,EAAE,CAAC,CAAE,mBAAmB;QASnE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED,wGAAwG;IACxG,IAAW,eAAe,KAA2B,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,IAAW,MAAM,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,IAAW,OAAO,KAAgB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzD;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,aAA4B,EAAE,OAAkB,EAAE,qBAAmD;QAC9I,MAAM,WAAW,GAAG,MAAM,eAAM,CAAC,gCAAgC,CAAC,aAAa,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC;QACjH,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,0HAA0H;IACnH,oBAAoB,CAAC,QAAgB;QAC1C,OAAO,eAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;CACF;AArCD,gCAqCC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { Format } from \"./Formatter/Format\";\nimport { AlternateUnitLabelsProvider, UnitConversionSpec, UnitProps, UnitsProvider } from \"./Interfaces\";\nimport { Parser, QuantityParseResult } from \"./Parser\";\n\n/** A ParserSpec holds information needed to parse a string into a quantity synchronously.\n * @beta\n */\nexport class ParserSpec {\n private _outUnit: UnitProps;\n private _conversions: UnitConversionSpec[] = []; // max four entries\n private _format: Format;\n\n /** Constructor\n * @param outUnit The name of a format specification.\n * @param format Defines the output format for the quantity value.\n * @param conversions An array of conversion factors necessary to convert from an input unit to the units specified in the format..\n */\n constructor(outUnit: UnitProps, format: Format, conversions: UnitConversionSpec[]) {\n this._outUnit = outUnit;\n this._format = format;\n this._conversions = conversions;\n }\n\n /** Returns an array of UnitConversionSpecs for each unit label that may be used in the input string. */\n public get unitConversions(): UnitConversionSpec[] { return this._conversions; }\n public get format(): Format { return this._format; }\n public get outUnit(): UnitProps { return this._outUnit; }\n\n /** Static async method to create a ParserSpec given the format and unit of the quantity that will be passed to the Parser. The input unit will\n * be used to generate conversion information for each unit specified in the Format. This method is async due to the fact that the units provider must make\n * async calls to lookup unit definitions.\n * @param format The format specification.\n * @param unitsProvider The units provider is used to look up unit definitions and provide conversion information for converting between units.\n * @param outUnit The unit the value to be formatted. This unit is often referred to as persistence unit.\n */\n public static async create(format: Format, unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<ParserSpec> {\n const conversions = await Parser.createUnitConversionSpecsForUnit(unitsProvider, outUnit, altUnitLabelsProvider);\n return new ParserSpec(outUnit, format, conversions);\n }\n\n /** Do the parsing. Done this way to allow Custom Parser Specs to parse custom formatted strings into their quantities. */\n public parseToQuantityValue(inString: string): QuantityParseResult {\n return Parser.parseQuantityString(inString, this);\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"ParserSpec.js","sourceRoot":"","sources":["../../src/ParserSpec.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH,qCAAuD;AAEvD;;GAEG;AACH,MAAa,UAAU;IAKrB;;;;OAIG;IACH,YAAY,OAAkB,EAAE,MAAc,EAAE,WAAiC;QARzE,iBAAY,GAAyB,EAAE,CAAC,CAAE,mBAAmB;QASnE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED,wGAAwG;IACxG,IAAW,eAAe,KAA2B,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,IAAW,MAAM,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,IAAW,OAAO,KAAgB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzD;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,aAA4B,EAAE,OAAkB,EAAE,qBAAmD;QAC9I,MAAM,WAAW,GAAG,MAAM,eAAM,CAAC,gCAAgC,CAAC,aAAa,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC;QACjH,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,0HAA0H;IACnH,oBAAoB,CAAC,QAAgB;QAC1C,OAAO,eAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;CACF;AArCD,gCAqCC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { Format } from \"./Formatter/Format\";\r\nimport { AlternateUnitLabelsProvider, UnitConversionSpec, UnitProps, UnitsProvider } from \"./Interfaces\";\r\nimport { Parser, QuantityParseResult } from \"./Parser\";\r\n\r\n/** A ParserSpec holds information needed to parse a string into a quantity synchronously.\r\n * @beta\r\n */\r\nexport class ParserSpec {\r\n private _outUnit: UnitProps;\r\n private _conversions: UnitConversionSpec[] = []; // max four entries\r\n private _format: Format;\r\n\r\n /** Constructor\r\n * @param outUnit The name of a format specification.\r\n * @param format Defines the output format for the quantity value.\r\n * @param conversions An array of conversion factors necessary to convert from an input unit to the units specified in the format..\r\n */\r\n constructor(outUnit: UnitProps, format: Format, conversions: UnitConversionSpec[]) {\r\n this._outUnit = outUnit;\r\n this._format = format;\r\n this._conversions = conversions;\r\n }\r\n\r\n /** Returns an array of UnitConversionSpecs for each unit label that may be used in the input string. */\r\n public get unitConversions(): UnitConversionSpec[] { return this._conversions; }\r\n public get format(): Format { return this._format; }\r\n public get outUnit(): UnitProps { return this._outUnit; }\r\n\r\n /** Static async method to create a ParserSpec given the format and unit of the quantity that will be passed to the Parser. The input unit will\r\n * be used to generate conversion information for each unit specified in the Format. This method is async due to the fact that the units provider must make\r\n * async calls to lookup unit definitions.\r\n * @param format The format specification.\r\n * @param unitsProvider The units provider is used to look up unit definitions and provide conversion information for converting between units.\r\n * @param outUnit The unit the value to be formatted. This unit is often referred to as persistence unit.\r\n */\r\n public static async create(format: Format, unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<ParserSpec> {\r\n const conversions = await Parser.createUnitConversionSpecsForUnit(unitsProvider, outUnit, altUnitLabelsProvider);\r\n return new ParserSpec(outUnit, format, conversions);\r\n }\r\n\r\n /** Do the parsing. Done this way to allow Custom Parser Specs to parse custom formatted strings into their quantities. */\r\n public parseToQuantityValue(inString: string): QuantityParseResult {\r\n return Parser.parseQuantityString(inString, this);\r\n }\r\n}\r\n\r\n"]}
|
package/lib/cjs/Quantity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Quantity.js","sourceRoot":"","sources":["../../src/Quantity.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH;;;GAGG;AACH,MAAa,QAAQ;IAKnB,IAAW,IAAI,KAAgB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,IAAW,SAAS,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,IAAW,OAAO,KAAc,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEvD;;;OAGG;IACH,YAAmB,IAAgB,EAAE,SAAkB;QAZ7C,eAAU,GAAW,GAAG,CAAC;QAEzB,aAAQ,GAAY,KAAK,CAAC;QAWlC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/G,CAAC;QAED,IAAI,SAAS,KAAK,SAAS;YACzB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,MAAiB,EAAE,UAA+B;QACjE,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;QAC9E,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;CACF;AAlCD,4BAkCC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityProps, UnitConversionProps, UnitProps } from \"./Interfaces\";\n\n/** The Quantity class is convenient container to specify both the magnitude and unit of a quantity. This class is commonly\n * returned as the result of parsing a string that represents a quantity.\n * @beta\n */\nexport class Quantity implements QuantityProps {\n protected _magnitude: number = 0.0;\n protected _unit: UnitProps;\n protected _isValid: boolean = false;\n\n public get unit(): UnitProps { return this._unit; }\n public get magnitude(): number { return this._magnitude; }\n public get isValid(): boolean { return this._isValid; }\n\n /** Constructor. The Quantity will only be set as valid if a unit is specified.\n * @param unit Defines the quantity's unit.\n * @param magnitude Defines the magnitude of the quantity.\n */\n public constructor(unit?: UnitProps, magnitude?: number) {\n if (undefined !== unit) {\n this._unit = unit;\n this._isValid = true;\n } else {\n this._unit = { name: \"unknown\", label: \"unknown\", phenomenon: \"unknown\", isValid: false, system: \"unknown\" };\n }\n\n if (undefined !== magnitude)\n this._magnitude = magnitude;\n }\n\n /** Convert a Quantity to the specified unit given the UnitConversion.\n * @param toUnit The new unit for the quantity.\n * @param conversion Defines the information needed to convert the Quantity's magnitude from the current unit to another unit. This conversion info is usually\n * returned from the UnitsProvider.\n */\n public convertTo(toUnit: UnitProps, conversion: UnitConversionProps): Quantity | undefined {\n const newMagnitude = (this.magnitude * conversion.factor) + conversion.offset;\n return new Quantity(toUnit, newMagnitude);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Quantity.js","sourceRoot":"","sources":["../../src/Quantity.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH;;;GAGG;AACH,MAAa,QAAQ;IAKnB,IAAW,IAAI,KAAgB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,IAAW,SAAS,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,IAAW,OAAO,KAAc,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEvD;;;OAGG;IACH,YAAmB,IAAgB,EAAE,SAAkB;QAZ7C,eAAU,GAAW,GAAG,CAAC;QAEzB,aAAQ,GAAY,KAAK,CAAC;QAWlC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/G,CAAC;QAED,IAAI,SAAS,KAAK,SAAS;YACzB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,MAAiB,EAAE,UAA+B;QACjE,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;QAC9E,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;CACF;AAlCD,4BAkCC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { QuantityProps, UnitConversionProps, UnitProps } from \"./Interfaces\";\r\n\r\n/** The Quantity class is convenient container to specify both the magnitude and unit of a quantity. This class is commonly\r\n * returned as the result of parsing a string that represents a quantity.\r\n * @beta\r\n */\r\nexport class Quantity implements QuantityProps {\r\n protected _magnitude: number = 0.0;\r\n protected _unit: UnitProps;\r\n protected _isValid: boolean = false;\r\n\r\n public get unit(): UnitProps { return this._unit; }\r\n public get magnitude(): number { return this._magnitude; }\r\n public get isValid(): boolean { return this._isValid; }\r\n\r\n /** Constructor. The Quantity will only be set as valid if a unit is specified.\r\n * @param unit Defines the quantity's unit.\r\n * @param magnitude Defines the magnitude of the quantity.\r\n */\r\n public constructor(unit?: UnitProps, magnitude?: number) {\r\n if (undefined !== unit) {\r\n this._unit = unit;\r\n this._isValid = true;\r\n } else {\r\n this._unit = { name: \"unknown\", label: \"unknown\", phenomenon: \"unknown\", isValid: false, system: \"unknown\" };\r\n }\r\n\r\n if (undefined !== magnitude)\r\n this._magnitude = magnitude;\r\n }\r\n\r\n /** Convert a Quantity to the specified unit given the UnitConversion.\r\n * @param toUnit The new unit for the quantity.\r\n * @param conversion Defines the information needed to convert the Quantity's magnitude from the current unit to another unit. This conversion info is usually\r\n * returned from the UnitsProvider.\r\n */\r\n public convertTo(toUnit: UnitProps, conversion: UnitConversionProps): Quantity | undefined {\r\n const newMagnitude = (this.magnitude * conversion.factor) + conversion.offset;\r\n return new Quantity(toUnit, newMagnitude);\r\n }\r\n}\r\n"]}
|
package/lib/cjs/Unit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Unit.js","sourceRoot":"","sources":["../../src/Unit.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH;;GAEG;AACH,MAAa,SAAS;IAOpB,YAAY,IAAY,EAAE,KAAa,EAAE,UAAkB,EAAE,MAAe;QANrE,SAAI,GAAG,EAAE,CAAC;QACV,UAAK,GAAG,EAAE,CAAC;QACX,eAAU,GAAG,EAAE,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAChB,WAAM,GAAW,SAAS,CAAC;QAGhC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,MAAM;gBACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AAjBD,8BAiBC;AAED;;GAEG;AACH,MAAa,OAAO;IAApB;QACS,SAAI,GAAG,EAAE,CAAC;QACV,UAAK,GAAG,EAAE,CAAC;QACX,eAAU,GAAG,EAAE,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAChB,WAAM,GAAG,SAAS,CAAC;IAC5B,CAAC;CAAA;AAND,0BAMC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { UnitProps } from \"./Interfaces\";\n\n/** This class provides basic implementation of UnitProps interface.\n * @beta\n */\nexport class BasicUnit implements UnitProps {\n public name = \"\";\n public label = \"\";\n public phenomenon = \"\";\n public isValid = false;\n public system: string = \"unknown\";\n\n constructor(name: string, label: string, phenomenon: string, system?: string) {\n if (name && name.length > 0 && label && label.length > 0 && phenomenon && phenomenon.length > 0) {\n this.name = name;\n this.label = label;\n this.phenomenon = phenomenon;\n this.isValid = true;\n if (system)\n this.system = system;\n }\n }\n}\n\n/** This class is a convenience class that can be returned when a valid Unit cannot be determined.\n * @beta\n */\nexport class BadUnit implements UnitProps {\n public name = \"\";\n public label = \"\";\n public phenomenon = \"\";\n public isValid = false;\n public system = \"unknown\";\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Unit.js","sourceRoot":"","sources":["../../src/Unit.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH;;GAEG;AACH,MAAa,SAAS;IAOpB,YAAY,IAAY,EAAE,KAAa,EAAE,UAAkB,EAAE,MAAe;QANrE,SAAI,GAAG,EAAE,CAAC;QACV,UAAK,GAAG,EAAE,CAAC;QACX,eAAU,GAAG,EAAE,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAChB,WAAM,GAAW,SAAS,CAAC;QAGhC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,MAAM;gBACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AAjBD,8BAiBC;AAED;;GAEG;AACH,MAAa,OAAO;IAApB;QACS,SAAI,GAAG,EAAE,CAAC;QACV,UAAK,GAAG,EAAE,CAAC;QACX,eAAU,GAAG,EAAE,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAChB,WAAM,GAAG,SAAS,CAAC;IAC5B,CAAC;CAAA;AAND,0BAMC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { UnitProps } from \"./Interfaces\";\r\n\r\n/** This class provides basic implementation of UnitProps interface.\r\n * @beta\r\n */\r\nexport class BasicUnit implements UnitProps {\r\n public name = \"\";\r\n public label = \"\";\r\n public phenomenon = \"\";\r\n public isValid = false;\r\n public system: string = \"unknown\";\r\n\r\n constructor(name: string, label: string, phenomenon: string, system?: string) {\r\n if (name && name.length > 0 && label && label.length > 0 && phenomenon && phenomenon.length > 0) {\r\n this.name = name;\r\n this.label = label;\r\n this.phenomenon = phenomenon;\r\n this.isValid = true;\r\n if (system)\r\n this.system = system;\r\n }\r\n }\r\n}\r\n\r\n/** This class is a convenience class that can be returned when a valid Unit cannot be determined.\r\n * @beta\r\n */\r\nexport class BadUnit implements UnitProps {\r\n public name = \"\";\r\n public label = \"\";\r\n public phenomenon = \"\";\r\n public isValid = false;\r\n public system = \"unknown\";\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-quantity.js","sourceRoot":"","sources":["../../src/core-quantity.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,8CAA4B;AAC5B,8CAA4B;AAC5B,+CAA6B;AAC7B,2CAAyB;AACzB,+CAA6B;AAC7B,6CAA2B;AAC3B,yCAAuB;AAEvB,qDAAmC;AACnC,4DAA0C;AAC1C,0DAAwC;AACxC,wDAAsC;AACtC,yDAAuC;AAEvC;;GAEG;AAEH;;;GAGG","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nexport * from \"./Constants\";\nexport * from \"./Exception\";\nexport * from \"./Interfaces\";\nexport * from \"./Parser\";\nexport * from \"./ParserSpec\";\nexport * from \"./Quantity\";\nexport * from \"./Unit\";\n\nexport * from \"./Formatter/Format\";\nexport * from \"./Formatter/FormatterSpec\";\nexport * from \"./Formatter/FormatEnums\";\nexport * from \"./Formatter/Formatter\";\nexport * from \"./Formatter/Interfaces\";\n\n/** @docs-package-description\n * The core-quantity package always runs in a web browser. It contains classes, interfaces, and definitions for formatting and parsing quantity values.\n */\n\n/**\n * @docs-group-description Quantity\n * Classes, Interfaces, and definitions used to format and parse quantity values.\n */\n"]}
|
|
1
|
+
{"version":3,"file":"core-quantity.js","sourceRoot":"","sources":["../../src/core-quantity.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,8CAA4B;AAC5B,8CAA4B;AAC5B,+CAA6B;AAC7B,2CAAyB;AACzB,+CAA6B;AAC7B,6CAA2B;AAC3B,yCAAuB;AAEvB,qDAAmC;AACnC,4DAA0C;AAC1C,0DAAwC;AACxC,wDAAsC;AACtC,yDAAuC;AAEvC;;GAEG;AAEH;;;GAGG","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nexport * from \"./Constants\";\r\nexport * from \"./Exception\";\r\nexport * from \"./Interfaces\";\r\nexport * from \"./Parser\";\r\nexport * from \"./ParserSpec\";\r\nexport * from \"./Quantity\";\r\nexport * from \"./Unit\";\r\n\r\nexport * from \"./Formatter/Format\";\r\nexport * from \"./Formatter/FormatterSpec\";\r\nexport * from \"./Formatter/FormatEnums\";\r\nexport * from \"./Formatter/Formatter\";\r\nexport * from \"./Formatter/Interfaces\";\r\n\r\n/** @docs-package-description\r\n * The core-quantity package always runs in a web browser. It contains classes, interfaces, and definitions for formatting and parsing quantity values.\r\n */\r\n\r\n/**\r\n * @docs-group-description Quantity\r\n * Classes, Interfaces, and definitions used to format and parse quantity values.\r\n */\r\n"]}
|
package/lib/esm/Constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../src/Constants.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,yDAAyD;AAEzD;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAoB5B,2DAA2D;IACpD,MAAM,KAAK,8BAA8B;QAC9C,IAAI,iBAAiB,CAAC,yBAAyB,CAAC,MAAM,GAAG,CAAC;YACxD,OAAO,iBAAiB,CAAC,yBAAyB,CAAC;QAErD,iBAAiB,CAAC,yBAAyB,GAAG,GAAG,CAAC;QAClD,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAC/B,iBAAiB,CAAC,yBAAyB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAE3D,OAAO,iBAAiB,CAAC,yBAAyB,CAAC;IACrD,CAAC;IAED,4DAA4D;IACrD,MAAM,KAAK,+BAA+B;QAC/C,IAAI,iBAAiB,CAAC,0BAA0B,CAAC,MAAM,GAAG,CAAC;YACzD,OAAO,iBAAiB,CAAC,0BAA0B,CAAC;QAEtD,iBAAiB,CAAC,0BAA0B,GAAG,GAAG,CAAC;QACnD,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAC/B,iBAAiB,CAAC,0BAA0B,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAE5D,OAAO,iBAAiB,CAAC,0BAA0B,CAAC;IACtD,CAAC;;AA3CsB,4BAAU,GAAG,EAAE,CAAC;AAChB,4BAAU,GAAG,EAAE,CAAC;AAChB,6BAAW,GAAG,EAAE,CAAC;AACjB,2BAAS,GAAG,EAAE,CAAC;AACf,4BAAU,GAAG,EAAE,CAAC;AAChB,6BAAW,GAAG,EAAE,CAAC;AACjB,4BAAU,GAAG,EAAE,CAAC;AAChB,qCAAmB,GAAG,IAAI,CAAC;AAC3B,qCAAmB,GAAG,IAAI,CAAC;AAC3B,kCAAgB,GAAG,GAAG,CAAC;AACvB,+BAAa,GAAG,GAAG,CAAC;AACpB,oCAAkB,GAAG,GAAG,CAAC;AACzB,iCAAe,GAAG,EAAE,CAAC;AACrB,iCAAe,GAAG,EAAE,CAAC;AACrB,8BAAY,GAAG,EAAE,CAAC;AAClB,8BAAY,GAAG,GAAG,CAAC;AAC3B,2CAAyB,GAAG,EAAE,CAAC;AAC/B,4CAA0B,GAAG,EAAE,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/* eslint-disable @typescript-eslint/naming-convention */\n\n/** Constants used internally for both formatting and parsing.\n * @internal\n */\nexport class QuantityConstants {\n public static readonly CHAR_COMMA = 44;\n public static readonly CHAR_SPACE = 32;\n public static readonly CHAR_NUMBER = 35;\n public static readonly CHAR_PLUS = 43;\n public static readonly CHAR_MINUS = 45;\n public static readonly CHAR_PERIOD = 46;\n public static readonly CHAR_SLASH = 47;\n public static readonly CHAR_DIVISION_SLASH = 8725;\n public static readonly CHAR_FRACTION_SLASH = 8260;\n public static readonly CHAR_ONE_QUARTER = 188;\n public static readonly CHAR_ONE_HALF = 189;\n public static readonly CHAR_THREE_QUARTER = 190;\n public static readonly CHAR_DIGIT_ZERO = 48;\n public static readonly CHAR_DIGIT_NINE = 57;\n public static readonly CHAR_UPPER_E = 69;\n public static readonly CHAR_LOWER_E = 101;\n private static _LOCALE_DECIMAL_SEPARATOR = \"\";\n private static _LOCALE_THOUSAND_SEPARATOR = \"\";\n\n /** Return the decimal separator for the current locale. */\n public static get LocaleSpecificDecimalSeparator(): string {\n if (QuantityConstants._LOCALE_DECIMAL_SEPARATOR.length > 0)\n return QuantityConstants._LOCALE_DECIMAL_SEPARATOR;\n\n QuantityConstants._LOCALE_DECIMAL_SEPARATOR = \".\";\n const matches = (12345.6789).toLocaleString().match(/345(.*)67/);\n if (matches && matches.length > 1)\n QuantityConstants._LOCALE_DECIMAL_SEPARATOR = matches[1];\n\n return QuantityConstants._LOCALE_DECIMAL_SEPARATOR;\n }\n\n /** Return the thousand separator for the current locale. */\n public static get LocaleSpecificThousandSeparator(): string {\n if (QuantityConstants._LOCALE_THOUSAND_SEPARATOR.length > 0)\n return QuantityConstants._LOCALE_THOUSAND_SEPARATOR;\n\n QuantityConstants._LOCALE_THOUSAND_SEPARATOR = \",\";\n const matches = (12345.6789).toLocaleString().match(/12(.*)345/);\n if (matches && matches.length > 0)\n QuantityConstants._LOCALE_THOUSAND_SEPARATOR = matches[1];\n\n return QuantityConstants._LOCALE_THOUSAND_SEPARATOR;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../src/Constants.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,yDAAyD;AAEzD;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAoB5B,2DAA2D;IACpD,MAAM,KAAK,8BAA8B;QAC9C,IAAI,iBAAiB,CAAC,yBAAyB,CAAC,MAAM,GAAG,CAAC;YACxD,OAAO,iBAAiB,CAAC,yBAAyB,CAAC;QAErD,iBAAiB,CAAC,yBAAyB,GAAG,GAAG,CAAC;QAClD,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAC/B,iBAAiB,CAAC,yBAAyB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAE3D,OAAO,iBAAiB,CAAC,yBAAyB,CAAC;IACrD,CAAC;IAED,4DAA4D;IACrD,MAAM,KAAK,+BAA+B;QAC/C,IAAI,iBAAiB,CAAC,0BAA0B,CAAC,MAAM,GAAG,CAAC;YACzD,OAAO,iBAAiB,CAAC,0BAA0B,CAAC;QAEtD,iBAAiB,CAAC,0BAA0B,GAAG,GAAG,CAAC;QACnD,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAC/B,iBAAiB,CAAC,0BAA0B,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAE5D,OAAO,iBAAiB,CAAC,0BAA0B,CAAC;IACtD,CAAC;;AA3CsB,4BAAU,GAAG,EAAE,CAAC;AAChB,4BAAU,GAAG,EAAE,CAAC;AAChB,6BAAW,GAAG,EAAE,CAAC;AACjB,2BAAS,GAAG,EAAE,CAAC;AACf,4BAAU,GAAG,EAAE,CAAC;AAChB,6BAAW,GAAG,EAAE,CAAC;AACjB,4BAAU,GAAG,EAAE,CAAC;AAChB,qCAAmB,GAAG,IAAI,CAAC;AAC3B,qCAAmB,GAAG,IAAI,CAAC;AAC3B,kCAAgB,GAAG,GAAG,CAAC;AACvB,+BAAa,GAAG,GAAG,CAAC;AACpB,oCAAkB,GAAG,GAAG,CAAC;AACzB,iCAAe,GAAG,EAAE,CAAC;AACrB,iCAAe,GAAG,EAAE,CAAC;AACrB,8BAAY,GAAG,EAAE,CAAC;AAClB,8BAAY,GAAG,GAAG,CAAC;AAC3B,2CAAyB,GAAG,EAAE,CAAC;AAC/B,4CAA0B,GAAG,EAAE,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\n\r\n/** Constants used internally for both formatting and parsing.\r\n * @internal\r\n */\r\nexport class QuantityConstants {\r\n public static readonly CHAR_COMMA = 44;\r\n public static readonly CHAR_SPACE = 32;\r\n public static readonly CHAR_NUMBER = 35;\r\n public static readonly CHAR_PLUS = 43;\r\n public static readonly CHAR_MINUS = 45;\r\n public static readonly CHAR_PERIOD = 46;\r\n public static readonly CHAR_SLASH = 47;\r\n public static readonly CHAR_DIVISION_SLASH = 8725;\r\n public static readonly CHAR_FRACTION_SLASH = 8260;\r\n public static readonly CHAR_ONE_QUARTER = 188;\r\n public static readonly CHAR_ONE_HALF = 189;\r\n public static readonly CHAR_THREE_QUARTER = 190;\r\n public static readonly CHAR_DIGIT_ZERO = 48;\r\n public static readonly CHAR_DIGIT_NINE = 57;\r\n public static readonly CHAR_UPPER_E = 69;\r\n public static readonly CHAR_LOWER_E = 101;\r\n private static _LOCALE_DECIMAL_SEPARATOR = \"\";\r\n private static _LOCALE_THOUSAND_SEPARATOR = \"\";\r\n\r\n /** Return the decimal separator for the current locale. */\r\n public static get LocaleSpecificDecimalSeparator(): string {\r\n if (QuantityConstants._LOCALE_DECIMAL_SEPARATOR.length > 0)\r\n return QuantityConstants._LOCALE_DECIMAL_SEPARATOR;\r\n\r\n QuantityConstants._LOCALE_DECIMAL_SEPARATOR = \".\";\r\n const matches = (12345.6789).toLocaleString().match(/345(.*)67/);\r\n if (matches && matches.length > 1)\r\n QuantityConstants._LOCALE_DECIMAL_SEPARATOR = matches[1];\r\n\r\n return QuantityConstants._LOCALE_DECIMAL_SEPARATOR;\r\n }\r\n\r\n /** Return the thousand separator for the current locale. */\r\n public static get LocaleSpecificThousandSeparator(): string {\r\n if (QuantityConstants._LOCALE_THOUSAND_SEPARATOR.length > 0)\r\n return QuantityConstants._LOCALE_THOUSAND_SEPARATOR;\r\n\r\n QuantityConstants._LOCALE_THOUSAND_SEPARATOR = \",\";\r\n const matches = (12345.6789).toLocaleString().match(/12(.*)345/);\r\n if (matches && matches.length > 0)\r\n QuantityConstants._LOCALE_THOUSAND_SEPARATOR = matches[1];\r\n\r\n return QuantityConstants._LOCALE_THOUSAND_SEPARATOR;\r\n }\r\n}\r\n"]}
|
package/lib/esm/Exception.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Exception.js","sourceRoot":"","sources":["../../src/Exception.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAN,IAAY,cAUX;AAVD,WAAY,cAAc;IACxB,qFAA4B,CAAA;IAC5B,yDAAW,CAAA;IACX,qEAAqC,CAAA;IACrC,2FAAgD,CAAA;IAChD,qGAAqD,CAAA;IACrD,mGAAoD,CAAA;IACpD,2GAAwD,CAAA;IACxD,qEAAqC,CAAA;IACrC,uHAA8D,CAAA;AAChE,CAAC,EAVW,cAAc,KAAd,cAAc,QAUzB;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,YAA4C,WAAmB,EAAE,OAAgB;QAC/E,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QADc,gBAAW,GAAX,WAAW,CAAQ;QAE7D,MAAM,CAAC,WAAW,KAAK,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { assert, BentleyError } from \"@itwin/core-bentley\";\n\n/**\n * Status codes used during Quantity parsing and formatting processing.\n * @beta\n */\nexport enum QuantityStatus {\n QUANTITY_ERROR_BASE = 0x88DF,\n Success = 0,\n InvalidJson = QUANTITY_ERROR_BASE + 1,\n InvalidCompositeFormat = QUANTITY_ERROR_BASE + 2,\n UnableToGenerateParseTokens = QUANTITY_ERROR_BASE + 3,\n NoValueOrUnitFoundInString = QUANTITY_ERROR_BASE + 4,\n UnitLabelSuppliedButNotMatched = QUANTITY_ERROR_BASE + 5,\n UnknownUnit = QUANTITY_ERROR_BASE + 6,\n UnableToConvertParseTokensToQuantity = QUANTITY_ERROR_BASE + 7,\n}\n\n/** The error type thrown by this module. See [[QuantityStatus]] for `errorNumber` values.\n * @beta\n */\nexport class QuantityError extends BentleyError {\n public constructor(public override readonly errorNumber: number, message?: string) {\n super(errorNumber, message);\n assert(errorNumber !== QuantityStatus.Success, message);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Exception.js","sourceRoot":"","sources":["../../src/Exception.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAN,IAAY,cAUX;AAVD,WAAY,cAAc;IACxB,qFAA4B,CAAA;IAC5B,yDAAW,CAAA;IACX,qEAAqC,CAAA;IACrC,2FAAgD,CAAA;IAChD,qGAAqD,CAAA;IACrD,mGAAoD,CAAA;IACpD,2GAAwD,CAAA;IACxD,qEAAqC,CAAA;IACrC,uHAA8D,CAAA;AAChE,CAAC,EAVW,cAAc,KAAd,cAAc,QAUzB;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,YAA4C,WAAmB,EAAE,OAAgB;QAC/E,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QADc,gBAAW,GAAX,WAAW,CAAQ;QAE7D,MAAM,CAAC,WAAW,KAAK,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { assert, BentleyError } from \"@itwin/core-bentley\";\r\n\r\n/**\r\n * Status codes used during Quantity parsing and formatting processing.\r\n * @beta\r\n */\r\nexport enum QuantityStatus {\r\n QUANTITY_ERROR_BASE = 0x88DF,\r\n Success = 0,\r\n InvalidJson = QUANTITY_ERROR_BASE + 1,\r\n InvalidCompositeFormat = QUANTITY_ERROR_BASE + 2,\r\n UnableToGenerateParseTokens = QUANTITY_ERROR_BASE + 3,\r\n NoValueOrUnitFoundInString = QUANTITY_ERROR_BASE + 4,\r\n UnitLabelSuppliedButNotMatched = QUANTITY_ERROR_BASE + 5,\r\n UnknownUnit = QUANTITY_ERROR_BASE + 6,\r\n UnableToConvertParseTokensToQuantity = QUANTITY_ERROR_BASE + 7,\r\n}\r\n\r\n/** The error type thrown by this module. See [[QuantityStatus]] for `errorNumber` values.\r\n * @beta\r\n */\r\nexport class QuantityError extends BentleyError {\r\n public constructor(public override readonly errorNumber: number, message?: string) {\r\n super(errorNumber, message);\r\n assert(errorNumber !== QuantityStatus.Success, message);\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Format.js","sourceRoot":"","sources":["../../../src/Formatter/Format.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityConstants } from \"../Constants\";\nimport { QuantityError, QuantityStatus } from \"../Exception\";\nimport { UnitProps, UnitsProvider } from \"../Interfaces\";\nimport { DecimalPrecision, FormatTraits, formatTraitsToArray, FormatType, formatTypeToString, FractionalPrecision,\n getTraitString, parseFormatTrait, parseFormatType, parsePrecision, parseScientificType, parseShowSignOption, ScientificType,\n scientificTypeToString, ShowSignOption, showSignOptionToString } from \"./FormatEnums\";\nimport { CloneOptions, CustomFormatProps, FormatProps, isCustomFormatProps } from \"./Interfaces\";\n\n// cSpell:ignore ZERONORMALIZED, nosign, onlynegative, signalways, negativeparentheses\n// cSpell:ignore trailzeroes, keepsinglezero, zeroempty, keepdecimalpoint, applyrounding, fractiondash, showunitlabel, prependunitlabel, exponentonlynegative\n\n/** A base Format class with shared properties and functionality between quantity and ecschema-metadata Format classes\n * @beta\n */\nexport class BaseFormat {\n private _name = \"\";\n protected _roundFactor: number = 0.0;\n protected _type: FormatType = FormatType.Decimal; // required; options are decimal, fractional, scientific, station\n protected _precision: number = DecimalPrecision.Six; // required\n protected _showSignOption: ShowSignOption = ShowSignOption.OnlyNegative; // options: noSign, onlyNegative, signAlways, negativeParentheses\n protected _decimalSeparator: string = QuantityConstants.LocaleSpecificDecimalSeparator;\n protected _thousandSeparator: string = QuantityConstants.LocaleSpecificThousandSeparator;\n protected _uomSeparator = \" \"; // optional; default is \" \"; defined separator between magnitude and the unit\n protected _stationSeparator = \"+\"; // optional; default is \"+\"\n protected _formatTraits: FormatTraits = FormatTraits.Uninitialized;\n protected _spacer: string = \" \"; // optional; default is \" \"\n protected _includeZero: boolean = true; // optional; default is true\n protected _minWidth?: number; // optional; positive int\n protected _scientificType?: ScientificType; // required if type is scientific; options: normalized, zeroNormalized\n protected _stationOffsetSize?: number; // required when type is station; positive integer > 0\n\n constructor(name: string) {\n this._name = name;\n }\n\n public get name(): string { return this._name; }\n\n public get roundFactor(): number { return this._roundFactor; }\n public set roundFactor(roundFactor: number) { this._roundFactor = roundFactor; }\n\n public get type(): FormatType { return this._type; }\n public set type(formatType: FormatType) { this._type = formatType; }\n\n public get precision(): DecimalPrecision | FractionalPrecision { return this._precision; }\n public set precision(precision: DecimalPrecision | FractionalPrecision) { this._precision = precision; }\n\n public get minWidth(): number | undefined { return this._minWidth; }\n public set minWidth(minWidth: number | undefined) { this._minWidth = minWidth; }\n\n public get scientificType(): ScientificType | undefined { return this._scientificType; }\n public set scientificType(scientificType: ScientificType | undefined) { this._scientificType = scientificType; }\n\n public get showSignOption(): ShowSignOption { return this._showSignOption; }\n public set showSignOption(showSignOption: ShowSignOption) { this._showSignOption = showSignOption; }\n\n public get decimalSeparator(): string { return this._decimalSeparator; }\n public set decimalSeparator(decimalSeparator: string) { this._decimalSeparator = decimalSeparator; }\n\n public get thousandSeparator(): string { return this._thousandSeparator; }\n public set thousandSeparator(thousandSeparator: string) { this._thousandSeparator = thousandSeparator; }\n\n public get uomSeparator(): string { return this._uomSeparator; }\n public set uomSeparator(uomSeparator: string) { this._uomSeparator = uomSeparator; }\n\n public get stationSeparator(): string { return this._stationSeparator; }\n public set stationSeparator(stationSeparator: string) { this._stationSeparator = stationSeparator; }\n\n public get stationOffsetSize(): number | undefined { return this._stationOffsetSize; }\n public set stationOffsetSize(stationOffsetSize: number | undefined) {stationOffsetSize = this._stationOffsetSize = stationOffsetSize; }\n\n public get formatTraits(): FormatTraits { return this._formatTraits; }\n public set formatTraits(formatTraits: FormatTraits) { this._formatTraits = formatTraits; }\n\n public get spacer(): string | undefined { return this._spacer; }\n public set spacer(spacer: string | undefined) { this._spacer = spacer ?? this._spacer; }\n\n public get includeZero(): boolean | undefined { return this._includeZero; }\n public set includeZero(includeZero: boolean | undefined) { this._includeZero = includeZero ?? this._includeZero; }\n\n /** This method parses input string that is typically extracted for persisted JSON data and validates that the string is a valid FormatType. Throws exception if not valid. */\n public parseFormatTraits(formatTraitsFromJson: string | string[]) {\n const formatTraits = (Array.isArray(formatTraitsFromJson)) ? formatTraitsFromJson : formatTraitsFromJson.split(/,|;|\\|/);\n formatTraits.forEach((formatTraitsString: string) => { // for each element in the string array\n const formatTrait = parseFormatTrait(formatTraitsString, this.name);\n this._formatTraits = this.formatTraits | formatTrait;\n });\n }\n\n /** This method returns true if the formatTrait is set in this Format object. */\n public hasFormatTraitSet(formatTrait: FormatTraits): boolean {\n return (this._formatTraits & formatTrait) === formatTrait;\n }\n\n public loadFormatProperties(formatProps: FormatProps) {\n this._type = parseFormatType(formatProps.type, this.name);\n\n if (formatProps.precision !== undefined) {\n if (!Number.isInteger(formatProps.precision)) // mut be an integer\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'precision' attribute. It should be an integer.`);\n\n this._precision = parsePrecision(formatProps.precision, this._type, this.name);\n }\n if (this.type === FormatType.Scientific) {\n if (undefined === formatProps.scientificType) // if format type is scientific and scientific type is undefined, throw\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Scientific' type therefore the attribute 'scientificType' is required.`);\n\n this._scientificType = parseScientificType(formatProps.scientificType, this.name);\n }\n\n if (undefined !== formatProps.roundFactor) { // optional; default is 0.0\n if (typeof (formatProps.roundFactor) !== \"number\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'roundFactor' attribute. It should be of type 'number'.`);\n if (formatProps.roundFactor !== this.roundFactor) // if roundFactor isn't default value of 0.0, reassign roundFactor variable\n this._roundFactor = formatProps.roundFactor;\n }\n\n if (undefined !== formatProps.minWidth) { // optional\n if (!Number.isInteger(formatProps.minWidth) || formatProps.minWidth < 0) // must be a positive int\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'minWidth' attribute. It should be a positive integer.`);\n this._minWidth = formatProps.minWidth;\n }\n if (FormatType.Station === this.type) {\n if (undefined === formatProps.stationOffsetSize)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Station' type therefore the attribute 'stationOffsetSize' is required.`);\n if (!Number.isInteger(formatProps.stationOffsetSize) || formatProps.stationOffsetSize < 0) // must be a positive int > 0\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationOffsetSize' attribute. It should be a positive integer.`);\n this._stationOffsetSize = formatProps.stationOffsetSize;\n }\n\n if (undefined !== formatProps.showSignOption) { // optional; default is \"onlyNegative\"\n this._showSignOption = parseShowSignOption(formatProps.showSignOption, this.name);\n }\n\n if (undefined !== formatProps.formatTraits && formatProps.formatTraits.length !== 0) { // FormatTraits is optional\n if (!Array.isArray(formatProps.formatTraits) && typeof (formatProps.formatTraits) !== \"string\") // must be either an array of strings or a string\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'formatTraits' attribute. It should be of type 'string' or 'string[]'.`);\n this.parseFormatTraits(formatProps.formatTraits); // check that all of the options for formatTraits are valid. If now, throw\n }\n\n if (undefined !== formatProps.decimalSeparator) { // optional\n if (typeof (formatProps.decimalSeparator) !== \"string\") // not a string or not a one character string\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'decimalSeparator' attribute. It should be of type 'string'.`);\n if (formatProps.decimalSeparator.length > 1)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'decimalSeparator' attribute. It should be an empty or one character string.`);\n this._decimalSeparator = formatProps.decimalSeparator;\n }\n\n if (undefined !== formatProps.thousandSeparator) { // optional\n if (typeof (formatProps.thousandSeparator) !== \"string\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'thousandSeparator' attribute. It should be of type 'string'.`);\n if (formatProps.thousandSeparator.length > 1)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'thousandSeparator' attribute. It should be an empty or one character string.`);\n this._thousandSeparator = formatProps.thousandSeparator;\n }\n\n if (undefined !== formatProps.uomSeparator) { // optional; default is \" \"\n if (typeof (formatProps.uomSeparator) !== \"string\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'uomSeparator' attribute. It should be of type 'string'.`);\n if (formatProps.uomSeparator.length < 0 || formatProps.uomSeparator.length > 1)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'uomSeparator' attribute. It should be an empty or one character string.`);\n this._uomSeparator = formatProps.uomSeparator;\n }\n\n if (undefined !== formatProps.stationSeparator) { // optional; default is \"+\"\n if (typeof (formatProps.stationSeparator) !== \"string\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationSeparator' attribute. It should be of type 'string'.`);\n if (formatProps.stationSeparator.length > 1)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationSeparator' attribute. It should be an empty or one character string.`);\n this._stationSeparator = formatProps.stationSeparator;\n }\n }\n}\n\n/** A class used to define the specifications for formatting quantity values. This class is typically loaded by reading [[FormatProps]].\n * @beta\n */\nexport class Format extends BaseFormat {\n protected _units?: Array<[UnitProps, string | undefined]>;\n protected _customProps?: any; // used by custom formatters and parsers\n\n /** Constructor\n * @param name The name of a format specification. TODO: make optional or remove\n */\n constructor(name: string) {\n super(name);\n }\n\n public get units(): Array<[UnitProps, string | undefined]> | undefined { return this._units; }\n public get hasUnits(): boolean { return this._units !== undefined && this._units.length > 0; }\n public get customProps(): any { return this._customProps; }\n\n public static isFormatTraitSetInProps(formatProps: FormatProps, trait: FormatTraits) {\n if (!formatProps.formatTraits)\n return false;\n const formatTraits = Array.isArray(formatProps.formatTraits) ? formatProps.formatTraits : formatProps.formatTraits.split(/,|;|\\|/);\n const traitStr = getTraitString(trait);\n return formatTraits.find((traitEntry) => traitStr === traitEntry) ? true : false;\n }\n\n private async createUnit(unitsProvider: UnitsProvider, name: string, label?: string): Promise<void> {\n if (name === undefined || typeof (name) !== \"string\" || (label !== undefined && typeof (label) !== \"string\")) // throws if name is undefined or name isn't a string or if label is defined and isn't a string\n throw new QuantityError(QuantityStatus.InvalidJson, `This Composite has a unit with an invalid 'name' or 'label' attribute.`);\n for (const unit of this.units!) {\n const unitObj = unit[0].name;\n if (unitObj.toLowerCase() === name.toLowerCase()) // duplicate names are not allowed\n throw new QuantityError(QuantityStatus.InvalidJson, `The unit ${unitObj} has a duplicate name.`);\n }\n const newUnit: UnitProps = await unitsProvider.findUnitByName(name);\n if (!newUnit || !newUnit.isValid)\n throw new QuantityError(QuantityStatus.InvalidJson, `Invalid unit name '${name}'.`);\n this.units!.push([newUnit, label]);\n }\n\n /**\n * Clone Format\n */\n public clone(options?: CloneOptions): Format {\n const newFormat = new Format(this.name);\n newFormat._roundFactor = this._roundFactor;\n newFormat._type = this._type;\n newFormat._precision = this._precision;\n newFormat._minWidth = this._minWidth;\n newFormat._scientificType = this._scientificType;\n newFormat._showSignOption = this._showSignOption;\n newFormat._decimalSeparator = this._decimalSeparator;\n newFormat._thousandSeparator = this._thousandSeparator;\n newFormat._uomSeparator = this._uomSeparator;\n newFormat._stationSeparator = this._stationSeparator;\n newFormat._stationOffsetSize = this._stationOffsetSize;\n newFormat._formatTraits = this._formatTraits;\n newFormat._spacer = this._spacer;\n newFormat._includeZero = this._includeZero;\n newFormat._customProps = this._customProps;\n this._units && (newFormat._units = [...this._units]);\n\n if (newFormat._units) {\n if (options?.showOnlyPrimaryUnit) {\n if (newFormat._units.length > 1)\n newFormat._units.length = 1;\n }\n }\n\n if (undefined !== options?.traits)\n newFormat._formatTraits = options?.traits;\n\n if (undefined !== options?.type)\n newFormat._type = options.type;\n\n if (undefined !== options?.precision) {\n // ensure specified precision is valid\n const precision = parsePrecision(options?.precision, newFormat._type, newFormat.name);\n newFormat._precision = precision;\n }\n\n if (undefined !== options?.primaryUnit) {\n if (options.primaryUnit.unit) {\n const newUnits = new Array<[UnitProps, string | undefined]>();\n newUnits.push([options.primaryUnit.unit, options.primaryUnit.label]);\n newFormat._units = newUnits;\n } else if (options.primaryUnit.label && newFormat._units?.length) {\n // update label only\n newFormat._units[0][1] = options.primaryUnit.label;\n }\n }\n return newFormat;\n }\n\n /**\n * Populates this Format with the values from the provided.\n */\n public async fromJSON(unitsProvider: UnitsProvider, jsonObj: FormatProps): Promise<void> {\n this.loadFormatProperties(jsonObj);\n\n if (isCustomFormatProps(jsonObj))\n this._customProps = jsonObj.custom;\n\n if (undefined !== jsonObj.composite) { // optional\n this._units = new Array<[UnitProps, string | undefined]>();\n if (jsonObj.composite.includeZero !== undefined) {\n if (typeof (jsonObj.composite.includeZero) !== \"boolean\") // includeZero must be a boolean IF it is defined\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'includeZero' attribute. It should be of type 'boolean'.`);\n this._includeZero = jsonObj.composite.includeZero;\n }\n if (jsonObj.composite.spacer !== undefined) { // spacer must be a string IF it is defined\n if (typeof (jsonObj.composite.spacer) !== \"string\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'spacer' attribute. It must be of type 'string'.`);\n if (jsonObj.composite.spacer.length > 1)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'spacer' attribute. It should be an empty or one character string.`);\n this._spacer = jsonObj.composite.spacer;\n }\n if (jsonObj.composite.units !== undefined) { // if composite is defined, it must be an array with 1-4 units\n if (!Array.isArray(jsonObj.composite.units)) { // must be an array\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'units' attribute. It must be of type 'array'`);\n }\n if (jsonObj.composite.units.length > 0 && jsonObj.composite.units.length <= 4) { // Composite requires 1-4 units\n try {\n const createUnitPromises: Array<Promise<void>> = [];\n for (const unit of jsonObj.composite.units) {\n createUnitPromises.push(this.createUnit(unitsProvider, unit.name, unit.label));\n }\n\n await Promise.all(createUnitPromises);\n } catch (e) {\n throw e;\n }\n }\n }\n if (undefined === this.units || this.units.length === 0)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with no valid 'units'`);\n }\n }\n\n /** Create a Format from FormatProps */\n public static async createFromJSON(name: string, unitsProvider: UnitsProvider, formatProps: FormatProps) {\n const actualFormat = new Format(name);\n await actualFormat.fromJSON(unitsProvider, formatProps);\n return actualFormat;\n }\n\n /**\n * Returns a JSON object that contain the specification for this Format.\n */\n public toJSON(): FormatProps {\n let composite;\n if (this.units) {\n const units = this.units.map((value) => {\n if (undefined !== value[1])\n return { name: value[0].name, label: value[1] };\n else\n return { name: value[0].name };\n });\n\n composite = {\n spacer: this.spacer,\n includeZero: this.includeZero,\n units,\n };\n }\n\n if (this.customProps)\n return {\n type: formatTypeToString(this.type),\n precision: this.precision,\n roundFactor: this.roundFactor,\n minWidth: this.minWidth,\n showSignOption: showSignOptionToString(this.showSignOption),\n formatTraits: formatTraitsToArray(this.formatTraits),\n decimalSeparator: this.decimalSeparator,\n thousandSeparator: this.thousandSeparator,\n uomSeparator: this.uomSeparator,\n scientificType: this.scientificType ? scientificTypeToString(this.scientificType) : undefined,\n stationOffsetSize: this.stationOffsetSize,\n stationSeparator: this.stationSeparator,\n composite,\n custom: this.customProps,\n } as CustomFormatProps;\n\n return {\n type: formatTypeToString(this.type),\n precision: this.precision,\n roundFactor: this.roundFactor,\n minWidth: this.minWidth,\n showSignOption: showSignOptionToString(this.showSignOption),\n formatTraits: formatTraitsToArray(this.formatTraits),\n decimalSeparator: this.decimalSeparator,\n thousandSeparator: this.thousandSeparator,\n uomSeparator: this.uomSeparator,\n scientificType: this.scientificType ? scientificTypeToString(this.scientificType) : undefined,\n stationOffsetSize: this.stationOffsetSize,\n stationSeparator: this.stationSeparator,\n composite,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Format.js","sourceRoot":"","sources":["../../../src/Formatter/Format.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { QuantityConstants } from \"../Constants\";\r\nimport { QuantityError, QuantityStatus } from \"../Exception\";\r\nimport { UnitProps, UnitsProvider } from \"../Interfaces\";\r\nimport { DecimalPrecision, FormatTraits, formatTraitsToArray, FormatType, formatTypeToString, FractionalPrecision,\r\n getTraitString, parseFormatTrait, parseFormatType, parsePrecision, parseScientificType, parseShowSignOption, ScientificType,\r\n scientificTypeToString, ShowSignOption, showSignOptionToString } from \"./FormatEnums\";\r\nimport { CloneOptions, CustomFormatProps, FormatProps, isCustomFormatProps } from \"./Interfaces\";\r\n\r\n// cSpell:ignore ZERONORMALIZED, nosign, onlynegative, signalways, negativeparentheses\r\n// cSpell:ignore trailzeroes, keepsinglezero, zeroempty, keepdecimalpoint, applyrounding, fractiondash, showunitlabel, prependunitlabel, exponentonlynegative\r\n\r\n/** A base Format class with shared properties and functionality between quantity and ecschema-metadata Format classes\r\n * @beta\r\n */\r\nexport class BaseFormat {\r\n private _name = \"\";\r\n protected _roundFactor: number = 0.0;\r\n protected _type: FormatType = FormatType.Decimal; // required; options are decimal, fractional, scientific, station\r\n protected _precision: number = DecimalPrecision.Six; // required\r\n protected _showSignOption: ShowSignOption = ShowSignOption.OnlyNegative; // options: noSign, onlyNegative, signAlways, negativeParentheses\r\n protected _decimalSeparator: string = QuantityConstants.LocaleSpecificDecimalSeparator;\r\n protected _thousandSeparator: string = QuantityConstants.LocaleSpecificThousandSeparator;\r\n protected _uomSeparator = \" \"; // optional; default is \" \"; defined separator between magnitude and the unit\r\n protected _stationSeparator = \"+\"; // optional; default is \"+\"\r\n protected _formatTraits: FormatTraits = FormatTraits.Uninitialized;\r\n protected _spacer: string = \" \"; // optional; default is \" \"\r\n protected _includeZero: boolean = true; // optional; default is true\r\n protected _minWidth?: number; // optional; positive int\r\n protected _scientificType?: ScientificType; // required if type is scientific; options: normalized, zeroNormalized\r\n protected _stationOffsetSize?: number; // required when type is station; positive integer > 0\r\n\r\n constructor(name: string) {\r\n this._name = name;\r\n }\r\n\r\n public get name(): string { return this._name; }\r\n\r\n public get roundFactor(): number { return this._roundFactor; }\r\n public set roundFactor(roundFactor: number) { this._roundFactor = roundFactor; }\r\n\r\n public get type(): FormatType { return this._type; }\r\n public set type(formatType: FormatType) { this._type = formatType; }\r\n\r\n public get precision(): DecimalPrecision | FractionalPrecision { return this._precision; }\r\n public set precision(precision: DecimalPrecision | FractionalPrecision) { this._precision = precision; }\r\n\r\n public get minWidth(): number | undefined { return this._minWidth; }\r\n public set minWidth(minWidth: number | undefined) { this._minWidth = minWidth; }\r\n\r\n public get scientificType(): ScientificType | undefined { return this._scientificType; }\r\n public set scientificType(scientificType: ScientificType | undefined) { this._scientificType = scientificType; }\r\n\r\n public get showSignOption(): ShowSignOption { return this._showSignOption; }\r\n public set showSignOption(showSignOption: ShowSignOption) { this._showSignOption = showSignOption; }\r\n\r\n public get decimalSeparator(): string { return this._decimalSeparator; }\r\n public set decimalSeparator(decimalSeparator: string) { this._decimalSeparator = decimalSeparator; }\r\n\r\n public get thousandSeparator(): string { return this._thousandSeparator; }\r\n public set thousandSeparator(thousandSeparator: string) { this._thousandSeparator = thousandSeparator; }\r\n\r\n public get uomSeparator(): string { return this._uomSeparator; }\r\n public set uomSeparator(uomSeparator: string) { this._uomSeparator = uomSeparator; }\r\n\r\n public get stationSeparator(): string { return this._stationSeparator; }\r\n public set stationSeparator(stationSeparator: string) { this._stationSeparator = stationSeparator; }\r\n\r\n public get stationOffsetSize(): number | undefined { return this._stationOffsetSize; }\r\n public set stationOffsetSize(stationOffsetSize: number | undefined) {stationOffsetSize = this._stationOffsetSize = stationOffsetSize; }\r\n\r\n public get formatTraits(): FormatTraits { return this._formatTraits; }\r\n public set formatTraits(formatTraits: FormatTraits) { this._formatTraits = formatTraits; }\r\n\r\n public get spacer(): string | undefined { return this._spacer; }\r\n public set spacer(spacer: string | undefined) { this._spacer = spacer ?? this._spacer; }\r\n\r\n public get includeZero(): boolean | undefined { return this._includeZero; }\r\n public set includeZero(includeZero: boolean | undefined) { this._includeZero = includeZero ?? this._includeZero; }\r\n\r\n /** This method parses input string that is typically extracted for persisted JSON data and validates that the string is a valid FormatType. Throws exception if not valid. */\r\n public parseFormatTraits(formatTraitsFromJson: string | string[]) {\r\n const formatTraits = (Array.isArray(formatTraitsFromJson)) ? formatTraitsFromJson : formatTraitsFromJson.split(/,|;|\\|/);\r\n formatTraits.forEach((formatTraitsString: string) => { // for each element in the string array\r\n const formatTrait = parseFormatTrait(formatTraitsString, this.name);\r\n this._formatTraits = this.formatTraits | formatTrait;\r\n });\r\n }\r\n\r\n /** This method returns true if the formatTrait is set in this Format object. */\r\n public hasFormatTraitSet(formatTrait: FormatTraits): boolean {\r\n return (this._formatTraits & formatTrait) === formatTrait;\r\n }\r\n\r\n public loadFormatProperties(formatProps: FormatProps) {\r\n this._type = parseFormatType(formatProps.type, this.name);\r\n\r\n if (formatProps.precision !== undefined) {\r\n if (!Number.isInteger(formatProps.precision)) // mut be an integer\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'precision' attribute. It should be an integer.`);\r\n\r\n this._precision = parsePrecision(formatProps.precision, this._type, this.name);\r\n }\r\n if (this.type === FormatType.Scientific) {\r\n if (undefined === formatProps.scientificType) // if format type is scientific and scientific type is undefined, throw\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Scientific' type therefore the attribute 'scientificType' is required.`);\r\n\r\n this._scientificType = parseScientificType(formatProps.scientificType, this.name);\r\n }\r\n\r\n if (undefined !== formatProps.roundFactor) { // optional; default is 0.0\r\n if (typeof (formatProps.roundFactor) !== \"number\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'roundFactor' attribute. It should be of type 'number'.`);\r\n if (formatProps.roundFactor !== this.roundFactor) // if roundFactor isn't default value of 0.0, reassign roundFactor variable\r\n this._roundFactor = formatProps.roundFactor;\r\n }\r\n\r\n if (undefined !== formatProps.minWidth) { // optional\r\n if (!Number.isInteger(formatProps.minWidth) || formatProps.minWidth < 0) // must be a positive int\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'minWidth' attribute. It should be a positive integer.`);\r\n this._minWidth = formatProps.minWidth;\r\n }\r\n if (FormatType.Station === this.type) {\r\n if (undefined === formatProps.stationOffsetSize)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Station' type therefore the attribute 'stationOffsetSize' is required.`);\r\n if (!Number.isInteger(formatProps.stationOffsetSize) || formatProps.stationOffsetSize < 0) // must be a positive int > 0\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationOffsetSize' attribute. It should be a positive integer.`);\r\n this._stationOffsetSize = formatProps.stationOffsetSize;\r\n }\r\n\r\n if (undefined !== formatProps.showSignOption) { // optional; default is \"onlyNegative\"\r\n this._showSignOption = parseShowSignOption(formatProps.showSignOption, this.name);\r\n }\r\n\r\n if (undefined !== formatProps.formatTraits && formatProps.formatTraits.length !== 0) { // FormatTraits is optional\r\n if (!Array.isArray(formatProps.formatTraits) && typeof (formatProps.formatTraits) !== \"string\") // must be either an array of strings or a string\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'formatTraits' attribute. It should be of type 'string' or 'string[]'.`);\r\n this.parseFormatTraits(formatProps.formatTraits); // check that all of the options for formatTraits are valid. If now, throw\r\n }\r\n\r\n if (undefined !== formatProps.decimalSeparator) { // optional\r\n if (typeof (formatProps.decimalSeparator) !== \"string\") // not a string or not a one character string\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'decimalSeparator' attribute. It should be of type 'string'.`);\r\n if (formatProps.decimalSeparator.length > 1)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'decimalSeparator' attribute. It should be an empty or one character string.`);\r\n this._decimalSeparator = formatProps.decimalSeparator;\r\n }\r\n\r\n if (undefined !== formatProps.thousandSeparator) { // optional\r\n if (typeof (formatProps.thousandSeparator) !== \"string\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'thousandSeparator' attribute. It should be of type 'string'.`);\r\n if (formatProps.thousandSeparator.length > 1)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'thousandSeparator' attribute. It should be an empty or one character string.`);\r\n this._thousandSeparator = formatProps.thousandSeparator;\r\n }\r\n\r\n if (undefined !== formatProps.uomSeparator) { // optional; default is \" \"\r\n if (typeof (formatProps.uomSeparator) !== \"string\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'uomSeparator' attribute. It should be of type 'string'.`);\r\n if (formatProps.uomSeparator.length < 0 || formatProps.uomSeparator.length > 1)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'uomSeparator' attribute. It should be an empty or one character string.`);\r\n this._uomSeparator = formatProps.uomSeparator;\r\n }\r\n\r\n if (undefined !== formatProps.stationSeparator) { // optional; default is \"+\"\r\n if (typeof (formatProps.stationSeparator) !== \"string\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationSeparator' attribute. It should be of type 'string'.`);\r\n if (formatProps.stationSeparator.length > 1)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationSeparator' attribute. It should be an empty or one character string.`);\r\n this._stationSeparator = formatProps.stationSeparator;\r\n }\r\n }\r\n}\r\n\r\n/** A class used to define the specifications for formatting quantity values. This class is typically loaded by reading [[FormatProps]].\r\n * @beta\r\n */\r\nexport class Format extends BaseFormat {\r\n protected _units?: Array<[UnitProps, string | undefined]>;\r\n protected _customProps?: any; // used by custom formatters and parsers\r\n\r\n /** Constructor\r\n * @param name The name of a format specification. TODO: make optional or remove\r\n */\r\n constructor(name: string) {\r\n super(name);\r\n }\r\n\r\n public get units(): Array<[UnitProps, string | undefined]> | undefined { return this._units; }\r\n public get hasUnits(): boolean { return this._units !== undefined && this._units.length > 0; }\r\n public get customProps(): any { return this._customProps; }\r\n\r\n public static isFormatTraitSetInProps(formatProps: FormatProps, trait: FormatTraits) {\r\n if (!formatProps.formatTraits)\r\n return false;\r\n const formatTraits = Array.isArray(formatProps.formatTraits) ? formatProps.formatTraits : formatProps.formatTraits.split(/,|;|\\|/);\r\n const traitStr = getTraitString(trait);\r\n return formatTraits.find((traitEntry) => traitStr === traitEntry) ? true : false;\r\n }\r\n\r\n private async createUnit(unitsProvider: UnitsProvider, name: string, label?: string): Promise<void> {\r\n if (name === undefined || typeof (name) !== \"string\" || (label !== undefined && typeof (label) !== \"string\")) // throws if name is undefined or name isn't a string or if label is defined and isn't a string\r\n throw new QuantityError(QuantityStatus.InvalidJson, `This Composite has a unit with an invalid 'name' or 'label' attribute.`);\r\n for (const unit of this.units!) {\r\n const unitObj = unit[0].name;\r\n if (unitObj.toLowerCase() === name.toLowerCase()) // duplicate names are not allowed\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The unit ${unitObj} has a duplicate name.`);\r\n }\r\n const newUnit: UnitProps = await unitsProvider.findUnitByName(name);\r\n if (!newUnit || !newUnit.isValid)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `Invalid unit name '${name}'.`);\r\n this.units!.push([newUnit, label]);\r\n }\r\n\r\n /**\r\n * Clone Format\r\n */\r\n public clone(options?: CloneOptions): Format {\r\n const newFormat = new Format(this.name);\r\n newFormat._roundFactor = this._roundFactor;\r\n newFormat._type = this._type;\r\n newFormat._precision = this._precision;\r\n newFormat._minWidth = this._minWidth;\r\n newFormat._scientificType = this._scientificType;\r\n newFormat._showSignOption = this._showSignOption;\r\n newFormat._decimalSeparator = this._decimalSeparator;\r\n newFormat._thousandSeparator = this._thousandSeparator;\r\n newFormat._uomSeparator = this._uomSeparator;\r\n newFormat._stationSeparator = this._stationSeparator;\r\n newFormat._stationOffsetSize = this._stationOffsetSize;\r\n newFormat._formatTraits = this._formatTraits;\r\n newFormat._spacer = this._spacer;\r\n newFormat._includeZero = this._includeZero;\r\n newFormat._customProps = this._customProps;\r\n this._units && (newFormat._units = [...this._units]);\r\n\r\n if (newFormat._units) {\r\n if (options?.showOnlyPrimaryUnit) {\r\n if (newFormat._units.length > 1)\r\n newFormat._units.length = 1;\r\n }\r\n }\r\n\r\n if (undefined !== options?.traits)\r\n newFormat._formatTraits = options?.traits;\r\n\r\n if (undefined !== options?.type)\r\n newFormat._type = options.type;\r\n\r\n if (undefined !== options?.precision) {\r\n // ensure specified precision is valid\r\n const precision = parsePrecision(options?.precision, newFormat._type, newFormat.name);\r\n newFormat._precision = precision;\r\n }\r\n\r\n if (undefined !== options?.primaryUnit) {\r\n if (options.primaryUnit.unit) {\r\n const newUnits = new Array<[UnitProps, string | undefined]>();\r\n newUnits.push([options.primaryUnit.unit, options.primaryUnit.label]);\r\n newFormat._units = newUnits;\r\n } else if (options.primaryUnit.label && newFormat._units?.length) {\r\n // update label only\r\n newFormat._units[0][1] = options.primaryUnit.label;\r\n }\r\n }\r\n return newFormat;\r\n }\r\n\r\n /**\r\n * Populates this Format with the values from the provided.\r\n */\r\n public async fromJSON(unitsProvider: UnitsProvider, jsonObj: FormatProps): Promise<void> {\r\n this.loadFormatProperties(jsonObj);\r\n\r\n if (isCustomFormatProps(jsonObj))\r\n this._customProps = jsonObj.custom;\r\n\r\n if (undefined !== jsonObj.composite) { // optional\r\n this._units = new Array<[UnitProps, string | undefined]>();\r\n if (jsonObj.composite.includeZero !== undefined) {\r\n if (typeof (jsonObj.composite.includeZero) !== \"boolean\") // includeZero must be a boolean IF it is defined\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'includeZero' attribute. It should be of type 'boolean'.`);\r\n this._includeZero = jsonObj.composite.includeZero;\r\n }\r\n if (jsonObj.composite.spacer !== undefined) { // spacer must be a string IF it is defined\r\n if (typeof (jsonObj.composite.spacer) !== \"string\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'spacer' attribute. It must be of type 'string'.`);\r\n if (jsonObj.composite.spacer.length > 1)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'spacer' attribute. It should be an empty or one character string.`);\r\n this._spacer = jsonObj.composite.spacer;\r\n }\r\n if (jsonObj.composite.units !== undefined) { // if composite is defined, it must be an array with 1-4 units\r\n if (!Array.isArray(jsonObj.composite.units)) { // must be an array\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'units' attribute. It must be of type 'array'`);\r\n }\r\n if (jsonObj.composite.units.length > 0 && jsonObj.composite.units.length <= 4) { // Composite requires 1-4 units\r\n try {\r\n const createUnitPromises: Array<Promise<void>> = [];\r\n for (const unit of jsonObj.composite.units) {\r\n createUnitPromises.push(this.createUnit(unitsProvider, unit.name, unit.label));\r\n }\r\n\r\n await Promise.all(createUnitPromises);\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n }\r\n if (undefined === this.units || this.units.length === 0)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with no valid 'units'`);\r\n }\r\n }\r\n\r\n /** Create a Format from FormatProps */\r\n public static async createFromJSON(name: string, unitsProvider: UnitsProvider, formatProps: FormatProps) {\r\n const actualFormat = new Format(name);\r\n await actualFormat.fromJSON(unitsProvider, formatProps);\r\n return actualFormat;\r\n }\r\n\r\n /**\r\n * Returns a JSON object that contain the specification for this Format.\r\n */\r\n public toJSON(): FormatProps {\r\n let composite;\r\n if (this.units) {\r\n const units = this.units.map((value) => {\r\n if (undefined !== value[1])\r\n return { name: value[0].name, label: value[1] };\r\n else\r\n return { name: value[0].name };\r\n });\r\n\r\n composite = {\r\n spacer: this.spacer,\r\n includeZero: this.includeZero,\r\n units,\r\n };\r\n }\r\n\r\n if (this.customProps)\r\n return {\r\n type: formatTypeToString(this.type),\r\n precision: this.precision,\r\n roundFactor: this.roundFactor,\r\n minWidth: this.minWidth,\r\n showSignOption: showSignOptionToString(this.showSignOption),\r\n formatTraits: formatTraitsToArray(this.formatTraits),\r\n decimalSeparator: this.decimalSeparator,\r\n thousandSeparator: this.thousandSeparator,\r\n uomSeparator: this.uomSeparator,\r\n scientificType: this.scientificType ? scientificTypeToString(this.scientificType) : undefined,\r\n stationOffsetSize: this.stationOffsetSize,\r\n stationSeparator: this.stationSeparator,\r\n composite,\r\n custom: this.customProps,\r\n } as CustomFormatProps;\r\n\r\n return {\r\n type: formatTypeToString(this.type),\r\n precision: this.precision,\r\n roundFactor: this.roundFactor,\r\n minWidth: this.minWidth,\r\n showSignOption: showSignOptionToString(this.showSignOption),\r\n formatTraits: formatTraitsToArray(this.formatTraits),\r\n decimalSeparator: this.decimalSeparator,\r\n thousandSeparator: this.thousandSeparator,\r\n uomSeparator: this.uomSeparator,\r\n scientificType: this.scientificType ? scientificTypeToString(this.scientificType) : undefined,\r\n stationOffsetSize: this.stationOffsetSize,\r\n stationSeparator: this.stationSeparator,\r\n composite,\r\n };\r\n }\r\n}\r\n"]}
|