533 lines
9.8 KiB
JavaScript
533 lines
9.8 KiB
JavaScript
|
|
/*global XRegExp*/
|
|||
|
|
"use strict";
|
|||
|
|
{
|
|||
|
|
const LATIN_MAP = {
|
|||
|
|
À: "A",
|
|||
|
|
Á: "A",
|
|||
|
|
Â: "A",
|
|||
|
|
Ã: "A",
|
|||
|
|
Ä: "A",
|
|||
|
|
Å: "A",
|
|||
|
|
Æ: "AE",
|
|||
|
|
Ç: "C",
|
|||
|
|
È: "E",
|
|||
|
|
É: "E",
|
|||
|
|
Ê: "E",
|
|||
|
|
Ë: "E",
|
|||
|
|
Ì: "I",
|
|||
|
|
Í: "I",
|
|||
|
|
Î: "I",
|
|||
|
|
Ï: "I",
|
|||
|
|
Ð: "D",
|
|||
|
|
Ñ: "N",
|
|||
|
|
Ò: "O",
|
|||
|
|
Ó: "O",
|
|||
|
|
Ô: "O",
|
|||
|
|
Õ: "O",
|
|||
|
|
Ö: "O",
|
|||
|
|
Ő: "O",
|
|||
|
|
Ø: "O",
|
|||
|
|
Ù: "U",
|
|||
|
|
Ú: "U",
|
|||
|
|
Û: "U",
|
|||
|
|
Ü: "U",
|
|||
|
|
Ű: "U",
|
|||
|
|
Ý: "Y",
|
|||
|
|
Þ: "TH",
|
|||
|
|
Ÿ: "Y",
|
|||
|
|
ß: "ss",
|
|||
|
|
à: "a",
|
|||
|
|
á: "a",
|
|||
|
|
â: "a",
|
|||
|
|
ã: "a",
|
|||
|
|
ä: "a",
|
|||
|
|
å: "a",
|
|||
|
|
æ: "ae",
|
|||
|
|
ç: "c",
|
|||
|
|
è: "e",
|
|||
|
|
é: "e",
|
|||
|
|
ê: "e",
|
|||
|
|
ë: "e",
|
|||
|
|
ì: "i",
|
|||
|
|
í: "i",
|
|||
|
|
î: "i",
|
|||
|
|
ï: "i",
|
|||
|
|
ð: "d",
|
|||
|
|
ñ: "n",
|
|||
|
|
ò: "o",
|
|||
|
|
ó: "o",
|
|||
|
|
ô: "o",
|
|||
|
|
õ: "o",
|
|||
|
|
ö: "o",
|
|||
|
|
ő: "o",
|
|||
|
|
ø: "o",
|
|||
|
|
ù: "u",
|
|||
|
|
ú: "u",
|
|||
|
|
û: "u",
|
|||
|
|
ü: "u",
|
|||
|
|
ű: "u",
|
|||
|
|
ý: "y",
|
|||
|
|
þ: "th",
|
|||
|
|
ÿ: "y",
|
|||
|
|
};
|
|||
|
|
const LATIN_SYMBOLS_MAP = {
|
|||
|
|
"©": "(c)",
|
|||
|
|
};
|
|||
|
|
const GREEK_MAP = {
|
|||
|
|
α: "a",
|
|||
|
|
β: "b",
|
|||
|
|
γ: "g",
|
|||
|
|
δ: "d",
|
|||
|
|
ε: "e",
|
|||
|
|
ζ: "z",
|
|||
|
|
η: "h",
|
|||
|
|
θ: "8",
|
|||
|
|
ι: "i",
|
|||
|
|
κ: "k",
|
|||
|
|
λ: "l",
|
|||
|
|
μ: "m",
|
|||
|
|
ν: "n",
|
|||
|
|
ξ: "3",
|
|||
|
|
ο: "o",
|
|||
|
|
π: "p",
|
|||
|
|
ρ: "r",
|
|||
|
|
σ: "s",
|
|||
|
|
τ: "t",
|
|||
|
|
υ: "y",
|
|||
|
|
φ: "f",
|
|||
|
|
χ: "x",
|
|||
|
|
ψ: "ps",
|
|||
|
|
ω: "w",
|
|||
|
|
ά: "a",
|
|||
|
|
έ: "e",
|
|||
|
|
ί: "i",
|
|||
|
|
ό: "o",
|
|||
|
|
ύ: "y",
|
|||
|
|
ή: "h",
|
|||
|
|
ώ: "w",
|
|||
|
|
ς: "s",
|
|||
|
|
ϊ: "i",
|
|||
|
|
ΰ: "y",
|
|||
|
|
ϋ: "y",
|
|||
|
|
ΐ: "i",
|
|||
|
|
Α: "A",
|
|||
|
|
Β: "B",
|
|||
|
|
Γ: "G",
|
|||
|
|
Δ: "D",
|
|||
|
|
Ε: "E",
|
|||
|
|
Ζ: "Z",
|
|||
|
|
Η: "H",
|
|||
|
|
Θ: "8",
|
|||
|
|
Ι: "I",
|
|||
|
|
Κ: "K",
|
|||
|
|
Λ: "L",
|
|||
|
|
Μ: "M",
|
|||
|
|
Ν: "N",
|
|||
|
|
Ξ: "3",
|
|||
|
|
Ο: "O",
|
|||
|
|
Π: "P",
|
|||
|
|
Ρ: "R",
|
|||
|
|
Σ: "S",
|
|||
|
|
Τ: "T",
|
|||
|
|
Υ: "Y",
|
|||
|
|
Φ: "F",
|
|||
|
|
Χ: "X",
|
|||
|
|
Ψ: "PS",
|
|||
|
|
Ω: "W",
|
|||
|
|
Ά: "A",
|
|||
|
|
Έ: "E",
|
|||
|
|
Ί: "I",
|
|||
|
|
Ό: "O",
|
|||
|
|
Ύ: "Y",
|
|||
|
|
Ή: "H",
|
|||
|
|
Ώ: "W",
|
|||
|
|
Ϊ: "I",
|
|||
|
|
Ϋ: "Y",
|
|||
|
|
};
|
|||
|
|
const TURKISH_MAP = {
|
|||
|
|
ş: "s",
|
|||
|
|
Ş: "S",
|
|||
|
|
ı: "i",
|
|||
|
|
İ: "I",
|
|||
|
|
ç: "c",
|
|||
|
|
Ç: "C",
|
|||
|
|
ü: "u",
|
|||
|
|
Ü: "U",
|
|||
|
|
ö: "o",
|
|||
|
|
Ö: "O",
|
|||
|
|
ğ: "g",
|
|||
|
|
Ğ: "G",
|
|||
|
|
};
|
|||
|
|
const ROMANIAN_MAP = {
|
|||
|
|
ă: "a",
|
|||
|
|
î: "i",
|
|||
|
|
ș: "s",
|
|||
|
|
ț: "t",
|
|||
|
|
â: "a",
|
|||
|
|
Ă: "A",
|
|||
|
|
Î: "I",
|
|||
|
|
Ș: "S",
|
|||
|
|
Ț: "T",
|
|||
|
|
Â: "A",
|
|||
|
|
};
|
|||
|
|
const RUSSIAN_MAP = {
|
|||
|
|
а: "a",
|
|||
|
|
б: "b",
|
|||
|
|
в: "v",
|
|||
|
|
г: "g",
|
|||
|
|
д: "d",
|
|||
|
|
е: "e",
|
|||
|
|
ё: "yo",
|
|||
|
|
ж: "zh",
|
|||
|
|
з: "z",
|
|||
|
|
и: "i",
|
|||
|
|
й: "j",
|
|||
|
|
к: "k",
|
|||
|
|
л: "l",
|
|||
|
|
м: "m",
|
|||
|
|
н: "n",
|
|||
|
|
о: "o",
|
|||
|
|
п: "p",
|
|||
|
|
р: "r",
|
|||
|
|
с: "s",
|
|||
|
|
т: "t",
|
|||
|
|
у: "u",
|
|||
|
|
ф: "f",
|
|||
|
|
х: "h",
|
|||
|
|
ц: "c",
|
|||
|
|
ч: "ch",
|
|||
|
|
ш: "sh",
|
|||
|
|
щ: "sh",
|
|||
|
|
ъ: "",
|
|||
|
|
ы: "y",
|
|||
|
|
ь: "",
|
|||
|
|
э: "e",
|
|||
|
|
ю: "yu",
|
|||
|
|
я: "ya",
|
|||
|
|
А: "A",
|
|||
|
|
Б: "B",
|
|||
|
|
В: "V",
|
|||
|
|
Г: "G",
|
|||
|
|
Д: "D",
|
|||
|
|
Е: "E",
|
|||
|
|
Ё: "Yo",
|
|||
|
|
Ж: "Zh",
|
|||
|
|
З: "Z",
|
|||
|
|
И: "I",
|
|||
|
|
Й: "J",
|
|||
|
|
К: "K",
|
|||
|
|
Л: "L",
|
|||
|
|
М: "M",
|
|||
|
|
Н: "N",
|
|||
|
|
О: "O",
|
|||
|
|
П: "P",
|
|||
|
|
Р: "R",
|
|||
|
|
С: "S",
|
|||
|
|
Т: "T",
|
|||
|
|
У: "U",
|
|||
|
|
Ф: "F",
|
|||
|
|
Х: "H",
|
|||
|
|
Ц: "C",
|
|||
|
|
Ч: "Ch",
|
|||
|
|
Ш: "Sh",
|
|||
|
|
Щ: "Sh",
|
|||
|
|
Ъ: "",
|
|||
|
|
Ы: "Y",
|
|||
|
|
Ь: "",
|
|||
|
|
Э: "E",
|
|||
|
|
Ю: "Yu",
|
|||
|
|
Я: "Ya",
|
|||
|
|
};
|
|||
|
|
const UKRAINIAN_MAP = {
|
|||
|
|
Є: "Ye",
|
|||
|
|
І: "I",
|
|||
|
|
Ї: "Yi",
|
|||
|
|
Ґ: "G",
|
|||
|
|
є: "ye",
|
|||
|
|
і: "i",
|
|||
|
|
ї: "yi",
|
|||
|
|
ґ: "g",
|
|||
|
|
};
|
|||
|
|
const CZECH_MAP = {
|
|||
|
|
č: "c",
|
|||
|
|
ď: "d",
|
|||
|
|
ě: "e",
|
|||
|
|
ň: "n",
|
|||
|
|
ř: "r",
|
|||
|
|
š: "s",
|
|||
|
|
ť: "t",
|
|||
|
|
ů: "u",
|
|||
|
|
ž: "z",
|
|||
|
|
Č: "C",
|
|||
|
|
Ď: "D",
|
|||
|
|
Ě: "E",
|
|||
|
|
Ň: "N",
|
|||
|
|
Ř: "R",
|
|||
|
|
Š: "S",
|
|||
|
|
Ť: "T",
|
|||
|
|
Ů: "U",
|
|||
|
|
Ž: "Z",
|
|||
|
|
};
|
|||
|
|
const SLOVAK_MAP = {
|
|||
|
|
á: "a",
|
|||
|
|
ä: "a",
|
|||
|
|
č: "c",
|
|||
|
|
ď: "d",
|
|||
|
|
é: "e",
|
|||
|
|
í: "i",
|
|||
|
|
ľ: "l",
|
|||
|
|
ĺ: "l",
|
|||
|
|
ň: "n",
|
|||
|
|
ó: "o",
|
|||
|
|
ô: "o",
|
|||
|
|
ŕ: "r",
|
|||
|
|
š: "s",
|
|||
|
|
ť: "t",
|
|||
|
|
ú: "u",
|
|||
|
|
ý: "y",
|
|||
|
|
ž: "z",
|
|||
|
|
Á: "a",
|
|||
|
|
Ä: "A",
|
|||
|
|
Č: "C",
|
|||
|
|
Ď: "D",
|
|||
|
|
É: "E",
|
|||
|
|
Í: "I",
|
|||
|
|
Ľ: "L",
|
|||
|
|
Ĺ: "L",
|
|||
|
|
Ň: "N",
|
|||
|
|
Ó: "O",
|
|||
|
|
Ô: "O",
|
|||
|
|
Ŕ: "R",
|
|||
|
|
Š: "S",
|
|||
|
|
Ť: "T",
|
|||
|
|
Ú: "U",
|
|||
|
|
Ý: "Y",
|
|||
|
|
Ž: "Z",
|
|||
|
|
};
|
|||
|
|
const POLISH_MAP = {
|
|||
|
|
ą: "a",
|
|||
|
|
ć: "c",
|
|||
|
|
ę: "e",
|
|||
|
|
ł: "l",
|
|||
|
|
ń: "n",
|
|||
|
|
ó: "o",
|
|||
|
|
ś: "s",
|
|||
|
|
ź: "z",
|
|||
|
|
ż: "z",
|
|||
|
|
Ą: "A",
|
|||
|
|
Ć: "C",
|
|||
|
|
Ę: "E",
|
|||
|
|
Ł: "L",
|
|||
|
|
Ń: "N",
|
|||
|
|
Ó: "O",
|
|||
|
|
Ś: "S",
|
|||
|
|
Ź: "Z",
|
|||
|
|
Ż: "Z",
|
|||
|
|
};
|
|||
|
|
const LATVIAN_MAP = {
|
|||
|
|
ā: "a",
|
|||
|
|
č: "c",
|
|||
|
|
ē: "e",
|
|||
|
|
ģ: "g",
|
|||
|
|
ī: "i",
|
|||
|
|
ķ: "k",
|
|||
|
|
ļ: "l",
|
|||
|
|
ņ: "n",
|
|||
|
|
š: "s",
|
|||
|
|
ū: "u",
|
|||
|
|
ž: "z",
|
|||
|
|
Ā: "A",
|
|||
|
|
Č: "C",
|
|||
|
|
Ē: "E",
|
|||
|
|
Ģ: "G",
|
|||
|
|
Ī: "I",
|
|||
|
|
Ķ: "K",
|
|||
|
|
Ļ: "L",
|
|||
|
|
Ņ: "N",
|
|||
|
|
Š: "S",
|
|||
|
|
Ū: "U",
|
|||
|
|
Ž: "Z",
|
|||
|
|
};
|
|||
|
|
const ARABIC_MAP = {
|
|||
|
|
أ: "a",
|
|||
|
|
ب: "b",
|
|||
|
|
ت: "t",
|
|||
|
|
ث: "th",
|
|||
|
|
ج: "g",
|
|||
|
|
ح: "h",
|
|||
|
|
خ: "kh",
|
|||
|
|
د: "d",
|
|||
|
|
ذ: "th",
|
|||
|
|
ر: "r",
|
|||
|
|
ز: "z",
|
|||
|
|
س: "s",
|
|||
|
|
ش: "sh",
|
|||
|
|
ص: "s",
|
|||
|
|
ض: "d",
|
|||
|
|
ط: "t",
|
|||
|
|
ظ: "th",
|
|||
|
|
ع: "aa",
|
|||
|
|
غ: "gh",
|
|||
|
|
ف: "f",
|
|||
|
|
ق: "k",
|
|||
|
|
ك: "k",
|
|||
|
|
ل: "l",
|
|||
|
|
م: "m",
|
|||
|
|
ن: "n",
|
|||
|
|
ه: "h",
|
|||
|
|
و: "o",
|
|||
|
|
ي: "y",
|
|||
|
|
};
|
|||
|
|
const LITHUANIAN_MAP = {
|
|||
|
|
ą: "a",
|
|||
|
|
č: "c",
|
|||
|
|
ę: "e",
|
|||
|
|
ė: "e",
|
|||
|
|
į: "i",
|
|||
|
|
š: "s",
|
|||
|
|
ų: "u",
|
|||
|
|
ū: "u",
|
|||
|
|
ž: "z",
|
|||
|
|
Ą: "A",
|
|||
|
|
Č: "C",
|
|||
|
|
Ę: "E",
|
|||
|
|
Ė: "E",
|
|||
|
|
Į: "I",
|
|||
|
|
Š: "S",
|
|||
|
|
Ų: "U",
|
|||
|
|
Ū: "U",
|
|||
|
|
Ž: "Z",
|
|||
|
|
};
|
|||
|
|
const SERBIAN_MAP = {
|
|||
|
|
ђ: "dj",
|
|||
|
|
ј: "j",
|
|||
|
|
љ: "lj",
|
|||
|
|
њ: "nj",
|
|||
|
|
ћ: "c",
|
|||
|
|
џ: "dz",
|
|||
|
|
đ: "dj",
|
|||
|
|
Ђ: "Dj",
|
|||
|
|
Ј: "j",
|
|||
|
|
Љ: "Lj",
|
|||
|
|
Њ: "Nj",
|
|||
|
|
Ћ: "C",
|
|||
|
|
Џ: "Dz",
|
|||
|
|
Đ: "Dj",
|
|||
|
|
};
|
|||
|
|
const AZERBAIJANI_MAP = {
|
|||
|
|
ç: "c",
|
|||
|
|
ə: "e",
|
|||
|
|
ğ: "g",
|
|||
|
|
ı: "i",
|
|||
|
|
ö: "o",
|
|||
|
|
ş: "s",
|
|||
|
|
ü: "u",
|
|||
|
|
Ç: "C",
|
|||
|
|
Ə: "E",
|
|||
|
|
Ğ: "G",
|
|||
|
|
İ: "I",
|
|||
|
|
Ö: "O",
|
|||
|
|
Ş: "S",
|
|||
|
|
Ü: "U",
|
|||
|
|
};
|
|||
|
|
const GEORGIAN_MAP = {
|
|||
|
|
ა: "a",
|
|||
|
|
ბ: "b",
|
|||
|
|
გ: "g",
|
|||
|
|
დ: "d",
|
|||
|
|
ე: "e",
|
|||
|
|
ვ: "v",
|
|||
|
|
ზ: "z",
|
|||
|
|
თ: "t",
|
|||
|
|
ი: "i",
|
|||
|
|
კ: "k",
|
|||
|
|
ლ: "l",
|
|||
|
|
მ: "m",
|
|||
|
|
ნ: "n",
|
|||
|
|
ო: "o",
|
|||
|
|
პ: "p",
|
|||
|
|
ჟ: "j",
|
|||
|
|
რ: "r",
|
|||
|
|
ს: "s",
|
|||
|
|
ტ: "t",
|
|||
|
|
უ: "u",
|
|||
|
|
ფ: "f",
|
|||
|
|
ქ: "q",
|
|||
|
|
ღ: "g",
|
|||
|
|
ყ: "y",
|
|||
|
|
შ: "sh",
|
|||
|
|
ჩ: "ch",
|
|||
|
|
ც: "c",
|
|||
|
|
ძ: "dz",
|
|||
|
|
წ: "w",
|
|||
|
|
ჭ: "ch",
|
|||
|
|
ხ: "x",
|
|||
|
|
ჯ: "j",
|
|||
|
|
ჰ: "h",
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const ALL_DOWNCODE_MAPS = [
|
|||
|
|
LATIN_MAP,
|
|||
|
|
LATIN_SYMBOLS_MAP,
|
|||
|
|
GREEK_MAP,
|
|||
|
|
TURKISH_MAP,
|
|||
|
|
ROMANIAN_MAP,
|
|||
|
|
RUSSIAN_MAP,
|
|||
|
|
UKRAINIAN_MAP,
|
|||
|
|
CZECH_MAP,
|
|||
|
|
SLOVAK_MAP,
|
|||
|
|
POLISH_MAP,
|
|||
|
|
LATVIAN_MAP,
|
|||
|
|
ARABIC_MAP,
|
|||
|
|
LITHUANIAN_MAP,
|
|||
|
|
SERBIAN_MAP,
|
|||
|
|
AZERBAIJANI_MAP,
|
|||
|
|
GEORGIAN_MAP,
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
const Downcoder = {
|
|||
|
|
Initialize: function () {
|
|||
|
|
if (Downcoder.map) {
|
|||
|
|
// already made
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Downcoder.map = {};
|
|||
|
|
for (const lookup of ALL_DOWNCODE_MAPS) {
|
|||
|
|
Object.assign(Downcoder.map, lookup);
|
|||
|
|
}
|
|||
|
|
Downcoder.regex = new RegExp(
|
|||
|
|
Object.keys(Downcoder.map).join("|"),
|
|||
|
|
"g",
|
|||
|
|
);
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
function downcode(slug) {
|
|||
|
|
Downcoder.Initialize();
|
|||
|
|
return slug.replace(Downcoder.regex, function (m) {
|
|||
|
|
return Downcoder.map[m];
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function URLify(s, num_chars, allowUnicode) {
|
|||
|
|
// changes, e.g., "Petty theft" to "petty-theft"
|
|||
|
|
if (!allowUnicode) {
|
|||
|
|
s = downcode(s);
|
|||
|
|
}
|
|||
|
|
s = s.toLowerCase(); // convert to lowercase
|
|||
|
|
// if downcode doesn't hit, the char will be stripped here
|
|||
|
|
if (allowUnicode) {
|
|||
|
|
// Keep Unicode letters including both lowercase and uppercase
|
|||
|
|
// characters, whitespace, and dash; remove other characters.
|
|||
|
|
s = XRegExp.replace(s, XRegExp("[^-_\\p{L}\\p{N}\\s]", "g"), "");
|
|||
|
|
} else {
|
|||
|
|
s = s.replace(/[^-\w\s]/g, ""); // remove unneeded chars
|
|||
|
|
}
|
|||
|
|
s = s.replace(/^\s+|\s+$/g, ""); // trim leading/trailing spaces
|
|||
|
|
s = s.replace(/[-\s]+/g, "-"); // convert spaces to hyphens
|
|||
|
|
s = s.substring(0, num_chars); // trim to first num_chars chars
|
|||
|
|
return s.replace(/-+$/g, ""); // trim any trailing hyphens
|
|||
|
|
}
|
|||
|
|
window.URLify = URLify;
|
|||
|
|
}
|