src/index.js   A
last analyzed

Complexity

Total Complexity 24
Complexity/F 2.4

Size

Lines of Code 109
Function Count 10

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 24
eloc 55
mnd 14
bc 14
fnc 10
dl 0
loc 109
rs 10
bpm 1.4
cpm 2.4
noi 0
c 0
b 0
f 0
1
var maps = require('./maps.js');
2
3
4
var tWord1 = function(word, from_lang, to_lang) {
5
	// console.debug(word, maps.map[from_lang][to_lang]);
6
	
7
	for (var k in maps.map[from_lang][to_lang]) {
8
		// console.debug('k-->', k, word, maps.map[from_lang][to_lang][k]);
9
		if (maps.map[from_lang][to_lang].hasOwnProperty(k)) {
10
			word = word.replace(new RegExp(k, 'g'), maps.map[from_lang][to_lang][k]);
11
		}
12
	}
13
	
14
	return word;
15
};
16
17
var tWordN = function(word, from_lang, to_lang, jumpTo) {
18
	if (!word) {
19
		return '';
20
	}
21
	
22
	jumpTo = jumpTo || 0;
23
	var tmp, parts, keys = Object.keys(maps.map[from_lang][to_lang]);
24
	
25
	for (; jumpTo < keys.length; ++jumpTo) {
26
		if (tmp = word.match(new RegExp(keys[jumpTo], 'ig'))) {
27
			try {
28
				tmp[0] = tmp[0].replace(/([\(\)\[\]\{\}\\])/g, "\\$1");
29
				parts = word.split(new RegExp('(' + tmp[0] + ')')).filter(function(v) {
30
					return v;
31
				});
32
				
33
				// console.debug('in-->', tmp, word, parts);
34
				
35
				for (var i = 0; i < parts.length; ++i) {
36
					if (parts[i] === tmp[0]) {
37
						// console.debug('in-->', keys[jumpTo]);
38
						parts[i] = parts[i].replace(new RegExp(keys[jumpTo], 'ig'), maps.map[from_lang][to_lang][keys[jumpTo]]);
39
					} else {
40
						parts[i] = tWordN(parts[i], from_lang, to_lang, jumpTo + 1);
41
					}
42
				}
43
				word = parts.join('');
44
			} catch(e) {
45
				console.error('Failed transliting:', keys[jumpTo], e, jumpTo, tmp, word, from_lang, to_lang);
46
			}
47
			
48
			break;
49
		}
50
	}
51
	
52
	return word;
53
};
54
55
var find_bridge = function(str, from_lang, to_lang) {
56
	var found_bridge = false;
57
	
58
	// console.debug(str, from_lang, to_lang, maps.languages);
59
	
60
	for (var i = 0; i < maps.languages.length && found_bridge === false; ++i) {
61
		found_bridge = !!maps.map[maps.languages[i]][to_lang] && maps.languages[i];
62
	}
63
	
64
	if (found_bridge) {
65
		return lingualate_helper(lingualate_helper(str, from_lang, found_bridge), found_bridge, to_lang);
66
	}
67
	return '';
68
};
69
70
var tsplit = function(str) {
71
	return str.split(/[\s\-]/).filter(function(v) { return typeof v !== 'undefined' && v.length; })
72
};
73
74
var lingualate_helper = function(str, from_lang, to_lang) {
75
	// return str;
76
	// console.debug('rrr!!!', str, from_lang, to_lang);
77
	if (!str || !maps.map[from_lang]) {
78
		return str || '';
79
	}
80
	
81
	if (!maps.map[from_lang][to_lang]) {
82
		return find_bridge(str, from_lang, to_lang);
83
	}
84
	
85
	var words = tsplit(str),
86
		func = ['ru', 'uk', 'sr', 'el', 'trans'].indexOf(from_lang) !== -1 ? tWord1 : tWordN;
87
	
88
	for (var i=0; i < words.length; ++i) {
89
		words[i] = func(words[i], from_lang, to_lang);
90
	}
91
	
92
	return words.join(' ');
93
};
94
95
var up = function(str) {
96
	return tsplit(str).map(function(v) {
97
		return v.substr(0, 1).toUpperCase() + v.substr(1);
98
	}).join(' ');
99
};
100
101
var lingualate = function(str, from_lang, to_lang) {
102
	return up(lingualate_helper(str.toLowerCase(), from_lang, to_lang));
103
};
104
105
106
module.exports = {
107
	maps: maps,
108
	ling: lingualate
109
};