Skip to content

Commit

Permalink
Fix a bug with wrong uppercase chars for some transliterated combos
Browse files Browse the repository at this point in the history
Cyr chars like 'Ж', 'Ю', etc. need to have their transilterated equivalent
stay upper case when the rest of the letters in the words are uppercase
as well.

Added unit tests to address this problem.
  • Loading branch information
petarov committed Apr 28, 2024
1 parent f898a8f commit 1bd99ce
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 9 deletions.
71 changes: 67 additions & 4 deletions src/translitbg.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,64 @@
}
};

// lookup table for uppercase letters
var UC = {
'А': true,
'Б': true,
'В': true,
'Г': true,
'Д': true,
'Е': true,
'Ж': true,
'З': true,
'И': true,
'Ѝ': true,
'Й': true,
'К': true,
'Л': true,
'М': true,
'Н': true,
'О': true,
'П': true,
'Р': true,
'С': true,
'Т': true,
'У': true,
'Ф': true,
'Х': true,
'Ц': true,
'Ч': true,
'Ш': true,
'Щ': true,
'Ъ': true,
'Ь': true,
'Ю': true,
'Я': true,
};

function isComboUC(ch) {
return ch == 'Ж' ||
ch == 'Ц' ||
ch == 'Ч' ||
ch == 'Ш' ||
ch == 'Щ' ||
ch == 'Ю' ||
ch == 'Я';
}

function toComboUC(ch) {
switch (ch) {
case 'Ж': return 'ZH';
case 'Ц': return 'TS';
case 'Ч': return 'CH';
case 'Ш': return 'SH';
case 'Щ': return 'SHT';
case 'Ю': return 'YU';
case 'Я': return 'YA';
}
return ch;
}

function transliterate(text, mode) {
var result = [];
var chars = text.split('');
Expand All @@ -114,8 +172,13 @@
}
}

if (mode.chars[ch]) {
result.push(mode.chars[ch]);
var found = mode.chars[ch];
if (found) {
if (isComboUC(ch) && (!ch2 || UC[ch2])) {
result.push(toComboUC(ch));
} else {
result.push(found);
}
} else {
result.push(ch);
}
Expand All @@ -125,8 +188,8 @@
}

/**
* Exports
*/
* Exports
*/
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = translitbg;
Expand Down
34 changes: 29 additions & 5 deletions test/test-all.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ describe('All tests', function () {

it('test изречения, нови редове', function () {
var input = 'Всички хора се раждат свободни и равни по достойнство и права.'
+ 'Те са надарени с разум и съвест и следва да се отнасят помежду си в дух на братство.';
+ 'Те са надарени с разум и съвест и следва да се отнасят помежду си в дух на братство.';
var expected = 'Vsichki hora se razhdat svobodni i ravni po dostoynstvo i prava.' +
'Te sa nadareni s razum i savest i sledva da se otnasyat pomezhdu si v duh na bratstvo.';
'Te sa nadareni s razum i savest i sledva da se otnasyat pomezhdu si v duh na bratstvo.';
assert.equal(translitbg.go(input), expected);

input = 'Всички хора \nсе раждат свободни\n и равни по достойнство\n и права.';
Expand All @@ -24,7 +24,7 @@ describe('All tests', function () {
expected = 'I mozhe da bade nameren i v drugi ezitsi \nkato ruskia ezik i ukrainskia ezik.';
assert.equal(translitbg.go(input), expected);

// --- mixed
// --- mixed

input = 'Seдем с едin udар';
expected = 'Sedem s edin udar';
Expand All @@ -42,14 +42,38 @@ describe('All tests', function () {
assert.equal(translitbg.go('Явор'), 'Yavor');
});

it('test специални случаи', function () {
assert.equal(translitbg.go('Стара планина'), 'Stara planina');
assert.equal(translitbg.go('Атанасовско езеро'), 'Atanasovsko ezero');
assert.equal(translitbg.go('Централен Балкан'), 'Tsentralen Balkan');
assert.equal(translitbg.go('ЖЕЗЪЛ'), 'ZHEZAL');
assert.equal(translitbg.go('жЕЗЪЛ'), 'zhEZAL');
assert.equal(translitbg.go('жезъл'), 'zhezal');
assert.equal(translitbg.go('ЦАРЕВЕЦ'), 'TSAREVETS');
assert.equal(translitbg.go('Царевец'), 'Tsarevets');
assert.equal(translitbg.go('ЦАРевец'), 'TSARevets');
assert.equal(translitbg.go('цАРЕВЕЦ'), 'tsAREVETS');
assert.equal(translitbg.go('чОвек'), 'chOvek');
assert.equal(translitbg.go('ЧОВек'), 'CHOVek');
assert.equal(translitbg.go('ШИВАЧ'), 'SHIVACH');
assert.equal(translitbg.go('шИВАч'), 'shIVAch');
assert.equal(translitbg.go('ЩАСТИЕ'), 'SHTASTIE');
assert.equal(translitbg.go('щАСТИЕ'), 'shtASTIE');
assert.equal(translitbg.go('ЩаСТИЕ'), 'ShtaSTIE');
assert.equal(translitbg.go('ЮНГА'), 'YUNGA');
assert.equal(translitbg.go('юНГА'), 'yuNGA');
assert.equal(translitbg.go('ЯБЪЛКИ'), 'YABALKI');
assert.equal(translitbg.go('яБЪЛКИ'), 'yaBALKI');
});

it('test места и адреси', function () {
assert.equal(translitbg.go('Стара планина'), 'Stara planina');
assert.equal(translitbg.go('Атанасовско езеро'), 'Atanasovsko ezero');
assert.equal(translitbg.go('Централен Балкан'), 'Tsentralen Balkan');
assert.equal(translitbg.go('София-юг'), 'Sofia-yug');
assert.equal(translitbg.go('СофИя-юг'), 'SofIa-yug');
assert.equal(translitbg.go('СофиЯ-юг'), 'SofiA-yug');
assert.equal(translitbg.go('СофИЯ-ЮГ'), 'SofIA-YuG');
assert.equal(translitbg.go('СофИЯ-ЮГ'), 'SofIA-YUG');
assert.equal(translitbg.go('гр. София, ул. Тракия.'), 'gr. Sofia, ul. Trakia.');
assert.equal(translitbg.go('гр. СофИЯ, ул. ТракИя.'), 'gr. SofIA, ul. TrakIa.');
assert.equal(translitbg.go('Перник-север'), 'Pernik-sever');
Expand Down Expand Up @@ -195,5 +219,5 @@ describe('All tests', function () {
assert.equal(translitbg.go('Дупница'), 'Dupnitsa');
assert.equal(translitbg.go('Петрич'), 'Petrich');
});

});

0 comments on commit 1bd99ce

Please sign in to comment.