master
1(function() {
2
3 var NormalizeMap = {}, NormalizeReg, NormalizeSource;
4
5 function buildNormalizeMap() {
6 var normalized, str, all = '';
7 for(normalized in NormalizeSource) {
8 if(!NormalizeSource.hasOwnProperty(normalized)) continue;
9 str = NormalizeSource[normalized];
10 str.split('').forEach(function(character) {
11 NormalizeMap[character] = normalized;
12 });
13 all += str;
14 }
15 NormalizeReg = RegExp('[' + all + ']', 'g');
16 }
17
18 NormalizeSource = {
19 'A': 'AⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ',
20 'B': 'BⒷBḂḄḆɃƂƁ',
21 'C': 'CⒸCĆĈĊČÇḈƇȻꜾ',
22 'D': 'DⒹDḊĎḌḐḒḎĐƋƊƉꝹ',
23 'E': 'EⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎ',
24 'F': 'FⒻFḞƑꝻ',
25 'G': 'GⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾ',
26 'H': 'HⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ',
27 'I': 'IⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ',
28 'J': 'JⒿJĴɈ',
29 'K': 'KⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ',
30 'L': 'LⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ',
31 'M': 'MⓂMḾṀṂⱮƜ',
32 'N': 'NⓃNǸŃÑṄŇṆŅṊṈȠƝꞐꞤ',
33 'O': 'OⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ',
34 'P': 'PⓅPṔṖƤⱣꝐꝒꝔ',
35 'Q': 'QⓆQꝖꝘɊ',
36 'R': 'RⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ',
37 'S': 'SⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ',
38 'T': 'TⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ',
39 'U': 'UⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ',
40 'V': 'VⓋVṼṾƲꝞɅ',
41 'W': 'WⓌWẀẂŴẆẄẈⱲ',
42 'X': 'XⓍXẊẌ',
43 'Y': 'YⓎYỲÝŶỸȲẎŸỶỴƳɎỾ',
44 'Z': 'ZⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ',
45 'a': 'aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐ',
46 'b': 'bⓑbḃḅḇƀƃɓ',
47 'c': 'cⓒcćĉċčçḉƈȼꜿↄ',
48 'd': 'dⓓdḋďḍḑḓḏđƌɖɗꝺ',
49 'e': 'eⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇɛǝ',
50 'f': 'fⓕfḟƒꝼ',
51 'g': 'gⓖgǵĝḡğġǧģǥɠꞡᵹꝿ',
52 'h': 'hⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ',
53 'i': 'iⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı',
54 'j': 'jⓙjĵǰɉ',
55 'k': 'kⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ',
56 'l': 'lⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇ',
57 'm': 'mⓜmḿṁṃɱɯ',
58 'n': 'nⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥ',
59 'o': 'oⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿɔꝋꝍɵ',
60 'p': 'pⓟpṕṗƥᵽꝑꝓꝕ',
61 'q': 'qⓠqɋꝗꝙ',
62 'r': 'rⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ',
63 's': 'sⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛ',
64 't': 'tⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ',
65 'u': 'uⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ',
66 'v': 'vⓥvṽṿʋꝟʌ',
67 'w': 'wⓦwẁẃŵẇẅẘẉⱳ',
68 'x': 'xⓧxẋẍ',
69 'y': 'yⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ',
70 'z': 'zⓩzźẑżžẓẕƶȥɀⱬꝣ',
71 'AA': 'Ꜳ',
72 'AE': 'ÆǼǢ',
73 'AO': 'Ꜵ',
74 'AU': 'Ꜷ',
75 'AV': 'ꜸꜺ',
76 'AY': 'Ꜽ',
77 'DZ': 'DZDŽ',
78 'Dz': 'DzDž',
79 'LJ': 'LJ',
80 'Lj': 'Lj',
81 'NJ': 'NJ',
82 'Nj': 'Nj',
83 'OI': 'Ƣ',
84 'OO': 'Ꝏ',
85 'OU': 'Ȣ',
86 'TZ': 'Ꜩ',
87 'VY': 'Ꝡ',
88 'aa': 'ꜳ',
89 'ae': 'æǽǣ',
90 'ao': 'ꜵ',
91 'au': 'ꜷ',
92 'av': 'ꜹꜻ',
93 'ay': 'ꜽ',
94 'dz': 'dzdž',
95 'hv': 'ƕ',
96 'lj': 'lj',
97 'nj': 'nj',
98 'oi': 'ƣ',
99 'ou': 'ȣ',
100 'oo': 'ꝏ',
101 'ss': 'ß',
102 'tz': 'ꜩ',
103 'vy': 'ꝡ'
104 };
105
106 String.extend({
107 /***
108 * @method normalize()
109 * @returns String
110 * @short Returns the string with accented and non-standard Latin-based characters converted into ASCII approximate equivalents.
111 * @example
112 *
113 * 'á'.normalize() -> 'a'
114 * 'Ménage à trois'.normalize() -> 'Menage a trois'
115 * 'Volkswagen'.normalize() -> 'Volkswagen'
116 * 'FULLWIDTH'.normalize() -> 'FULLWIDTH'
117 *
118 ***/
119 'normalize': function() {
120 return this.replace(NormalizeReg, function(character) {
121 return NormalizeMap[character];
122 });
123 }
124
125 });
126
127 buildNormalizeMap();
128
129})();
130