-
Notifications
You must be signed in to change notification settings - Fork 0
/
translit.js
138 lines (137 loc) · 10.2 KB
/
translit.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*******************************************************************************
* @Name : "translit(a, b)" // Имя
* @Params : a - транслитерируемая строка // Параметры запуска
b - [123456] system A = 1; - диакритика
system B =(2-Беларусь;3-Болгария;4-Македония;5-Россия;6-Украина)
Если b отрицательное обратная транслитерация
* @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[11.02.2015/03:44:01] translit [ver.0.0.0.4]
*******************************************************************************/
translit = function (a, b) {
b = function (c) { // c - Второй параметр родительской функции
/* Function Expression
* Вспомогательная функция.
*
* В ней и хотелось навести порядок.
*
* Проверяет направление транслитерации.
* Предобработка строки (согласно правилам из ГОСТ).
* Возвращает массив из 2 функций:
* построения таблиц транслитерации.
* и постобработки строки (согласно правилам из ГОСТ).
*
* @param {Number} c Второй параметр парент функции
* @return {Array}
*/
var b = Math.abs(c); // Абсолютное значение транслитерации
if(c === b) { // Прямая транслитерация(кирилица в латиницу)
// Правила транслитерации (из ГОСТ).
// "i`" только перед согласными в ст. рус. и болг.
// a = a.replace(/(i(?=.[^аеиоуъ\s]+))/ig, "$1`");
a = a.replace(/(\u0456(?=.[^\u0430\u0435\u0438\u043E\u0443\u044A\s]+))/ig, "$1`");
return [ // Возвращаем массив функций
function (c, d) { // c - таблица, d - символ (создаем таблицу и RegExp)
var a; // Создаем временную переменную для хранения символа
if(a = c[d][0] || c[d][b]) { // Если символ есть
f[d] = a; // Добавляем символ в объект преобразования
e.push(d); // Добавляем в массив RegExp
}
},
// функция пост-обработки
function (a) { // a - транслируемая строка.
// Правила транслитерации (из ГОСТ).
return a.replace(/i``/ig, "i`"). // "i`" только перед согласными в ст. рус. и болг.
replace(/((c)z)(?=[ieyj])/ig, "$2"); // "cz" в символ "c"
}];
} else { // Обратная транслитерация (латиница в кирилицу)
a = a.replace(/(c)(?=[ieyj])/ig, "$1z"); //правило сочетания "cz"
return [ // Возвращаем массив функций
function (c, d) { // c - таблица, d - символ (создаем таблицу и RegExp)
var a; // Создаем временную переменную для хранения символа
if(a = c[d][0] || c[d][b]) { // Если символ есть
f[a] = d; // Добавляем символ в объект преобразования
e.push(a); // Добавляем в массив RegExp
}
},
// функция пост-обработки
function (a) {return a;}]; // nop - пустая функция.
}
}(b);
var c = { // Объект для построения таблицы транслитерации и RegExp
// Имя - кириллица
// 0 - общие для всех
// 1 - диакритика 4 - MK|MKD - Македония
// 2 - BY|BLR - Беларусь 5 - RU|RUS - Россия
// 3 - BG|BGR - Болгария 6 - UA|UKR - Украина
/*-Имя---------0-,-------1--,---2-,---3-,---4-,----5-,---6-*/
"\u0449": [ "", "\u015D", "","sth", "", "shh","shh"], // "щ"
"\u044F": [ "", "\u00E2", "ya", "ya", "", "ya", "ya"], // "я"
"\u0454": [ "", "\u00EA", "", "", "", "", "ye"], // "є"
"\u0463": [ "", "\u011B", "", "ye", "", "ye", ""], // ять
"\u0456": [ "", "\u00EC", "i", "i`", "", "i`", "i"], // "і" йота
"\u0457": [ "", "\u00EF", "", "", "", "", "yi"], // "ї"
"\u0451": [ "", "\u00EB", "yo", "", "", "yo", ""], // "ё"
"\u044E": [ "", "\u00FB", "yu", "yu", "", "yu", "yu"], // "ю"
"\u0436": [ "zh", "\u017E"], // "ж"
"\u0447": [ "ch", "\u010D"], // "ч"
"\u0448": [ "sh", "\u0161"], // "ш"
"\u0473": [ "","f\u0300", "", "fh", "", "fh", ""], // фита
"\u045F": [ "","d\u0302", "", "", "dh", "", ""], // "џ"
"\u0491": [ "","g\u0300", "", "", "", "", "g`"], // "ґ"
"\u0453": [ "", "\u01F5", "", "", "g`", "", ""], // "ѓ"
"\u0455": [ "", "\u1E91", "", "", "z`", "", ""], // "ѕ"
"\u045C": [ "", "\u1E31", "", "", "k`", "", ""], // "ќ"
"\u0459": [ "","l\u0302", "", "", "l`", "", ""], // "љ"
"\u045A": [ "","n\u0302", "", "", "n`", "", ""], // "њ"
"\u044D": [ "", "\u00E8", "e`", "", "", "e`", ""], // "э"
"\u044A": [ "", "\u02BA", "", "a`", "", "``", ""], // "ъ"
"\u044B": [ "", "y", "y`", "", "", "y`", ""], // "ы"
"\u045E": [ "", "\u01D4", "u`", "", "", "", ""], // "ў"
"\u046B": [ "", "\u01CE", "", "o`", "", "", ""], // юс
"\u0475": [ "", "\u1EF3", "", "yh", "", "yh", ""], // ижица
"\u0446": [ "cz", "c"], // "ц"
"\u0430": [ "a"], // "а"
"\u0431": [ "b"], // "б"
"\u0432": [ "v"], // "в"
"\u0433": [ "g"], // "г"
"\u0434": [ "d"], // "д"
"\u0435": [ "e"], // "е"
"\u0437": [ "z"], // "з"
"\u0438": [ "", "i", "", "i", "i", "i", "y`"], // "и"
"\u0439": [ "", "j", "j", "j", "", "j", "j"], // "й"
"\u043A": [ "k"], // "к"
"\u043B": [ "l"], // "л"
"\u043C": [ "m"], // "м"
"\u043D": [ "n"], // "н"
"\u043E": [ "o"], // "о"
"\u043F": [ "p"], // "п"
"\u0440": [ "r"], // "р"
"\u0441": [ "s"], // "с"
"\u0442": [ "t"], // "т"
"\u0443": [ "u"], // "у"
"\u0444": [ "f"], // "ф"
"\u0445": [ "x", "h"], // "х"
"\u044C": [ "", "\u02B9", "`", "`", "", "`", "`"], // "ь"
"\u0458": [ "","j\u030C", "", "", "j", "", ""], // "ј"
"\u2019": [ "'", "\u02BC"], // "’"
"\u2116": [ "#"] // "№"
},
d, e = [], f = {};
for(d in c) {b[0](c, d);} // Создание таблиц и массива RegExp ранее созданной функцией
return b[1]( // функция пост-обработки строки (правила и т.д.)
a.replace( // Транслитерация
new RegExp(e.join("|"), // Создаем RegExp из массива
"gi"),
function (a) { // CallBack Функция RegExp
if( // Обработка строки с учетом регистра
a.toLowerCase() === a) {
return f[a];
} else {
return f[a.toLowerCase()].toUpperCase();
}
}));
}