@itwin/core-quantity 4.6.0-dev.9 → 4.7.0-dev.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"FormatEnums.js","sourceRoot":"","sources":["../../../src/Formatter/FormatEnums.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 { QuantityError, QuantityStatus } from \"../Exception\";\r\n\r\n/** The regular expression to parse [format strings]($docs/bis/ec/kindofquantity.md#format-string)\r\n * provided in serialized formats as well as the full name of an [[OverrideFormat]].\r\n *\r\n * `formatName(precision)[unitName|unitLabel][unitName|unitLabel][unitName|unitLabel][unitName|unitLabel]`\r\n *\r\n * Explanation of the regex:\r\n * - ([\\w.:]+)\r\n * - Grabs the format full name\r\n * - (\\(([^\\)]+)\\))?\r\n * - Grabs the precision part with and without the `()`.\r\n * - The parentheses are needed to validate the entire string. (TODO: Need to check if this is true)\r\n * - (\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?\r\n * - 4 of these make up the rest of the regex, none of them are required so each end in `?`\r\n * - Grabs the unit name and label including the `[]`\r\n * - Grabs the unit name, `|` and label separately\r\n * @internal\r\n */\r\nexport const formatStringRgx = /([\\w.:]+)(\\(([^\\)]+)\\))?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?/;\r\n\r\n/** @internal */\r\nexport function* getItemNamesFromFormatString(formatString: string): Iterable<string> {\r\n const match = formatString.split(formatStringRgx);\r\n yield match[1]; // the Format Name\r\n let index = 4;\r\n while (index < match.length - 1) { // index 0 and 21 are empty strings\r\n if (match[index] !== undefined)\r\n yield match[index + 1]; // Unit Name\r\n else\r\n break;\r\n index += 4;\r\n }\r\n}\r\n/** @beta */\r\nexport enum FormatTraits {\r\n Uninitialized = 0x0,\r\n /** Show trailing zeroes to requested precision. */\r\n TrailZeroes = 0x1,\r\n /** Indicates that the fractional part of the number is required when the fraction is zero */\r\n KeepSingleZero = 0x2,\r\n /** Zero magnitude returns blank display value */\r\n ZeroEmpty = 0x4,\r\n /** Show decimal point when value to right of decimal is empty */\r\n KeepDecimalPoint = 0x8,\r\n /** Use the rounding factor. Not yet supported */\r\n ApplyRounding = 0x10,\r\n /** Show a dash between whole value and fractional value */\r\n FractionDash = 0x20,\r\n /** Append the quantity's unit label */\r\n ShowUnitLabel = 0x40,\r\n /** Prepend unit label. Not yet supported */\r\n PrependUnitLabel = 0x80,\r\n /** show a grouping in each group of 1000. */\r\n Use1000Separator = 0x100,\r\n /** Indicates that if an exponent value is positive to not include a `+`. By default a sign, `+` or `-`, is always shown. Not yet supported */\r\n ExponentOnlyNegative = 0x200,\r\n}\r\n\r\n/** Precision for Fractional formatted value types. Range from Whole (1/1) through 1/256.\r\n * @beta */\r\nexport enum FractionalPrecision {\r\n One = 1,\r\n Two = 2,\r\n Four = 4,\r\n Eight = 8,\r\n Sixteen = 16,\r\n ThirtyTwo = 32,\r\n SixtyFour = 64,\r\n OneHundredTwentyEight = 128,\r\n TwoHundredFiftySix = 256,\r\n}\r\n\r\n/** Precision for Decimal, Scientific, and Station formatted value types. Range from 1/(10^0) through 1/(10^12).\r\n * @beta */\r\nexport enum DecimalPrecision {\r\n Zero = 0,\r\n One = 1,\r\n Two = 2,\r\n Three = 3,\r\n Four = 4,\r\n Five = 5,\r\n Six = 6,\r\n Seven = 7,\r\n Eight = 8,\r\n Nine = 9,\r\n Ten = 10,\r\n Eleven = 11,\r\n Twelve = 12,\r\n}\r\n\r\n/** Supported format types\r\n * @beta */\r\nexport enum FormatType {\r\n /** Decimal display (ie 2.125) */\r\n Decimal,\r\n /** Fractional display (ie 2-1/8) */\r\n Fractional,\r\n /** Scientific Notation (ie 1.04e3) */\r\n Scientific,\r\n /** Civil Engineering Stationing (ie 1+00). */\r\n Station,\r\n}\r\n\r\n/** required if type is scientific\r\n * @beta */\r\nexport enum ScientificType {\r\n /** Non-zero value left of decimal point (ie 1.2345e3) */\r\n Normalized,\r\n /** Zero value left of decimal point (ie 0.12345e4) */\r\n ZeroNormalized,\r\n}\r\n\r\n/** Determines how the sign of values are displayed\r\n * @beta */\r\nexport enum ShowSignOption {\r\n /** Never show a sign even if the value is negative. */\r\n NoSign,\r\n /** Only show a sign when the value is negative. */\r\n OnlyNegative,\r\n /** Always show a sign whether the value is positive or negative. */\r\n SignAlways,\r\n /** Only show a sign when the value is negative but use parentheses instead of a negative sign. For example, -10 is formatted as `(10)`. */\r\n NegativeParentheses,\r\n}\r\n\r\n// parse and toString methods\r\n\r\n/** @beta */\r\n\r\nexport function parseScientificType(scientificType: string, formatName: string): ScientificType {\r\n switch (scientificType.toLowerCase()) {\r\n case \"normalized\": return ScientificType.Normalized;\r\n case \"zeronormalized\": return ScientificType.ZeroNormalized;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'scientificType' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function scientificTypeToString(scientificType: ScientificType): string {\r\n return (scientificType === ScientificType.Normalized) ? \"Normalized\" : \"ZeroNormalized\";\r\n}\r\n\r\n/** @beta */\r\nexport function parseShowSignOption(showSignOption: string, formatName: string): ShowSignOption {\r\n switch (showSignOption.toLowerCase()) {\r\n case \"nosign\": return ShowSignOption.NoSign;\r\n case \"onlynegative\": return ShowSignOption.OnlyNegative;\r\n case \"signalways\": return ShowSignOption.SignAlways;\r\n case \"negativeparentheses\": return ShowSignOption.NegativeParentheses;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'showSignOption' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function showSignOptionToString(showSign: ShowSignOption): string {\r\n switch (showSign) {\r\n case ShowSignOption.NegativeParentheses: return \"NegativeParentheses\";\r\n case ShowSignOption.NoSign: return \"NoSign\";\r\n case ShowSignOption.OnlyNegative: return \"OnlyNegative\";\r\n case ShowSignOption.SignAlways: return \"SignAlways\";\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function parseFormatTrait(formatTraitsString: string, formatName: string): FormatTraits {\r\n switch (formatTraitsString.toLowerCase()) {\r\n case \"trailzeroes\": return FormatTraits.TrailZeroes;\r\n case \"keepsinglezero\": return FormatTraits.KeepSingleZero;\r\n case \"zeroempty\": return FormatTraits.ZeroEmpty;\r\n case \"keepdecimalpoint\": return FormatTraits.KeepDecimalPoint;\r\n case \"applyrounding\": return FormatTraits.ApplyRounding;\r\n case \"fractiondash\": return FormatTraits.FractionDash;\r\n case \"showunitlabel\": return FormatTraits.ShowUnitLabel;\r\n case \"prependunitlabel\": return FormatTraits.PrependUnitLabel;\r\n case \"use1000separator\": return FormatTraits.Use1000Separator;\r\n case \"exponentonlynegative\": return FormatTraits.ExponentOnlyNegative;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'formatTraits' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function getTraitString(trait: FormatTraits) {\r\n switch (trait) {\r\n case FormatTraits.TrailZeroes:\r\n return \"trailZeroes\";\r\n case FormatTraits.KeepSingleZero:\r\n return \"keepSingleZero\";\r\n case FormatTraits.ZeroEmpty:\r\n return \"zeroEmpty\";\r\n case FormatTraits.KeepDecimalPoint:\r\n return \"keepDecimalPoint\";\r\n case FormatTraits.ApplyRounding:\r\n return \"applyRounding\";\r\n case FormatTraits.FractionDash:\r\n return \"fractionDash\";\r\n case FormatTraits.ShowUnitLabel:\r\n return \"showUnitLabel\";\r\n case FormatTraits.PrependUnitLabel:\r\n return \"prependUnitLabel\";\r\n case FormatTraits.Use1000Separator:\r\n return \"use1000Separator\";\r\n case FormatTraits.ExponentOnlyNegative:\r\n default:\r\n return \"exponentOnlyNegative\";\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function formatTraitsToArray(currentFormatTrait: FormatTraits): string[] {\r\n const formatTraitsArr = Array<string>();\r\n if ((currentFormatTrait & FormatTraits.TrailZeroes) === FormatTraits.TrailZeroes)\r\n formatTraitsArr.push(\"TrailZeroes\");\r\n if ((currentFormatTrait & FormatTraits.KeepSingleZero) === FormatTraits.KeepSingleZero)\r\n formatTraitsArr.push(\"KeepSingleZero\");\r\n if ((currentFormatTrait & FormatTraits.ZeroEmpty) === FormatTraits.ZeroEmpty)\r\n formatTraitsArr.push(\"ZeroEmpty\");\r\n if ((currentFormatTrait & FormatTraits.KeepDecimalPoint) === FormatTraits.KeepDecimalPoint)\r\n formatTraitsArr.push(\"KeepDecimalPoint\");\r\n if ((currentFormatTrait & FormatTraits.ApplyRounding) === FormatTraits.ApplyRounding)\r\n formatTraitsArr.push(\"ApplyRounding\");\r\n if ((currentFormatTrait & FormatTraits.FractionDash) === FormatTraits.FractionDash)\r\n formatTraitsArr.push(\"FractionDash\");\r\n if ((currentFormatTrait & FormatTraits.ShowUnitLabel) === FormatTraits.ShowUnitLabel)\r\n formatTraitsArr.push(\"ShowUnitLabel\");\r\n if ((currentFormatTrait & FormatTraits.PrependUnitLabel) === FormatTraits.PrependUnitLabel)\r\n formatTraitsArr.push(\"PrependUnitLabel\");\r\n if ((currentFormatTrait & FormatTraits.Use1000Separator) === FormatTraits.Use1000Separator)\r\n formatTraitsArr.push(\"Use1000Separator\");\r\n if ((currentFormatTrait & FormatTraits.ExponentOnlyNegative) === FormatTraits.ExponentOnlyNegative)\r\n formatTraitsArr.push(\"ExponentOnlyNegative\");\r\n return formatTraitsArr;\r\n}\r\n\r\n/** @beta */\r\nexport function parseFormatType(jsonObjType: string, formatName: string): FormatType {\r\n switch (jsonObjType.toLowerCase()) {\r\n case \"decimal\": return FormatType.Decimal;\r\n case \"scientific\": return FormatType.Scientific;\r\n case \"station\": return FormatType.Station;\r\n case \"fractional\": return FormatType.Fractional;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'type' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function formatTypeToString(type: FormatType): string {\r\n switch (type) {\r\n case FormatType.Decimal: return \"Decimal\";\r\n case FormatType.Scientific: return \"Scientific\";\r\n case FormatType.Station: return \"Station\";\r\n case FormatType.Fractional: return \"Fractional\";\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function parseDecimalPrecision(jsonObjPrecision: number, formatName: string): DecimalPrecision {\r\n switch (jsonObjPrecision) {\r\n case 0: return DecimalPrecision.Zero;\r\n case 1: return DecimalPrecision.One;\r\n case 2: return DecimalPrecision.Two;\r\n case 3: return DecimalPrecision.Three;\r\n case 4: return DecimalPrecision.Four;\r\n case 5: return DecimalPrecision.Five;\r\n case 6: return DecimalPrecision.Six;\r\n case 7: return DecimalPrecision.Seven;\r\n case 8: return DecimalPrecision.Eight;\r\n case 9: return DecimalPrecision.Nine;\r\n case 10: return DecimalPrecision.Ten;\r\n case 11: return DecimalPrecision.Eleven;\r\n case 12: return DecimalPrecision.Twelve;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta validates the input value, that is typically extracted for persisted JSON data, is a valid FractionalPrecision */\r\nexport function parseFractionalPrecision(jsonObjPrecision: number, formatName: string): FractionalPrecision {\r\n switch (jsonObjPrecision) {\r\n case 1: return FractionalPrecision.One;\r\n case 2: return FractionalPrecision.Two;\r\n case 4: return FractionalPrecision.Four;\r\n case 8: return FractionalPrecision.Eight;\r\n case 16: return FractionalPrecision.Sixteen;\r\n case 32: return FractionalPrecision.ThirtyTwo;\r\n case 64: return FractionalPrecision.SixtyFour;\r\n case 128: return FractionalPrecision.OneHundredTwentyEight;\r\n case 256: return FractionalPrecision.TwoHundredFiftySix;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta validates the input value, that is typically extracted for persisted JSON data, is a valid DecimalPrecision or FractionalPrecision. */\r\nexport function parsePrecision(precision: number, type: FormatType, formatName: string): DecimalPrecision | FractionalPrecision {\r\n switch (type) { // type must be decimal, fractional, scientific, or station\r\n case FormatType.Decimal:\r\n case FormatType.Scientific:\r\n case FormatType.Station:\r\n return parseDecimalPrecision(precision, formatName);\r\n case FormatType.Fractional:\r\n return parseFractionalPrecision(precision, formatName);\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"FormatEnums.js","sourceRoot":"","sources":["../../../src/Formatter/FormatEnums.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 { QuantityError, QuantityStatus } from \"../Exception\";\r\n\r\n/** The regular expression to parse [format strings]($docs/bis/ec/kindofquantity.md#format-string)\r\n * provided in serialized formats as well as the full name of an [[OverrideFormat]].\r\n *\r\n * `formatName(precision)[unitName|unitLabel][unitName|unitLabel][unitName|unitLabel][unitName|unitLabel]`\r\n *\r\n * Explanation of the regex:\r\n * - ([\\w.:]+)\r\n * - Grabs the format full name\r\n * - (\\(([^\\)]+)\\))?\r\n * - Grabs the precision part with and without the `()`.\r\n * - The parentheses are needed to validate the entire string. (TODO: Need to check if this is true)\r\n * - (\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?\r\n * - 4 of these make up the rest of the regex, none of them are required so each end in `?`\r\n * - Grabs the unit name and label including the `[]`\r\n * - Grabs the unit name, `|` and label separately\r\n * @internal\r\n */\r\nexport const formatStringRgx = /([\\w.:]+)(\\(([^\\)]+)\\))?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?/;\r\n\r\n/** @internal */\r\nexport function* getItemNamesFromFormatString(formatString: string): Iterable<string> {\r\n const match = formatString.split(formatStringRgx);\r\n yield match[1]; // the Format Name\r\n let index = 4;\r\n while (index < match.length - 1) { // index 0 and 21 are empty strings\r\n if (match[index] !== undefined)\r\n yield match[index + 1]; // Unit Name\r\n else\r\n break;\r\n index += 4;\r\n }\r\n}\r\n/** @beta */\r\nexport enum FormatTraits {\r\n Uninitialized = 0x0,\r\n /** Show trailing zeroes to requested precision. */\r\n TrailZeroes = 0x1,\r\n /** Indicates that the fractional part of the number is required when the fraction is zero */\r\n KeepSingleZero = 0x2,\r\n /** Zero magnitude returns blank display value */\r\n ZeroEmpty = 0x4,\r\n /** Show decimal point when value to right of decimal is empty */\r\n KeepDecimalPoint = 0x8,\r\n /** Use the rounding factor. Not yet supported */\r\n ApplyRounding = 0x10,\r\n /** Show a dash between whole value and fractional value */\r\n FractionDash = 0x20,\r\n /** Append the quantity's unit label */\r\n ShowUnitLabel = 0x40,\r\n /** Prepend unit label. Not yet supported */\r\n PrependUnitLabel = 0x80,\r\n /** show a grouping in each group of 1000. */\r\n Use1000Separator = 0x100,\r\n /** Indicates that if an exponent value is positive to not include a `+`. By default a sign, `+` or `-`, is always shown. Not yet supported */\r\n ExponentOnlyNegative = 0x200,\r\n}\r\n\r\n/** Precision for Fractional formatted value types. Range from Whole (1/1) through 1/256.\r\n * @beta */\r\nexport enum FractionalPrecision {\r\n One = 1,\r\n Two = 2,\r\n Four = 4,\r\n Eight = 8,\r\n Sixteen = 16,\r\n ThirtyTwo = 32,\r\n SixtyFour = 64,\r\n OneHundredTwentyEight = 128,\r\n TwoHundredFiftySix = 256,\r\n}\r\n\r\n/** Precision for Decimal, Scientific, and Station formatted value types. Range from 1/(10^0) through 1/(10^12).\r\n * @beta */\r\nexport enum DecimalPrecision {\r\n Zero = 0,\r\n One = 1,\r\n Two = 2,\r\n Three = 3,\r\n Four = 4,\r\n Five = 5,\r\n Six = 6,\r\n Seven = 7,\r\n Eight = 8,\r\n Nine = 9,\r\n Ten = 10,\r\n Eleven = 11,\r\n Twelve = 12,\r\n}\r\n\r\n/** Supported format types\r\n * @beta */\r\nexport enum FormatType {\r\n /** Decimal display (ie 2.125) */\r\n Decimal,\r\n /** Fractional display (ie 2-1/8) */\r\n Fractional,\r\n /** Scientific Notation (ie 1.04e3) */\r\n Scientific,\r\n /** Civil Engineering Stationing (ie 1+00). */\r\n Station,\r\n}\r\n\r\n/** required if type is scientific\r\n * @beta */\r\nexport enum ScientificType {\r\n /** Non-zero value left of decimal point (ie 1.2345e3) */\r\n Normalized,\r\n /** Zero value left of decimal point (ie 0.12345e4) */\r\n ZeroNormalized,\r\n}\r\n\r\n/** Determines how the sign of values are displayed\r\n * @beta */\r\nexport enum ShowSignOption {\r\n /** Never show a sign even if the value is negative. */\r\n NoSign,\r\n /** Only show a sign when the value is negative. */\r\n OnlyNegative,\r\n /** Always show a sign whether the value is positive or negative. */\r\n SignAlways,\r\n /** Only show a sign when the value is negative but use parentheses instead of a negative sign. For example, -10 is formatted as `(10)`. */\r\n NegativeParentheses,\r\n}\r\n\r\n// parse and toString methods\r\n\r\n/** @beta */\r\n\r\nexport function parseScientificType(scientificType: string, formatName: string): ScientificType {\r\n switch (scientificType.toLowerCase()) {\r\n case \"normalized\": return ScientificType.Normalized;\r\n case \"zeronormalized\": return ScientificType.ZeroNormalized;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'scientificType' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function scientificTypeToString(scientificType: ScientificType): string {\r\n return (scientificType === ScientificType.Normalized) ? \"Normalized\" : \"ZeroNormalized\";\r\n}\r\n\r\n/** @beta */\r\nexport function parseShowSignOption(showSignOption: string, formatName: string): ShowSignOption {\r\n switch (showSignOption.toLowerCase()) {\r\n case \"nosign\": return ShowSignOption.NoSign;\r\n case \"onlynegative\": return ShowSignOption.OnlyNegative;\r\n case \"signalways\": return ShowSignOption.SignAlways;\r\n case \"negativeparentheses\": return ShowSignOption.NegativeParentheses;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'showSignOption' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function showSignOptionToString(showSign: ShowSignOption): string {\r\n switch (showSign) {\r\n case ShowSignOption.NegativeParentheses: return \"NegativeParentheses\";\r\n case ShowSignOption.NoSign: return \"NoSign\";\r\n case ShowSignOption.OnlyNegative: return \"OnlyNegative\";\r\n case ShowSignOption.SignAlways: return \"SignAlways\";\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function parseFormatTrait(formatTraitsString: string, formatName: string): FormatTraits {\r\n switch (formatTraitsString.toLowerCase()) {\r\n case \"trailzeroes\": return FormatTraits.TrailZeroes;\r\n case \"keepsinglezero\": return FormatTraits.KeepSingleZero;\r\n case \"zeroempty\": return FormatTraits.ZeroEmpty;\r\n case \"keepdecimalpoint\": return FormatTraits.KeepDecimalPoint;\r\n case \"applyrounding\": return FormatTraits.ApplyRounding;\r\n case \"fractiondash\": return FormatTraits.FractionDash;\r\n case \"showunitlabel\": return FormatTraits.ShowUnitLabel;\r\n case \"prependunitlabel\": return FormatTraits.PrependUnitLabel;\r\n case \"use1000separator\": return FormatTraits.Use1000Separator;\r\n case \"exponentonlynegative\": return FormatTraits.ExponentOnlyNegative;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'formatTraits' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function getTraitString(trait: FormatTraits) {\r\n switch (trait) {\r\n case FormatTraits.TrailZeroes:\r\n return \"trailZeroes\";\r\n case FormatTraits.KeepSingleZero:\r\n return \"keepSingleZero\";\r\n case FormatTraits.ZeroEmpty:\r\n return \"zeroEmpty\";\r\n case FormatTraits.KeepDecimalPoint:\r\n return \"keepDecimalPoint\";\r\n case FormatTraits.ApplyRounding:\r\n return \"applyRounding\";\r\n case FormatTraits.FractionDash:\r\n return \"fractionDash\";\r\n case FormatTraits.ShowUnitLabel:\r\n return \"showUnitLabel\";\r\n case FormatTraits.PrependUnitLabel:\r\n return \"prependUnitLabel\";\r\n case FormatTraits.Use1000Separator:\r\n return \"use1000Separator\";\r\n case FormatTraits.ExponentOnlyNegative:\r\n default:\r\n return \"exponentOnlyNegative\";\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function formatTraitsToArray(currentFormatTrait: FormatTraits): string[] {\r\n const formatTraitsArr = Array<string>();\r\n if ((currentFormatTrait & FormatTraits.TrailZeroes) === FormatTraits.TrailZeroes)\r\n formatTraitsArr.push(\"TrailZeroes\");\r\n if ((currentFormatTrait & FormatTraits.KeepSingleZero) === FormatTraits.KeepSingleZero)\r\n formatTraitsArr.push(\"KeepSingleZero\");\r\n if ((currentFormatTrait & FormatTraits.ZeroEmpty) === FormatTraits.ZeroEmpty)\r\n formatTraitsArr.push(\"ZeroEmpty\");\r\n if ((currentFormatTrait & FormatTraits.KeepDecimalPoint) === FormatTraits.KeepDecimalPoint)\r\n formatTraitsArr.push(\"KeepDecimalPoint\");\r\n if ((currentFormatTrait & FormatTraits.ApplyRounding) === FormatTraits.ApplyRounding)\r\n formatTraitsArr.push(\"ApplyRounding\");\r\n if ((currentFormatTrait & FormatTraits.FractionDash) === FormatTraits.FractionDash)\r\n formatTraitsArr.push(\"FractionDash\");\r\n if ((currentFormatTrait & FormatTraits.ShowUnitLabel) === FormatTraits.ShowUnitLabel)\r\n formatTraitsArr.push(\"ShowUnitLabel\");\r\n if ((currentFormatTrait & FormatTraits.PrependUnitLabel) === FormatTraits.PrependUnitLabel)\r\n formatTraitsArr.push(\"PrependUnitLabel\");\r\n if ((currentFormatTrait & FormatTraits.Use1000Separator) === FormatTraits.Use1000Separator)\r\n formatTraitsArr.push(\"Use1000Separator\");\r\n if ((currentFormatTrait & FormatTraits.ExponentOnlyNegative) === FormatTraits.ExponentOnlyNegative)\r\n formatTraitsArr.push(\"ExponentOnlyNegative\");\r\n return formatTraitsArr;\r\n}\r\n\r\n/** @beta */\r\nexport function parseFormatType(jsonObjType: string, formatName: string): FormatType {\r\n switch (jsonObjType.toLowerCase()) {\r\n case \"decimal\": return FormatType.Decimal;\r\n case \"scientific\": return FormatType.Scientific;\r\n case \"station\": return FormatType.Station;\r\n case \"fractional\": return FormatType.Fractional;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'type' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function formatTypeToString(type: FormatType): string {\r\n switch (type) {\r\n case FormatType.Decimal: return \"Decimal\";\r\n case FormatType.Scientific: return \"Scientific\";\r\n case FormatType.Station: return \"Station\";\r\n case FormatType.Fractional: return \"Fractional\";\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function parseDecimalPrecision(jsonObjPrecision: number, formatName: string): DecimalPrecision {\r\n switch (jsonObjPrecision) {\r\n case 0: return DecimalPrecision.Zero;\r\n case 1: return DecimalPrecision.One;\r\n case 2: return DecimalPrecision.Two;\r\n case 3: return DecimalPrecision.Three;\r\n case 4: return DecimalPrecision.Four;\r\n case 5: return DecimalPrecision.Five;\r\n case 6: return DecimalPrecision.Six;\r\n case 7: return DecimalPrecision.Seven;\r\n case 8: return DecimalPrecision.Eight;\r\n case 9: return DecimalPrecision.Nine;\r\n case 10: return DecimalPrecision.Ten;\r\n case 11: return DecimalPrecision.Eleven;\r\n case 12: return DecimalPrecision.Twelve;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta validates the input value, that is typically extracted for persisted JSON data, is a valid FractionalPrecision */\r\nexport function parseFractionalPrecision(jsonObjPrecision: number, formatName: string): FractionalPrecision {\r\n switch (jsonObjPrecision) {\r\n case 1: return FractionalPrecision.One;\r\n case 2: return FractionalPrecision.Two;\r\n case 4: return FractionalPrecision.Four;\r\n case 8: return FractionalPrecision.Eight;\r\n case 16: return FractionalPrecision.Sixteen;\r\n case 32: return FractionalPrecision.ThirtyTwo;\r\n case 64: return FractionalPrecision.SixtyFour;\r\n case 128: return FractionalPrecision.OneHundredTwentyEight;\r\n case 256: return FractionalPrecision.TwoHundredFiftySix;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta validates the input value, that is typically extracted for persisted JSON data, is a valid DecimalPrecision or FractionalPrecision. */\r\nexport function parsePrecision(precision: number, type: FormatType, formatName: string): DecimalPrecision | FractionalPrecision {\r\n switch (type) { // type must be decimal, fractional, scientific, or station\r\n case FormatType.Decimal:\r\n case FormatType.Scientific:\r\n case FormatType.Station:\r\n return parseDecimalPrecision(precision, formatName);\r\n case FormatType.Fractional:\r\n return parseFractionalPrecision(precision, formatName);\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\r\n }\r\n}\r\n"]}
@@ -86,7 +86,7 @@ class FractionalNumeric {
86
86
  /** A helper class that contains methods used to format quantity values based on a format that are defined via the Format class.
87
87
  * @beta
88
88
  */
89
- class Formatter {
89
+ export class Formatter {
90
90
  static isNegligible(value) { return (Math.abs(value) < Formatter.FPV_MINTHRESHOLD); }
91
91
  /** Return floating point value rounded by specific rounding factor.
92
92
  * @param value Value to be rounded.
@@ -365,5 +365,4 @@ class Formatter {
365
365
  }
366
366
  // eslint-disable-next-line @typescript-eslint/naming-convention
367
367
  Formatter.FPV_MINTHRESHOLD = 1.0e-14;
368
- export { Formatter };
369
368
  //# sourceMappingURL=Formatter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Formatter.js","sourceRoot":"","sources":["../../../src/Formatter/Formatter.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 { FormatterSpec } from \"./FormatterSpec\";\r\nimport { DecimalPrecision, FormatTraits, FormatType, FractionalPrecision, ScientificType, ShowSignOption } from \"./FormatEnums\";\r\n\r\n/** rounding additive\r\n * @internal\r\n */\r\nconst FPV_ROUNDFACTOR = 0.50000000001;\r\n\r\n/** A private helper class used to format fraction part of value into a numerator and denominator.\r\n * @internal\r\n */\r\nclass FractionalNumeric {\r\n private _integral: number = 0;\r\n private _numerator: number = 0;\r\n private _denominator: number = 1;\r\n private _greatestCommonFactor: number = 1;\r\n private _textParts: string[] = [];\r\n\r\n constructor(value: number, precision: FractionalPrecision, reduce: boolean) {\r\n this.calculate(value, precision as number);\r\n this.formTextParts(reduce);\r\n }\r\n\r\n private calculate(value: number, denominator: number) {\r\n const positiveValue = Math.abs(value);\r\n this._denominator = denominator;\r\n this._integral = Math.floor(positiveValue);\r\n const fractionPart = positiveValue - this._integral;\r\n this._numerator = Math.floor(fractionPart * this._denominator + FPV_ROUNDFACTOR);\r\n\r\n if (0 !== denominator && (this._numerator / this._denominator) === 1) {\r\n this._numerator = 0;\r\n this._integral += 1;\r\n } else {\r\n this._greatestCommonFactor = this.getGreatestCommonFactor(this._numerator, this._denominator);\r\n }\r\n }\r\n\r\n /** Determine the GCD given two values. This value can be used to reduce a fraction.\r\n * See algorithm description http://en.wikipedia.org/wiki/Euclidean_algorithm\r\n */\r\n private getGreatestCommonFactor(numerator: number, denominator: number): number {\r\n let r;\r\n while (denominator !== 0) {\r\n r = numerator % denominator;\r\n numerator = denominator;\r\n denominator = r;\r\n }\r\n return (numerator < 0) ? -numerator : numerator;\r\n }\r\n\r\n public get greatestCommonFactor(): number { return this._greatestCommonFactor; }\r\n public get hasFractionPart(): boolean { return this._textParts.length > 0; }\r\n public get isZero(): boolean { return 0 === this._numerator; }\r\n\r\n public getIntegralString(): string {\r\n if (this._textParts.length > 0)\r\n return this._textParts[0];\r\n\r\n return \"\";\r\n }\r\n\r\n public getNumeratorString(): string {\r\n if (this._textParts.length >= 3)\r\n return this._textParts[1];\r\n\r\n return \"\";\r\n }\r\n\r\n public getDenominatorString(): string {\r\n if (this._textParts.length >= 3)\r\n return this._textParts[2];\r\n\r\n return \"\";\r\n }\r\n\r\n private formTextParts(reduce: boolean): void {\r\n let numerator = this._numerator;\r\n let denominator = this._denominator;\r\n\r\n if (reduce && this._greatestCommonFactor > 1) {\r\n numerator /= this.greatestCommonFactor;\r\n denominator /= this.greatestCommonFactor;\r\n }\r\n\r\n this._textParts.push(this._integral.toFixed(0));\r\n if (numerator > 0) {\r\n this._textParts.push(numerator.toFixed(0));\r\n this._textParts.push(denominator.toFixed(0));\r\n }\r\n }\r\n}\r\n\r\n/** A helper class that contains methods used to format quantity values based on a format that are defined via the Format class.\r\n * @beta\r\n */\r\nexport class Formatter {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private static FPV_MINTHRESHOLD = 1.0e-14;\r\n\r\n private static isNegligible(value: number): boolean { return (Math.abs(value) < Formatter.FPV_MINTHRESHOLD); }\r\n\r\n /** Return floating point value rounded by specific rounding factor.\r\n * @param value Value to be rounded.\r\n * @param roundTo Rounding factor.\r\n */\r\n private static roundDouble(value: number, roundTo: number): number {\r\n if (Formatter.isNegligible(roundTo))\r\n return value;\r\n\r\n roundTo = Math.abs(roundTo);\r\n let rnd = FPV_ROUNDFACTOR + (value / roundTo);\r\n const iVal = Math.floor(rnd);\r\n rnd = iVal * roundTo;\r\n return (value < 0.0) ? -rnd : rnd;\r\n }\r\n\r\n /** Generate a formatted text string integer value insert 1000 separators if appropriate.\r\n * @param wholePart Integer value to be formatted.\r\n */\r\n private static integerPartToText(wholePart: number, spec: FormatterSpec): string {\r\n // build invariant string represent wholePart\r\n let formattedValue = wholePart.toFixed(0);\r\n\r\n if ((formattedValue.length > 3) && (spec.format.hasFormatTraitSet(FormatTraits.Use1000Separator) && (spec.format.thousandSeparator.length > 0))) {\r\n let numSeparators = Math.floor(formattedValue.length / 3);\r\n let groupLength = formattedValue.length % 3;\r\n\r\n if (groupLength === 0) {\r\n numSeparators = numSeparators - 1;\r\n groupLength = groupLength + 3;\r\n }\r\n\r\n let outString = formattedValue.substring(0, groupLength);\r\n\r\n for (let i = 1; i <= numSeparators; i += 1) {\r\n outString = outString + spec.format.thousandSeparator + formattedValue.substring(groupLength, groupLength + 3);\r\n groupLength = groupLength + 3;\r\n }\r\n\r\n formattedValue = outString;\r\n }\r\n\r\n return formattedValue;\r\n }\r\n\r\n /** Trim trailing \"0\" from the text that represent the fractional part of a floating point value.\r\n * @param strVal The value string.\r\n */\r\n private static trimTrailingZeroes(strVal: string): string {\r\n let lastNonZeroCharIndex = -1;\r\n for (let i = strVal.length - 1; i >= 0; i--) {\r\n if (strVal.charCodeAt(i) !== QuantityConstants.CHAR_DIGIT_ZERO) {\r\n lastNonZeroCharIndex = i;\r\n break;\r\n }\r\n }\r\n if (lastNonZeroCharIndex >= 0)\r\n return strVal.substring(0, lastNonZeroCharIndex + 1);\r\n return \"\";\r\n }\r\n\r\n /** Format a quantity value into a composite format such as ft-in or deg-min-sec.\r\n * @param compositeValue The value for this part of the composite\r\n * @param isLastPart If false the composite value should be a whole value, if true then the value should be formatted as a floating point value.\r\n * @param label Label for this part of the composite. This will be either the default unit label or a custom label specified the format specification.\r\n */\r\n private static formatCompositePart(compositeValue: number, isLastPart: boolean, label: string, spec: FormatterSpec): string {\r\n let componentText = \"\";\r\n if (!isLastPart) {\r\n componentText = Formatter.integerPartToText(compositeValue, spec);\r\n } else {\r\n componentText = Formatter.formatMagnitude(compositeValue, spec);\r\n }\r\n\r\n if (spec.format.hasFormatTraitSet(FormatTraits.ShowUnitLabel)) {\r\n componentText = componentText + spec.format.uomSeparator + label;\r\n } else {\r\n if (!isLastPart)\r\n componentText = `${componentText}:`;\r\n }\r\n\r\n return componentText;\r\n }\r\n\r\n /** Format a quantity value into a composite format such as ft-in or deg-min-sec.\r\n * @param magnitude quantity value\r\n * @param fromUnit quantity unit\r\n */\r\n private static formatComposite(magnitude: number, spec: FormatterSpec): string {\r\n const compositeStrings: string[] = [];\r\n\r\n // Caller will deal with appending +||-||() value sign as specified by formatting options so just format positive value\r\n let posMagnitude = Math.abs(magnitude);\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\r\n for (let i = 0; i < spec.unitConversions.length; i++) {\r\n const currentLabel = spec.unitConversions[i].label;\r\n const unitConversion = spec.unitConversions[i].conversion;\r\n\r\n if (i > 0 && unitConversion.factor < 1.0)\r\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} has a invalid unit specification..`);\r\n if (i > 0 && unitConversion.offset !== 0)\r\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} has a invalid unit specification..`);\r\n\r\n let unitValue = (posMagnitude * unitConversion.factor) + unitConversion.offset + Formatter.FPV_MINTHRESHOLD; // offset should only ever be defined for major unit\r\n if (0 === i) {\r\n const precisionScale = Math.pow(10, 8); // use a fixed round off precision of 8 to avoid loss of precision in actual magnitude\r\n unitValue = Math.floor(unitValue * precisionScale + FPV_ROUNDFACTOR) / precisionScale;\r\n if ((Math.abs(unitValue) < 0.0001) && spec.format.hasFormatTraitSet(FormatTraits.ZeroEmpty))\r\n return \"\";\r\n }\r\n\r\n if (i < spec.format.units!.length - 1) {\r\n const wholePart = Math.floor(unitValue);\r\n const componentText = Formatter.formatCompositePart(wholePart, false, currentLabel, spec);\r\n posMagnitude = unitValue - wholePart;\r\n compositeStrings.push(componentText);\r\n } else {\r\n const componentText = Formatter.formatCompositePart(unitValue, true, currentLabel, spec);\r\n compositeStrings.push(componentText);\r\n }\r\n }\r\n\r\n return compositeStrings.join(spec.format.spacer ? spec.format.spacer : \"\");\r\n }\r\n\r\n /** Format a quantity value into a single text string. Imitate how formatting done by server method NumericFormatSpec::FormatDouble.\r\n * @param magnitude quantity value\r\n */\r\n private static formatMagnitude(magnitude: number, spec: FormatterSpec): string {\r\n let posMagnitude = Math.abs(magnitude);\r\n if ((Math.abs(posMagnitude) < 0.0001) && spec.format.hasFormatTraitSet(FormatTraits.ZeroEmpty))\r\n return \"\";\r\n\r\n if (spec.format.hasFormatTraitSet(FormatTraits.ApplyRounding))\r\n posMagnitude = Math.abs(Formatter.roundDouble(magnitude, spec.format.roundFactor));\r\n\r\n const isSci = ((posMagnitude > 1.0e12) || spec.format.type === FormatType.Scientific);\r\n const isDecimal = (isSci || spec.format.type === FormatType.Decimal);\r\n const isFractional = (!isDecimal && spec.format.type === FormatType.Fractional);\r\n /* const usesStops = spec.format.type === FormatType.Station; */\r\n const isPrecisionZero = spec.format.precision === DecimalPrecision.Zero;\r\n const isKeepSingleZero = spec.format.hasFormatTraitSet(FormatTraits.KeepSingleZero);\r\n const precisionScale = Math.pow(10.0, spec.format.precision);\r\n const isKeepTrailingZeroes = spec.format.hasFormatTraitSet(FormatTraits.TrailZeroes);\r\n let expInt = 0.0;\r\n\r\n if (isSci && (posMagnitude !== 0.0)) {\r\n let exp = Math.log10(posMagnitude);\r\n let negativeExp = false;\r\n if (exp < 0.0) {\r\n exp = -exp;\r\n negativeExp = true;\r\n }\r\n\r\n expInt = Math.floor(exp);\r\n if (spec.format.type === FormatType.Scientific) {\r\n if (spec.format.scientificType === ScientificType.ZeroNormalized && posMagnitude > 1.0)\r\n expInt += 1.0;\r\n else if (spec.format.scientificType === ScientificType.Normalized && posMagnitude < 1.0)\r\n expInt += 1.0;\r\n\r\n if (negativeExp)\r\n expInt = -expInt;\r\n }\r\n\r\n const factor = Math.pow(10.0, -expInt);\r\n posMagnitude *= factor;\r\n }\r\n\r\n let formattedValue = \"\";\r\n if (isDecimal) {\r\n const actualVal = isPrecisionZero ? posMagnitude + FPV_ROUNDFACTOR : posMagnitude + Formatter.FPV_MINTHRESHOLD;\r\n let wholePart = Math.floor(actualVal);\r\n let fractionPart = actualVal - wholePart;\r\n if (!isPrecisionZero) {\r\n fractionPart = Math.abs(fractionPart) * precisionScale + FPV_ROUNDFACTOR;\r\n if (fractionPart >= precisionScale) {\r\n wholePart += 1;\r\n fractionPart -= precisionScale;\r\n }\r\n }\r\n\r\n formattedValue = Formatter.integerPartToText(wholePart, spec);\r\n if (isPrecisionZero) {\r\n if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint) && !isKeepSingleZero)\r\n formattedValue = formattedValue + spec.format.decimalSeparator;\r\n else if (isKeepSingleZero)\r\n formattedValue = `${formattedValue + spec.format.decimalSeparator}0`;\r\n } else {\r\n fractionPart = Math.floor(fractionPart) / precisionScale;\r\n let fractionString = fractionPart.toFixed(spec.format.precision);\r\n // remove leading \"0.\"\r\n fractionString = fractionString.substring(2).padEnd(spec.format.precision, \"0\");\r\n if (!isKeepTrailingZeroes)\r\n fractionString = Formatter.trimTrailingZeroes(fractionString);\r\n\r\n if (fractionString.length > 0)\r\n formattedValue = formattedValue + spec.format.decimalSeparator + fractionString;\r\n else {\r\n if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint))\r\n formattedValue = formattedValue + spec.format.decimalSeparator + (isKeepSingleZero ? \"0\" : \"\");\r\n }\r\n }\r\n\r\n if (isSci) {\r\n const expString = `e${expInt.toFixed(0)}`;\r\n formattedValue = formattedValue + expString;\r\n }\r\n } else if (isFractional) {\r\n const fn = new FractionalNumeric(posMagnitude, spec.format.precision as FractionalPrecision, true);\r\n formattedValue = fn.getIntegralString();\r\n\r\n if (!fn.isZero && fn.hasFractionPart) {\r\n const wholeFractionSeparator = spec.format.hasFormatTraitSet(FormatTraits.FractionDash) ? \"-\" : \" \";\r\n const fractionString = `${fn.getNumeratorString()}/${fn.getDenominatorString()}`;\r\n formattedValue = formattedValue + wholeFractionSeparator + fractionString;\r\n }\r\n } else /* if (usesStops)*/ {\r\n // we assume that stopping value is always positive\r\n posMagnitude = Math.floor(posMagnitude * precisionScale + FPV_ROUNDFACTOR) / precisionScale;\r\n\r\n const denominator = (Math.pow(10, spec.format.stationOffsetSize!));\r\n const tVal = Math.floor(posMagnitude); // this is the integer part only\r\n const hiPart = Math.floor(tVal / denominator);\r\n const lowPart = tVal - hiPart * denominator;\r\n const fract = posMagnitude - tVal;\r\n const fractionPart = Math.floor(fract * precisionScale + FPV_ROUNDFACTOR);\r\n const stationString = hiPart.toFixed(0) + spec.format.stationSeparator + lowPart.toFixed(0).padStart(spec.format.stationOffsetSize!, \"0\");\r\n let fractionString = \"\";\r\n if (fractionPart > 0) {\r\n fractionString = (fractionPart/precisionScale).toFixed(spec.format.precision);\r\n // remove leading \"0.\"\r\n fractionString = fractionString.substring(2).padEnd(spec.format.precision, \"0\");\r\n if (!isKeepTrailingZeroes)\r\n fractionString = Formatter.trimTrailingZeroes(fractionString);\r\n\r\n formattedValue = stationString + spec.format.decimalSeparator + fractionString;\r\n } else {\r\n if (isKeepTrailingZeroes)\r\n fractionString = spec.format.decimalSeparator + \"\".padEnd(spec.format.precision, \"0\");\r\n else if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint))\r\n fractionString = spec.format.decimalSeparator;\r\n formattedValue = stationString + fractionString;\r\n }\r\n }\r\n return formattedValue;\r\n }\r\n\r\n /** Format a quantity value into a single text string based on the current format specification of this class.\r\n * @param magnitude defines the value to spec.format.\r\n * @param spec A FormatterSpec object the defines specification for the magnitude and unit conversions for the formatter.\r\n */\r\n public static formatQuantity(magnitude: number, spec: FormatterSpec): string {\r\n const valueIsNegative = magnitude < 0.0;\r\n let prefix = \"\";\r\n let suffix = \"\";\r\n let formattedValue = \"\";\r\n switch (spec.format.showSignOption) {\r\n case ShowSignOption.NegativeParentheses:\r\n if (valueIsNegative) {\r\n prefix = \"(\";\r\n suffix = \")\";\r\n }\r\n break;\r\n\r\n case ShowSignOption.OnlyNegative:\r\n if (valueIsNegative)\r\n prefix = \"-\";\r\n\r\n break;\r\n\r\n case ShowSignOption.SignAlways:\r\n if (valueIsNegative)\r\n prefix = \"-\";\r\n else\r\n prefix = \"+\";\r\n\r\n break;\r\n\r\n case ShowSignOption.NoSign:\r\n default:\r\n break;\r\n }\r\n\r\n let formattedMagnitude = \"\";\r\n\r\n if (spec.format.hasUnits) {\r\n formattedMagnitude = Formatter.formatComposite(magnitude, spec);\r\n } else {\r\n // unitless quantity\r\n formattedMagnitude = Formatter.formatMagnitude(magnitude, spec);\r\n if (formattedMagnitude.length > 0 && spec.unitConversions.length > 0 && spec.format.hasFormatTraitSet(FormatTraits.ShowUnitLabel)) {\r\n if (spec.format.hasFormatTraitSet(FormatTraits.PrependUnitLabel))\r\n formattedMagnitude = spec.unitConversions[0].label + spec.format.uomSeparator + formattedMagnitude;\r\n else\r\n formattedMagnitude = formattedMagnitude + spec.format.uomSeparator + spec.unitConversions[0].label;\r\n }\r\n }\r\n // add Sign prefix and suffix as necessary\r\n if ((prefix.length > 0 || suffix.length > 0) && formattedMagnitude.length > 0)\r\n formattedValue = prefix + formattedMagnitude + suffix;\r\n else\r\n formattedValue = formattedMagnitude;\r\n\r\n if (spec.format.minWidth && spec.format.minWidth < formattedValue.length)\r\n formattedValue.padStart(spec.format.minWidth, \" \");\r\n\r\n return formattedValue;\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"Formatter.js","sourceRoot":"","sources":["../../../src/Formatter/Formatter.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAuB,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEhI;;GAEG;AACH,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC;;GAEG;AACH,MAAM,iBAAiB;IAOrB,YAAY,KAAa,EAAE,SAA8B,EAAE,MAAe;QANlE,cAAS,GAAW,CAAC,CAAC;QACtB,eAAU,GAAW,CAAC,CAAC;QACvB,iBAAY,GAAW,CAAC,CAAC;QACzB,0BAAqB,GAAW,CAAC,CAAC;QAClC,eAAU,GAAa,EAAE,CAAC;QAGhC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,SAAmB,CAAC,CAAC;QAC3C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAEO,SAAS,CAAC,KAAa,EAAE,WAAmB;QAClD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC,CAAC;QAEjF,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,SAAiB,EAAE,WAAmB;QACpE,IAAI,CAAC,CAAC;QACN,OAAO,WAAW,KAAK,CAAC,EAAE,CAAC;YACzB,CAAC,GAAG,SAAS,GAAG,WAAW,CAAC;YAC5B,SAAS,GAAG,WAAW,CAAC;YACxB,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,CAAC;IAED,IAAW,oBAAoB,KAAa,OAAO,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAChF,IAAW,eAAe,KAAc,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAW,MAAM,KAAc,OAAO,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvD,iBAAiB;QACtB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAE5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,kBAAkB;QACvB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAE5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,oBAAoB;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAE5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,aAAa,CAAC,MAAe;QACnC,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAChC,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QAEpC,IAAI,MAAM,IAAI,IAAI,CAAC,qBAAqB,GAAG,CAAC,EAAE,CAAC;YAC7C,SAAS,IAAI,IAAI,CAAC,oBAAoB,CAAC;YACvC,WAAW,IAAI,IAAI,CAAC,oBAAoB,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,SAAS;IAIZ,MAAM,CAAC,YAAY,CAAC,KAAa,IAAa,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAE9G;;;OAGG;IACK,MAAM,CAAC,WAAW,CAAC,KAAa,EAAE,OAAe;QACvD,IAAI,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC;YACjC,OAAO,KAAK,CAAC;QAEf,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,GAAG,GAAG,eAAe,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC;QACrB,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACpC,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,iBAAiB,CAAC,SAAiB,EAAE,IAAmB;QACrE,6CAA6C;QAC7C,IAAI,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE1C,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAChJ,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,WAAW,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;YAE5C,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC;gBAClC,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;YAChC,CAAC;YAED,IAAI,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,cAAc,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;gBAC/G,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;YAChC,CAAC;YAED,cAAc,GAAG,SAAS,CAAC;QAC7B,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,kBAAkB,CAAC,MAAc;QAC9C,IAAI,oBAAoB,GAAG,CAAC,CAAC,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,eAAe,EAAE,CAAC;gBAC/D,oBAAoB,GAAG,CAAC,CAAC;gBACzB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,oBAAoB,IAAI,CAAC;YAC3B,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,oBAAoB,GAAG,CAAC,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,mBAAmB,CAAC,cAAsB,EAAE,UAAmB,EAAE,KAAa,EAAE,IAAmB;QAChH,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,aAAa,GAAG,SAAS,CAAC,iBAAiB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,SAAS,CAAC,eAAe,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9D,aAAa,GAAG,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU;gBACb,aAAa,GAAG,GAAG,aAAa,GAAG,CAAC;QACxC,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,IAAmB;QACnE,MAAM,gBAAgB,GAAa,EAAE,CAAC;QAEtC,uHAAuH;QACvH,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEvC,4DAA4D;QAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACnD,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YAE1D,IAAI,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,GAAG;gBACtC,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,sBAAsB,EAAE,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,qCAAqC,CAAC,CAAC;YACtI,IAAI,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;gBACtC,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,sBAAsB,EAAE,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,qCAAqC,CAAC,CAAC;YAEtI,IAAI,SAAS,GAAG,CAAC,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC,oDAAoD;YACjK,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACZ,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAE,sFAAsF;gBAC/H,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,cAAc,GAAG,eAAe,CAAC,GAAG,cAAc,CAAC;gBACtF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC;oBACzF,OAAO,EAAE,CAAC;YACd,CAAC;YAED,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACxC,MAAM,aAAa,GAAG,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;gBAC1F,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;gBACrC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,aAAa,GAAG,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;gBACzF,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,IAAmB;QACnE,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC;YAC5F,OAAO,EAAE,CAAC;QAEZ,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,aAAa,CAAC;YAC3D,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAErF,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,UAAU,CAAC,CAAC;QACtF,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,UAAU,CAAC,CAAC;QAChF,gEAAgE;QAChE,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,gBAAgB,CAAC,IAAI,CAAC;QACxE,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QACpF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACrF,IAAI,MAAM,GAAG,GAAG,CAAC;QAEjB,IAAI,KAAK,IAAI,CAAC,YAAY,KAAK,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACnC,IAAI,WAAW,GAAG,KAAK,CAAC;YACxB,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;gBACd,GAAG,GAAG,CAAC,GAAG,CAAC;gBACX,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;YAED,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC/C,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,cAAc,CAAC,cAAc,IAAI,YAAY,GAAG,GAAG;oBACpF,MAAM,IAAI,GAAG,CAAC;qBACX,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,cAAc,CAAC,UAAU,IAAI,YAAY,GAAG,GAAG;oBACrF,MAAM,IAAI,GAAG,CAAC;gBAEhB,IAAI,WAAW;oBACb,MAAM,GAAG,CAAC,MAAM,CAAC;YACrB,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;YACvC,YAAY,IAAI,MAAM,CAAC;QACzB,CAAC;QAED,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,YAAY,GAAG,SAAS,CAAC,gBAAgB,CAAC;YAC/G,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;YACzC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,cAAc,GAAG,eAAe,CAAC;gBACzE,IAAI,YAAY,IAAI,cAAc,EAAE,CAAC;oBACnC,SAAS,IAAI,CAAC,CAAC;oBACf,YAAY,IAAI,cAAc,CAAC;gBACjC,CAAC;YACH,CAAC;YAED,cAAc,GAAG,SAAS,CAAC,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC9D,IAAI,eAAe,EAAE,CAAC;gBACpB,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB;oBACnF,cAAc,GAAG,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;qBAC5D,IAAI,gBAAgB;oBACvB,cAAc,GAAG,GAAG,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,cAAc,CAAC;gBACzD,IAAI,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACjE,sBAAsB;gBACtB,cAAc,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAChF,IAAI,CAAC,oBAAoB;oBACvB,cAAc,GAAG,SAAS,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;gBAEhE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC;oBAC3B,cAAc,GAAG,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,cAAc,CAAC;qBAC7E,CAAC;oBACJ,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,gBAAgB,CAAC;wBAC9D,cAAc,GAAG,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnG,CAAC;YACH,CAAC;YAED,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,cAAc,GAAG,cAAc,GAAG,SAAS,CAAC;YAC9C,CAAC;QACH,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,SAAgC,EAAE,IAAI,CAAC,CAAC;YACnG,cAAc,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAExC,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;gBACrC,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBACpG,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,oBAAoB,EAAE,EAAE,CAAC;gBACjF,cAAc,GAAG,cAAc,GAAG,sBAAsB,GAAG,cAAc,CAAC;YAC5E,CAAC;QACH,CAAC;aAAM,mBAAmB,CAAC,CAAC;YAC1B,mDAAmD;YACnD,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,cAAc,GAAG,eAAe,CAAC,GAAG,cAAc,CAAC;YAE5F,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAkB,CAAC,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,gCAAgC;YACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,WAAW,CAAC;YAC5C,MAAM,KAAK,GAAG,YAAY,GAAG,IAAI,CAAC;YAClC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,cAAc,GAAG,eAAe,CAAC,CAAC;YAC1E,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAkB,EAAE,GAAG,CAAC,CAAC;YAC1I,IAAI,cAAc,GAAG,EAAE,CAAC;YACxB,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,cAAc,GAAG,CAAC,YAAY,GAAC,cAAc,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC9E,sBAAsB;gBACtB,cAAc,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAChF,IAAI,CAAC,oBAAoB;oBACvB,cAAc,GAAG,SAAS,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;gBAEhE,cAAc,GAAG,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,cAAc,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,IAAI,oBAAoB;oBACtB,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;qBACnF,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,gBAAgB,CAAC;oBACnE,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBAChD,cAAc,GAAG,aAAa,GAAG,cAAc,CAAC;YAClD,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,cAAc,CAAC,SAAiB,EAAE,IAAmB;QACjE,MAAM,eAAe,GAAG,SAAS,GAAG,GAAG,CAAC;QACxC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,QAAQ,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACnC,KAAK,cAAc,CAAC,mBAAmB;gBACrC,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,GAAG,GAAG,CAAC;oBACb,MAAM,GAAG,GAAG,CAAC;gBACf,CAAC;gBACD,MAAM;YAER,KAAK,cAAc,CAAC,YAAY;gBAC9B,IAAI,eAAe;oBACjB,MAAM,GAAG,GAAG,CAAC;gBAEf,MAAM;YAER,KAAK,cAAc,CAAC,UAAU;gBAC5B,IAAI,eAAe;oBACjB,MAAM,GAAG,GAAG,CAAC;;oBAEb,MAAM,GAAG,GAAG,CAAC;gBAEf,MAAM;YAER,KAAK,cAAc,CAAC,MAAM,CAAC;YAC3B;gBACE,MAAM;QACV,CAAC;QAED,IAAI,kBAAkB,GAAG,EAAE,CAAC;QAE5B,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,kBAAkB,GAAG,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,oBAAoB;YACpB,kBAAkB,GAAG,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAChE,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;gBAClI,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,gBAAgB,CAAC;oBAC9D,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,kBAAkB,CAAC;;oBAEnG,kBAAkB,GAAG,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACvG,CAAC;QACH,CAAC;QACD,0CAA0C;QAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;YAC3E,cAAc,GAAG,MAAM,GAAG,kBAAkB,GAAG,MAAM,CAAC;;YAEtD,cAAc,GAAG,kBAAkB,CAAC;QAEtC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,cAAc,CAAC,MAAM;YACtE,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAErD,OAAO,cAAc,CAAC;IACxB,CAAC;;AAzTD,gEAAgE;AACjD,0BAAgB,GAAG,OAAO,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/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { QuantityConstants } from \"../Constants\";\r\nimport { QuantityError, QuantityStatus } from \"../Exception\";\r\nimport { FormatterSpec } from \"./FormatterSpec\";\r\nimport { DecimalPrecision, FormatTraits, FormatType, FractionalPrecision, ScientificType, ShowSignOption } from \"./FormatEnums\";\r\n\r\n/** rounding additive\r\n * @internal\r\n */\r\nconst FPV_ROUNDFACTOR = 0.50000000001;\r\n\r\n/** A private helper class used to format fraction part of value into a numerator and denominator.\r\n * @internal\r\n */\r\nclass FractionalNumeric {\r\n private _integral: number = 0;\r\n private _numerator: number = 0;\r\n private _denominator: number = 1;\r\n private _greatestCommonFactor: number = 1;\r\n private _textParts: string[] = [];\r\n\r\n constructor(value: number, precision: FractionalPrecision, reduce: boolean) {\r\n this.calculate(value, precision as number);\r\n this.formTextParts(reduce);\r\n }\r\n\r\n private calculate(value: number, denominator: number) {\r\n const positiveValue = Math.abs(value);\r\n this._denominator = denominator;\r\n this._integral = Math.floor(positiveValue);\r\n const fractionPart = positiveValue - this._integral;\r\n this._numerator = Math.floor(fractionPart * this._denominator + FPV_ROUNDFACTOR);\r\n\r\n if (0 !== denominator && (this._numerator / this._denominator) === 1) {\r\n this._numerator = 0;\r\n this._integral += 1;\r\n } else {\r\n this._greatestCommonFactor = this.getGreatestCommonFactor(this._numerator, this._denominator);\r\n }\r\n }\r\n\r\n /** Determine the GCD given two values. This value can be used to reduce a fraction.\r\n * See algorithm description http://en.wikipedia.org/wiki/Euclidean_algorithm\r\n */\r\n private getGreatestCommonFactor(numerator: number, denominator: number): number {\r\n let r;\r\n while (denominator !== 0) {\r\n r = numerator % denominator;\r\n numerator = denominator;\r\n denominator = r;\r\n }\r\n return (numerator < 0) ? -numerator : numerator;\r\n }\r\n\r\n public get greatestCommonFactor(): number { return this._greatestCommonFactor; }\r\n public get hasFractionPart(): boolean { return this._textParts.length > 0; }\r\n public get isZero(): boolean { return 0 === this._numerator; }\r\n\r\n public getIntegralString(): string {\r\n if (this._textParts.length > 0)\r\n return this._textParts[0];\r\n\r\n return \"\";\r\n }\r\n\r\n public getNumeratorString(): string {\r\n if (this._textParts.length >= 3)\r\n return this._textParts[1];\r\n\r\n return \"\";\r\n }\r\n\r\n public getDenominatorString(): string {\r\n if (this._textParts.length >= 3)\r\n return this._textParts[2];\r\n\r\n return \"\";\r\n }\r\n\r\n private formTextParts(reduce: boolean): void {\r\n let numerator = this._numerator;\r\n let denominator = this._denominator;\r\n\r\n if (reduce && this._greatestCommonFactor > 1) {\r\n numerator /= this.greatestCommonFactor;\r\n denominator /= this.greatestCommonFactor;\r\n }\r\n\r\n this._textParts.push(this._integral.toFixed(0));\r\n if (numerator > 0) {\r\n this._textParts.push(numerator.toFixed(0));\r\n this._textParts.push(denominator.toFixed(0));\r\n }\r\n }\r\n}\r\n\r\n/** A helper class that contains methods used to format quantity values based on a format that are defined via the Format class.\r\n * @beta\r\n */\r\nexport class Formatter {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private static FPV_MINTHRESHOLD = 1.0e-14;\r\n\r\n private static isNegligible(value: number): boolean { return (Math.abs(value) < Formatter.FPV_MINTHRESHOLD); }\r\n\r\n /** Return floating point value rounded by specific rounding factor.\r\n * @param value Value to be rounded.\r\n * @param roundTo Rounding factor.\r\n */\r\n private static roundDouble(value: number, roundTo: number): number {\r\n if (Formatter.isNegligible(roundTo))\r\n return value;\r\n\r\n roundTo = Math.abs(roundTo);\r\n let rnd = FPV_ROUNDFACTOR + (value / roundTo);\r\n const iVal = Math.floor(rnd);\r\n rnd = iVal * roundTo;\r\n return (value < 0.0) ? -rnd : rnd;\r\n }\r\n\r\n /** Generate a formatted text string integer value insert 1000 separators if appropriate.\r\n * @param wholePart Integer value to be formatted.\r\n */\r\n private static integerPartToText(wholePart: number, spec: FormatterSpec): string {\r\n // build invariant string represent wholePart\r\n let formattedValue = wholePart.toFixed(0);\r\n\r\n if ((formattedValue.length > 3) && (spec.format.hasFormatTraitSet(FormatTraits.Use1000Separator) && (spec.format.thousandSeparator.length > 0))) {\r\n let numSeparators = Math.floor(formattedValue.length / 3);\r\n let groupLength = formattedValue.length % 3;\r\n\r\n if (groupLength === 0) {\r\n numSeparators = numSeparators - 1;\r\n groupLength = groupLength + 3;\r\n }\r\n\r\n let outString = formattedValue.substring(0, groupLength);\r\n\r\n for (let i = 1; i <= numSeparators; i += 1) {\r\n outString = outString + spec.format.thousandSeparator + formattedValue.substring(groupLength, groupLength + 3);\r\n groupLength = groupLength + 3;\r\n }\r\n\r\n formattedValue = outString;\r\n }\r\n\r\n return formattedValue;\r\n }\r\n\r\n /** Trim trailing \"0\" from the text that represent the fractional part of a floating point value.\r\n * @param strVal The value string.\r\n */\r\n private static trimTrailingZeroes(strVal: string): string {\r\n let lastNonZeroCharIndex = -1;\r\n for (let i = strVal.length - 1; i >= 0; i--) {\r\n if (strVal.charCodeAt(i) !== QuantityConstants.CHAR_DIGIT_ZERO) {\r\n lastNonZeroCharIndex = i;\r\n break;\r\n }\r\n }\r\n if (lastNonZeroCharIndex >= 0)\r\n return strVal.substring(0, lastNonZeroCharIndex + 1);\r\n return \"\";\r\n }\r\n\r\n /** Format a quantity value into a composite format such as ft-in or deg-min-sec.\r\n * @param compositeValue The value for this part of the composite\r\n * @param isLastPart If false the composite value should be a whole value, if true then the value should be formatted as a floating point value.\r\n * @param label Label for this part of the composite. This will be either the default unit label or a custom label specified the format specification.\r\n */\r\n private static formatCompositePart(compositeValue: number, isLastPart: boolean, label: string, spec: FormatterSpec): string {\r\n let componentText = \"\";\r\n if (!isLastPart) {\r\n componentText = Formatter.integerPartToText(compositeValue, spec);\r\n } else {\r\n componentText = Formatter.formatMagnitude(compositeValue, spec);\r\n }\r\n\r\n if (spec.format.hasFormatTraitSet(FormatTraits.ShowUnitLabel)) {\r\n componentText = componentText + spec.format.uomSeparator + label;\r\n } else {\r\n if (!isLastPart)\r\n componentText = `${componentText}:`;\r\n }\r\n\r\n return componentText;\r\n }\r\n\r\n /** Format a quantity value into a composite format such as ft-in or deg-min-sec.\r\n * @param magnitude quantity value\r\n * @param fromUnit quantity unit\r\n */\r\n private static formatComposite(magnitude: number, spec: FormatterSpec): string {\r\n const compositeStrings: string[] = [];\r\n\r\n // Caller will deal with appending +||-||() value sign as specified by formatting options so just format positive value\r\n let posMagnitude = Math.abs(magnitude);\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\r\n for (let i = 0; i < spec.unitConversions.length; i++) {\r\n const currentLabel = spec.unitConversions[i].label;\r\n const unitConversion = spec.unitConversions[i].conversion;\r\n\r\n if (i > 0 && unitConversion.factor < 1.0)\r\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} has a invalid unit specification..`);\r\n if (i > 0 && unitConversion.offset !== 0)\r\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} has a invalid unit specification..`);\r\n\r\n let unitValue = (posMagnitude * unitConversion.factor) + unitConversion.offset + Formatter.FPV_MINTHRESHOLD; // offset should only ever be defined for major unit\r\n if (0 === i) {\r\n const precisionScale = Math.pow(10, 8); // use a fixed round off precision of 8 to avoid loss of precision in actual magnitude\r\n unitValue = Math.floor(unitValue * precisionScale + FPV_ROUNDFACTOR) / precisionScale;\r\n if ((Math.abs(unitValue) < 0.0001) && spec.format.hasFormatTraitSet(FormatTraits.ZeroEmpty))\r\n return \"\";\r\n }\r\n\r\n if (i < spec.format.units!.length - 1) {\r\n const wholePart = Math.floor(unitValue);\r\n const componentText = Formatter.formatCompositePart(wholePart, false, currentLabel, spec);\r\n posMagnitude = unitValue - wholePart;\r\n compositeStrings.push(componentText);\r\n } else {\r\n const componentText = Formatter.formatCompositePart(unitValue, true, currentLabel, spec);\r\n compositeStrings.push(componentText);\r\n }\r\n }\r\n\r\n return compositeStrings.join(spec.format.spacer ? spec.format.spacer : \"\");\r\n }\r\n\r\n /** Format a quantity value into a single text string. Imitate how formatting done by server method NumericFormatSpec::FormatDouble.\r\n * @param magnitude quantity value\r\n */\r\n private static formatMagnitude(magnitude: number, spec: FormatterSpec): string {\r\n let posMagnitude = Math.abs(magnitude);\r\n if ((Math.abs(posMagnitude) < 0.0001) && spec.format.hasFormatTraitSet(FormatTraits.ZeroEmpty))\r\n return \"\";\r\n\r\n if (spec.format.hasFormatTraitSet(FormatTraits.ApplyRounding))\r\n posMagnitude = Math.abs(Formatter.roundDouble(magnitude, spec.format.roundFactor));\r\n\r\n const isSci = ((posMagnitude > 1.0e12) || spec.format.type === FormatType.Scientific);\r\n const isDecimal = (isSci || spec.format.type === FormatType.Decimal);\r\n const isFractional = (!isDecimal && spec.format.type === FormatType.Fractional);\r\n /* const usesStops = spec.format.type === FormatType.Station; */\r\n const isPrecisionZero = spec.format.precision === DecimalPrecision.Zero;\r\n const isKeepSingleZero = spec.format.hasFormatTraitSet(FormatTraits.KeepSingleZero);\r\n const precisionScale = Math.pow(10.0, spec.format.precision);\r\n const isKeepTrailingZeroes = spec.format.hasFormatTraitSet(FormatTraits.TrailZeroes);\r\n let expInt = 0.0;\r\n\r\n if (isSci && (posMagnitude !== 0.0)) {\r\n let exp = Math.log10(posMagnitude);\r\n let negativeExp = false;\r\n if (exp < 0.0) {\r\n exp = -exp;\r\n negativeExp = true;\r\n }\r\n\r\n expInt = Math.floor(exp);\r\n if (spec.format.type === FormatType.Scientific) {\r\n if (spec.format.scientificType === ScientificType.ZeroNormalized && posMagnitude > 1.0)\r\n expInt += 1.0;\r\n else if (spec.format.scientificType === ScientificType.Normalized && posMagnitude < 1.0)\r\n expInt += 1.0;\r\n\r\n if (negativeExp)\r\n expInt = -expInt;\r\n }\r\n\r\n const factor = Math.pow(10.0, -expInt);\r\n posMagnitude *= factor;\r\n }\r\n\r\n let formattedValue = \"\";\r\n if (isDecimal) {\r\n const actualVal = isPrecisionZero ? posMagnitude + FPV_ROUNDFACTOR : posMagnitude + Formatter.FPV_MINTHRESHOLD;\r\n let wholePart = Math.floor(actualVal);\r\n let fractionPart = actualVal - wholePart;\r\n if (!isPrecisionZero) {\r\n fractionPart = Math.abs(fractionPart) * precisionScale + FPV_ROUNDFACTOR;\r\n if (fractionPart >= precisionScale) {\r\n wholePart += 1;\r\n fractionPart -= precisionScale;\r\n }\r\n }\r\n\r\n formattedValue = Formatter.integerPartToText(wholePart, spec);\r\n if (isPrecisionZero) {\r\n if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint) && !isKeepSingleZero)\r\n formattedValue = formattedValue + spec.format.decimalSeparator;\r\n else if (isKeepSingleZero)\r\n formattedValue = `${formattedValue + spec.format.decimalSeparator}0`;\r\n } else {\r\n fractionPart = Math.floor(fractionPart) / precisionScale;\r\n let fractionString = fractionPart.toFixed(spec.format.precision);\r\n // remove leading \"0.\"\r\n fractionString = fractionString.substring(2).padEnd(spec.format.precision, \"0\");\r\n if (!isKeepTrailingZeroes)\r\n fractionString = Formatter.trimTrailingZeroes(fractionString);\r\n\r\n if (fractionString.length > 0)\r\n formattedValue = formattedValue + spec.format.decimalSeparator + fractionString;\r\n else {\r\n if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint))\r\n formattedValue = formattedValue + spec.format.decimalSeparator + (isKeepSingleZero ? \"0\" : \"\");\r\n }\r\n }\r\n\r\n if (isSci) {\r\n const expString = `e${expInt.toFixed(0)}`;\r\n formattedValue = formattedValue + expString;\r\n }\r\n } else if (isFractional) {\r\n const fn = new FractionalNumeric(posMagnitude, spec.format.precision as FractionalPrecision, true);\r\n formattedValue = fn.getIntegralString();\r\n\r\n if (!fn.isZero && fn.hasFractionPart) {\r\n const wholeFractionSeparator = spec.format.hasFormatTraitSet(FormatTraits.FractionDash) ? \"-\" : \" \";\r\n const fractionString = `${fn.getNumeratorString()}/${fn.getDenominatorString()}`;\r\n formattedValue = formattedValue + wholeFractionSeparator + fractionString;\r\n }\r\n } else /* if (usesStops)*/ {\r\n // we assume that stopping value is always positive\r\n posMagnitude = Math.floor(posMagnitude * precisionScale + FPV_ROUNDFACTOR) / precisionScale;\r\n\r\n const denominator = (Math.pow(10, spec.format.stationOffsetSize!));\r\n const tVal = Math.floor(posMagnitude); // this is the integer part only\r\n const hiPart = Math.floor(tVal / denominator);\r\n const lowPart = tVal - hiPart * denominator;\r\n const fract = posMagnitude - tVal;\r\n const fractionPart = Math.floor(fract * precisionScale + FPV_ROUNDFACTOR);\r\n const stationString = hiPart.toFixed(0) + spec.format.stationSeparator + lowPart.toFixed(0).padStart(spec.format.stationOffsetSize!, \"0\");\r\n let fractionString = \"\";\r\n if (fractionPart > 0) {\r\n fractionString = (fractionPart/precisionScale).toFixed(spec.format.precision);\r\n // remove leading \"0.\"\r\n fractionString = fractionString.substring(2).padEnd(spec.format.precision, \"0\");\r\n if (!isKeepTrailingZeroes)\r\n fractionString = Formatter.trimTrailingZeroes(fractionString);\r\n\r\n formattedValue = stationString + spec.format.decimalSeparator + fractionString;\r\n } else {\r\n if (isKeepTrailingZeroes)\r\n fractionString = spec.format.decimalSeparator + \"\".padEnd(spec.format.precision, \"0\");\r\n else if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint))\r\n fractionString = spec.format.decimalSeparator;\r\n formattedValue = stationString + fractionString;\r\n }\r\n }\r\n return formattedValue;\r\n }\r\n\r\n /** Format a quantity value into a single text string based on the current format specification of this class.\r\n * @param magnitude defines the value to spec.format.\r\n * @param spec A FormatterSpec object the defines specification for the magnitude and unit conversions for the formatter.\r\n */\r\n public static formatQuantity(magnitude: number, spec: FormatterSpec): string {\r\n const valueIsNegative = magnitude < 0.0;\r\n let prefix = \"\";\r\n let suffix = \"\";\r\n let formattedValue = \"\";\r\n switch (spec.format.showSignOption) {\r\n case ShowSignOption.NegativeParentheses:\r\n if (valueIsNegative) {\r\n prefix = \"(\";\r\n suffix = \")\";\r\n }\r\n break;\r\n\r\n case ShowSignOption.OnlyNegative:\r\n if (valueIsNegative)\r\n prefix = \"-\";\r\n\r\n break;\r\n\r\n case ShowSignOption.SignAlways:\r\n if (valueIsNegative)\r\n prefix = \"-\";\r\n else\r\n prefix = \"+\";\r\n\r\n break;\r\n\r\n case ShowSignOption.NoSign:\r\n default:\r\n break;\r\n }\r\n\r\n let formattedMagnitude = \"\";\r\n\r\n if (spec.format.hasUnits) {\r\n formattedMagnitude = Formatter.formatComposite(magnitude, spec);\r\n } else {\r\n // unitless quantity\r\n formattedMagnitude = Formatter.formatMagnitude(magnitude, spec);\r\n if (formattedMagnitude.length > 0 && spec.unitConversions.length > 0 && spec.format.hasFormatTraitSet(FormatTraits.ShowUnitLabel)) {\r\n if (spec.format.hasFormatTraitSet(FormatTraits.PrependUnitLabel))\r\n formattedMagnitude = spec.unitConversions[0].label + spec.format.uomSeparator + formattedMagnitude;\r\n else\r\n formattedMagnitude = formattedMagnitude + spec.format.uomSeparator + spec.unitConversions[0].label;\r\n }\r\n }\r\n // add Sign prefix and suffix as necessary\r\n if ((prefix.length > 0 || suffix.length > 0) && formattedMagnitude.length > 0)\r\n formattedValue = prefix + formattedMagnitude + suffix;\r\n else\r\n formattedValue = formattedMagnitude;\r\n\r\n if (spec.format.minWidth && spec.format.minWidth < formattedValue.length)\r\n formattedValue.padStart(spec.format.minWidth, \" \");\r\n\r\n return formattedValue;\r\n }\r\n\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"FormatterSpec.js","sourceRoot":"","sources":["../../../src/Formatter/FormatterSpec.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 { UnitConversionProps, UnitConversionSpec, UnitProps, UnitsProvider } from \"../Interfaces\";\r\nimport { Format } from \"./Format\";\r\nimport { Formatter } from \"./Formatter\";\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 class that contains both formatting information and the conversion factors necessary to convert from an input unit to the units specified in the format.\r\n * Once created the FormatterSpec will be able to format quantity values with synchronous calls.\r\n * @beta\r\n */\r\nexport class FormatterSpec {\r\n protected _name: string;\r\n protected _conversions: UnitConversionSpec[] = []; // max four entries\r\n protected _format: Format;\r\n protected _persistenceUnit: UnitProps;\r\n\r\n /** Constructor\r\n * @param name 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 * @param persistenceUnit The unit the magnitude value is input.\r\n */\r\n constructor(name: string, format: Format, conversions?: UnitConversionSpec[], persistenceUnit?: UnitProps) {\r\n if (!persistenceUnit) {\r\n if (format.units) {\r\n const [props] = format.units[0];\r\n persistenceUnit = props;\r\n } else {\r\n throw new Error(\"Formatter Spec needs persistence unit to be specified\");\r\n }\r\n }\r\n\r\n this._name = name;\r\n this._format = format;\r\n this._persistenceUnit = persistenceUnit;\r\n if (conversions)\r\n this._conversions = conversions;\r\n }\r\n\r\n public get name(): string { return this._name; }\r\n /** Returns an array of UnitConversionSpecs, one for each unit that is to be shown in the formatted quantity string. */\r\n public get unitConversions(): UnitConversionSpec[] { return this._conversions; }\r\n public get format(): Format { return this._format; }\r\n public get persistenceUnit(): UnitProps { return this._persistenceUnit; }\r\n\r\n /** Get an array of UnitConversionSpecs, one for each unit that is to be shown in the formatted quantity string. */\r\n public static async getUnitConversions(format: Format, unitsProvider: UnitsProvider, inputUnit?: UnitProps): Promise<UnitConversionSpec[]> {\r\n const conversions: UnitConversionSpec[] = [];\r\n let persistenceUnit = inputUnit;\r\n if (!persistenceUnit) {\r\n if (format.units) {\r\n const [props] = format.units[0];\r\n persistenceUnit = props;\r\n } else {\r\n throw new Error(\"Formatter Spec needs persistence unit to be specified\");\r\n }\r\n }\r\n\r\n if (format.units) {\r\n let convertFromUnit = inputUnit;\r\n for (const unit of format.units) {\r\n let unitConversion: UnitConversionProps;\r\n if (convertFromUnit) {\r\n unitConversion = await unitsProvider.getConversion(convertFromUnit, unit[0]);\r\n } else {\r\n unitConversion = { factor: 1.0, offset: 0.0 };\r\n }\r\n const unitLabel = (unit[1] && unit[1]!.length > 0) ? unit[1]! : unit[0].label;\r\n const spec = ({ name: unit[0].name, label: unitLabel, conversion: unitConversion, system: unit[0].system }) as UnitConversionSpec;\r\n\r\n conversions.push(spec);\r\n convertFromUnit = unit[0];\r\n }\r\n } else {\r\n // if format is only numeric and a input unit is defined set spec to use the input unit as the format unit\r\n if (inputUnit) {\r\n const spec: UnitConversionSpec = { name: inputUnit.name, label: inputUnit.label, system: inputUnit.system, conversion: { factor: 1.0, offset: 0.0 } };\r\n conversions.push(spec);\r\n }\r\n }\r\n\r\n return conversions;\r\n }\r\n\r\n /** Static async method to create a FormatSpec given the format and unit of the quantity that will be passed to the Formatter. 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 name The name of a 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 inputUnit The unit the value to be formatted. This unit is often referred to as persistence unit.\r\n */\r\n public static async create(name: string, format: Format, unitsProvider: UnitsProvider, inputUnit?: UnitProps): Promise<FormatterSpec> {\r\n const conversions: UnitConversionSpec[] = await FormatterSpec.getUnitConversions(format, unitsProvider, inputUnit);\r\n return new FormatterSpec(name, format, conversions, inputUnit);\r\n }\r\n\r\n /** Format a quantity value. */\r\n public applyFormatting(magnitude: number): string {\r\n return Formatter.formatQuantity(magnitude, this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"FormatterSpec.js","sourceRoot":"","sources":["../../../src/Formatter/FormatterSpec.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 { UnitConversionProps, UnitConversionSpec, UnitProps, UnitsProvider } from \"../Interfaces\";\r\nimport { Format } from \"./Format\";\r\nimport { Formatter } from \"./Formatter\";\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 class that contains both formatting information and the conversion factors necessary to convert from an input unit to the units specified in the format.\r\n * Once created the FormatterSpec will be able to format quantity values with synchronous calls.\r\n * @beta\r\n */\r\nexport class FormatterSpec {\r\n protected _name: string;\r\n protected _conversions: UnitConversionSpec[] = []; // max four entries\r\n protected _format: Format;\r\n protected _persistenceUnit: UnitProps;\r\n\r\n /** Constructor\r\n * @param name 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 * @param persistenceUnit The unit the magnitude value is input.\r\n */\r\n constructor(name: string, format: Format, conversions?: UnitConversionSpec[], persistenceUnit?: UnitProps) {\r\n if (!persistenceUnit) {\r\n if (format.units) {\r\n const [props] = format.units[0];\r\n persistenceUnit = props;\r\n } else {\r\n throw new Error(\"Formatter Spec needs persistence unit to be specified\");\r\n }\r\n }\r\n\r\n this._name = name;\r\n this._format = format;\r\n this._persistenceUnit = persistenceUnit;\r\n if (conversions)\r\n this._conversions = conversions;\r\n }\r\n\r\n public get name(): string { return this._name; }\r\n /** Returns an array of UnitConversionSpecs, one for each unit that is to be shown in the formatted quantity string. */\r\n public get unitConversions(): UnitConversionSpec[] { return this._conversions; }\r\n public get format(): Format { return this._format; }\r\n public get persistenceUnit(): UnitProps { return this._persistenceUnit; }\r\n\r\n /** Get an array of UnitConversionSpecs, one for each unit that is to be shown in the formatted quantity string. */\r\n public static async getUnitConversions(format: Format, unitsProvider: UnitsProvider, inputUnit?: UnitProps): Promise<UnitConversionSpec[]> {\r\n const conversions: UnitConversionSpec[] = [];\r\n let persistenceUnit = inputUnit;\r\n if (!persistenceUnit) {\r\n if (format.units) {\r\n const [props] = format.units[0];\r\n persistenceUnit = props;\r\n } else {\r\n throw new Error(\"Formatter Spec needs persistence unit to be specified\");\r\n }\r\n }\r\n\r\n if (format.units) {\r\n let convertFromUnit = inputUnit;\r\n for (const unit of format.units) {\r\n let unitConversion: UnitConversionProps;\r\n if (convertFromUnit) {\r\n unitConversion = await unitsProvider.getConversion(convertFromUnit, unit[0]);\r\n } else {\r\n unitConversion = { factor: 1.0, offset: 0.0 };\r\n }\r\n const unitLabel = (unit[1] && unit[1].length > 0) ? unit[1] : unit[0].label;\r\n const spec = ({ name: unit[0].name, label: unitLabel, conversion: unitConversion, system: unit[0].system }) as UnitConversionSpec;\r\n\r\n conversions.push(spec);\r\n convertFromUnit = unit[0];\r\n }\r\n } else {\r\n // if format is only numeric and a input unit is defined set spec to use the input unit as the format unit\r\n if (inputUnit) {\r\n const spec: UnitConversionSpec = { name: inputUnit.name, label: inputUnit.label, system: inputUnit.system, conversion: { factor: 1.0, offset: 0.0 } };\r\n conversions.push(spec);\r\n }\r\n }\r\n\r\n return conversions;\r\n }\r\n\r\n /** Static async method to create a FormatSpec given the format and unit of the quantity that will be passed to the Formatter. 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 name The name of a 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 inputUnit The unit the value to be formatted. This unit is often referred to as persistence unit.\r\n */\r\n public static async create(name: string, format: Format, unitsProvider: UnitsProvider, inputUnit?: UnitProps): Promise<FormatterSpec> {\r\n const conversions: UnitConversionSpec[] = await FormatterSpec.getUnitConversions(format, unitsProvider, inputUnit);\r\n return new FormatterSpec(name, format, conversions, inputUnit);\r\n }\r\n\r\n /** Format a quantity value. */\r\n public applyFormatting(magnitude: number): string {\r\n return Formatter.formatQuantity(magnitude, this);\r\n }\r\n}\r\n"]}
package/lib/esm/Parser.js CHANGED
@@ -59,7 +59,7 @@ class FractionToken {
59
59
  /** A Parser class that is used to break a string that represents a quantity value into tokens.
60
60
  * @beta
61
61
  */
62
- class Parser {
62
+ export class Parser {
63
63
  static isParsedQuantity(item) {
64
64
  return item.ok;
65
65
  }
@@ -588,5 +588,4 @@ class Parser {
588
588
  }
589
589
  }
590
590
  Parser._log = false;
591
- export { Parser };
592
591
  //# sourceMappingURL=Parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGnE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAN,IAAY,UAOX;AAPD,WAAY,UAAU;IACpB,yFAA+B,CAAA;IAC/B,uFAA0B,CAAA;IAC1B,+FAA8B,CAAA;IAC9B,yDAAW,CAAA;IACX,2GAAoC,CAAA;IACpC,qEAAiB,CAAA;AACnB,CAAC,EAPW,UAAU,KAAV,UAAU,QAOrB;AA4BD;;GAEG;AACH,MAAM,UAAU;IAGd,YAAY,KAAsB;QAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;;YAE1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAW,QAAQ,KAAc,OAAO,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC;IACzE,IAAW,QAAQ,KAAc,OAAO,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,eAAe;IAInB,YAAY,KAAa,EAAE,QAAiB;QAFrC,aAAQ,GAAG,EAAE,CAAC;QAGnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,QAAQ;YACV,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,aAAa;IAKjB,YAAY,KAAa,EAAE,QAAiB;QAHrC,aAAQ,GAAG,GAAG,CAAC;QACf,aAAQ,GAAG,EAAE,CAAC;QAGnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,QAAQ;YACV,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAa,MAAM;IAGV,MAAM,CAAC,gBAAgB,CAAC,IAAyB;QACtD,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,IAAyB;QAClD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAClB,CAAC;IAEO,MAAM,CAAC,0BAA0B,CAAC,KAAa,EAAE,aAAqB,EAAE,oBAA4B;QAC1G,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAElB,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,iBAAiB,CAAC,UAAU,IAAI,QAAQ,KAAK,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;gBAChJ,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;aAC1D;iBAAM;gBACL,CAAC,GAAG,oBAAoB,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAClD,MAAM;aACP;SACF;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACnM,OAAO,IAAI,eAAe,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QAEhD,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,KAAa,EAAE,aAAqB,EAAE,oBAA4B,EAAE,YAAqB;QACxH,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAC1B,IAAI,mBAAmB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,GAAG,KAAK,CAAC;QACd,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3C,cAAc,GAAG,YAAY,CAAC;YAC9B,mBAAmB,GAAG,KAAK,CAAC;SAC7B;QAED,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAC5B,IAAI,mBAAmB,EAAE;oBACvB,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1D;qBAAM;oBACL,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC9D;aACF;iBAAM;gBACL,IAAI,mBAAmB,IAAI,CAAC,QAAQ,KAAK,iBAAiB,CAAC,UAAU,IAAI,QAAQ,KAAK,iBAAiB,CAAC,mBAAmB,IAAI,QAAQ,KAAK,iBAAiB,CAAC,mBAAmB,CAAC,EAAE;oBAClL,mBAAmB,GAAG,KAAK,CAAC;iBAC7B;qBAAM;oBACL,IAAI,oBAAoB,KAAK,QAAQ;wBACnC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,yCAAyC;oBAEtD,MAAM;iBACP;aACF;SACF;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5D,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,WAAW,GAAG,CAAC;gBACjB,OAAO,IAAI,aAAa,CAAC,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC;YACvD,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;SAC7B;QAED,OAAO,IAAI,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAEO,MAAM,CAAC,OAAO,CAAC,QAAgB;QACrC,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAC5G,CAAC;IAEO,MAAM,CAAC,yBAAyB,CAAC,QAAgB,EAAE,MAAc;QACvE,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1F,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,0BAA0B,CAAC,qBAA6B,EAAE,MAAc;QACpF,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAC7B,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAEzB,MAAM,SAAS,GAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAErE,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,OAAO,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YACvG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAExD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,UAAU,IAAI,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE;YAChG,gBAAgB,GAAG,iBAAiB,CAAC,UAAU,CAAC;SACjD;QAED,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,KAAK,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1F,oBAAoB,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACzD,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;SACtC;QAED,4DAA4D;QAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACtD,IAAI,CAAC,gBAAgB,EAAE;oBACrB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;wBACvB,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;wBACtC,QAAQ,GAAG,EAAE,CAAC;qBACf;oBACD,gBAAgB,GAAG,IAAI,CAAC;iBACzB;gBACD,wIAAwI;gBACxI,MAAM,SAAS,GAAG,QAAQ,KAAK,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpF,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aACvC;iBAAM;gBACL,IAAI,gBAAgB,EAAE;oBACpB,IAAI,QAAQ,KAAK,iBAAiB,CAAC,UAAU,IAAI,QAAQ,KAAK,iBAAiB,CAAC,mBAAmB,IAAI,QAAQ,KAAK,iBAAiB,CAAC,mBAAmB,EAAE;wBACzJ,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC;wBACzF,IAAI,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;wBACpC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;wBACtB,IAAI,WAAW,CAAC,QAAQ,KAAK,GAAG,EAAE;4BAChC,QAAQ,GAAG,EAAE,CAAC;4BACd,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gCACxB,IAAI,SAAS,KAAK,GAAG;oCACnB,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC;gCAE1B,SAAS,GAAG,EAAE,CAAC;6BAChB;4BAED,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;4BACtC,gBAAgB,GAAG,KAAK,CAAC;4BACzB,SAAS;yBACV;qBACF;yBAAM;wBACL,wDAAwD;wBACxD,IAAI,QAAQ,KAAK,iBAAiB,CAAC,UAAU,IAAI,QAAQ,KAAK,gBAAgB,EAAE;4BAC9E,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;4BAC/E,IAAI,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;4BACpC,IAAI,WAAW,CAAC,QAAQ,KAAK,GAAG,EAAE;gCAChC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;gCACtB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oCACxB,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;oCAChC,IAAI,SAAS,KAAK,GAAG;wCACnB,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC;oCAE1B,SAAS,GAAG,EAAE,CAAC;iCAChB;gCAED,MAAM,iBAAiB,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;gCAC1D,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;gCAC/C,gBAAgB,GAAG,KAAK,CAAC;gCACzB,QAAQ,GAAG,EAAE,CAAC;6BACf;4BACD,SAAS;yBACV;6BAAM;4BACL,gDAAgD;4BAChD,IAAI,QAAQ,KAAK,iBAAiB,CAAC,YAAY,IAAI,QAAQ,KAAK,iBAAiB,CAAC,YAAY,EAAE;gCAC9F,MAAM,cAAc,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;gCACvF,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC;gCAEzB,IAAI,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oCACjE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;wCACxB,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;wCAChC,SAAS,GAAG,EAAE,CAAC;qCAChB;oCAED,QAAQ,GAAG,GAAG,QAAQ,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC;oCACpD,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;oCACzC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;oCAC7C,gBAAgB,GAAG,KAAK,CAAC;oCACzB,QAAQ,GAAG,EAAE,CAAC;oCACd,SAAS;iCACV;6BACF;yBACF;qBACF;oBAED,gCAAgC;oBAChC,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;wBACvD,SAAS;oBAEX,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;wBACxB,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;wBAChC,SAAS,GAAG,EAAE,CAAC;qBAChB;oBAED,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAElD,QAAQ,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1C,gBAAgB,GAAG,KAAK,CAAC;iBAC1B;qBAAM;oBACL,0BAA0B;oBAC1B,IAAI,CAAC,QAAQ,KAAK,iBAAiB,CAAC,SAAS,IAAI,QAAQ,KAAK,iBAAiB,CAAC,UAAU,CAAC,EAAE;wBAC3F,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,6CAA6C;4BACpE,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;wBACrB,SAAS;qBACV;oBAED,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBACpC;aACF;SACF;QAED,oDAAoD;QACpD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,IAAI,gBAAgB,EAAE;gBACpB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACxB,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;iBACjC;gBACD,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;aACnD;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;aACvC;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,MAAc,EAAE,aAA4B,EAAE,qBAAmD;QACzJ,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7F,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAC5C,+CAA+C;QAC/C,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;gBACrD,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,WAAW;oBAC9C,OAAO,IAAI,CAAC;gBACd,MAAM,eAAe,GAAG,qBAAqB,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBAC5E,8DAA8D;gBAC9D,IAAI,eAAe,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC;oBACrF,OAAO,IAAI,CAAC;gBAEd,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YACH,IAAI,UAAU;gBACZ,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;SACxB;QAED,yDAAyD;QACzD,IAAI,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAExJ,4CAA4C;QAC5C,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,WAAW;YACnC,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxG,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,MAAoB,EAAE,MAAc,EAAE,aAA4B,EAAE,qBAAmD;QACxK,IAAI,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE3F,6CAA6C;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACtB,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC,CAAC;aAC7D;iBAAM;gBACL,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,MAAM,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;gBACnH,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;aAC3B;SACF;QAED,+DAA+D;QAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,MAAM,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;gBACnH,IAAI,SAAS,KAAK,WAAW;oBAC3B,WAAW,GAAG,IAAI,CAAC;gBACrB,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;oBACjD,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC,CAAC;iBAC7D;qBAAM,IAAI,WAAW,EAAE;oBACtB,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;oBACxE,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;oBAClF,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;iBACvC;aACF;iBAAM,EAAG,wDAAwD;gBAChE,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;oBAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,MAAM,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;oBACnH,IAAI,SAAS,KAAK,WAAW;wBAC3B,WAAW,GAAG,IAAI,CAAC;oBACrB,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;wBACjD,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC,CAAC;qBAC7D;yBAAM,IAAI,WAAW,EAAE;wBACtB,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;wBACxE,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;wBAClF,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;qBACvC;iBACF;aACF;SACF;QAED,yDAAyD;QACzD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3B,IAAI,GAAG,GAAG,GAAG,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAC5C,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;oBAChD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC;oBACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAe,EAAE,MAAM,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;oBACvH,IAAI,SAAS,KAAK,WAAW;wBAC3B,WAAW,GAAG,IAAI,CAAC;oBACrB,IAAI,CAAC,KAAK,CAAC,EAAE;wBACX,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;4BAChC,GAAG,GAAG,KAAK,CAAC;6BACT;4BACH,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;4BACxE,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;yBACzD;qBACF;yBAAM;wBACL,IAAI,WAAW,EAAE;4BACf,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;4BACxE,IAAI,GAAG,GAAG,GAAG;gCACX,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;;gCAE9D,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;yBACjE;qBACF;iBACF;aACF;YACD,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;SACvC;QAED,OAAO,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,MAAc,EAAE,aAA4B,EAAE,qBAAmD;QACvJ,MAAM,MAAM,GAAiB,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACrB,OAAO,IAAI,QAAQ,EAAE,CAAC;QAExB,OAAO,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;IACpG,CAAC;IAED,2DAA2D;IACnD,MAAM,CAAC,qBAAqB,CAAC,SAAiB,EAAE,gBAAsC,EAAE,aAAyB;QACvH,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,iBAAiB,EAAE,CAAC;YAE5C;;;;cAIE;YACF,IAAI,aAAa,EAAE;gBACjB,6FAA6F;gBAC7F,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC1G,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,WAAW,EAAE;oBAC1D,IAAI,CAAC,CAAC,KAAK,mBAAmB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC;wBAC1E,OAAO,mBAAmB,CAAC,UAAU,CAAC;iBACzC;gBACD,mGAAmG;gBACnG,MAAM,0BAA0B,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;gBACvH,KAAK,MAAM,UAAU,IAAI,0BAA0B,EAAE;oBACnD,IAAI,UAAU,CAAC,WAAW,EAAE;wBAC1B,IAAI,CAAC,CAAC,KAAK,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC;4BACjE,OAAO,UAAU,CAAC,UAAU,CAAC;qBAChC;iBACF;aACF;YAED,uEAAuE;YACvE,KAAK,MAAM,UAAU,IAAI,gBAAgB,EAAE;gBACzC,IAAI,UAAU,CAAC,WAAW,EAAE;oBAC1B,IAAI,CAAC,CAAC,KAAK,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC;wBACjE,OAAO,UAAU,CAAC,UAAU,CAAC;iBAChC;qBAAM;oBACL,sCAAsC;oBACtC,OAAO,CAAC,GAAG,CAAC,sGAAsG,CAAC,CAAC;iBACrH;aACF;SACF;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,MAAM,CAAC,+BAA+B,CAAC,MAAoB,EAAE,MAAc,EAAE,gBAAsC;QACzH,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,6CAA6C;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACtB,IAAI,WAAW,EAAE;oBACf,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;oBAClG,IAAI,UAAU,EAAE;wBACd,MAAM,KAAK,GAAI,MAAM,CAAC,CAAC,CAAC,CAAC,KAAgB,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;wBAClF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;qBAC5B;iBACF;qBAAM;oBACL,gEAAgE;oBAChE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,CAAC;iBACvD;aACF;iBAAM;gBACL,6DAA6D;gBAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;gBAC1G,IAAI,SAAS,KAAK,UAAU;oBAC1B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;;oBAElE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,0BAA0B,EAAE,CAAC;aACtE;SACF;QAED,+DAA+D;QAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;gBAC1G,IAAI,UAAU,EAAE;oBACd,MAAM,KAAK,GAAI,MAAM,CAAC,CAAC,CAAC,CAAC,KAAgB,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;oBAClF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;iBAC5B;gBACD,+EAA+E;gBAC/E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,CAAC;aACvD;iBAAM,EAAG,wDAAwD;gBAChE,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;oBAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;oBAC1G,IAAI,UAAU,EAAE;wBACd,MAAM,KAAK,GAAI,MAAM,CAAC,CAAC,CAAC,CAAC,KAAgB,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;wBAClF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;qBAC5B;oBACD,+EAA+E;oBAC/E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,CAAC;iBACvD;aACF;SACF;QAED,yDAAyD;QACzD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3B,IAAI,GAAG,GAAG,GAAG,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAC5C,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;oBAChD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC;oBACxC,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAe,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;oBAC9G,IAAI,UAAU,EAAE;wBACd,IAAI,GAAG,GAAG,GAAG;4BACX,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;;4BAE9D,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;qBACjE;iBACF;aACF;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;SACjC;QAED,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,oCAAoC,EAAE,CAAC;IAC/E,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,mBAAmB,CAAC,QAAgB,EAAE,UAAsB;QACxE,OAAO,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;IAC9F,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,oBAAoB,CAAC,QAAgB,EAAE,MAAc,EAAE,gBAAsC;QACzG,0FAA0F;QAC1F,IAAI,MAAM,CAAC,KAAK,EAAE;YAChB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;gBACrC,IAAI,KAAK,EAAE;oBACT,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,EAAE,0HAA0H;wBACpJ,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC5F,IAAI,cAAc,IAAI,cAAc,CAAC,WAAW,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC;4BAC9G,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;qBAC1C;iBACF;YACH,CAAC,CAAC,CAAC;SACJ;QAED,MAAM,MAAM,GAAiB,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,2BAA2B,EAAE,CAAC;QAEtE,IAAI,MAAM,CAAC,IAAI,EAAE;YACf,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;gBAC1B,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,cAAc,KAAK,CAAC,QAAQ,aAAa,KAAK,CAAC,QAAQ,UAAU,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;aACtG;SACF;QAED,OAAO,MAAM,CAAC,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAClF,CAAC;IAED,+HAA+H;IACxH,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,aAA4B,EAAE,OAAkB,EAAE,qBAAmD;QACxJ,MAAM,mBAAmB,GAAyB,EAAE,CAAC;QAErD,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;YAC9B,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,WAAW,GAAa,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC/D,MAAM,eAAe,GAAG,qBAAqB,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAC5E,4DAA4D;YAC5D,IAAI,eAAe,EAAE;gBACnB,eAAe,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;oBACxC,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBACjD,IAAI,CAAC,CAAC,KAAK,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,cAAc,CAAC;wBAC/D,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;aACJ;YAED,mBAAmB,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU;gBACV,WAAW;gBACX,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;SACJ;QACD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,+HAA+H;IACxH,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,aAA4B,EAAE,WAAmB,EAAE,mBAAyC,EAAE,qBAAmD;QAC7L,MAAM,mBAAmB,GAAyB,EAAE,CAAC;QAErD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;YAC1D,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,uEAAuE,WAAW,GAAG,CAAC,CAAC;YACnG,OAAO,mBAAmB,CAAC;SAC5B;QAED,KAAK,MAAM,kBAAkB,IAAI,mBAAmB,EAAE;YACpD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC7E,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBACjD,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CAAC,6EAA6E,kBAAkB,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACzH,SAAS;aACV;YAED,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,WAAW,GAAa,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC/D,MAAM,eAAe,GAAG,qBAAqB,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAC5E,4DAA4D;YAC5D,IAAI,eAAe,EAAE;gBACnB,eAAe,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;oBACxC,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBACjD,IAAI,CAAC,CAAC,KAAK,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,cAAc,CAAC;wBAC/D,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;aACJ;YAED,yDAAyD;YACzD,IAAI,kBAAkB,CAAC,SAAS,EAAE;gBAChC,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;oBACrD,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBACjD,IAAI,CAAC,CAAC,KAAK,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,cAAc,CAAC;wBAC/D,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;aACJ;YACD,mBAAmB,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU;gBACV,WAAW;gBACX,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;SACJ;QACD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;;AA7jBc,WAAI,GAAG,KAAK,CAAC;SADjB,MAAM","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 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 } else { // unit specification comes before value (like currency)\r\n if (tokens[1].isNumber && tokens[0].isString) {\r\n const unit = await this.lookupUnitByLabel(tokens[0].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[1].value as number);\r\n } else if (defaultUnit) {\r\n const conversion = await unitsProvider.getConversion(unit, defaultUnit);\r\n const mag = ((tokens[1].value as number * conversion.factor)) + conversion.offset;\r\n return new Quantity(defaultUnit, mag);\r\n }\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 if (tokens[0].isNumber && tokens[1].isString) {\r\n const conversion = Parser.tryFindUnitConversion(tokens[1].value as string, 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 // 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 } else { // unit specification comes before value (like currency)\r\n if (tokens[1].isNumber && tokens[0].isString) {\r\n const conversion = Parser.tryFindUnitConversion(tokens[0].value as string, unitsConversions, defaultUnit);\r\n if (conversion) {\r\n const value = (tokens[1].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[1].value as number };\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 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
+ {"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 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 } else { // unit specification comes before value (like currency)\r\n if (tokens[1].isNumber && tokens[0].isString) {\r\n const unit = await this.lookupUnitByLabel(tokens[0].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[1].value as number);\r\n } else if (defaultUnit) {\r\n const conversion = await unitsProvider.getConversion(unit, defaultUnit);\r\n const mag = ((tokens[1].value as number * conversion.factor)) + conversion.offset;\r\n return new Quantity(defaultUnit, mag);\r\n }\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 if (tokens[0].isNumber && tokens[1].isString) {\r\n const conversion = Parser.tryFindUnitConversion(tokens[1].value as string, 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 // 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 } else { // unit specification comes before value (like currency)\r\n if (tokens[1].isNumber && tokens[0].isString) {\r\n const conversion = Parser.tryFindUnitConversion(tokens[0].value as string, unitsConversions, defaultUnit);\r\n if (conversion) {\r\n const value = (tokens[1].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[1].value as number };\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 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"]}