@fgv/ts-bcp47 4.0.2 → 4.2.0
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.json +30 -0
- package/CHANGELOG.md +20 -1
- package/dist/ts-bcp47.d.ts +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/index.js +17 -7
- package/lib/index.js.map +1 -1
- package/lib/packlets/bcp47/bcp47Subtags/converters.js +17 -7
- package/lib/packlets/bcp47/bcp47Subtags/converters.js.map +1 -1
- package/lib/packlets/bcp47/bcp47Subtags/index.js +17 -7
- package/lib/packlets/bcp47/bcp47Subtags/index.js.map +1 -1
- package/lib/packlets/bcp47/bcp47Subtags/validate.js +17 -7
- package/lib/packlets/bcp47/bcp47Subtags/validate.js.map +1 -1
- package/lib/packlets/bcp47/common.js +2 -2
- package/lib/packlets/bcp47/common.js.map +1 -1
- package/lib/packlets/bcp47/helpers.js +4 -5
- package/lib/packlets/bcp47/helpers.js.map +1 -1
- package/lib/packlets/bcp47/index.js +17 -7
- package/lib/packlets/bcp47/index.js.map +1 -1
- package/lib/packlets/bcp47/languageTag.js +17 -7
- package/lib/packlets/bcp47/languageTag.js.map +1 -1
- package/lib/packlets/bcp47/languageTagParser.js +17 -7
- package/lib/packlets/bcp47/languageTagParser.js.map +1 -1
- package/lib/packlets/bcp47/match/similarity.js +17 -7
- package/lib/packlets/bcp47/match/similarity.js.map +1 -1
- package/lib/packlets/bcp47/normalization/baseNormalizer.js +17 -7
- package/lib/packlets/bcp47/normalization/baseNormalizer.js.map +1 -1
- package/lib/packlets/bcp47/normalization/canonicalNormalizer.js +17 -7
- package/lib/packlets/bcp47/normalization/canonicalNormalizer.js.map +1 -1
- package/lib/packlets/bcp47/normalization/common.js +2 -3
- package/lib/packlets/bcp47/normalization/common.js.map +1 -1
- package/lib/packlets/bcp47/normalization/preferredTagNormalizer.js +17 -7
- package/lib/packlets/bcp47/normalization/preferredTagNormalizer.js.map +1 -1
- package/lib/packlets/bcp47/overrides/converters.js +19 -9
- package/lib/packlets/bcp47/overrides/converters.js.map +1 -1
- package/lib/packlets/bcp47/overrides/overridesRegistry.js +17 -7
- package/lib/packlets/bcp47/overrides/overridesRegistry.js.map +1 -1
- package/lib/packlets/bcp47/validation/baseValidator.js +17 -7
- package/lib/packlets/bcp47/validation/baseValidator.js.map +1 -1
- package/lib/packlets/bcp47/validation/common.js +2 -3
- package/lib/packlets/bcp47/validation/common.js.map +1 -1
- package/lib/packlets/bcp47/validation/isCanonical.js +17 -7
- package/lib/packlets/bcp47/validation/isCanonical.js.map +1 -1
- package/lib/packlets/bcp47/validation/isInPreferredForm.js +17 -7
- package/lib/packlets/bcp47/validation/isInPreferredForm.js.map +1 -1
- package/lib/packlets/bcp47/validation/isValid.js +17 -7
- package/lib/packlets/bcp47/validation/isValid.js.map +1 -1
- package/lib/packlets/bcp47/validation/isWellFormed.js +17 -7
- package/lib/packlets/bcp47/validation/isWellFormed.js.map +1 -1
- package/lib/packlets/iana/common/converters.d.ts +1 -1
- package/lib/packlets/iana/common/converters.d.ts.map +1 -1
- package/lib/packlets/iana/common/converters.js +19 -9
- package/lib/packlets/iana/common/converters.js.map +1 -1
- package/lib/packlets/iana/common/utils.js +1 -2
- package/lib/packlets/iana/common/utils.js.map +1 -1
- package/lib/packlets/iana/converters.js +17 -7
- package/lib/packlets/iana/converters.js.map +1 -1
- package/lib/packlets/iana/index.js +17 -7
- package/lib/packlets/iana/index.js.map +1 -1
- package/lib/packlets/iana/jar/converters.js +17 -7
- package/lib/packlets/iana/jar/converters.js.map +1 -1
- package/lib/packlets/iana/jar/index.js +17 -7
- package/lib/packlets/iana/jar/index.js.map +1 -1
- package/lib/packlets/iana/jar/jarConverters.js +19 -9
- package/lib/packlets/iana/jar/jarConverters.js.map +1 -1
- package/lib/packlets/iana/jar/language-subtags/converters.js +17 -7
- package/lib/packlets/iana/jar/language-subtags/converters.js.map +1 -1
- package/lib/packlets/iana/jar/language-subtags/index.js +17 -7
- package/lib/packlets/iana/jar/language-subtags/index.js.map +1 -1
- package/lib/packlets/iana/jar/language-subtags/model.js +17 -7
- package/lib/packlets/iana/jar/language-subtags/model.js.map +1 -1
- package/lib/packlets/iana/jar/language-subtags/registry/converters.js +17 -7
- package/lib/packlets/iana/jar/language-subtags/registry/converters.js.map +1 -1
- package/lib/packlets/iana/jar/language-subtags/registry/index.js +17 -7
- package/lib/packlets/iana/jar/language-subtags/registry/index.js.map +1 -1
- package/lib/packlets/iana/jar/language-subtags/tags/converters.js +22 -12
- package/lib/packlets/iana/jar/language-subtags/tags/converters.js.map +1 -1
- package/lib/packlets/iana/jar/language-subtags/tags/index.js +17 -7
- package/lib/packlets/iana/jar/language-subtags/tags/index.js.map +1 -1
- package/lib/packlets/iana/jar/model.js +17 -7
- package/lib/packlets/iana/jar/model.js.map +1 -1
- package/lib/packlets/iana/language-subtags/converters.js +19 -9
- package/lib/packlets/iana/language-subtags/converters.js.map +1 -1
- package/lib/packlets/iana/language-subtags/index.js +17 -7
- package/lib/packlets/iana/language-subtags/index.js.map +1 -1
- package/lib/packlets/iana/language-subtags/jarConverters.js +20 -10
- package/lib/packlets/iana/language-subtags/jarConverters.js.map +1 -1
- package/lib/packlets/iana/language-subtags/subtagRegistry.js +17 -7
- package/lib/packlets/iana/language-subtags/subtagRegistry.js.map +1 -1
- package/lib/packlets/iana/language-tag-extensions/converters.js +19 -9
- package/lib/packlets/iana/language-tag-extensions/converters.js.map +1 -1
- package/lib/packlets/iana/language-tag-extensions/extensionsRegistry.js +17 -7
- package/lib/packlets/iana/language-tag-extensions/extensionsRegistry.js.map +1 -1
- package/lib/packlets/iana/language-tag-extensions/extensionsScope.js +17 -7
- package/lib/packlets/iana/language-tag-extensions/extensionsScope.js.map +1 -1
- package/lib/packlets/iana/language-tag-extensions/index.js +17 -7
- package/lib/packlets/iana/language-tag-extensions/index.js.map +1 -1
- package/lib/packlets/iana/language-tag-extensions/jarConverters.js +3 -3
- package/lib/packlets/iana/language-tag-extensions/jarConverters.js.map +1 -1
- package/lib/packlets/iana/model.js +17 -7
- package/lib/packlets/iana/model.js.map +1 -1
- package/lib/packlets/unsd/csv/converters.js +2 -2
- package/lib/packlets/unsd/csv/converters.js.map +1 -1
- package/lib/packlets/unsd/csv/index.js +17 -7
- package/lib/packlets/unsd/csv/index.js.map +1 -1
- package/lib/packlets/unsd/index.js +17 -7
- package/lib/packlets/unsd/index.js.map +1 -1
- package/lib/packlets/utils/jsonHelpers.js +1 -2
- package/lib/packlets/utils/jsonHelpers.js.map +1 -1
- package/package.json +29 -30
|
@@ -36,13 +36,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
36
36
|
}) : function(o, v) {
|
|
37
37
|
o["default"] = v;
|
|
38
38
|
});
|
|
39
|
-
var __importStar = (this && this.__importStar) || function (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
};
|
|
39
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
40
|
+
var ownKeys = function(o) {
|
|
41
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
42
|
+
var ar = [];
|
|
43
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
44
|
+
return ar;
|
|
45
|
+
};
|
|
46
|
+
return ownKeys(o);
|
|
47
|
+
};
|
|
48
|
+
return function (mod) {
|
|
49
|
+
if (mod && mod.__esModule) return mod;
|
|
50
|
+
var result = {};
|
|
51
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
52
|
+
__setModuleDefault(result, mod);
|
|
53
|
+
return result;
|
|
54
|
+
};
|
|
55
|
+
})();
|
|
46
56
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
57
|
exports.LanguageTagParser = void 0;
|
|
48
58
|
const Iana = __importStar(require("../iana"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"languageTagParser.js","sourceRoot":"","sources":["../../../src/packlets/bcp47/languageTagParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../iana';\n\nimport { Result, Success, allSucceed, fail, succeed } from '@fgv/ts-utils';\n\nimport { Validate } from './bcp47Subtags';\nimport { ExtensionSingleton, ExtensionSubtag } from './bcp47Subtags/model';\nimport { ISubtags } from './common';\n\n/**\n * @internal\n */\ninterface IParserState {\n readonly iana: Iana.LanguageRegistries;\n readonly tag: string;\n readonly subtags: string[];\n readonly parsedSubtags: ISubtags;\n next?: string;\n}\n\n/**\n * @public\n */\nexport class LanguageTagParser {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n /* c8 ignore next */\n private constructor() {}\n\n /**\n * Parses a string representation of a BCP-47 ({@link https://www.rfc-editor.org/rfc/rfc5646.html | RFC 5646})\n * language tag, to produce a {@link Bcp47.Subtags | Subtags} object which\n * breaks out each of the subtags.\n * @param tag - The `string` language tag to be parsed.\n * @param iana - Optional {@link Iana.LanguageRegistries | IANA language registries}\n * to be used.\n * @returns `Success` with the resulting {@link Bcp47.Subtags | subtags}\n * or `Failure` with details if an error occurs.\n * @public\n */\n public static parse(tag: string, iana?: Iana.LanguageRegistries): Result<ISubtags> {\n /* c8 ignore next */\n iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n const status: IParserState = {\n tag,\n iana,\n subtags: tag.split('-'),\n parsedSubtags: {}\n };\n status.next = status.subtags.shift();\n\n return allSucceed(\n [\n this._parseGrandfatheredTag(status),\n this._parsePrimaryLanguage(status),\n this._parseExtlang(status),\n this._parseScript(status),\n this._parseRegion(status),\n this._parseVariants(status),\n this._parseExtensions(status),\n this._parsePrivateSubtags(status),\n this._parseTagEnd(status)\n ],\n status\n ).onSuccess(() => {\n return succeed(status.parsedSubtags);\n });\n }\n\n /**\n * Determines if the entire tag matches a registered grandfathered tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with the updated {@link Bcp47.Subtags | subtags}\n * if a grandfathered tag is found, or `Success` with the supplied subtags\n * if no matching grandfathered tag is found.\n * @internal\n */\n protected static _parseGrandfatheredTag(state: IParserState): Success<ISubtags> {\n const grandfathered = state.iana.subtags.grandfathered.tryGet(state.tag);\n if (grandfathered) {\n state.parsedSubtags.grandfathered = state.tag as Iana.LanguageSubtags.GrandfatheredTag;\n // we consumed the whole thing\n state.subtags.splice(0, state.subtags.length);\n state.next = undefined;\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the primary language subtag of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the primary language subtag, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parsePrimaryLanguage(state: IParserState): Result<ISubtags> {\n // primary language subtag is required unless the entire tag is grandfathered or consists\n // of only private tags\n if (state.iana.subtags.languages.isWellFormed(state.next)) {\n state.parsedSubtags.primaryLanguage = state.next;\n state.next = state.subtags.shift();\n return succeed(state.parsedSubtags);\n } else if (state.parsedSubtags.grandfathered !== undefined) {\n return succeed(state.parsedSubtags);\n } else if (Validate.privateUsePrefix.isWellFormed(state.next)) {\n // just return with no primary language and the private tag\n // parser will be invoked by the parent flow.\n return succeed(state.parsedSubtags);\n }\n return fail(`${state.tag}: no primary language subtag`);\n }\n\n /**\n * Parses the extlang subtag(s) of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include extlang subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseExtlang(state: IParserState): Result<ISubtags> {\n // optional extlangs subtags\n while (state.iana.subtags.extlangs.isWellFormed(state.next)) {\n if (state.parsedSubtags.extlangs === undefined) {\n state.parsedSubtags.extlangs = [state.next];\n } else if (state.parsedSubtags.extlangs.length < 3) {\n state.parsedSubtags.extlangs.push(state.next);\n } else {\n return fail(`${state.next}: too many extlang subtags`);\n }\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the script subtag of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the script subtag if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseScript(state: IParserState): Result<ISubtags> {\n // optional script subtag\n if (state.iana.subtags.scripts.isWellFormed(state.next)) {\n state.parsedSubtags.script = state.next;\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the region subtag of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the region subtag if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseRegion(state: IParserState): Result<ISubtags> {\n // optional region subtag\n if (state.iana.subtags.regions.isWellFormed(state.next)) {\n state.parsedSubtags.region = state.next;\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the variant subtag(s) of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the variant subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseVariants(state: IParserState): Result<ISubtags> {\n // optional variant subtags\n while (state.iana.subtags.variants.isWellFormed(state.next)) {\n if (state.parsedSubtags.variants === undefined) {\n state.parsedSubtags.variants = [state.next];\n } else {\n state.parsedSubtags.variants.push(state.next);\n }\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the extension subtag(s) of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the extension subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseExtensions(state: IParserState): Result<ISubtags> {\n // optional extension subtags\n while (state.next !== undefined && Validate.extensionSingleton.isWellFormed(state.next)) {\n const singleton: ExtensionSingleton = state.next as ExtensionSingleton;\n const values: ExtensionSubtag[] = [];\n state.next = state.subtags.shift();\n\n while (Validate.extensionSubtag.isWellFormed(state.next)) {\n values.push(state.next as ExtensionSubtag);\n state.next = state.subtags.shift();\n }\n if (\n state.next !== undefined &&\n !Validate.extensionSingleton.isWellFormed(state.next) &&\n !Validate.privateUsePrefix.isWellFormed(state.next)\n ) {\n return fail(`${state.next}: malformed extension subtag`);\n } else if (values.length < 1) {\n return fail(`${state.tag}: extension '${singleton}' must have at least one subtag.`);\n }\n\n const value = values.join('-') as ExtensionSubtag;\n if (state.parsedSubtags.extensions === undefined) {\n state.parsedSubtags.extensions = [{ singleton, value }];\n } else {\n state.parsedSubtags.extensions.push({ singleton, value });\n }\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the private use subtags of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the private-use subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parsePrivateSubtags(state: IParserState): Result<ISubtags> {\n // optional private use subtags\n if (state.next !== undefined && Validate.privateUsePrefix.isWellFormed(state.next)) {\n const values: string[] = [];\n state.next = state.subtags.shift();\n\n while (\n state.next &&\n state.next.length > 1 &&\n Iana.LanguageSubtags.Validate.extendedLanguageRange.isWellFormed(state.next)\n ) {\n values.push(state.next);\n state.next = state.subtags.shift();\n }\n\n if (state.next !== undefined) {\n return fail(`${state.next}: malformed private-use subtag`);\n } else if (values.length < 1) {\n return fail(`${state.tag}: private-use tag must have at least one subtag.`);\n }\n\n state.parsedSubtags.privateUse = values as Iana.LanguageSubtags.ExtendedLanguageRange[];\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Verifies {@link Bcp47.ParserState | parser state} at the end of a parse operation.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` if the tag was fully consumed, or `Failure` with details\n * if unexpected subtags remain to be parsed.\n * @internal\n */\n protected static _parseTagEnd(state: IParserState): Result<ISubtags> {\n if (state.next !== undefined) {\n return fail(`${state.next}: unexpected subtag`);\n }\n return succeed(state.parsedSubtags);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"languageTagParser.js","sourceRoot":"","sources":["../../../src/packlets/bcp47/languageTagParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../iana';\n\nimport { Result, Success, allSucceed, fail, succeed } from '@fgv/ts-utils';\n\nimport { Validate } from './bcp47Subtags';\nimport { ExtensionSingleton, ExtensionSubtag } from './bcp47Subtags/model';\nimport { ISubtags } from './common';\n\n/**\n * @internal\n */\ninterface IParserState {\n readonly iana: Iana.LanguageRegistries;\n readonly tag: string;\n readonly subtags: string[];\n readonly parsedSubtags: ISubtags;\n next?: string;\n}\n\n/**\n * @public\n */\nexport class LanguageTagParser {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n /* c8 ignore next */\n private constructor() {}\n\n /**\n * Parses a string representation of a BCP-47 ({@link https://www.rfc-editor.org/rfc/rfc5646.html | RFC 5646})\n * language tag, to produce a {@link Bcp47.Subtags | Subtags} object which\n * breaks out each of the subtags.\n * @param tag - The `string` language tag to be parsed.\n * @param iana - Optional {@link Iana.LanguageRegistries | IANA language registries}\n * to be used.\n * @returns `Success` with the resulting {@link Bcp47.Subtags | subtags}\n * or `Failure` with details if an error occurs.\n * @public\n */\n public static parse(tag: string, iana?: Iana.LanguageRegistries): Result<ISubtags> {\n /* c8 ignore next */\n iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n const status: IParserState = {\n tag,\n iana,\n subtags: tag.split('-'),\n parsedSubtags: {}\n };\n status.next = status.subtags.shift();\n\n return allSucceed(\n [\n this._parseGrandfatheredTag(status),\n this._parsePrimaryLanguage(status),\n this._parseExtlang(status),\n this._parseScript(status),\n this._parseRegion(status),\n this._parseVariants(status),\n this._parseExtensions(status),\n this._parsePrivateSubtags(status),\n this._parseTagEnd(status)\n ],\n status\n ).onSuccess(() => {\n return succeed(status.parsedSubtags);\n });\n }\n\n /**\n * Determines if the entire tag matches a registered grandfathered tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with the updated {@link Bcp47.Subtags | subtags}\n * if a grandfathered tag is found, or `Success` with the supplied subtags\n * if no matching grandfathered tag is found.\n * @internal\n */\n protected static _parseGrandfatheredTag(state: IParserState): Success<ISubtags> {\n const grandfathered = state.iana.subtags.grandfathered.tryGet(state.tag);\n if (grandfathered) {\n state.parsedSubtags.grandfathered = state.tag as Iana.LanguageSubtags.GrandfatheredTag;\n // we consumed the whole thing\n state.subtags.splice(0, state.subtags.length);\n state.next = undefined;\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the primary language subtag of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the primary language subtag, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parsePrimaryLanguage(state: IParserState): Result<ISubtags> {\n // primary language subtag is required unless the entire tag is grandfathered or consists\n // of only private tags\n if (state.iana.subtags.languages.isWellFormed(state.next)) {\n state.parsedSubtags.primaryLanguage = state.next;\n state.next = state.subtags.shift();\n return succeed(state.parsedSubtags);\n } else if (state.parsedSubtags.grandfathered !== undefined) {\n return succeed(state.parsedSubtags);\n } else if (Validate.privateUsePrefix.isWellFormed(state.next)) {\n // just return with no primary language and the private tag\n // parser will be invoked by the parent flow.\n return succeed(state.parsedSubtags);\n }\n return fail(`${state.tag}: no primary language subtag`);\n }\n\n /**\n * Parses the extlang subtag(s) of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include extlang subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseExtlang(state: IParserState): Result<ISubtags> {\n // optional extlangs subtags\n while (state.iana.subtags.extlangs.isWellFormed(state.next)) {\n if (state.parsedSubtags.extlangs === undefined) {\n state.parsedSubtags.extlangs = [state.next];\n } else if (state.parsedSubtags.extlangs.length < 3) {\n state.parsedSubtags.extlangs.push(state.next);\n } else {\n return fail(`${state.next}: too many extlang subtags`);\n }\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the script subtag of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the script subtag if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseScript(state: IParserState): Result<ISubtags> {\n // optional script subtag\n if (state.iana.subtags.scripts.isWellFormed(state.next)) {\n state.parsedSubtags.script = state.next;\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the region subtag of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the region subtag if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseRegion(state: IParserState): Result<ISubtags> {\n // optional region subtag\n if (state.iana.subtags.regions.isWellFormed(state.next)) {\n state.parsedSubtags.region = state.next;\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the variant subtag(s) of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the variant subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseVariants(state: IParserState): Result<ISubtags> {\n // optional variant subtags\n while (state.iana.subtags.variants.isWellFormed(state.next)) {\n if (state.parsedSubtags.variants === undefined) {\n state.parsedSubtags.variants = [state.next];\n } else {\n state.parsedSubtags.variants.push(state.next);\n }\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the extension subtag(s) of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the extension subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseExtensions(state: IParserState): Result<ISubtags> {\n // optional extension subtags\n while (state.next !== undefined && Validate.extensionSingleton.isWellFormed(state.next)) {\n const singleton: ExtensionSingleton = state.next as ExtensionSingleton;\n const values: ExtensionSubtag[] = [];\n state.next = state.subtags.shift();\n\n while (Validate.extensionSubtag.isWellFormed(state.next)) {\n values.push(state.next as ExtensionSubtag);\n state.next = state.subtags.shift();\n }\n if (\n state.next !== undefined &&\n !Validate.extensionSingleton.isWellFormed(state.next) &&\n !Validate.privateUsePrefix.isWellFormed(state.next)\n ) {\n return fail(`${state.next}: malformed extension subtag`);\n } else if (values.length < 1) {\n return fail(`${state.tag}: extension '${singleton}' must have at least one subtag.`);\n }\n\n const value = values.join('-') as ExtensionSubtag;\n if (state.parsedSubtags.extensions === undefined) {\n state.parsedSubtags.extensions = [{ singleton, value }];\n } else {\n state.parsedSubtags.extensions.push({ singleton, value });\n }\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the private use subtags of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the private-use subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parsePrivateSubtags(state: IParserState): Result<ISubtags> {\n // optional private use subtags\n if (state.next !== undefined && Validate.privateUsePrefix.isWellFormed(state.next)) {\n const values: string[] = [];\n state.next = state.subtags.shift();\n\n while (\n state.next &&\n state.next.length > 1 &&\n Iana.LanguageSubtags.Validate.extendedLanguageRange.isWellFormed(state.next)\n ) {\n values.push(state.next);\n state.next = state.subtags.shift();\n }\n\n if (state.next !== undefined) {\n return fail(`${state.next}: malformed private-use subtag`);\n } else if (values.length < 1) {\n return fail(`${state.tag}: private-use tag must have at least one subtag.`);\n }\n\n state.parsedSubtags.privateUse = values as Iana.LanguageSubtags.ExtendedLanguageRange[];\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Verifies {@link Bcp47.ParserState | parser state} at the end of a parse operation.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` if the tag was fully consumed, or `Failure` with details\n * if unexpected subtags remain to be parsed.\n * @internal\n */\n protected static _parseTagEnd(state: IParserState): Result<ISubtags> {\n if (state.next !== undefined) {\n return fail(`${state.next}: unexpected subtag`);\n }\n return succeed(state.parsedSubtags);\n }\n}\n"]}
|
|
@@ -36,13 +36,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
36
36
|
}) : function(o, v) {
|
|
37
37
|
o["default"] = v;
|
|
38
38
|
});
|
|
39
|
-
var __importStar = (this && this.__importStar) || function (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
};
|
|
39
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
40
|
+
var ownKeys = function(o) {
|
|
41
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
42
|
+
var ar = [];
|
|
43
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
44
|
+
return ar;
|
|
45
|
+
};
|
|
46
|
+
return ownKeys(o);
|
|
47
|
+
};
|
|
48
|
+
return function (mod) {
|
|
49
|
+
if (mod && mod.__esModule) return mod;
|
|
50
|
+
var result = {};
|
|
51
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
52
|
+
__setModuleDefault(result, mod);
|
|
53
|
+
return result;
|
|
54
|
+
};
|
|
55
|
+
})();
|
|
46
56
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
57
|
exports.LanguageSimilarityMatcher = void 0;
|
|
48
58
|
const Iana = __importStar(require("../../iana"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"similarity.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/match/similarity.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Unsd from '../../unsd';\n\nimport { DefaultRegistries, OverridesRegistry } from '../overrides';\n\nimport { GlobalRegion } from '../common';\nimport { LanguageTag } from '../languageTag';\nimport { tagSimilarity } from './common';\n\n/**\n * Helper to compare two language tags to determine how closely related they are,\n * applying normalization and language semantics as appropriate.\n * @public\n */\nexport class LanguageSimilarityMatcher {\n public iana: Iana.LanguageRegistries;\n public unsd: Unsd.RegionCodes;\n public overrides: OverridesRegistry;\n\n public constructor(iana?: Iana.LanguageRegistries) {\n /* c8 ignore next */\n this.iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n this.unsd = Unsd.DefaultRegistries.regionCodes;\n this.overrides = DefaultRegistries.overridesRegistry;\n }\n\n public matchLanguageTags(t1: LanguageTag, t2: LanguageTag): number {\n // no primary tag is either all private or grandfathered, which must match\n // exactly.\n if (!t1.subtags.primaryLanguage || !t2.subtags.primaryLanguage) {\n return t1.toString().toLowerCase() === t2.toString().toLowerCase()\n ? tagSimilarity.exact\n : tagSimilarity.none;\n }\n\n let quality = this.matchPrimaryLanguage(t1, t2);\n quality = quality > tagSimilarity.none ? Math.min(this.matchExtlang(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchScript(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchRegion(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchVariants(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchExtensions(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchPrivateUseTags(t1, t2), quality) : quality;\n\n return quality;\n }\n\n public matchPrimaryLanguage(lt1: LanguageTag, lt2: LanguageTag): number {\n /* c8 ignore next 2 */\n const l1 = lt1.subtags.primaryLanguage?.toLowerCase();\n const l2 = lt2.subtags.primaryLanguage?.toLowerCase();\n\n if (l1 === l2) {\n return tagSimilarity.exact;\n }\n\n if (lt1.isUndetermined || lt2.isUndetermined) {\n return tagSimilarity.undetermined;\n }\n\n return tagSimilarity.none;\n }\n\n public matchExtlang(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.extlangs?.length !== lt2.subtags.extlangs?.length) {\n return tagSimilarity.none;\n }\n\n if (lt1.subtags.extlangs) {\n for (let i = 0; i < lt1.subtags.extlangs.length; i++) {\n if (lt1.subtags.extlangs[i].toLowerCase() !== lt2.subtags.extlangs![i].toLowerCase()) {\n return tagSimilarity.none;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchScript(lt1: LanguageTag, lt2: LanguageTag): number {\n const s1 = lt1.effectiveScript?.toLowerCase();\n const s2 = lt2.effectiveScript?.toLowerCase();\n\n if (s1 === s2) {\n return tagSimilarity.exact;\n }\n\n if (lt1.isUndetermined || lt2.isUndetermined) {\n return tagSimilarity.undetermined;\n }\n\n return tagSimilarity.none;\n }\n\n public matchRegion(lt1: LanguageTag, lt2: LanguageTag): number {\n const r1 = lt1.subtags.region?.toUpperCase() as Iana.LanguageSubtags.RegionSubtag;\n const r2 = lt2.subtags.region?.toUpperCase() as Iana.LanguageSubtags.RegionSubtag;\n\n if (r1 === r2) {\n return tagSimilarity.exact;\n }\n\n // region 001 is equivalent to neutral (no region)\n if (r1 === GlobalRegion || r2 === GlobalRegion) {\n // if one tag is 001 and the other in neutral, exact match\n // otherwise, one tag is 001 so neutral region match\n return !r1 || !r2 ? tagSimilarity.exact : tagSimilarity.neutralRegion;\n }\n\n if (!r1 || !r2) {\n return tagSimilarity.neutralRegion;\n }\n\n // macro-region match\n const r1IsMacroRegion = Iana.Validate.unM49RegionCode.isWellFormed(r1);\n const r2IsMacroRegion = Iana.Validate.unM49RegionCode.isWellFormed(r2);\n if (r1IsMacroRegion || r2IsMacroRegion) {\n let contained: Unsd.ICountryOrArea | Unsd.Region | undefined;\n let container: Unsd.Region | undefined;\n if (r1IsMacroRegion) {\n container = this.unsd.regions.tryGetRegion(r1 as unknown as Iana.Model.UnM49RegionCode);\n contained =\n this.unsd.areas.tryGetAlpha2Area(r2 as unknown as Iana.Model.IsoAlpha2RegionCode) ??\n this.unsd.tryGetRegionOrArea(r2 as unknown as Iana.Model.UnM49RegionCode);\n } else {\n container = this.unsd.regions.tryGetRegion(r2 as unknown as Iana.Model.UnM49RegionCode);\n contained = this.unsd.areas.tryGetAlpha2Area(r1 as unknown as Iana.Model.IsoAlpha2RegionCode);\n }\n if (container && contained) {\n if (this.unsd.getIsContained(container, contained)) {\n return tagSimilarity.macroRegion;\n }\n\n // if they're both regions, also check to see if the second region contains the\n // first\n if (contained.tier !== 'area' && this.unsd.getIsContained(contained, container)) {\n return tagSimilarity.macroRegion;\n }\n }\n }\n\n /* c8 ignore next 6 */\n const o1 = this.overrides.overrides.get(\n lt1.subtags.primaryLanguage?.toLowerCase() as Iana.LanguageSubtags.LanguageSubtag\n );\n const o2 = this.overrides.overrides.get(\n lt2.subtags.primaryLanguage?.toLowerCase() as Iana.LanguageSubtags.LanguageSubtag\n );\n\n // orthographic affinity\n if (o1 && o2) {\n /* c8 ignore next 2 */\n const a1 = o1.affinity?.get(r1) ?? o1.defaultAffinity;\n const a2 = o2.affinity?.get(r2) ?? o2.defaultAffinity;\n if (a1 && a2 && a1 === a2) {\n if (r1 === a1.toUpperCase() || r2 === a2.toUpperCase()) {\n return tagSimilarity.preferredAffinity;\n }\n return tagSimilarity.affinity;\n }\n }\n\n // preferred region\n if (o1?.preferredRegion === r1 || o2?.preferredRegion === r2) {\n return tagSimilarity.preferredRegion;\n }\n\n return tagSimilarity.sibling;\n }\n\n public matchVariants(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.variants?.length !== lt2.subtags.variants?.length) {\n return tagSimilarity.region;\n }\n\n if (lt1.subtags.variants) {\n for (let i = 0; i < lt1.subtags.variants.length; i++) {\n if (lt1.subtags.variants[i].toLowerCase() !== lt2.subtags.variants![i].toLowerCase()) {\n return tagSimilarity.region;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchExtensions(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.extensions?.length !== lt2.subtags.extensions?.length) {\n return tagSimilarity.variant;\n }\n\n if (lt1.subtags.extensions) {\n for (let i = 0; i < lt1.subtags.extensions.length; i++) {\n if (\n lt1.subtags.extensions[i].singleton.toLowerCase() !==\n lt2.subtags.extensions![i].singleton.toLowerCase() ||\n lt1.subtags.extensions[i].value.toLowerCase() !== lt2.subtags.extensions![i].value.toLowerCase()\n ) {\n return tagSimilarity.variant;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchPrivateUseTags(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.privateUse?.length !== lt2.subtags.privateUse?.length) {\n return tagSimilarity.variant;\n }\n\n if (lt1.subtags.privateUse) {\n for (let i = 0; i < lt1.subtags.privateUse.length; i++) {\n if (lt1.subtags.privateUse[i].toLowerCase() !== lt2.subtags.privateUse![i].toLowerCase()) {\n return tagSimilarity.variant;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"similarity.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/match/similarity.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Unsd from '../../unsd';\n\nimport { DefaultRegistries, OverridesRegistry } from '../overrides';\n\nimport { GlobalRegion } from '../common';\nimport { LanguageTag } from '../languageTag';\nimport { tagSimilarity } from './common';\n\n/**\n * Helper to compare two language tags to determine how closely related they are,\n * applying normalization and language semantics as appropriate.\n * @public\n */\nexport class LanguageSimilarityMatcher {\n public iana: Iana.LanguageRegistries;\n public unsd: Unsd.RegionCodes;\n public overrides: OverridesRegistry;\n\n public constructor(iana?: Iana.LanguageRegistries) {\n /* c8 ignore next */\n this.iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n this.unsd = Unsd.DefaultRegistries.regionCodes;\n this.overrides = DefaultRegistries.overridesRegistry;\n }\n\n public matchLanguageTags(t1: LanguageTag, t2: LanguageTag): number {\n // no primary tag is either all private or grandfathered, which must match\n // exactly.\n if (!t1.subtags.primaryLanguage || !t2.subtags.primaryLanguage) {\n return t1.toString().toLowerCase() === t2.toString().toLowerCase()\n ? tagSimilarity.exact\n : tagSimilarity.none;\n }\n\n let quality = this.matchPrimaryLanguage(t1, t2);\n quality = quality > tagSimilarity.none ? Math.min(this.matchExtlang(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchScript(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchRegion(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchVariants(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchExtensions(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchPrivateUseTags(t1, t2), quality) : quality;\n\n return quality;\n }\n\n public matchPrimaryLanguage(lt1: LanguageTag, lt2: LanguageTag): number {\n /* c8 ignore next 2 */\n const l1 = lt1.subtags.primaryLanguage?.toLowerCase();\n const l2 = lt2.subtags.primaryLanguage?.toLowerCase();\n\n if (l1 === l2) {\n return tagSimilarity.exact;\n }\n\n if (lt1.isUndetermined || lt2.isUndetermined) {\n return tagSimilarity.undetermined;\n }\n\n return tagSimilarity.none;\n }\n\n public matchExtlang(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.extlangs?.length !== lt2.subtags.extlangs?.length) {\n return tagSimilarity.none;\n }\n\n if (lt1.subtags.extlangs) {\n for (let i = 0; i < lt1.subtags.extlangs.length; i++) {\n if (lt1.subtags.extlangs[i].toLowerCase() !== lt2.subtags.extlangs![i].toLowerCase()) {\n return tagSimilarity.none;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchScript(lt1: LanguageTag, lt2: LanguageTag): number {\n const s1 = lt1.effectiveScript?.toLowerCase();\n const s2 = lt2.effectiveScript?.toLowerCase();\n\n if (s1 === s2) {\n return tagSimilarity.exact;\n }\n\n if (lt1.isUndetermined || lt2.isUndetermined) {\n return tagSimilarity.undetermined;\n }\n\n return tagSimilarity.none;\n }\n\n public matchRegion(lt1: LanguageTag, lt2: LanguageTag): number {\n const r1 = lt1.subtags.region?.toUpperCase() as Iana.LanguageSubtags.RegionSubtag;\n const r2 = lt2.subtags.region?.toUpperCase() as Iana.LanguageSubtags.RegionSubtag;\n\n if (r1 === r2) {\n return tagSimilarity.exact;\n }\n\n // region 001 is equivalent to neutral (no region)\n if (r1 === GlobalRegion || r2 === GlobalRegion) {\n // if one tag is 001 and the other in neutral, exact match\n // otherwise, one tag is 001 so neutral region match\n return !r1 || !r2 ? tagSimilarity.exact : tagSimilarity.neutralRegion;\n }\n\n if (!r1 || !r2) {\n return tagSimilarity.neutralRegion;\n }\n\n // macro-region match\n const r1IsMacroRegion = Iana.Validate.unM49RegionCode.isWellFormed(r1);\n const r2IsMacroRegion = Iana.Validate.unM49RegionCode.isWellFormed(r2);\n if (r1IsMacroRegion || r2IsMacroRegion) {\n let contained: Unsd.ICountryOrArea | Unsd.Region | undefined;\n let container: Unsd.Region | undefined;\n if (r1IsMacroRegion) {\n container = this.unsd.regions.tryGetRegion(r1 as unknown as Iana.Model.UnM49RegionCode);\n contained =\n this.unsd.areas.tryGetAlpha2Area(r2 as unknown as Iana.Model.IsoAlpha2RegionCode) ??\n this.unsd.tryGetRegionOrArea(r2 as unknown as Iana.Model.UnM49RegionCode);\n } else {\n container = this.unsd.regions.tryGetRegion(r2 as unknown as Iana.Model.UnM49RegionCode);\n contained = this.unsd.areas.tryGetAlpha2Area(r1 as unknown as Iana.Model.IsoAlpha2RegionCode);\n }\n if (container && contained) {\n if (this.unsd.getIsContained(container, contained)) {\n return tagSimilarity.macroRegion;\n }\n\n // if they're both regions, also check to see if the second region contains the\n // first\n if (contained.tier !== 'area' && this.unsd.getIsContained(contained, container)) {\n return tagSimilarity.macroRegion;\n }\n }\n }\n\n /* c8 ignore next 6 */\n const o1 = this.overrides.overrides.get(\n lt1.subtags.primaryLanguage?.toLowerCase() as Iana.LanguageSubtags.LanguageSubtag\n );\n const o2 = this.overrides.overrides.get(\n lt2.subtags.primaryLanguage?.toLowerCase() as Iana.LanguageSubtags.LanguageSubtag\n );\n\n // orthographic affinity\n if (o1 && o2) {\n /* c8 ignore next 2 */\n const a1 = o1.affinity?.get(r1) ?? o1.defaultAffinity;\n const a2 = o2.affinity?.get(r2) ?? o2.defaultAffinity;\n if (a1 && a2 && a1 === a2) {\n if (r1 === a1.toUpperCase() || r2 === a2.toUpperCase()) {\n return tagSimilarity.preferredAffinity;\n }\n return tagSimilarity.affinity;\n }\n }\n\n // preferred region\n if (o1?.preferredRegion === r1 || o2?.preferredRegion === r2) {\n return tagSimilarity.preferredRegion;\n }\n\n return tagSimilarity.sibling;\n }\n\n public matchVariants(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.variants?.length !== lt2.subtags.variants?.length) {\n return tagSimilarity.region;\n }\n\n if (lt1.subtags.variants) {\n for (let i = 0; i < lt1.subtags.variants.length; i++) {\n if (lt1.subtags.variants[i].toLowerCase() !== lt2.subtags.variants![i].toLowerCase()) {\n return tagSimilarity.region;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchExtensions(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.extensions?.length !== lt2.subtags.extensions?.length) {\n return tagSimilarity.variant;\n }\n\n if (lt1.subtags.extensions) {\n for (let i = 0; i < lt1.subtags.extensions.length; i++) {\n if (\n lt1.subtags.extensions[i].singleton.toLowerCase() !==\n lt2.subtags.extensions![i].singleton.toLowerCase() ||\n lt1.subtags.extensions[i].value.toLowerCase() !== lt2.subtags.extensions![i].value.toLowerCase()\n ) {\n return tagSimilarity.variant;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchPrivateUseTags(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.privateUse?.length !== lt2.subtags.privateUse?.length) {\n return tagSimilarity.variant;\n }\n\n if (lt1.subtags.privateUse) {\n for (let i = 0; i < lt1.subtags.privateUse.length; i++) {\n if (lt1.subtags.privateUse[i].toLowerCase() !== lt2.subtags.privateUse![i].toLowerCase()) {\n return tagSimilarity.variant;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n}\n"]}
|
|
@@ -36,13 +36,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
36
36
|
}) : function(o, v) {
|
|
37
37
|
o["default"] = v;
|
|
38
38
|
});
|
|
39
|
-
var __importStar = (this && this.__importStar) || function (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
};
|
|
39
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
40
|
+
var ownKeys = function(o) {
|
|
41
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
42
|
+
var ar = [];
|
|
43
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
44
|
+
return ar;
|
|
45
|
+
};
|
|
46
|
+
return ownKeys(o);
|
|
47
|
+
};
|
|
48
|
+
return function (mod) {
|
|
49
|
+
if (mod && mod.__esModule) return mod;
|
|
50
|
+
var result = {};
|
|
51
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
52
|
+
__setModuleDefault(result, mod);
|
|
53
|
+
return result;
|
|
54
|
+
};
|
|
55
|
+
})();
|
|
46
56
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
57
|
exports.TagNormalizerBase = void 0;
|
|
48
58
|
const Iana = __importStar(require("../../iana"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/baseNormalizer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG
|
|
1
|
+
{"version":3,"file":"baseNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/baseNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\n\nimport { Result, allSucceed, fail, mapResults, populateObject, succeed } from '@fgv/ts-utils';\nimport { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';\nimport { IExtensionSubtagValue, ISubtags, subtagsToString } from '../common';\nimport { TagNormalization } from './common';\n\n/**\n * @public\n */\nexport interface ITagNormalizer {\n readonly normalization: TagNormalization;\n\n processSubtags(subtags: ISubtags): Result<ISubtags>;\n}\n\n/**\n * @public\n */\nexport abstract class TagNormalizerBase {\n protected readonly _iana: Iana.LanguageRegistries;\n\n public abstract readonly normalization: TagNormalization;\n\n public constructor(iana?: Iana.LanguageRegistries) {\n /* c8 ignore next - dependency injection primarily for test */\n this._iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n }\n\n public processSubtags(subtags: ISubtags): Result<ISubtags> {\n return populateObject<ISubtags>(\n {\n primaryLanguage: () => this._processLanguage(subtags),\n extlangs: () => this._processExtlangs(subtags),\n script: () => this._processScript(subtags),\n region: () => this._processRegion(subtags),\n variants: () => this._processVariants(subtags),\n extensions: () => this._processExtensions(subtags),\n privateUse: () => this._processPrivateUseTags(subtags),\n grandfathered: () => this._processGrandfatheredTags(subtags)\n },\n { suppressUndefined: true }\n ).onSuccess((processed) => {\n return this._postValidate(processed);\n });\n }\n\n protected _basicPostValidation(subtags: ISubtags): Result<ISubtags> {\n /* c8 ignore next 7 - any validation whatsoever catches these so should never happen in practice */\n if (\n subtags.primaryLanguage === undefined &&\n subtags.grandfathered === undefined &&\n subtags.privateUse === undefined\n ) {\n return fail(`${subtagsToString(subtags)}: missing primary language subtag.`);\n }\n\n /* c8 ignore next 3 - any validation whatsoever catches these so should never happen in practice */\n if (subtags.extlangs && subtags.extlangs.length > 3) {\n return fail(`${subtagsToString(subtags)}: too many extlang subtags`);\n }\n return succeed(subtags);\n }\n\n protected _postValidate(subtags: ISubtags): Result<ISubtags> {\n return this._basicPostValidation(subtags);\n }\n\n protected _processExtensions(subtags: ISubtags): Result<IExtensionSubtagValue[] | undefined> {\n if (subtags.extensions) {\n return mapResults(\n subtags.extensions.map((ex) => {\n return populateObject<IExtensionSubtagValue>({\n singleton: () => this._processExtensionSingleton(ex.singleton),\n value: () => this._processExtensionSubtagValue(ex.value)\n });\n })\n );\n }\n return succeed(subtags.extensions);\n }\n\n protected _verifyUnique<T, TK extends string>(\n description: string,\n items: T[] | undefined,\n getKey: (item: T) => TK\n ): Result<T[] | undefined> {\n if (items) {\n const present = new Set<TK>();\n return allSucceed(\n items.map((i) => {\n const key = getKey(i);\n if (present.has(key)) {\n return fail(`${key}: duplicate ${description}`);\n }\n present.add(key);\n return succeed(key);\n }),\n items\n );\n }\n return succeed(items);\n }\n\n protected abstract _processLanguage(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.LanguageSubtag | undefined>;\n protected abstract _processExtlangs(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined>;\n protected abstract _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined>;\n protected abstract _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined>;\n protected abstract _processVariants(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined>;\n protected abstract _processExtensionSingleton(singleton: ExtensionSingleton): Result<ExtensionSingleton>;\n protected abstract _processExtensionSubtagValue(value: ExtensionSubtag): Result<ExtensionSubtag>;\n protected abstract _processPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined>;\n protected abstract _processGrandfatheredTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined>;\n}\n"]}
|
|
@@ -36,13 +36,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
36
36
|
}) : function(o, v) {
|
|
37
37
|
o["default"] = v;
|
|
38
38
|
});
|
|
39
|
-
var __importStar = (this && this.__importStar) || function (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
};
|
|
39
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
40
|
+
var ownKeys = function(o) {
|
|
41
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
42
|
+
var ar = [];
|
|
43
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
44
|
+
return ar;
|
|
45
|
+
};
|
|
46
|
+
return ownKeys(o);
|
|
47
|
+
};
|
|
48
|
+
return function (mod) {
|
|
49
|
+
if (mod && mod.__esModule) return mod;
|
|
50
|
+
var result = {};
|
|
51
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
52
|
+
__setModuleDefault(result, mod);
|
|
53
|
+
return result;
|
|
54
|
+
};
|
|
55
|
+
})();
|
|
46
56
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
57
|
exports.CanonicalNormalizer = void 0;
|
|
48
58
|
const Iana = __importStar(require("../../iana"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonicalNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/canonicalNormalizer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG
|
|
1
|
+
{"version":3,"file":"canonicalNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/canonicalNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Bcp47Subtags from '../bcp47Subtags';\n\nimport { Result, mapResults, succeed } from '@fgv/ts-utils';\n\nimport { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';\nimport { ISubtags } from '../common';\nimport { TagNormalizerBase } from './baseNormalizer';\nimport { TagNormalization } from './common';\n\n/**\n * @internal\n */\nexport class CanonicalNormalizer extends TagNormalizerBase {\n public readonly normalization: TagNormalization = 'canonical';\n\n protected _processLanguage(subtags: ISubtags): Result<Iana.LanguageSubtags.LanguageSubtag | undefined> {\n if (subtags.primaryLanguage) {\n return this._iana.subtags.languages.toCanonical(subtags.primaryLanguage);\n }\n return succeed(subtags.primaryLanguage);\n }\n\n protected _processExtlangs(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined> {\n if (subtags.extlangs) {\n return mapResults(subtags.extlangs.map((e) => this._iana.subtags.extlangs.toCanonical(e)));\n }\n return succeed(undefined);\n }\n\n protected _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined> {\n if (subtags.script) {\n return this._iana.subtags.scripts.toCanonical(subtags.script);\n }\n return succeed(undefined);\n }\n\n protected _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined> {\n if (subtags.region) {\n return this._iana.subtags.regions.toCanonical(subtags.region);\n }\n return succeed(undefined);\n }\n\n protected _processVariants(subtags: ISubtags): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined> {\n if (subtags.variants) {\n return mapResults(subtags.variants.map((v) => this._iana.subtags.variants.toCanonical(v)));\n }\n return succeed(undefined);\n }\n\n protected _processExtensionSingleton(singleton: ExtensionSingleton): Result<ExtensionSingleton> {\n return this._iana.extensions.extensions.toCanonical(singleton);\n }\n\n protected _processExtensionSubtagValue(value: ExtensionSubtag): Result<ExtensionSubtag> {\n return Bcp47Subtags.Validate.extensionSubtag.toCanonical(value);\n }\n\n protected _processPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined> {\n if (subtags.privateUse) {\n const merged = subtags.privateUse.join('-');\n return Iana.LanguageSubtags.Validate.extendedLanguageRange.toCanonical(merged).onSuccess((canon) => {\n return succeed(canon.split('-') as Iana.LanguageSubtags.ExtendedLanguageRange[]);\n });\n }\n return succeed(subtags.privateUse);\n }\n\n protected _processGrandfatheredTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined> {\n if (subtags.grandfathered) {\n return this._iana.subtags.grandfathered.toCanonical(subtags.grandfathered);\n }\n return succeed(undefined);\n }\n}\n"]}
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
* SOFTWARE.
|
|
22
22
|
*/
|
|
23
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
-
exports.
|
|
24
|
+
exports.compareNormalization = compareNormalization;
|
|
25
|
+
exports.mostNormalized = mostNormalized;
|
|
25
26
|
/**
|
|
26
27
|
* Ordered ranking of the degrees of normalization, from `unknown` (least
|
|
27
28
|
* normalized) to `preferred` (most normalized).
|
|
@@ -66,7 +67,6 @@ function compareNormalization(n1, n2) {
|
|
|
66
67
|
}
|
|
67
68
|
return 0;
|
|
68
69
|
}
|
|
69
|
-
exports.compareNormalization = compareNormalization;
|
|
70
70
|
/**
|
|
71
71
|
* Chooses the most normalized of two normalization ranks.
|
|
72
72
|
* @param n1 - The first {@link TagNormalization} to be compared.
|
|
@@ -78,5 +78,4 @@ function mostNormalized(n1, n2) {
|
|
|
78
78
|
/* c8 ignore next - hard to hit due to guards */
|
|
79
79
|
return normalizationRank[n1] > normalizationRank[n2] ? n1 : n2;
|
|
80
80
|
}
|
|
81
|
-
exports.mostNormalized = mostNormalized;
|
|
82
81
|
//# sourceMappingURL=common.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/common.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/common.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;AA4CH,oDAOC;AASD,wCAGC;AAvDD;;;;GAIG;AACH,MAAM,iBAAiB,GAAqC;IAC1D;;OAEG;IACH,OAAO,EAAE,CAAC;IACV;;OAEG;IACH,IAAI,EAAE,GAAG;IACT;;;;OAIG;IACH,SAAS,EAAE,GAAG;IACd;;;;OAIG;IACH,SAAS,EAAE,GAAG;CACf,CAAC;AAEF;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAAC,EAAoB,EAAE,EAAoB;IAC7E,IAAI,iBAAiB,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,CAAC;IACX,CAAC;SAAM,IAAI,iBAAiB,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,EAAoB,EAAE,EAAoB;IACvE,gDAAgD;IAChD,OAAO,iBAAiB,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Describes the degree of normalization of a language tag.\n * @public\n */\nexport type TagNormalization = 'unknown' | 'none' | 'canonical' | 'preferred';\n\n/**\n * Ordered ranking of the degrees of normalization, from `unknown` (least\n * normalized) to `preferred` (most normalized).\n * @public\n */\nconst normalizationRank: Record<TagNormalization, number> = {\n /**\n * Normalization level is unknown.\n */\n unknown: 0,\n /**\n * Not normalized.\n */\n none: 0.1,\n /**\n * Tag and subtag case has been normalized to canonical\n * letter case (e.g. lower-case language and upper-case\n * region) but no other normalization has been applied.\n */\n canonical: 0.9,\n /**\n * All tag recommendations have been applied - e.g. suppressed\n * script is removed, deprecated or grandfathered values are\n * replaced with preferred values.\n */\n preferred: 1.0\n};\n\n/**\n * Determines which of two normalization ranks is most normalized.\n * @param n1 - The first {@link TagNormalization} to be compared.\n * @param n2 - The second {@link TagNormalization} to me compared.\n * @returns `1` if `n1` is more normalized, `-1` if `n2` is more\n * normalized, or `0` if they are identical.\n * @public\n */\nexport function compareNormalization(n1: TagNormalization, n2: TagNormalization): -1 | 0 | 1 {\n if (normalizationRank[n1] > normalizationRank[n2]) {\n return 1;\n } else if (normalizationRank[n1] < normalizationRank[n2]) {\n return -1;\n }\n return 0;\n}\n\n/**\n * Chooses the most normalized of two normalization ranks.\n * @param n1 - The first {@link TagNormalization} to be compared.\n * @param n2 - The second {@link TagNormalization} to me compared.\n * @returns The most normalized of `n1` or `n2`.\n * @public\n */\nexport function mostNormalized(n1: TagNormalization, n2: TagNormalization): TagNormalization {\n /* c8 ignore next - hard to hit due to guards */\n return normalizationRank[n1] > normalizationRank[n2] ? n1 : n2;\n}\n"]}
|
|
@@ -36,13 +36,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
36
36
|
}) : function(o, v) {
|
|
37
37
|
o["default"] = v;
|
|
38
38
|
});
|
|
39
|
-
var __importStar = (this && this.__importStar) || function (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
};
|
|
39
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
40
|
+
var ownKeys = function(o) {
|
|
41
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
42
|
+
var ar = [];
|
|
43
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
44
|
+
return ar;
|
|
45
|
+
};
|
|
46
|
+
return ownKeys(o);
|
|
47
|
+
};
|
|
48
|
+
return function (mod) {
|
|
49
|
+
if (mod && mod.__esModule) return mod;
|
|
50
|
+
var result = {};
|
|
51
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
52
|
+
__setModuleDefault(result, mod);
|
|
53
|
+
return result;
|
|
54
|
+
};
|
|
55
|
+
})();
|
|
46
56
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
57
|
exports.PreferredNormalizer = void 0;
|
|
48
58
|
const Iana = __importStar(require("../../iana"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preferredTagNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/preferredTagNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Bcp47Subtags from '../bcp47Subtags';\n\nimport { Result, fail, mapResults, succeed } from '@fgv/ts-utils';\nimport { IExtensionSubtagValue, ISubtags, subtagsToString } from '../common';\n\nimport { sanitizeJson } from '../../utils';\nimport { LanguageTagParser } from '../languageTagParser';\nimport { TagNormalizerBase } from './baseNormalizer';\nimport { TagNormalization } from './common';\n\n/**\n * @public\n */\nexport class PreferredNormalizer extends TagNormalizerBase {\n public readonly normalization: TagNormalization = 'preferred';\n\n protected _processLanguage(subtags: ISubtags): Result<Iana.LanguageSubtags.LanguageSubtag | undefined> {\n if (subtags.primaryLanguage) {\n const language = this._iana.subtags.languages.tryGet(subtags.primaryLanguage);\n if (!language) {\n return fail(`invalid language subtag \"${subtags.primaryLanguage}\"`);\n }\n return succeed(language.preferredValue ?? language.subtag);\n }\n return succeed(undefined);\n }\n\n protected _processExtlangs(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined> {\n if (subtags.extlangs) {\n return mapResults(subtags.extlangs.map((e) => this._iana.subtags.extlangs.toValidCanonical(e)));\n }\n return succeed(undefined);\n }\n\n protected _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined> {\n if (subtags.primaryLanguage && subtags.script) {\n const language = this._iana.subtags.languages.tryGet(subtags.primaryLanguage);\n /* c8 ignore next 3 - internal error difficult to test */\n if (!language) {\n return fail(`invalid primary language subtag \"${subtags.primaryLanguage}.`);\n }\n\n const script = this._iana.subtags.scripts.toValidCanonical(subtags.script).orDefault();\n if (!script) {\n return fail(`invalid script subtag \"${subtags.script}`);\n }\n\n if (language.suppressScript !== script) {\n return succeed(script);\n }\n }\n return succeed(undefined);\n }\n\n protected _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined> {\n if (subtags.region) {\n return this._iana.subtags.regions.get(subtags.region).onSuccess((region) => {\n return succeed(region.preferredValue ?? region.subtag);\n });\n }\n return succeed(undefined);\n }\n\n protected _processVariants(subtags: ISubtags): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined> {\n if (subtags.variants) {\n return mapResults(\n subtags.variants.map((v) => this._iana.subtags.variants.toValidCanonical(v))\n ).onSuccess((v) => this._verifyUnique('variant', v, (v) => v));\n }\n return succeed(undefined);\n }\n\n protected _processExtensionSingleton(\n singleton: Bcp47Subtags.Model.ExtensionSingleton\n ): Result<Bcp47Subtags.Model.ExtensionSingleton> {\n return this._iana.extensions.extensions.toValidCanonical(singleton);\n }\n\n protected _processExtensionSubtagValue(\n value: Bcp47Subtags.Model.ExtensionSubtag\n ): Result<Bcp47Subtags.Model.ExtensionSubtag> {\n return Bcp47Subtags.Validate.extensionSubtag.toCanonical(value);\n }\n\n protected _processExtensions(subtags: ISubtags): Result<IExtensionSubtagValue[] | undefined> {\n return super._processExtensions(subtags).onSuccess((extensions) => {\n return this._verifyUnique('extensions', extensions, (e) => e.singleton);\n });\n }\n\n protected _processPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined> {\n if (subtags.privateUse) {\n const merged = subtags.privateUse.join('-');\n return Iana.LanguageSubtags.Validate.extendedLanguageRange.toCanonical(merged).onSuccess((canon) => {\n return succeed(canon.split('-') as Iana.LanguageSubtags.ExtendedLanguageRange[]);\n });\n }\n return succeed(undefined);\n }\n\n protected _processGrandfatheredTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined> {\n if (subtags.grandfathered) {\n return this._iana.subtags.grandfathered.toValidCanonical(subtags.grandfathered);\n }\n return succeed(undefined);\n }\n\n protected _postValidateGrandfatheredTag(subtags: ISubtags): Result<ISubtags> {\n if (subtags.grandfathered) {\n return this._iana.subtags.grandfathered.get(subtags.grandfathered).onSuccess((grandfathered) => {\n if (grandfathered.preferredValue) {\n return LanguageTagParser.parse(grandfathered.preferredValue, this._iana)\n .onSuccess((gfSubtags) => {\n /* c8 ignore next 5 - would require a registry error too hard to test */\n if (gfSubtags.grandfathered !== undefined) {\n return fail<ISubtags>(\n `preferred value ${grandfathered.preferredValue} of grandfathered tag ${subtags.grandfathered} is also grandfathered.`\n );\n }\n return this.processSubtags(gfSubtags);\n })\n .onFailure((message) => {\n /* c8 ignore next 4 - would require a registry error too hard to test */\n return fail(\n `grandfathered tag \"${subtags.grandfathered}\" has invalid preferred value \"${grandfathered.preferredValue}\":\\n${message}`\n );\n });\n }\n return succeed(subtags);\n });\n }\n return succeed(subtags);\n }\n\n protected _postValidateRedundantTag(subtags: ISubtags): Result<ISubtags> {\n const tag = subtagsToString(subtags);\n const redundant = this._iana.subtags.redundant.tryGetCanonical(tag);\n if (redundant?.preferredValue) {\n return LanguageTagParser.parse(redundant.preferredValue, this._iana);\n }\n return succeed(subtags);\n }\n\n protected _postValidateExtLangs(subtags: ISubtags): Result<ISubtags> {\n if (subtags.extlangs) {\n if (subtags.extlangs.length > 1) {\n return fail(`${subtags.extlangs.join('-')}: multiple extlang subtags is invalid`);\n }\n if (subtags.extlangs.length > 0) {\n const registry = this._iana.subtags.extlangs.tryGet(subtags.extlangs[0]);\n if (registry) {\n if (\n registry.preferredValue &&\n registry.prefix === /* c8 ignore next */ subtags.primaryLanguage?.toLowerCase()\n ) {\n const preferred = this._iana.subtags.languages.tryGet(registry.preferredValue);\n if (preferred) {\n return succeed(\n sanitizeJson({\n ...subtags,\n primaryLanguage: preferred.subtag,\n extlangs: undefined\n })\n );\n }\n }\n }\n }\n }\n return succeed(subtags);\n }\n\n protected _postValidate(subtags: ISubtags): Result<ISubtags> {\n return super\n ._postValidate(subtags)\n .onSuccess((subtags) => {\n return this._postValidateExtLangs(subtags);\n })\n .onSuccess((subtags) => {\n return this._postValidateGrandfatheredTag(subtags);\n })\n .onSuccess((subtags) => {\n return this._postValidateRedundantTag(subtags);\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"preferredTagNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/preferredTagNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Bcp47Subtags from '../bcp47Subtags';\n\nimport { Result, fail, mapResults, succeed } from '@fgv/ts-utils';\nimport { IExtensionSubtagValue, ISubtags, subtagsToString } from '../common';\n\nimport { sanitizeJson } from '../../utils';\nimport { LanguageTagParser } from '../languageTagParser';\nimport { TagNormalizerBase } from './baseNormalizer';\nimport { TagNormalization } from './common';\n\n/**\n * @public\n */\nexport class PreferredNormalizer extends TagNormalizerBase {\n public readonly normalization: TagNormalization = 'preferred';\n\n protected _processLanguage(subtags: ISubtags): Result<Iana.LanguageSubtags.LanguageSubtag | undefined> {\n if (subtags.primaryLanguage) {\n const language = this._iana.subtags.languages.tryGet(subtags.primaryLanguage);\n if (!language) {\n return fail(`invalid language subtag \"${subtags.primaryLanguage}\"`);\n }\n return succeed(language.preferredValue ?? language.subtag);\n }\n return succeed(undefined);\n }\n\n protected _processExtlangs(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined> {\n if (subtags.extlangs) {\n return mapResults(subtags.extlangs.map((e) => this._iana.subtags.extlangs.toValidCanonical(e)));\n }\n return succeed(undefined);\n }\n\n protected _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined> {\n if (subtags.primaryLanguage && subtags.script) {\n const language = this._iana.subtags.languages.tryGet(subtags.primaryLanguage);\n /* c8 ignore next 3 - internal error difficult to test */\n if (!language) {\n return fail(`invalid primary language subtag \"${subtags.primaryLanguage}.`);\n }\n\n const script = this._iana.subtags.scripts.toValidCanonical(subtags.script).orDefault();\n if (!script) {\n return fail(`invalid script subtag \"${subtags.script}`);\n }\n\n if (language.suppressScript !== script) {\n return succeed(script);\n }\n }\n return succeed(undefined);\n }\n\n protected _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined> {\n if (subtags.region) {\n return this._iana.subtags.regions.get(subtags.region).onSuccess((region) => {\n return succeed(region.preferredValue ?? region.subtag);\n });\n }\n return succeed(undefined);\n }\n\n protected _processVariants(subtags: ISubtags): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined> {\n if (subtags.variants) {\n return mapResults(\n subtags.variants.map((v) => this._iana.subtags.variants.toValidCanonical(v))\n ).onSuccess((v) => this._verifyUnique('variant', v, (v) => v));\n }\n return succeed(undefined);\n }\n\n protected _processExtensionSingleton(\n singleton: Bcp47Subtags.Model.ExtensionSingleton\n ): Result<Bcp47Subtags.Model.ExtensionSingleton> {\n return this._iana.extensions.extensions.toValidCanonical(singleton);\n }\n\n protected _processExtensionSubtagValue(\n value: Bcp47Subtags.Model.ExtensionSubtag\n ): Result<Bcp47Subtags.Model.ExtensionSubtag> {\n return Bcp47Subtags.Validate.extensionSubtag.toCanonical(value);\n }\n\n protected _processExtensions(subtags: ISubtags): Result<IExtensionSubtagValue[] | undefined> {\n return super._processExtensions(subtags).onSuccess((extensions) => {\n return this._verifyUnique('extensions', extensions, (e) => e.singleton);\n });\n }\n\n protected _processPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined> {\n if (subtags.privateUse) {\n const merged = subtags.privateUse.join('-');\n return Iana.LanguageSubtags.Validate.extendedLanguageRange.toCanonical(merged).onSuccess((canon) => {\n return succeed(canon.split('-') as Iana.LanguageSubtags.ExtendedLanguageRange[]);\n });\n }\n return succeed(undefined);\n }\n\n protected _processGrandfatheredTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined> {\n if (subtags.grandfathered) {\n return this._iana.subtags.grandfathered.toValidCanonical(subtags.grandfathered);\n }\n return succeed(undefined);\n }\n\n protected _postValidateGrandfatheredTag(subtags: ISubtags): Result<ISubtags> {\n if (subtags.grandfathered) {\n return this._iana.subtags.grandfathered.get(subtags.grandfathered).onSuccess((grandfathered) => {\n if (grandfathered.preferredValue) {\n return LanguageTagParser.parse(grandfathered.preferredValue, this._iana)\n .onSuccess((gfSubtags) => {\n /* c8 ignore next 5 - would require a registry error too hard to test */\n if (gfSubtags.grandfathered !== undefined) {\n return fail<ISubtags>(\n `preferred value ${grandfathered.preferredValue} of grandfathered tag ${subtags.grandfathered} is also grandfathered.`\n );\n }\n return this.processSubtags(gfSubtags);\n })\n .onFailure((message) => {\n /* c8 ignore next 4 - would require a registry error too hard to test */\n return fail(\n `grandfathered tag \"${subtags.grandfathered}\" has invalid preferred value \"${grandfathered.preferredValue}\":\\n${message}`\n );\n });\n }\n return succeed(subtags);\n });\n }\n return succeed(subtags);\n }\n\n protected _postValidateRedundantTag(subtags: ISubtags): Result<ISubtags> {\n const tag = subtagsToString(subtags);\n const redundant = this._iana.subtags.redundant.tryGetCanonical(tag);\n if (redundant?.preferredValue) {\n return LanguageTagParser.parse(redundant.preferredValue, this._iana);\n }\n return succeed(subtags);\n }\n\n protected _postValidateExtLangs(subtags: ISubtags): Result<ISubtags> {\n if (subtags.extlangs) {\n if (subtags.extlangs.length > 1) {\n return fail(`${subtags.extlangs.join('-')}: multiple extlang subtags is invalid`);\n }\n if (subtags.extlangs.length > 0) {\n const registry = this._iana.subtags.extlangs.tryGet(subtags.extlangs[0]);\n if (registry) {\n if (\n registry.preferredValue &&\n registry.prefix === /* c8 ignore next */ subtags.primaryLanguage?.toLowerCase()\n ) {\n const preferred = this._iana.subtags.languages.tryGet(registry.preferredValue);\n if (preferred) {\n return succeed(\n sanitizeJson({\n ...subtags,\n primaryLanguage: preferred.subtag,\n extlangs: undefined\n })\n );\n }\n }\n }\n }\n }\n return succeed(subtags);\n }\n\n protected _postValidate(subtags: ISubtags): Result<ISubtags> {\n return super\n ._postValidate(subtags)\n .onSuccess((subtags) => {\n return this._postValidateExtLangs(subtags);\n })\n .onSuccess((subtags) => {\n return this._postValidateGrandfatheredTag(subtags);\n })\n .onSuccess((subtags) => {\n return this._postValidateRedundantTag(subtags);\n });\n }\n}\n"]}
|
|
@@ -37,15 +37,26 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
37
37
|
}) : function(o, v) {
|
|
38
38
|
o["default"] = v;
|
|
39
39
|
});
|
|
40
|
-
var __importStar = (this && this.__importStar) || function (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
};
|
|
40
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
+
var ownKeys = function(o) {
|
|
42
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
+
var ar = [];
|
|
44
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
+
return ar;
|
|
46
|
+
};
|
|
47
|
+
return ownKeys(o);
|
|
48
|
+
};
|
|
49
|
+
return function (mod) {
|
|
50
|
+
if (mod && mod.__esModule) return mod;
|
|
51
|
+
var result = {};
|
|
52
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
+
__setModuleDefault(result, mod);
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
47
57
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.
|
|
58
|
+
exports.languageOverridesFile = exports.languageOverrideRecord = void 0;
|
|
59
|
+
exports.loadLanguageOverridesFileSync = loadLanguageOverridesFileSync;
|
|
49
60
|
const Iana = __importStar(require("../../iana"));
|
|
50
61
|
const ts_json_base_1 = require("@fgv/ts-json-base");
|
|
51
62
|
const ts_utils_1 = require("@fgv/ts-utils");
|
|
@@ -72,5 +83,4 @@ exports.languageOverridesFile = ts_utils_1.Converters.arrayOf(exports.languageOv
|
|
|
72
83
|
function loadLanguageOverridesFileSync(path) {
|
|
73
84
|
return ts_json_base_1.JsonFile.convertJsonFileSync(path, exports.languageOverridesFile);
|
|
74
85
|
}
|
|
75
|
-
exports.loadLanguageOverridesFileSync = loadLanguageOverridesFileSync;
|
|
76
86
|
//# sourceMappingURL=converters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/overrides/converters.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,2CAA2C
|
|
1
|
+
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/overrides/converters.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,2CAA2C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkC3C,sEAEC;AAlCD,iDAAmC;AAGnC,oDAA6C;AAC7C,4CAA8D;AAE9D;;GAEG;AACU,QAAA,sBAAsB,GACjC,qBAAU,CAAC,YAAY,CACrB;IACE,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc;IAC7D,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY;IAClE,eAAe,EAAE,qBAAU,CAAC,MAAM;IAClC,QAAQ,EAAE,qBAAU,CAAC,QAAQ,CAAC,qBAAU,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;CACrG,EACD,EAAE,cAAc,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,EAAE,CACvE,CAAC;AAEJ;;GAEG;AACU,QAAA,qBAAqB,GAAG,qBAAU,CAAC,OAAO,CAAC,8BAAsB,CAAC,CAAC;AAEhF;;;;;;GAMG;AACH,SAAgB,6BAA6B,CAAC,IAAY;IACxD,OAAO,uBAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,6BAAqB,CAAC,CAAC;AACnE,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n/* eslint-disable @rushstack/typedef-var */\n\nimport * as Iana from '../../iana';\nimport * as Model from './model';\n\nimport { JsonFile } from '@fgv/ts-json-base';\nimport { Converter, Converters, Result } from '@fgv/ts-utils';\n\n/**\n * @internal\n */\nexport const languageOverrideRecord: Converter<Model.ILanguageOverrideRecord, unknown> =\n Converters.strictObject<Model.ILanguageOverrideRecord>(\n {\n language: Iana.LanguageSubtags.Converters.Tags.languageSubtag,\n preferredRegion: Iana.LanguageSubtags.Converters.Tags.regionSubtag,\n defaultAffinity: Converters.string,\n affinity: Converters.recordOf(Converters.arrayOf(Iana.LanguageSubtags.Converters.Tags.regionSubtag))\n },\n { optionalFields: ['affinity', 'defaultAffinity', 'preferredRegion'] }\n );\n\n/**\n * @internal\n */\nexport const languageOverridesFile = Converters.arrayOf(languageOverrideRecord);\n\n/**\n * Loads a language overrides JSON file.\n * @internal\n * @param path - Path from which overrides should be loaded.\n * @returns `Success` with the loaded overrides or `Failure` with details if an\n * error occurs.\n */\nexport function loadLanguageOverridesFileSync(path: string): Result<Model.ILanguageOverrideRecord[]> {\n return JsonFile.convertJsonFileSync(path, languageOverridesFile);\n}\n"]}
|