670 lines
16 KiB
JavaScript
670 lines
16 KiB
JavaScript
/**
|
|
* Unidecode takes UTF-8 data and tries to represent it in US-ASCII characters (i.e., the universally displayable characters between 0x00 and 0x7F).
|
|
* The representation is almost always an attempt at transliteration -- i.e., conveying, in Roman letters, the pronunciation expressed by the text in
|
|
* some other writing system.
|
|
*
|
|
* The tables used (in data) are converted from the tables provided in the perl library Text::Unidecode (http://search.cpan.org/dist/Text-Unidecode/lib/Text/Unidecode.pm)
|
|
* and are distributed under the perl license
|
|
*
|
|
* @author Francois-Guillaume Ribreau
|
|
*
|
|
* Based on the port of unidecode for php
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
var tr = {};
|
|
var utf8_rx = /(?![\x00-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})./g;
|
|
|
|
module.exports = function (str) {
|
|
return str.replace(utf8_rx, unidecode_internal_replace);
|
|
};
|
|
|
|
function unidecode_internal_replace(match) {
|
|
var utf16 = utf8_to_utf16(match);
|
|
|
|
if (utf16 > 0xFFFF) {
|
|
return '_';
|
|
} else {
|
|
|
|
var h = utf16 >> 8;
|
|
var l = utf16 & 0xFF;
|
|
|
|
// (18) 18 > h < 1e (30)
|
|
if (h > 24 && h < 30) return '';
|
|
|
|
//(d7) 215 > h < 249 (f9) no supported
|
|
if (h > 215 && h < 249) return '';
|
|
|
|
if (!tr[h]) {
|
|
switch (dec2hex(h)) {
|
|
case '00':
|
|
tr[h] = require('./data/x00');
|
|
break;
|
|
case '01':
|
|
tr[h] = require('./data/x01');
|
|
break;
|
|
case '02':
|
|
tr[h] = require('./data/x02');
|
|
break;
|
|
case '03':
|
|
tr[h] = require('./data/x03');
|
|
break;
|
|
case '04':
|
|
tr[h] = require('./data/x04');
|
|
break;
|
|
case '05':
|
|
tr[h] = require('./data/x05');
|
|
break;
|
|
case '06':
|
|
tr[h] = require('./data/x06');
|
|
break;
|
|
case '07':
|
|
tr[h] = require('./data/x07');
|
|
break;
|
|
case '09':
|
|
tr[h] = require('./data/x09');
|
|
break;
|
|
case '0a':
|
|
tr[h] = require('./data/x0a');
|
|
break;
|
|
case '0b':
|
|
tr[h] = require('./data/x0b');
|
|
break;
|
|
case '0c':
|
|
tr[h] = require('./data/x0c');
|
|
break;
|
|
case '0d':
|
|
tr[h] = require('./data/x0d');
|
|
break;
|
|
case '0e':
|
|
tr[h] = require('./data/x0e');
|
|
break;
|
|
case '0f':
|
|
tr[h] = require('./data/x0f');
|
|
break;
|
|
case '10':
|
|
tr[h] = require('./data/x10');
|
|
break;
|
|
case '11':
|
|
tr[h] = require('./data/x11');
|
|
break;
|
|
case '12':
|
|
tr[h] = require('./data/x12');
|
|
break;
|
|
case '13':
|
|
tr[h] = require('./data/x13');
|
|
break;
|
|
case '14':
|
|
tr[h] = require('./data/x14');
|
|
break;
|
|
case '15':
|
|
tr[h] = require('./data/x15');
|
|
break;
|
|
case '16':
|
|
tr[h] = require('./data/x16');
|
|
break;
|
|
case '17':
|
|
tr[h] = require('./data/x17');
|
|
break;
|
|
case '18':
|
|
tr[h] = require('./data/x18');
|
|
break;
|
|
case '1e':
|
|
tr[h] = require('./data/x1e');
|
|
break;
|
|
case '1f':
|
|
tr[h] = require('./data/x1f');
|
|
break;
|
|
case '20':
|
|
tr[h] = require('./data/x20');
|
|
break;
|
|
case '21':
|
|
tr[h] = require('./data/x21');
|
|
break;
|
|
case '22':
|
|
tr[h] = require('./data/x22');
|
|
break;
|
|
case '23':
|
|
tr[h] = require('./data/x23');
|
|
break;
|
|
case '24':
|
|
tr[h] = require('./data/x24');
|
|
break;
|
|
case '25':
|
|
tr[h] = require('./data/x25');
|
|
break;
|
|
case '26':
|
|
tr[h] = require('./data/x26');
|
|
break;
|
|
case '27':
|
|
tr[h] = require('./data/x27');
|
|
break;
|
|
case '28':
|
|
tr[h] = require('./data/x28');
|
|
break;
|
|
case '2e':
|
|
tr[h] = require('./data/x2e');
|
|
break;
|
|
case '2f':
|
|
tr[h] = require('./data/x2f');
|
|
break;
|
|
case '30':
|
|
tr[h] = require('./data/x30');
|
|
break;
|
|
case '31':
|
|
tr[h] = require('./data/x31');
|
|
break;
|
|
case '32':
|
|
tr[h] = require('./data/x32');
|
|
break;
|
|
case '33':
|
|
tr[h] = require('./data/x33');
|
|
break;
|
|
case '4d':
|
|
tr[h] = require('./data/x4d');
|
|
break;
|
|
case '4e':
|
|
tr[h] = require('./data/x4e');
|
|
break;
|
|
case '4f':
|
|
tr[h] = require('./data/x4f');
|
|
break;
|
|
case '50':
|
|
tr[h] = require('./data/x50');
|
|
break;
|
|
case '51':
|
|
tr[h] = require('./data/x51');
|
|
break;
|
|
case '52':
|
|
tr[h] = require('./data/x52');
|
|
break;
|
|
case '53':
|
|
tr[h] = require('./data/x53');
|
|
break;
|
|
case '54':
|
|
tr[h] = require('./data/x54');
|
|
break;
|
|
case '55':
|
|
tr[h] = require('./data/x55');
|
|
break;
|
|
case '56':
|
|
tr[h] = require('./data/x56');
|
|
break;
|
|
case '57':
|
|
tr[h] = require('./data/x57');
|
|
break;
|
|
case '58':
|
|
tr[h] = require('./data/x58');
|
|
break;
|
|
case '59':
|
|
tr[h] = require('./data/x59');
|
|
break;
|
|
case '5a':
|
|
tr[h] = require('./data/x5a');
|
|
break;
|
|
case '5b':
|
|
tr[h] = require('./data/x5b');
|
|
break;
|
|
case '5c':
|
|
tr[h] = require('./data/x5c');
|
|
break;
|
|
case '5d':
|
|
tr[h] = require('./data/x5d');
|
|
break;
|
|
case '5e':
|
|
tr[h] = require('./data/x5e');
|
|
break;
|
|
case '5f':
|
|
tr[h] = require('./data/x5f');
|
|
break;
|
|
case '60':
|
|
tr[h] = require('./data/x60');
|
|
break;
|
|
case '61':
|
|
tr[h] = require('./data/x61');
|
|
break;
|
|
case '62':
|
|
tr[h] = require('./data/x62');
|
|
break;
|
|
case '63':
|
|
tr[h] = require('./data/x63');
|
|
break;
|
|
case '64':
|
|
tr[h] = require('./data/x64');
|
|
break;
|
|
case '65':
|
|
tr[h] = require('./data/x65');
|
|
break;
|
|
case '66':
|
|
tr[h] = require('./data/x66');
|
|
break;
|
|
case '67':
|
|
tr[h] = require('./data/x67');
|
|
break;
|
|
case '68':
|
|
tr[h] = require('./data/x68');
|
|
break;
|
|
case '69':
|
|
tr[h] = require('./data/x69');
|
|
break;
|
|
case '6a':
|
|
tr[h] = require('./data/x6a');
|
|
break;
|
|
case '6b':
|
|
tr[h] = require('./data/x6b');
|
|
break;
|
|
case '6c':
|
|
tr[h] = require('./data/x6c');
|
|
break;
|
|
case '6d':
|
|
tr[h] = require('./data/x6d');
|
|
break;
|
|
case '6e':
|
|
tr[h] = require('./data/x6e');
|
|
break;
|
|
case '6f':
|
|
tr[h] = require('./data/x6f');
|
|
break;
|
|
case '70':
|
|
tr[h] = require('./data/x70');
|
|
break;
|
|
case '71':
|
|
tr[h] = require('./data/x71');
|
|
break;
|
|
case '72':
|
|
tr[h] = require('./data/x72');
|
|
break;
|
|
case '73':
|
|
tr[h] = require('./data/x73');
|
|
break;
|
|
case '74':
|
|
tr[h] = require('./data/x74');
|
|
break;
|
|
case '75':
|
|
tr[h] = require('./data/x75');
|
|
break;
|
|
case '76':
|
|
tr[h] = require('./data/x76');
|
|
break;
|
|
case '77':
|
|
tr[h] = require('./data/x77');
|
|
break;
|
|
case '78':
|
|
tr[h] = require('./data/x78');
|
|
break;
|
|
case '79':
|
|
tr[h] = require('./data/x79');
|
|
break;
|
|
case '7a':
|
|
tr[h] = require('./data/x7a');
|
|
break;
|
|
case '7b':
|
|
tr[h] = require('./data/x7b');
|
|
break;
|
|
case '7c':
|
|
tr[h] = require('./data/x7c');
|
|
break;
|
|
case '7d':
|
|
tr[h] = require('./data/x7d');
|
|
break;
|
|
case '7e':
|
|
tr[h] = require('./data/x7e');
|
|
break;
|
|
case '7f':
|
|
tr[h] = require('./data/x7f');
|
|
break;
|
|
case '80':
|
|
tr[h] = require('./data/x80');
|
|
break;
|
|
case '81':
|
|
tr[h] = require('./data/x81');
|
|
break;
|
|
case '82':
|
|
tr[h] = require('./data/x82');
|
|
break;
|
|
case '83':
|
|
tr[h] = require('./data/x83');
|
|
break;
|
|
case '84':
|
|
tr[h] = require('./data/x84');
|
|
break;
|
|
case '85':
|
|
tr[h] = require('./data/x85');
|
|
break;
|
|
case '86':
|
|
tr[h] = require('./data/x86');
|
|
break;
|
|
case '87':
|
|
tr[h] = require('./data/x87');
|
|
break;
|
|
case '88':
|
|
tr[h] = require('./data/x88');
|
|
break;
|
|
case '89':
|
|
tr[h] = require('./data/x89');
|
|
break;
|
|
case '8a':
|
|
tr[h] = require('./data/x8a');
|
|
break;
|
|
case '8b':
|
|
tr[h] = require('./data/x8b');
|
|
break;
|
|
case '8c':
|
|
tr[h] = require('./data/x8c');
|
|
break;
|
|
case '8d':
|
|
tr[h] = require('./data/x8d');
|
|
break;
|
|
case '8e':
|
|
tr[h] = require('./data/x8e');
|
|
break;
|
|
case '8f':
|
|
tr[h] = require('./data/x8f');
|
|
break;
|
|
case '90':
|
|
tr[h] = require('./data/x90');
|
|
break;
|
|
case '91':
|
|
tr[h] = require('./data/x91');
|
|
break;
|
|
case '92':
|
|
tr[h] = require('./data/x92');
|
|
break;
|
|
case '93':
|
|
tr[h] = require('./data/x93');
|
|
break;
|
|
case '94':
|
|
tr[h] = require('./data/x94');
|
|
break;
|
|
case '95':
|
|
tr[h] = require('./data/x95');
|
|
break;
|
|
case '96':
|
|
tr[h] = require('./data/x96');
|
|
break;
|
|
case '97':
|
|
tr[h] = require('./data/x97');
|
|
break;
|
|
case '98':
|
|
tr[h] = require('./data/x98');
|
|
break;
|
|
case '99':
|
|
tr[h] = require('./data/x99');
|
|
break;
|
|
case '9a':
|
|
tr[h] = require('./data/x9a');
|
|
break;
|
|
case '9b':
|
|
tr[h] = require('./data/x9b');
|
|
break;
|
|
case '9c':
|
|
tr[h] = require('./data/x9c');
|
|
break;
|
|
case '9d':
|
|
tr[h] = require('./data/x9d');
|
|
break;
|
|
case '9e':
|
|
tr[h] = require('./data/x9e');
|
|
break;
|
|
case '9f':
|
|
tr[h] = require('./data/x9f');
|
|
break;
|
|
case 'a0':
|
|
tr[h] = require('./data/xa0');
|
|
break;
|
|
case 'a1':
|
|
tr[h] = require('./data/xa1');
|
|
break;
|
|
case 'a2':
|
|
tr[h] = require('./data/xa2');
|
|
break;
|
|
case 'a3':
|
|
tr[h] = require('./data/xa3');
|
|
break;
|
|
case 'a4':
|
|
tr[h] = require('./data/xa4');
|
|
break;
|
|
case 'ac':
|
|
tr[h] = require('./data/xac');
|
|
break;
|
|
case 'ad':
|
|
tr[h] = require('./data/xad');
|
|
break;
|
|
case 'ae':
|
|
tr[h] = require('./data/xae');
|
|
break;
|
|
case 'af':
|
|
tr[h] = require('./data/xaf');
|
|
break;
|
|
case 'b0':
|
|
tr[h] = require('./data/xb0');
|
|
break;
|
|
case 'b1':
|
|
tr[h] = require('./data/xb1');
|
|
break;
|
|
case 'b2':
|
|
tr[h] = require('./data/xb2');
|
|
break;
|
|
case 'b3':
|
|
tr[h] = require('./data/xb3');
|
|
break;
|
|
case 'b4':
|
|
tr[h] = require('./data/xb4');
|
|
break;
|
|
case 'b5':
|
|
tr[h] = require('./data/xb5');
|
|
break;
|
|
case 'b6':
|
|
tr[h] = require('./data/xb6');
|
|
break;
|
|
case 'b7':
|
|
tr[h] = require('./data/xb7');
|
|
break;
|
|
case 'b8':
|
|
tr[h] = require('./data/xb8');
|
|
break;
|
|
case 'b9':
|
|
tr[h] = require('./data/xb9');
|
|
break;
|
|
case 'ba':
|
|
tr[h] = require('./data/xba');
|
|
break;
|
|
case 'bb':
|
|
tr[h] = require('./data/xbb');
|
|
break;
|
|
case 'bc':
|
|
tr[h] = require('./data/xbc');
|
|
break;
|
|
case 'bd':
|
|
tr[h] = require('./data/xbd');
|
|
break;
|
|
case 'be':
|
|
tr[h] = require('./data/xbe');
|
|
break;
|
|
case 'bf':
|
|
tr[h] = require('./data/xbf');
|
|
break;
|
|
case 'c0':
|
|
tr[h] = require('./data/xc0');
|
|
break;
|
|
case 'c1':
|
|
tr[h] = require('./data/xc1');
|
|
break;
|
|
case 'c2':
|
|
tr[h] = require('./data/xc2');
|
|
break;
|
|
case 'c3':
|
|
tr[h] = require('./data/xc3');
|
|
break;
|
|
case 'c4':
|
|
tr[h] = require('./data/xc4');
|
|
break;
|
|
case 'c5':
|
|
tr[h] = require('./data/xc5');
|
|
break;
|
|
case 'c6':
|
|
tr[h] = require('./data/xc6');
|
|
break;
|
|
case 'c7':
|
|
tr[h] = require('./data/xc7');
|
|
break;
|
|
case 'c8':
|
|
tr[h] = require('./data/xc8');
|
|
break;
|
|
case 'c9':
|
|
tr[h] = require('./data/xc9');
|
|
break;
|
|
case 'ca':
|
|
tr[h] = require('./data/xca');
|
|
break;
|
|
case 'cb':
|
|
tr[h] = require('./data/xcb');
|
|
break;
|
|
case 'cc':
|
|
tr[h] = require('./data/xcc');
|
|
break;
|
|
case 'cd':
|
|
tr[h] = require('./data/xcd');
|
|
break;
|
|
case 'ce':
|
|
tr[h] = require('./data/xce');
|
|
break;
|
|
case 'cf':
|
|
tr[h] = require('./data/xcf');
|
|
break;
|
|
case 'd0':
|
|
tr[h] = require('./data/xd0');
|
|
break;
|
|
case 'd1':
|
|
tr[h] = require('./data/xd1');
|
|
break;
|
|
case 'd2':
|
|
tr[h] = require('./data/xd2');
|
|
break;
|
|
case 'd3':
|
|
tr[h] = require('./data/xd3');
|
|
break;
|
|
case 'd4':
|
|
tr[h] = require('./data/xd4');
|
|
break;
|
|
case 'd5':
|
|
tr[h] = require('./data/xd5');
|
|
break;
|
|
case 'd6':
|
|
tr[h] = require('./data/xd6');
|
|
break;
|
|
case 'd7':
|
|
tr[h] = require('./data/xd7');
|
|
break;
|
|
case 'f9':
|
|
tr[h] = require('./data/xf9');
|
|
break;
|
|
case 'fa':
|
|
tr[h] = require('./data/xfa');
|
|
break;
|
|
case 'fb':
|
|
tr[h] = require('./data/xfb');
|
|
break;
|
|
case 'fc':
|
|
tr[h] = require('./data/xfc');
|
|
break;
|
|
case 'fd':
|
|
tr[h] = require('./data/xfd');
|
|
break;
|
|
case 'fe':
|
|
tr[h] = require('./data/xfe');
|
|
break;
|
|
case 'ff':
|
|
tr[h] = require('./data/xff');
|
|
break;
|
|
default:
|
|
// console.error("Unidecode file not found for h=", h);
|
|
return '';
|
|
}
|
|
}
|
|
|
|
return tr[h][l];
|
|
}
|
|
}
|
|
|
|
function dec2hex(i) {
|
|
return (i + 0x100).toString(16).substr(-2);
|
|
}
|
|
|
|
function utf8_to_utf16(raw) {
|
|
var b1, b2, b3, b4,
|
|
x, y, z;
|
|
|
|
while (Array.isArray(raw)) raw = raw[0];
|
|
|
|
switch (raw.length) {
|
|
case 1:
|
|
return ord(raw);
|
|
|
|
// http://en.wikipedia.org/wiki/UTF-8
|
|
case 2:
|
|
b1 = ord(raw.substr(0, 1));
|
|
b2 = ord(raw.substr(1, 1));
|
|
|
|
x = ((b1 & 0x03) << 6) | (b2 & 0x3F);
|
|
y = (b1 & 0x1C) >> 2;
|
|
|
|
return (y << 8) | x;
|
|
|
|
case 3:
|
|
b1 = ord(raw.substr(0, 1));
|
|
b2 = ord(raw.substr(1, 1));
|
|
b3 = ord(raw.substr(2, 1));
|
|
|
|
x = ((b2 & 0x03) << 6) | (b3 & 0x3F);
|
|
y = ((b1 & 0x0F) << 4) | ((b2 & 0x3C) >> 2);
|
|
|
|
return (y << 8) | x;
|
|
|
|
default:
|
|
b1 = ord(raw.substr(0, 1));
|
|
b2 = ord(raw.substr(1, 1));
|
|
b3 = ord(raw.substr(2, 1));
|
|
b4 = ord(raw.substr(3, 1));
|
|
|
|
x = ((b3 & 0x03) << 6) | (b4 & 0x3F);
|
|
y = ((b2 & 0x0F) << 4) | ((b3 & 0x3C) >> 2);
|
|
z = ((b1 & 0x07) << 5) | ((b2 & 0x30) >> 4);
|
|
|
|
return (z << 16) | (y << 8) | x;
|
|
}
|
|
}
|
|
|
|
/* From php.js */
|
|
|
|
function ord(string) {
|
|
// Returns the codepoint value of a character
|
|
//
|
|
// version: 1109.2015
|
|
// discuss at: http://phpjs.org/functions/ord
|
|
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
|
// + bugfixed by: Onno Marsman
|
|
// + improved by: Brett Zamir (http://brett-zamir.me)
|
|
// + input by: incidence
|
|
// * example 1: ord('K');
|
|
// * returns 1: 75
|
|
// * example 2: ord('\uD800\uDC00'); // surrogate pair to create a single Unicode character
|
|
// * returns 2: 65536
|
|
var str = string + '',
|
|
code = str.charCodeAt(0);
|
|
if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters)
|
|
var hi = code;
|
|
if (str.length === 1) {
|
|
return code; // This is just a high surrogate with no following low surrogate, so we return its value;
|
|
// we could also throw an error as it is not a complete character, but someone may want to know
|
|
}
|
|
var low = str.charCodeAt(1);
|
|
return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
|
|
}
|
|
if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate
|
|
return code; // This is just a low surrogate with no preceding high surrogate, so we return its value;
|
|
// we could also throw an error as it is not a complete character, but someone may want to know
|
|
}
|
|
return code;
|
|
}
|