"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const FS = require("fs"); const iconv_corefoundation_1 = require("iconv-corefoundation"); const Path = require("path"); const util_1 = require("./util"); class NoSuchLanguageError extends Error { constructor(lang) { super(`No known languages found for specification ${Array.isArray(lang) ? `[${lang.join(", ")}]` : lang}.`); this.lang = lang; } } exports.NoSuchLanguageError = NoSuchLanguageError; NoSuchLanguageError.prototype.name = NoSuchLanguageError.name; class Language { static add(lang) { Language.byID[lang.languageID] = lang; for (const tag of lang.langTags) Language.byTag[tag.toLowerCase()] = lang; } static bySpec(lang, context) { const langs = []; for (const specLang of util_1.arrayify(lang)) { const lang = typeof specLang === "number" ? Language.byID[specLang] : Language.byTag[specLang.toLowerCase()]; if (lang) langs.push(lang); else if (context && context.canWarn) context.warning(new NoSuchLanguageError(specLang)); } if (langs.length) return langs; else throw new NoSuchLanguageError(lang); } toString() { return `${this.englishName} (language ${this.languageID}${this.langTags.length === 0 ? "" : `; ${this.langTags.join(", ")}`})`; } } Language.byTag = {}; Language.byID = []; exports.Language = Language; exports.default = Language; { const langJSON = JSON.parse(FS.readFileSync(Path.resolve(__dirname, "..", "language-info.json"), { encoding: "utf8" })); const labelsByName = {}; for (const labelsName in langJSON.labels) labelsByName[labelsName] = langJSON.labels[labelsName]; const charsetCache = new Map(); for (const idStr in langJSON.languages) { const rawLang = langJSON.languages[idStr]; const entry = new class extends Language { constructor() { super(...arguments); this.charset = (() => { let charset = charsetCache.get(rawLang.charset); if (!charset) { charset = iconv_corefoundation_1.StringEncoding.byIANACharSetName(rawLang.charset); charsetCache.set(rawLang.charset, charset); } return charset; })(); this.doubleByteCharset = rawLang.doubleByteCharset || false; this.englishName = rawLang.englishName; this.labels = rawLang.labels ? labelsByName[rawLang.labels] : undefined; this.languageID = Number(idStr); this.langTags = rawLang.langTags; this.localizedName = rawLang.localizedName; } }(); Language.add(entry); } } function indexByLanguage(objects, { filter, map, onCollisions } = {}) { const result = new Map(); const seen = new Set(); const collisions = onCollisions && new Set(); for (const object of objects) if (!filter || filter(object)) for (const lang of Language.bySpec(object.lang)) { const { languageID } = lang; if (seen.has(languageID)) { if (collisions) collisions.add(languageID); } else { seen.add(languageID); const mapped = map ? map(object, lang) : object; if (mapped !== undefined) result.set(lang.languageID, mapped); } } if (collisions && collisions.size) onCollisions(collisions); return result; } exports.indexByLanguage = indexByLanguage; //# sourceMappingURL=Language.js.map