@itwin/core-quantity 3.0.0-extension.1 → 3.1.0-dev.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +76 -1
- package/LICENSE.md +1 -1
- package/lib/cjs/Interfaces.d.ts +6 -2
- package/lib/cjs/Interfaces.d.ts.map +1 -1
- package/lib/cjs/Interfaces.js.map +1 -1
- package/lib/cjs/Parser.d.ts +4 -4
- package/lib/cjs/Parser.d.ts.map +1 -1
- package/lib/cjs/Parser.js +22 -17
- package/lib/cjs/Parser.js.map +1 -1
- package/lib/cjs/ParserSpec.d.ts +2 -2
- package/lib/cjs/ParserSpec.d.ts.map +1 -1
- package/lib/cjs/ParserSpec.js +2 -2
- package/lib/cjs/ParserSpec.js.map +1 -1
- package/lib/cjs/Unit.d.ts +1 -2
- package/lib/cjs/Unit.d.ts.map +1 -1
- package/lib/cjs/Unit.js +1 -2
- package/lib/cjs/Unit.js.map +1 -1
- package/lib/esm/Interfaces.d.ts +6 -2
- package/lib/esm/Interfaces.d.ts.map +1 -1
- package/lib/esm/Interfaces.js.map +1 -1
- package/lib/esm/Parser.d.ts +4 -4
- package/lib/esm/Parser.d.ts.map +1 -1
- package/lib/esm/Parser.js +22 -17
- package/lib/esm/Parser.js.map +1 -1
- package/lib/esm/ParserSpec.d.ts +2 -2
- package/lib/esm/ParserSpec.d.ts.map +1 -1
- package/lib/esm/ParserSpec.js +2 -2
- package/lib/esm/ParserSpec.js.map +1 -1
- package/lib/esm/Unit.d.ts +1 -2
- package/lib/esm/Unit.d.ts.map +1 -1
- package/lib/esm/Unit.js +1 -2
- package/lib/esm/Unit.js.map +1 -1
- package/package.json +7 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParserSpec.js","sourceRoot":"","sources":["../../src/ParserSpec.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH,qCAAuD;AAEvD;;GAEG;AACH,MAAa,UAAU;IAKrB;;;;OAIG;IACH,YAAY,OAAkB,EAAE,MAAc,EAAE,WAAiC;QARzE,iBAAY,GAAyB,EAAE,CAAC,CAAE,mBAAmB;QASnE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED,wGAAwG;IACxG,IAAW,eAAe,KAA2B,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,IAAW,MAAM,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,IAAW,OAAO,KAAgB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzD;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,aAA4B,EAAE,OAAkB;
|
|
1
|
+
{"version":3,"file":"ParserSpec.js","sourceRoot":"","sources":["../../src/ParserSpec.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH,qCAAuD;AAEvD;;GAEG;AACH,MAAa,UAAU;IAKrB;;;;OAIG;IACH,YAAY,OAAkB,EAAE,MAAc,EAAE,WAAiC;QARzE,iBAAY,GAAyB,EAAE,CAAC,CAAE,mBAAmB;QASnE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED,wGAAwG;IACxG,IAAW,eAAe,KAA2B,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,IAAW,MAAM,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,IAAW,OAAO,KAAgB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzD;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,aAA4B,EAAE,OAAkB,EAAE,qBAAmD;QAC9I,MAAM,WAAW,GAAG,MAAM,eAAM,CAAC,gCAAgC,CAAC,aAAa,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC;QACjH,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,0HAA0H;IACnH,oBAAoB,CAAC,QAAgB;QAC1C,OAAO,eAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;CACF;AArCD,gCAqCC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { Format } from \"./Formatter/Format\";\r\nimport { AlternateUnitLabelsProvider, UnitConversionSpec, UnitProps, UnitsProvider } from \"./Interfaces\";\r\nimport { Parser, QuantityParseResult } from \"./Parser\";\r\n\r\n/** A ParserSpec holds information needed to parse a string into a quantity synchronously.\r\n * @beta\r\n */\r\nexport class ParserSpec {\r\n private _outUnit: UnitProps;\r\n private _conversions: UnitConversionSpec[] = []; // max four entries\r\n private _format: Format;\r\n\r\n /** Constructor\r\n * @param outUnit The name of a format specification.\r\n * @param format Defines the output format for the quantity value.\r\n * @param conversions An array of conversion factors necessary to convert from an input unit to the units specified in the format..\r\n */\r\n constructor(outUnit: UnitProps, format: Format, conversions: UnitConversionSpec[]) {\r\n this._outUnit = outUnit;\r\n this._format = format;\r\n this._conversions = conversions;\r\n }\r\n\r\n /** Returns an array of UnitConversionSpecs for each unit label that may be used in the input string. */\r\n public get unitConversions(): UnitConversionSpec[] { return this._conversions; }\r\n public get format(): Format { return this._format; }\r\n public get outUnit(): UnitProps { return this._outUnit; }\r\n\r\n /** Static async method to create a ParserSpec given the format and unit of the quantity that will be passed to the Parser. The input unit will\r\n * be used to generate conversion information for each unit specified in the Format. This method is async due to the fact that the units provider must make\r\n * async calls to lookup unit definitions.\r\n * @param format The format specification.\r\n * @param unitsProvider The units provider is used to look up unit definitions and provide conversion information for converting between units.\r\n * @param outUnit The unit the value to be formatted. This unit is often referred to as persistence unit.\r\n */\r\n public static async create(format: Format, unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<ParserSpec> {\r\n const conversions = await Parser.createUnitConversionSpecsForUnit(unitsProvider, outUnit, altUnitLabelsProvider);\r\n return new ParserSpec(outUnit, format, conversions);\r\n }\r\n\r\n /** Do the parsing. Done this way to allow Custom Parser Specs to parse custom formatted strings into their quantities. */\r\n public parseToQuantityValue(inString: string): QuantityParseResult {\r\n return Parser.parseQuantityString(inString, this);\r\n }\r\n}\r\n\r\n"]}
|
package/lib/cjs/Unit.d.ts
CHANGED
|
@@ -10,9 +10,8 @@ export declare class BasicUnit implements UnitProps {
|
|
|
10
10
|
label: string;
|
|
11
11
|
phenomenon: string;
|
|
12
12
|
isValid: boolean;
|
|
13
|
-
alternateLabels?: string[];
|
|
14
13
|
system: string;
|
|
15
|
-
constructor(name: string, label: string, phenomenon: string,
|
|
14
|
+
constructor(name: string, label: string, phenomenon: string, system?: string);
|
|
16
15
|
}
|
|
17
16
|
/** This class is a convenience class that can be returned when a valid Unit cannot be determined.
|
|
18
17
|
* @beta
|
package/lib/cjs/Unit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Unit.d.ts","sourceRoot":"","sources":["../../src/Unit.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;GAEG;AACH,qBAAa,SAAU,YAAW,SAAS;IAClC,IAAI,SAAM;IACV,KAAK,SAAM;IACX,UAAU,SAAM;IAChB,OAAO,UAAS;IAChB,
|
|
1
|
+
{"version":3,"file":"Unit.d.ts","sourceRoot":"","sources":["../../src/Unit.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;GAEG;AACH,qBAAa,SAAU,YAAW,SAAS;IAClC,IAAI,SAAM;IACV,KAAK,SAAM;IACX,UAAU,SAAM;IAChB,OAAO,UAAS;IAChB,MAAM,EAAE,MAAM,CAAa;gBAEtB,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAU7E;AAED;;GAEG;AACH,qBAAa,OAAQ,YAAW,SAAS;IAChC,IAAI,SAAM;IACV,KAAK,SAAM;IACX,UAAU,SAAM;IAChB,OAAO,UAAS;IAChB,MAAM,SAAa;CAC3B"}
|
package/lib/cjs/Unit.js
CHANGED
|
@@ -12,7 +12,7 @@ exports.BadUnit = exports.BasicUnit = void 0;
|
|
|
12
12
|
* @beta
|
|
13
13
|
*/
|
|
14
14
|
class BasicUnit {
|
|
15
|
-
constructor(name, label, phenomenon,
|
|
15
|
+
constructor(name, label, phenomenon, system) {
|
|
16
16
|
this.name = "";
|
|
17
17
|
this.label = "";
|
|
18
18
|
this.phenomenon = "";
|
|
@@ -22,7 +22,6 @@ class BasicUnit {
|
|
|
22
22
|
this.name = name;
|
|
23
23
|
this.label = label;
|
|
24
24
|
this.phenomenon = phenomenon;
|
|
25
|
-
this.alternateLabels = alternateLabels;
|
|
26
25
|
this.isValid = true;
|
|
27
26
|
if (system)
|
|
28
27
|
this.system = system;
|
package/lib/cjs/Unit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Unit.js","sourceRoot":"","sources":["../../src/Unit.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH;;GAEG;AACH,MAAa,SAAS;
|
|
1
|
+
{"version":3,"file":"Unit.js","sourceRoot":"","sources":["../../src/Unit.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH;;GAEG;AACH,MAAa,SAAS;IAOpB,YAAY,IAAY,EAAE,KAAa,EAAE,UAAkB,EAAE,MAAe;QANrE,SAAI,GAAG,EAAE,CAAC;QACV,UAAK,GAAG,EAAE,CAAC;QACX,eAAU,GAAG,EAAE,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAChB,WAAM,GAAW,SAAS,CAAC;QAGhC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/F,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,MAAM;gBACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACxB;IACH,CAAC;CACF;AAjBD,8BAiBC;AAED;;GAEG;AACH,MAAa,OAAO;IAApB;QACS,SAAI,GAAG,EAAE,CAAC;QACV,UAAK,GAAG,EAAE,CAAC;QACX,eAAU,GAAG,EAAE,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAChB,WAAM,GAAG,SAAS,CAAC;IAC5B,CAAC;CAAA;AAND,0BAMC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { UnitProps } from \"./Interfaces\";\r\n\r\n/** This class provides basic implementation of UnitProps interface.\r\n * @beta\r\n */\r\nexport class BasicUnit implements UnitProps {\r\n public name = \"\";\r\n public label = \"\";\r\n public phenomenon = \"\";\r\n public isValid = false;\r\n public system: string = \"unknown\";\r\n\r\n constructor(name: string, label: string, phenomenon: string, system?: string) {\r\n if (name && name.length > 0 && label && label.length > 0 && phenomenon && phenomenon.length > 0) {\r\n this.name = name;\r\n this.label = label;\r\n this.phenomenon = phenomenon;\r\n this.isValid = true;\r\n if (system)\r\n this.system = system;\r\n }\r\n }\r\n}\r\n\r\n/** This class is a convenience class that can be returned when a valid Unit cannot be determined.\r\n * @beta\r\n */\r\nexport class BadUnit implements UnitProps {\r\n public name = \"\";\r\n public label = \"\";\r\n public phenomenon = \"\";\r\n public isValid = false;\r\n public system = \"unknown\";\r\n}\r\n"]}
|
package/lib/esm/Interfaces.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
/** @packageDocumentation
|
|
2
2
|
* @module Quantity
|
|
3
3
|
*/
|
|
4
|
+
/** This interface allows a provider to be specified that will define an array of alternate labels for a specific unit.
|
|
5
|
+
* @beta
|
|
6
|
+
*/
|
|
7
|
+
export interface AlternateUnitLabelsProvider {
|
|
8
|
+
getAlternateUnitLabels: (unit: UnitProps) => string[] | undefined;
|
|
9
|
+
}
|
|
4
10
|
/** This interface provides basic information about a Unit that is return from a UnitProvider. This info
|
|
5
11
|
* uniquely identifies a unit by its name.
|
|
6
12
|
* @beta
|
|
@@ -14,8 +20,6 @@ export interface UnitProps {
|
|
|
14
20
|
readonly phenomenon: string;
|
|
15
21
|
/** This is set to true if the Unit is known by the UnitsProvider. */
|
|
16
22
|
readonly isValid: boolean;
|
|
17
|
-
/** Optionally defined set of unit labels that can be used to represent the unit. This is helpful when parsing quantity value strings */
|
|
18
|
-
readonly alternateLabels?: string[];
|
|
19
23
|
/** Unique system name. Example "Units.USCUSTOM"," Units.METRIC", "Units.USSURVEY", "Units.IMPERIAL" */
|
|
20
24
|
readonly system: string;
|
|
21
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Interfaces.d.ts","sourceRoot":"","sources":["../../src/Interfaces.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wHAAwH;IACxH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,
|
|
1
|
+
{"version":3,"file":"Interfaces.d.ts","sourceRoot":"","sources":["../../src/Interfaces.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,sBAAsB,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,EAAE,GAAG,SAAS,CAAC;CACnE;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wHAAwH;IACxH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,uGAAuG;IACvG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,UAAU,EAAE,cAAc,CAAC;IAC3B,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1F,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3D,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACrD,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChF;AAED;;;GAGG;AACH,oBAAY,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Interfaces.js","sourceRoot":"","sources":["../../src/Interfaces.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG","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\n/** This interface provides basic information about a Unit that is return from a UnitProvider. This info\r\n * uniquely identifies a unit by its name.\r\n * @beta\r\n */\r\nexport interface UnitProps {\r\n /** Unique name for unit. */\r\n readonly name: string;\r\n /** Default label for unit. */\r\n readonly label: string;\r\n /** Unique name of unit phenomenon. Example phenomenon names include 'Units.LENGTH', 'Units.AREA', and 'Units.VOLUME' */\r\n readonly phenomenon: string;\r\n /** This is set to true if the Unit is known by the UnitsProvider. */\r\n readonly isValid: boolean;\r\n /**
|
|
1
|
+
{"version":3,"file":"Interfaces.js","sourceRoot":"","sources":["../../src/Interfaces.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG","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\n/** This interface allows a provider to be specified that will define an array of alternate labels for a specific unit.\r\n * @beta\r\n */\r\nexport interface AlternateUnitLabelsProvider {\r\n getAlternateUnitLabels: (unit: UnitProps) => string[] | undefined;\r\n}\r\n\r\n/** This interface provides basic information about a Unit that is return from a UnitProvider. This info\r\n * uniquely identifies a unit by its name.\r\n * @beta\r\n */\r\nexport interface UnitProps {\r\n /** Unique name for unit. */\r\n readonly name: string;\r\n /** Default label for unit. */\r\n readonly label: string;\r\n /** Unique name of unit phenomenon. Example phenomenon names include 'Units.LENGTH', 'Units.AREA', and 'Units.VOLUME' */\r\n readonly phenomenon: string;\r\n /** This is set to true if the Unit is known by the UnitsProvider. */\r\n readonly isValid: boolean;\r\n /** Unique system name. Example \"Units.USCUSTOM\",\" Units.METRIC\", \"Units.USSURVEY\", \"Units.IMPERIAL\" */\r\n readonly system: string;\r\n}\r\n\r\n/** This interface defines the required properties of a Quantity.\r\n * @beta\r\n */\r\nexport interface QuantityProps {\r\n readonly magnitude: number;\r\n readonly unit: UnitProps;\r\n readonly isValid: boolean;\r\n}\r\n\r\n/** Interface that defines how to convert between a specific unit an another in synchronous formatting or parsing processing.\r\n * @beta\r\n */\r\nexport interface UnitConversionSpec {\r\n /** Unit name that was used to locate the unit by the Unit Provider */\r\n name: string;\r\n /** The default label that is used to display unit */\r\n label: string;\r\n /** Unit system name, used to when finding preferred parse unit */\r\n system: string;\r\n /** the information necessary to convert the unit to a specific display unit */\r\n conversion: UnitConversion;\r\n /** Labels that may be used to represent the unit in a string that is to be parsed. */\r\n parseLabels?: string[];\r\n}\r\n\r\n/** This interface defines the properties required to convert a quantity value from one unit to another such as from meters to feet\r\n * or from Celsius to Fahrenheit.\r\n * @beta\r\n */\r\nexport interface UnitConversion {\r\n factor: number;\r\n offset: number;\r\n}\r\n\r\n/** Interface that defines potential parse units that may be found in user's string input of a quantity value.\r\n * @beta\r\n */\r\nexport interface PotentialParseUnit {\r\n unitName: string;\r\n altLabels?: string[];\r\n}\r\n\r\n/** This interface is implemented by the class that is responsible for locating units by name or label and providing conversion values between units.\r\n * The methods to be implemented are async allowing the UnitsProvider to query the backend when necessary to look up unit definition and conversion rules.\r\n * @beta\r\n */\r\nexport interface UnitsProvider {\r\n findUnit(unitLabel: string, phenomenon?: string, unitSystem?: string): Promise<UnitProps>;\r\n getUnitsByFamily(phenomenon: string): Promise<UnitProps[]>;\r\n findUnitByName(unitName: string): Promise<UnitProps>;\r\n getConversion(fromUnit: UnitProps, toUnit: UnitProps): Promise<UnitConversion>;\r\n}\r\n\r\n/**\r\n * Used to uniquely identify a unit system.\r\n * @beta\r\n */\r\nexport type UnitSystemKey = \"metric\" | \"imperial\" | \"usCustomary\" | \"usSurvey\";\r\n"]}
|
package/lib/esm/Parser.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @module Quantity
|
|
3
3
|
*/
|
|
4
4
|
import { Format } from "./Formatter/Format";
|
|
5
|
-
import { PotentialParseUnit, QuantityProps, UnitConversionSpec, UnitProps, UnitsProvider } from "./Interfaces";
|
|
5
|
+
import { AlternateUnitLabelsProvider, PotentialParseUnit, QuantityProps, UnitConversionSpec, UnitProps, UnitsProvider } from "./Interfaces";
|
|
6
6
|
import { ParserSpec } from "./ParserSpec";
|
|
7
7
|
/** Possible parser errors
|
|
8
8
|
* @beta
|
|
@@ -69,7 +69,7 @@ export declare class Parser {
|
|
|
69
69
|
* @param format Defines the likely format of inString.
|
|
70
70
|
* @param unitsProvider required to look up units that may be specified in inString
|
|
71
71
|
*/
|
|
72
|
-
static parseIntoQuantity(inString: string, format: Format, unitsProvider: UnitsProvider): Promise<QuantityProps>;
|
|
72
|
+
static parseIntoQuantity(inString: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps>;
|
|
73
73
|
/** method to get the Unit Conversion given a unit label */
|
|
74
74
|
private static tryFindUnitConversion;
|
|
75
75
|
private static getQuantityValueFromParseTokens;
|
|
@@ -86,9 +86,9 @@ export declare class Parser {
|
|
|
86
86
|
*/
|
|
87
87
|
static parseToQuantityValue(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult;
|
|
88
88
|
/** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */
|
|
89
|
-
static createUnitConversionSpecsForUnit(unitsProvider: UnitsProvider, outUnit: UnitProps): Promise<UnitConversionSpec[]>;
|
|
89
|
+
static createUnitConversionSpecsForUnit(unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]>;
|
|
90
90
|
/** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */
|
|
91
|
-
static createUnitConversionSpecs(unitsProvider: UnitsProvider, outUnitName: string, potentialParseUnits: PotentialParseUnit[]): Promise<UnitConversionSpec[]>;
|
|
91
|
+
static createUnitConversionSpecs(unitsProvider: UnitsProvider, outUnitName: string, potentialParseUnits: PotentialParseUnit[], altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]>;
|
|
92
92
|
}
|
|
93
93
|
export {};
|
|
94
94
|
//# sourceMappingURL=Parser.d.ts.map
|
package/lib/esm/Parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAkB,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,aAAa,EAAkB,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5J,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C;;GAEG;AACH,oBAAY,UAAU;IACpB,2BAA2B,IAAI;IAC/B,0BAA0B,IAAA;IAC1B,8BAA8B,IAAA;IAC9B,WAAW,IAAA;IACX,oCAAoC,IAAA;IACpC,iBAAiB,IAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,EAAE,EAAE,KAAK,CAAC;IACV,uDAAuD;IACvD,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,EAAE,EAAE,IAAI,CAAC;IACT,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,oBAAY,mBAAmB,GAAG,cAAc,GAAG,kBAAkB,CAAC;AAEtE;;GAEG;AACH,cAAM,UAAU;IACP,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;gBAElB,KAAK,EAAE,MAAM,GAAG,MAAM;IAKlC,IAAW,QAAQ,IAAI,OAAO,CAA2C;IACzE,IAAW,QAAQ,IAAI,OAAO,CAA2C;CAC1E;AA6BD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAS;WAEd,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,IAAI,cAAc;WAInE,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,IAAI,kBAAkB;IAIjF,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAoBzC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAuChC,OAAO,CAAC,MAAM,CAAC,OAAO;IAItB,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAIxC;;OAEG;WACW,0BAA0B,CAAC,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;mBAsIhF,iBAAiB;mBA6BjB,6BAA6B;IA2ElD;;;;OAIG;WACiB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,aAAa,CAAC;IAQlL,2DAA2D;IAC3D,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAyCpC,OAAO,CAAC,MAAM,CAAC,+BAA+B;IAqE9C;;;;OAIG;WACW,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,mBAAmB;IAIhG;;;;OAIG;WACW,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,mBAAmB;IA+BjI,+HAA+H;WAC3G,gCAAgC,CAAC,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,qBAAqB,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA4B1L,+HAA+H;WAC3G,yBAAyB,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,EAAE,qBAAqB,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAgDhO"}
|
package/lib/esm/Parser.js
CHANGED
|
@@ -256,7 +256,7 @@ export class Parser {
|
|
|
256
256
|
}
|
|
257
257
|
return tokens;
|
|
258
258
|
}
|
|
259
|
-
static async lookupUnitByLabel(unitLabel, format, unitsProvider) {
|
|
259
|
+
static async lookupUnitByLabel(unitLabel, format, unitsProvider, altUnitLabelsProvider) {
|
|
260
260
|
const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;
|
|
261
261
|
const labelToFind = unitLabel.toLowerCase();
|
|
262
262
|
// First look in format for a label and matches
|
|
@@ -264,7 +264,9 @@ export class Parser {
|
|
|
264
264
|
const formatUnit = format.units.find(([unit, label]) => {
|
|
265
265
|
if (label && label.toLowerCase() === labelToFind)
|
|
266
266
|
return true;
|
|
267
|
-
|
|
267
|
+
const alternateLabels = altUnitLabelsProvider === null || altUnitLabelsProvider === void 0 ? void 0 : altUnitLabelsProvider.getAlternateUnitLabels(unit);
|
|
268
|
+
// check any alternate labels that may be defined for the Unit
|
|
269
|
+
if (alternateLabels && alternateLabels.find((lbl) => lbl.toLowerCase() === labelToFind))
|
|
268
270
|
return true;
|
|
269
271
|
return false;
|
|
270
272
|
});
|
|
@@ -278,7 +280,7 @@ export class Parser {
|
|
|
278
280
|
foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined);
|
|
279
281
|
return foundUnit;
|
|
280
282
|
}
|
|
281
|
-
static async createQuantityFromParseTokens(tokens, format, unitsProvider) {
|
|
283
|
+
static async createQuantityFromParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider) {
|
|
282
284
|
let defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;
|
|
283
285
|
// common case where single value is supplied
|
|
284
286
|
if (tokens.length === 1) {
|
|
@@ -286,14 +288,14 @@ export class Parser {
|
|
|
286
288
|
return new Quantity(defaultUnit, tokens[0].value);
|
|
287
289
|
}
|
|
288
290
|
else {
|
|
289
|
-
const unit = await this.lookupUnitByLabel(tokens[0].value, format, unitsProvider);
|
|
291
|
+
const unit = await this.lookupUnitByLabel(tokens[0].value, format, unitsProvider, altUnitLabelsProvider);
|
|
290
292
|
return new Quantity(unit);
|
|
291
293
|
}
|
|
292
294
|
}
|
|
293
295
|
// common case where single value and single label are supplied
|
|
294
296
|
if (tokens.length === 2) {
|
|
295
297
|
if (tokens[0].isNumber && tokens[1].isString) {
|
|
296
|
-
const unit = await this.lookupUnitByLabel(tokens[1].value, format, unitsProvider);
|
|
298
|
+
const unit = await this.lookupUnitByLabel(tokens[1].value, format, unitsProvider, altUnitLabelsProvider);
|
|
297
299
|
if (undefined === defaultUnit)
|
|
298
300
|
defaultUnit = unit;
|
|
299
301
|
if (defaultUnit && defaultUnit.name === unit.name) {
|
|
@@ -307,7 +309,7 @@ export class Parser {
|
|
|
307
309
|
}
|
|
308
310
|
else { // unit specification comes before value (like currency)
|
|
309
311
|
if (tokens[1].isNumber && tokens[0].isString) {
|
|
310
|
-
const unit = await this.lookupUnitByLabel(tokens[0].value, format, unitsProvider);
|
|
312
|
+
const unit = await this.lookupUnitByLabel(tokens[0].value, format, unitsProvider, altUnitLabelsProvider);
|
|
311
313
|
if (undefined === defaultUnit)
|
|
312
314
|
defaultUnit = unit;
|
|
313
315
|
if (defaultUnit && defaultUnit.name === unit.name) {
|
|
@@ -327,7 +329,7 @@ export class Parser {
|
|
|
327
329
|
for (let i = 0; i < tokens.length; i = i + 2) {
|
|
328
330
|
if (tokens[i].isNumber && tokens[i + 1].isString) {
|
|
329
331
|
const value = tokens[i].value;
|
|
330
|
-
const unit = await this.lookupUnitByLabel(tokens[i + 1].value, format, unitsProvider);
|
|
332
|
+
const unit = await this.lookupUnitByLabel(tokens[i + 1].value, format, unitsProvider, altUnitLabelsProvider);
|
|
331
333
|
if (undefined === defaultUnit)
|
|
332
334
|
defaultUnit = unit;
|
|
333
335
|
if (0 === i) {
|
|
@@ -358,11 +360,11 @@ export class Parser {
|
|
|
358
360
|
* @param format Defines the likely format of inString.
|
|
359
361
|
* @param unitsProvider required to look up units that may be specified in inString
|
|
360
362
|
*/
|
|
361
|
-
static async parseIntoQuantity(inString, format, unitsProvider) {
|
|
363
|
+
static async parseIntoQuantity(inString, format, unitsProvider, altUnitLabelsProvider) {
|
|
362
364
|
const tokens = Parser.parseQuantitySpecification(inString, format);
|
|
363
365
|
if (tokens.length === 0)
|
|
364
366
|
return new Quantity();
|
|
365
|
-
return Parser.createQuantityFromParseTokens(tokens, format, unitsProvider);
|
|
367
|
+
return Parser.createQuantityFromParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);
|
|
366
368
|
}
|
|
367
369
|
/** method to get the Unit Conversion given a unit label */
|
|
368
370
|
static tryFindUnitConversion(unitLabel, unitsConversions, preferredUnit) {
|
|
@@ -512,15 +514,16 @@ export class Parser {
|
|
|
512
514
|
return Parser.getQuantityValueFromParseTokens(tokens, format, unitsConversions);
|
|
513
515
|
}
|
|
514
516
|
/** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */
|
|
515
|
-
static async createUnitConversionSpecsForUnit(unitsProvider, outUnit) {
|
|
517
|
+
static async createUnitConversionSpecsForUnit(unitsProvider, outUnit, altUnitLabelsProvider) {
|
|
516
518
|
const unitConversionSpecs = [];
|
|
517
519
|
const familyUnits = await unitsProvider.getUnitsByFamily(outUnit.phenomenon);
|
|
518
520
|
for (const unit of familyUnits) {
|
|
519
521
|
const conversion = await unitsProvider.getConversion(unit, outUnit);
|
|
520
522
|
const parseLabels = [unit.label.toLocaleLowerCase()];
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
523
|
+
const alternateLabels = altUnitLabelsProvider === null || altUnitLabelsProvider === void 0 ? void 0 : altUnitLabelsProvider.getAlternateUnitLabels(unit);
|
|
524
|
+
// add any alternate labels that may be defined for the Unit
|
|
525
|
+
if (alternateLabels) {
|
|
526
|
+
alternateLabels.forEach((label) => {
|
|
524
527
|
const potentialLabel = label.toLocaleLowerCase();
|
|
525
528
|
if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))
|
|
526
529
|
parseLabels.push(label.toLocaleLowerCase());
|
|
@@ -537,7 +540,7 @@ export class Parser {
|
|
|
537
540
|
return unitConversionSpecs;
|
|
538
541
|
}
|
|
539
542
|
/** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */
|
|
540
|
-
static async createUnitConversionSpecs(unitsProvider, outUnitName, potentialParseUnits) {
|
|
543
|
+
static async createUnitConversionSpecs(unitsProvider, outUnitName, potentialParseUnits, altUnitLabelsProvider) {
|
|
541
544
|
const unitConversionSpecs = [];
|
|
542
545
|
const outUnit = await unitsProvider.findUnitByName(outUnitName);
|
|
543
546
|
if (!outUnit || !outUnit.name || 0 === outUnit.name.length) {
|
|
@@ -554,14 +557,16 @@ export class Parser {
|
|
|
554
557
|
}
|
|
555
558
|
const conversion = await unitsProvider.getConversion(unit, outUnit);
|
|
556
559
|
const parseLabels = [unit.label.toLocaleLowerCase()];
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
+
const alternateLabels = altUnitLabelsProvider === null || altUnitLabelsProvider === void 0 ? void 0 : altUnitLabelsProvider.getAlternateUnitLabels(unit);
|
|
561
|
+
// add any alternate labels that may be defined for the Unit
|
|
562
|
+
if (alternateLabels) {
|
|
563
|
+
alternateLabels.forEach((label) => {
|
|
560
564
|
const potentialLabel = label.toLocaleLowerCase();
|
|
561
565
|
if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))
|
|
562
566
|
parseLabels.push(label.toLocaleLowerCase());
|
|
563
567
|
});
|
|
564
568
|
}
|
|
569
|
+
// add any alternate labels that where provided by caller
|
|
565
570
|
if (potentialParseUnit.altLabels) {
|
|
566
571
|
potentialParseUnit.altLabels.forEach((label) => {
|
|
567
572
|
const potentialLabel = label.toLocaleLowerCase();
|
package/lib/esm/Parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 { PotentialParseUnit, QuantityProps, UnitConversion, 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\") this.value = value.trim();\r\n else 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) 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) 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) i = i - 1; // skip over uom separator after fraction\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 wipToken = wipToken.concat(str[i]);\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 === \"-\") fraction = 0 - fraction;\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 === \"-\") fraction = 0 - fraction;\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) 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) {\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 if (unit.alternateLabels && unit.alternateLabels.find((lbl)=>lbl.toLowerCase() === labelToFind ))\r\n return true;\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): 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);\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);\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);\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);\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): 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);\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): UnitConversion | 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): 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 // add any alternate labels that may be define by the UnitProp\r\n if (unit.alternateLabels) {\r\n unit.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[]): 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 // add any alternate labels that may be defined by the UnitProp\r\n if (unit.alternateLabels) {\r\n unit.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 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, UnitConversion, 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\") this.value = value.trim();\r\n else 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) 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) 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) i = i - 1; // skip over uom separator after fraction\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 wipToken = wipToken.concat(str[i]);\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 === \"-\") fraction = 0 - fraction;\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 === \"-\") fraction = 0 - fraction;\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) 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): UnitConversion | 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"]}
|
package/lib/esm/ParserSpec.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @module Quantity
|
|
3
3
|
*/
|
|
4
4
|
import { Format } from "./Formatter/Format";
|
|
5
|
-
import { UnitConversionSpec, UnitProps, UnitsProvider } from "./Interfaces";
|
|
5
|
+
import { AlternateUnitLabelsProvider, UnitConversionSpec, UnitProps, UnitsProvider } from "./Interfaces";
|
|
6
6
|
import { QuantityParseResult } from "./Parser";
|
|
7
7
|
/** A ParserSpec holds information needed to parse a string into a quantity synchronously.
|
|
8
8
|
* @beta
|
|
@@ -28,7 +28,7 @@ export declare class ParserSpec {
|
|
|
28
28
|
* @param unitsProvider The units provider is used to look up unit definitions and provide conversion information for converting between units.
|
|
29
29
|
* @param outUnit The unit the value to be formatted. This unit is often referred to as persistence unit.
|
|
30
30
|
*/
|
|
31
|
-
static create(format: Format, unitsProvider: UnitsProvider, outUnit: UnitProps): Promise<ParserSpec>;
|
|
31
|
+
static create(format: Format, unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<ParserSpec>;
|
|
32
32
|
/** Do the parsing. Done this way to allow Custom Parser Specs to parse custom formatted strings into their quantities. */
|
|
33
33
|
parseToQuantityValue(inString: string): QuantityParseResult;
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParserSpec.d.ts","sourceRoot":"","sources":["../../src/ParserSpec.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ParserSpec.d.ts","sourceRoot":"","sources":["../../src/ParserSpec.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzG,OAAO,EAAU,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEvD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,OAAO,CAAS;IAExB;;;;OAIG;gBACS,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAMjF,wGAAwG;IACxG,IAAW,eAAe,IAAI,kBAAkB,EAAE,CAA8B;IAChF,IAAW,MAAM,IAAI,MAAM,CAAyB;IACpD,IAAW,OAAO,IAAI,SAAS,CAA0B;IAEzD;;;;;;OAMG;WACiB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,qBAAqB,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,CAAC;IAKtK,0HAA0H;IACnH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB;CAGnE"}
|
package/lib/esm/ParserSpec.js
CHANGED
|
@@ -32,8 +32,8 @@ export class ParserSpec {
|
|
|
32
32
|
* @param unitsProvider The units provider is used to look up unit definitions and provide conversion information for converting between units.
|
|
33
33
|
* @param outUnit The unit the value to be formatted. This unit is often referred to as persistence unit.
|
|
34
34
|
*/
|
|
35
|
-
static async create(format, unitsProvider, outUnit) {
|
|
36
|
-
const conversions = await Parser.createUnitConversionSpecsForUnit(unitsProvider, outUnit);
|
|
35
|
+
static async create(format, unitsProvider, outUnit, altUnitLabelsProvider) {
|
|
36
|
+
const conversions = await Parser.createUnitConversionSpecsForUnit(unitsProvider, outUnit, altUnitLabelsProvider);
|
|
37
37
|
return new ParserSpec(outUnit, format, conversions);
|
|
38
38
|
}
|
|
39
39
|
/** Do the parsing. Done this way to allow Custom Parser Specs to parse custom formatted strings into their quantities. */
|