uklatn
Version:
Ukrainian Cyrillic transliteration to Latin script
263 lines (237 loc) • 15.1 kB
JavaScript
/* Generated by gentables.py, do not edit. */
/* uklatn.js - https://github.com/paiv/uklatn */
// @ts-self-types="./uklatn.d.ts"
class _Uklatn_uk_uk_Latn_DSTU_9112_A {
constructor() {
this._rx1 = /(?<=^|[^\p{L}\p{M}\p{N}])([Ьь])|([Ьь](?=[АаЕеУу])|[ЄЮЯ](?=\u0301?[а-щьюяєіїґ’])|(?<=[Б-ДЖЗК-НП-ТФ-Щб-джзк-нп-тф-щҐґ])[Йй])|([ЁЄІЇЎА-яёєіїўҐґ’])/gu;
const _maps1 = [
new Map([["Ь","Ĵ"],["ь","ĵ"]]),
new Map([["Ь","J'"],["ь","j'"],["Є","Je"],["Ю","Ju"],["Я","Ja"],["Й","'J"],["й","'j"]]),
new Map([["А","A"],["а","a"],["Б","B"],["б","b"],["В","V"],["в","v"],["Г","Ğ"],["г","ğ"],["Ґ","G"],["ґ","g"],["Д","D"],["д","d"],["Е","E"],["е","e"],["Є","JE"],["є","je"],["Ж","Ž"],["ж","ž"],["З","Z"],["з","z"],["И","Y"],["и","y"],["І","I"],["і","i"],["Ї","Ï"],["ї","ï"],["К","K"],["к","k"],["Л","L"],["л","l"],["М","M"],["м","m"],["Н","N"],["н","n"],["О","O"],["о","o"],["П","P"],["п","p"],["Р","R"],["р","r"],["С","S"],["с","s"],["Т","T"],["т","t"],["У","U"],["у","u"],["Ф","F"],["ф","f"],["Х","X"],["х","x"],["Ц","C"],["ц","c"],["Ч","Č"],["ч","č"],["Ш","Š"],["ш","š"],["Щ","Ŝ"],["щ","ŝ"],["Ю","JU"],["ю","ju"],["Я","JA"],["я","ja"],["Ь","J"],["ь","j"],["Й","J"],["й","j"],["’","'"],["Ё","Ö"],["ё","ö"],["Ў","Ŭ"],["ў","ŭ"],["Ъ","Ǒ"],["ъ","ǒ"],["Ы","Ȳ"],["ы","ȳ"],["Э","Ē"],["э","ē"]]),
];
this._tr1 = (match, g1, g2, g3) => {
let value = undefined;
if (g3 !== undefined) {
value = _maps1[2].get(g3);
}
else if (g2 !== undefined) {
value = _maps1[1].get(g2);
}
else if (g1 !== undefined) {
value = _maps1[0].get(g1);
}
return (value !== undefined) ? value : match;
}
}
transform(text) {
text = text.normalize('NFC');
text = text.replaceAll(this._rx1, this._tr1);
text = text.normalize('NFC');
return text;
}
}
class _Uklatn_uk_uk_Latn_DSTU_9112_B {
constructor() {
this._rx1 = /([Ьь](?=[АаЕеІіУу])|(?<=[Б-ДЖЗК-НП-ТФ-Щб-джзк-нп-тф-щҐґ])[Йй])|([ГЄЖЇХЩШЧЮЯЁЎЪЫЭ](?=\u0301?[а-яёєіїўґ’])|(?<=^|[^\p{L}\p{M}\p{N}])[Ьь])|([ЁЄІЇЎА-яёєіїўҐґ’])/gu;
const _maps1 = [
new Map([["Ь","J'"],["ь","j'"],["Й","'J"],["й","'j"]]),
new Map([["Г","Gh"],["Є","Je"],["Ж","Zh"],["Ї","Ji"],["Х","Kh"],["Щ","Shch"],["Ш","Sh"],["Ч","Ch"],["Ю","Ju"],["Я","Ja"],["Ё","Jow"],["Ў","Uh"],["Ъ","Oh"],["Ы","Yw"],["Э","Ehw"],["Ь","Hj"],["ь","hj"]]),
new Map([["А","A"],["а","a"],["Б","B"],["б","b"],["В","V"],["в","v"],["Г","GH"],["г","gh"],["Ґ","G"],["ґ","g"],["Д","D"],["д","d"],["Е","E"],["е","e"],["Є","JE"],["є","je"],["Ж","ZH"],["ж","zh"],["З","Z"],["з","z"],["И","Y"],["и","y"],["І","I"],["і","i"],["Ї","JI"],["ї","ji"],["Х","KH"],["х","kh"],["К","K"],["к","k"],["Л","L"],["л","l"],["М","M"],["м","m"],["Н","N"],["н","n"],["О","O"],["о","o"],["П","P"],["п","p"],["Р","R"],["р","r"],["Щ","SHCH"],["щ","shch"],["Ш","SH"],["ш","sh"],["С","S"],["с","s"],["Т","T"],["т","t"],["У","U"],["у","u"],["Ф","F"],["ф","f"],["Ч","CH"],["ч","ch"],["Ц","C"],["ц","c"],["Ю","JU"],["ю","ju"],["Я","JA"],["я","ja"],["Й","J"],["й","j"],["Ь","J"],["ь","j"],["’","'"],["Ё","JOW"],["ё","jow"],["Ў","UH"],["ў","uh"],["Ъ","OH"],["ъ","oh"],["Ы","YW"],["ы","yw"],["Э","EHW"],["э","ehw"]]),
];
this._tr1 = (match, g1, g2, g3) => {
let value = undefined;
if (g3 !== undefined) {
value = _maps1[2].get(g3);
}
else if (g2 !== undefined) {
value = _maps1[1].get(g2);
}
else if (g1 !== undefined) {
value = _maps1[0].get(g1);
}
return (value !== undefined) ? value : match;
}
}
transform(text) {
text = text.normalize('NFC');
text = text.replaceAll(this._rx1, this._tr1);
text = text.normalize('NFC');
return text;
}
}
class _Uklatn_uk_uk_Latn_KMU_55 {
constructor() {
this._rx1 = /(?<=[ЁЄІЇЎА-яёєіїўҐґ])([’\u0027])(?=[ЁЄІЇЎА-яёєіїўҐґ])/gu;
const _maps1 = [
new Map([["’",""],["'",""]]),
];
this._tr1 = (match, g1) => {
let value = undefined;
if (g1 !== undefined) {
value = _maps1[0].get(g1);
}
return (value !== undefined) ? value : match;
}
this._rx2 = /(?<=^|[^\p{L}\p{M}\p{N}])([ЄЇЮЯ])(?=\u0301?[а-яёєіїўґ’])|(?<=^|[^\p{L}\p{M}\p{N}])([ЙйЄЇЮЯєїюя])|([Зз]Г|[ЖХЦЩШЧЄЇЮЯ])(?=\u0301?[а-яёєіїўґ’])|([Зз][Гг]|[ЄІЇА-ЩЬЮ-щьюяєіїҐґ’])/gu;
const _maps2 = [
new Map([["Є","Ye"],["Ї","Yi"],["Ю","Yu"],["Я","Ya"]]),
new Map([["Й","Y"],["й","y"],["Є","YE"],["є","ye"],["Ї","YI"],["ї","yi"],["Ю","YU"],["ю","yu"],["Я","YA"],["я","ya"]]),
new Map([["ЗГ","ZGh"],["зГ","zGh"],["Ж","Zh"],["Х","Kh"],["Ц","Ts"],["Щ","Shch"],["Ш","Sh"],["Ч","Ch"],["Є","Ie"],["Ї","I"],["Ю","Iu"],["Я","Ia"]]),
new Map([["ЗГ","ZGH"],["Зг","Zgh"],["зГ","zGH"],["зг","zgh"],["А","A"],["а","a"],["Б","B"],["б","b"],["В","V"],["в","v"],["Г","H"],["г","h"],["Ґ","G"],["ґ","g"],["Д","D"],["д","d"],["Е","E"],["е","e"],["Є","IE"],["є","ie"],["Ж","ZH"],["ж","zh"],["З","Z"],["з","z"],["И","Y"],["и","y"],["І","I"],["і","i"],["Ї","I"],["ї","i"],["Х","KH"],["х","kh"],["К","K"],["к","k"],["Л","L"],["л","l"],["М","M"],["м","m"],["Н","N"],["н","n"],["О","O"],["о","o"],["П","P"],["п","p"],["Р","R"],["р","r"],["Щ","SHCH"],["щ","shch"],["Ш","SH"],["ш","sh"],["С","S"],["с","s"],["Т","T"],["т","t"],["У","U"],["у","u"],["Ф","F"],["ф","f"],["Ч","CH"],["ч","ch"],["Ц","TS"],["ц","ts"],["Ю","IU"],["ю","iu"],["Я","IA"],["я","ia"],["Й","I"],["й","i"],["Ь",""],["ь",""],["’",""]]),
];
this._tr2 = (match, g1, g2, g3, g4) => {
let value = undefined;
if (g4 !== undefined) {
value = _maps2[3].get(g4);
}
else if (g3 !== undefined) {
value = _maps2[2].get(g3);
}
else if (g2 !== undefined) {
value = _maps2[1].get(g2);
}
else if (g1 !== undefined) {
value = _maps2[0].get(g1);
}
return (value !== undefined) ? value : match;
}
}
transform(text) {
text = text.normalize('NFC');
text = text.replaceAll(this._rx1, this._tr1);
text = text.replaceAll(this._rx2, this._tr2);
text = text.normalize('NFC');
return text;
}
}
class _Uklatn_uk_Latn_DSTU_9112_A_uk {
constructor() {
this._rx1 = /([ÁáÉéÍíÓóÚúÝýḮḯ])/gu;
const _maps1 = [
new Map([["Á","Á"],["á","á"],["É","É"],["é","é"],["Í","Í"],["í","í"],["Ó","Ó"],["ó","ó"],["Ú","Ú"],["ú","ú"],["Ý","Ý"],["ý","ý"],["Ḯ","Ḯ"],["ḯ","ḯ"]]),
];
this._tr1 = (match, g1) => {
let value = undefined;
if (g1 !== undefined) {
value = _maps1[0].get(g1);
}
return (value !== undefined) ? value : match;
}
this._rx2 = /(J[Ee]|j[Ee]|J[Uu]|j[Uu]|J[Aa]|j[Aa]|[A-GIK-PR-VXYZa-gik-pr-vxyzÏÖïöČčĒēĞğĴĵŜŝŠšŬŭŽžǑǒȲȳ])|(?<=[BbCcDdFfGgKkLlMmNnPpRrSsTtVvXxZzČčĞğŜŝŠšŽž])([Jj]\u0027(?=[AaEeUu])|[Jj])|(\u0027[Jj](?![AaEeIiUu])|\u0027(?=[Jj])|[Jj])/gu;
const _maps2 = [
new Map([["A","А"],["a","а"],["B","Б"],["b","б"],["V","В"],["v","в"],["Ğ","Г"],["ğ","г"],["G","Ґ"],["g","ґ"],["D","Д"],["d","д"],["E","Е"],["e","е"],["JE","Є"],["Je","Є"],["jE","є"],["je","є"],["Ž","Ж"],["ž","ж"],["Z","З"],["z","з"],["Y","И"],["y","и"],["I","І"],["i","і"],["Ï","Ї"],["ï","ї"],["K","К"],["k","к"],["L","Л"],["l","л"],["M","М"],["m","м"],["N","Н"],["n","н"],["O","О"],["o","о"],["P","П"],["p","п"],["R","Р"],["r","р"],["S","С"],["s","с"],["T","Т"],["t","т"],["U","У"],["u","у"],["F","Ф"],["f","ф"],["X","Х"],["x","х"],["C","Ц"],["c","ц"],["Č","Ч"],["č","ч"],["Š","Ш"],["š","ш"],["Ŝ","Щ"],["ŝ","щ"],["JU","Ю"],["Ju","Ю"],["jU","ю"],["ju","ю"],["JA","Я"],["Ja","Я"],["jA","я"],["ja","я"],["Ĵ","Ь"],["ĵ","ь"],["Ö","Ё"],["ö","ё"],["Ŭ","Ў"],["ŭ","ў"],["Ǒ","Ъ"],["ǒ","ъ"],["Ȳ","Ы"],["ȳ","ы"],["Ē","Э"],["ē","э"]]),
new Map([["J","Ь"],["j","ь"],["J'","Ь"],["j'","ь"]]),
new Map([["'J","Й"],["'j","й"],["'","’"],["J","Й"],["j","й"]]),
];
this._tr2 = (match, g1, g2, g3) => {
let value = undefined;
if (g3 !== undefined) {
value = _maps2[2].get(g3);
}
else if (g2 !== undefined) {
value = _maps2[1].get(g2);
}
else if (g1 !== undefined) {
value = _maps2[0].get(g1);
}
return (value !== undefined) ? value : match;
}
}
transform(text) {
text = text.normalize('NFC');
text = text.replaceAll(this._rx1, this._tr1);
text = text.replaceAll(this._rx2, this._tr2);
text = text.normalize('NFC');
return text;
}
}
class _Uklatn_uk_Latn_DSTU_9112_B_uk {
constructor() {
this._rx1 = /([ÁáÉéÍíÓóÚúÝý])/gu;
const _maps1 = [
new Map([["Á","Á"],["á","á"],["É","É"],["é","é"],["Í","Í"],["í","í"],["Ó","Ó"],["ó","ó"],["Ú","Ú"],["ú","ú"],["Ý","Ý"],["ý","ý"]]),
];
this._tr1 = (match, g1) => {
let value = undefined;
if (g1 !== undefined) {
value = _maps1[0].get(g1);
}
return (value !== undefined) ? value : match;
}
this._rx2 = /([Jj][Oo][Ww]|[Ss][Hh][Cc][Hh]|[CcGgKkSsZzUuOo][Hh]|[Yy][Ww]|[Ee][Hh][Ww]|[Jj][EeIiUuAa]|[Hh][Jj]|[A-GIK-PR-VYZa-gik-pr-vyz])|(?<=[Ss][Hh][Cc][Hh])([Jj]\u0027(?=[AaEeIiUu])|[Jj])|(?<=[CcGgKkSsZz][Hh])([Jj]\u0027(?=[AaEeIiUu])|[Jj])|(?<=[BCDFGKLMNPRSTVZbcdfgklmnprstvzv])([Jj]\u0027(?=[AaEeIiUu])|[Jj])|(\u0027[Jj](?![AaEeIiUu])|\u0027(?=[Jj])|[Jj])/gu;
const _maps2 = [
new Map([["A","А"],["a","а"],["B","Б"],["b","б"],["V","В"],["v","в"],["GH","Г"],["Gh","Г"],["gH","г"],["gh","г"],["G","Ґ"],["g","ґ"],["D","Д"],["d","д"],["E","Е"],["e","е"],["JE","Є"],["Je","Є"],["jE","є"],["je","є"],["ZH","Ж"],["Zh","Ж"],["zH","ж"],["zh","ж"],["Z","З"],["z","з"],["Y","И"],["y","и"],["I","І"],["i","і"],["JI","Ї"],["Ji","Ї"],["jI","ї"],["ji","ї"],["KH","Х"],["Kh","Х"],["kH","х"],["kh","х"],["K","К"],["k","к"],["L","Л"],["l","л"],["M","М"],["m","м"],["N","Н"],["n","н"],["O","О"],["o","о"],["P","П"],["p","п"],["R","Р"],["r","р"],["SHCH","Щ"],["SHCh","Щ"],["SHcH","Щ"],["SHch","Щ"],["ShCH","Щ"],["ShCh","Щ"],["ShcH","Щ"],["Shch","Щ"],["sHCH","щ"],["sHCh","щ"],["sHcH","щ"],["sHch","щ"],["shCH","щ"],["shCh","щ"],["shcH","щ"],["shch","щ"],["SH","Ш"],["Sh","Ш"],["sH","ш"],["sh","ш"],["S","С"],["s","с"],["T","Т"],["t","т"],["U","У"],["u","у"],["F","Ф"],["f","ф"],["CH","Ч"],["Ch","Ч"],["cH","ч"],["ch","ч"],["C","Ц"],["c","ц"],["JU","Ю"],["Ju","Ю"],["jU","ю"],["ju","ю"],["JA","Я"],["Ja","Я"],["jA","я"],["ja","я"],["HJ","Ь"],["Hj","Ь"],["hJ","ь"],["hj","ь"],["JOW","Ё"],["JOw","Ё"],["JoW","Ё"],["Jow","Ё"],["jOW","ё"],["jOw","ё"],["joW","ё"],["jow","ё"],["UH","Ў"],["Uh","Ў"],["uH","ў"],["uh","ў"],["OH","Ъ"],["Oh","Ъ"],["oH","ъ"],["oh","ъ"],["YW","Ы"],["Yw","Ы"],["yW","ы"],["yw","ы"],["EHW","Э"],["EHw","Э"],["EhW","Э"],["Ehw","Э"],["eHW","э"],["eHw","э"],["ehW","э"],["ehw","э"]]),
new Map([["J","Ь"],["j","ь"],["J'","Ь"],["j'","ь"]]),
new Map([["J","Ь"],["j","ь"],["J'","Ь"],["j'","ь"]]),
new Map([["J","Ь"],["j","ь"],["J'","Ь"],["j'","ь"]]),
new Map([["'J","Й"],["'j","й"],["'","’"],["J","Й"],["j","й"]]),
];
this._tr2 = (match, g1, g2, g3, g4, g5) => {
let value = undefined;
if (g5 !== undefined) {
value = _maps2[4].get(g5);
}
else if (g4 !== undefined) {
value = _maps2[3].get(g4);
}
else if (g3 !== undefined) {
value = _maps2[2].get(g3);
}
else if (g2 !== undefined) {
value = _maps2[1].get(g2);
}
else if (g1 !== undefined) {
value = _maps2[0].get(g1);
}
return (value !== undefined) ? value : match;
}
}
transform(text) {
text = text.normalize('NFC');
text = text.replaceAll(this._rx1, this._tr1);
text = text.replaceAll(this._rx2, this._tr2);
text = text.normalize('NFC');
return text;
}
}
const _UklatnTables = new Map([
['DSTU_9112_A', [new _Uklatn_uk_uk_Latn_DSTU_9112_A(), new _Uklatn_uk_Latn_DSTU_9112_A_uk()]],
['DSTU_9112_B', [new _Uklatn_uk_uk_Latn_DSTU_9112_B(), new _Uklatn_uk_Latn_DSTU_9112_B_uk()]],
['KMU_55', [new _Uklatn_uk_uk_Latn_KMU_55(), undefined]],
]);
/**
* Transliterates a string of Ukrainian Cyrillic to Latin script.
*
* @param {string} text - the text to transliterate
* @param {string} [table] - transliteration system, one of:
* - "DSTU_9112_A": DSTU 9112:2021 System A
* - "DSTU_9112_B": DSTU 9112:2021 System B
* - "KMU_55": KMU 55:2010
* @returns {string} transliterated text
*/
export function encode(text, table) {
if (table === undefined) { table = 'DSTU_9112_A'; }
const codecs = _UklatnTables.get(table);
let tr = undefined;
if (codecs) { tr = codecs[0]; }
if (tr === undefined) { throw new Error("unknown table " + JSON.stringify(table)); }
return tr.transform(text);
}
/**
* Re-transliterates a string of Ukrainian Latin to Cyrillic script.
*
* @param {string} text - the text to transliterate
* @param {string} [table] - transliteration system, one of:
* - "DSTU_9112_A": DSTU 9112:2021 System A
* - "DSTU_9112_B": DSTU 9112:2021 System B
* @returns {string} transliterated text
*/
export function decode(text, table) {
if (table === undefined) { table = 'DSTU_9112_A'; }
const codecs = _UklatnTables.get(table);
let tr = undefined;
if (codecs) { tr = codecs[1]; }
if (tr === undefined) { throw new Error("unknown table " + JSON.stringify(table)); }
return tr.transform(text);
}
export default { encode, decode };