|
"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; |
|
|