master
Raw Download raw file
  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