documentverification/staticfiles/admin/js/urlify.js

533 lines
9.8 KiB
JavaScript
Raw Permalink Normal View History

/*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;
}