Translit для JavaScript

в 19:50, , рубрики: Песочница, метки: ,

Про транслитерацию в интернете написано много, но Хабрахабр'е не нашел, решил написать код прямой и обратной транслитерации полностью соответствующий стандарту ISO 9:1995 7.79-2000 системы А и Б на JavaScript.

Поддерживает Русский, Белорусский, Украинский, Болгарский, Македонский языки.
Используется в России, Армении, Азербайджане, Белоруссии, Казахстане, Киргизии, Таджикистане, Туркмении, Узбекистане.

Впечатление от использования: код упростить, конечно, можно, не хватает фонетических правил, но приходится придерживаться стандарта.

/*******************************************************************************
* @Name   : "translit(a, b, c)"                      // Имя
* @Params :   a  - транслируемая строка              // Параметры запуска
              b  - флаг обратного направления
              c  - [012345] system A = 0; system B = (1-RUS|2-BEL|3-UKR|4-BOL|5-MAK;)
* @Descrp : Прямая и обратная транслитерация         // Описание
             по стандарту ISO 9 или ISO 9:1995
             ГОСТ 7.79-2000 системы А и Б.     
* @ExtURL : ru.wikipedia.org/wiki/ISO_9              // Внешний URL
* #Guid   : {E7088033-479F-47EF-A573-BBF3520F493C}   // GUID
* @Exampl : "example()"                              // Пример использования
* GPL applies. No warranties XGuest[02.12.2013/06:39:59] translit [ver.0.0.0.2]
*******************************************************************************/
function translit(a, b, c) {
       // Символы кириллицы
 var d =  ["u0449", "u044F", "u0454", "u1123", "u0456", "u0457", "u0451", "u044E", "u0436", "u0447", "u0448", "u1139", "u045F", "u0491", "u0453", "u0455", "u045C", "u0459", "u045A", "u044D", "u044A", "u044B", "u045E", "u1131", "u1141", "u0446", "u0430", "u0431", "u0432", "u0433", "u0434", "u0435", "u0437", "u0438", "u0439", "u0458", "u0456", "u043A", "u043B", "u043C", "u043D", "u043E", "u043F", "u0440", "u0441", "u0442", "u0443", "u0444", "u0445", "u044C", "u2019", "u2116"],
 /* Транслитерация славянских алфавитов по системе А (с использованием диакритики) */
    e =  [["u015D", "u00E2", "u00EA", "u011B", , "u00EF", "u00EB", "u00FB", "u017E", "u010D", "u0161", "fu0300", "du0302", "gu0300", "u01F5", "u1E91", "u1E31", "lu0302", "nu0302", "u00E8", "u02BA", "y", "u01D4", "u01CE", "u1EF3", "c", "a", "b", "v", "g", "d", "e", "z", "i", "j", "ju030C", "u00EC", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "u02B9", "u02BC", "#"],
 /* Транслитерация славянских алфавитов по системе Б (с использованием буквосочетаний) */
 /* RUS */["shh", "ya", , "ye", "i`", , "yo", "yu", "zh", "ch", "sh", "fh", ,, ,, ,, , "e`", "``", "y`", ,, "yh", "cz", "a", "b", "v", "g", "d", "e", "z", "i", "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
 /* BEL */[ , "ya", ,, ,, "yo", "yu", "zh", "ch", "sh", ,, ,, ,, ,, "e`", , "y`", "u`", ,, "cz", "a", "b", "v", "g", "d", "e", "z", , "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
 /* UKR */["shh", "ya", "ye", ,, "yi", , "yu", "zh", "ch", "sh", ,, "g`", ,, ,, ,, ,, ,, , "cz", "a", "b", "v", "g", "d", "e", "z", "y`", "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
 /* BOL */["sth", "ya", , "ye", "i`", ,, "yu", "zh", "ch", "sh", "fh", ,, ,, ,, ,, "a`", ,, "o`", "yh", "cz", "a", "b", "v", "g", "d", "e", "z", "i", "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
 /* MAK */[ , ,, ,, ,, , "zh", "ch", "sh", , "dh", , "g`", "z`", "k`", "l`", "n`", ,, ,, ,, "cz", "a", "b", "v", "g", "d", "e", "z", "i", , "j", , "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", , "'", "#"]
         ], f;
 c = (typeof c === "undefined")?1:c;               // Таблица по умолчанию
 if (b){                                           // Направление транслитерации
  f = e; e = d; d = f[c];
  if (c) {
   a = a.replace(/(c(?=[ieyjIEYJ]))/g, "cz");      // Обратное преобразование буквосочетаний
   a = a.replace(/(C(?=[ieyjIEYJ]))/g, "CZ");
  };
 } else {
  a = a.replace(/(i(?=.[^ufffdufffdufffdufffdufffdufffds]+))/ig, "$1`");
  e = e[c];
 }
 for (f = 0;f < d.length;f++) {                    // Транслитерация
  if (!d[f]||!e[f]) continue;
  a = a.replace(new RegExp(d[f], "g"), e[f]);
  a = a.replace(new RegExp(d[f].toUpperCase(), "g"), e[f].toUpperCase());
 }
 if (!b) {
  a = a.replace(/cz(?=[ieyjIEYJ])/g, "c");         // Прямое преобразование буквосочетаний
  a = a.replace(/CZ(?=[ieyjIEYJ])/g, "C");
 }
 return a;
}

Проверка функции:

example();
function example() {
'use strict';
 var a = "Съешь ещё этих мягких французских булок, да выпей же чаю!",
// var a = "мірь",                                 // Старославянский
 b = translit(a,"");
 c = translit(b,true);
 console.log("Транслируемая строка:n{0}nТранслированная строка:n{1}nОбратная трансляция:n{2}",a, b, c);
}


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js