1482 lines
38 KiB
JavaScript
1482 lines
38 KiB
JavaScript
(function (root, undefined) {
|
||
'use strict';
|
||
|
||
/**
|
||
* getSlug
|
||
* @param {string} input input string
|
||
* @param {object|string} opts config object or separator string/char
|
||
* @api public
|
||
* @return {string} sluggified string
|
||
*/
|
||
var getSlug = function getSlug(input, opts) {
|
||
|
||
var separator = '-';
|
||
var uricChars = [';', '?', ':', '@', '&', '=', '+', '$', ',', '/'];
|
||
var uricNoSlashChars = [';', '?', ':', '@', '&', '=', '+', '$', ','];
|
||
var markChars = ['.', '!', '~', '*', '\'', '(', ')'];
|
||
var result = '';
|
||
var diatricString = '';
|
||
var convertSymbols = true;
|
||
var customReplacements = {};
|
||
var maintainCase;
|
||
var titleCase;
|
||
var truncate;
|
||
var uricFlag;
|
||
var uricNoSlashFlag;
|
||
var markFlag;
|
||
var symbol;
|
||
var langChar;
|
||
var lucky;
|
||
var i;
|
||
var ch;
|
||
var l;
|
||
var lastCharWasSymbol;
|
||
var lastCharWasDiatric;
|
||
var allowedChars;
|
||
|
||
/**
|
||
* charMap
|
||
* @type {Object}
|
||
*/
|
||
var charMap = {
|
||
|
||
// latin
|
||
'À': 'A',
|
||
'Á': 'A',
|
||
'Â': 'A',
|
||
'Ã': 'A',
|
||
'Ä': 'Ae',
|
||
'Å': 'A',
|
||
'Æ': 'AE',
|
||
'Ç': 'C',
|
||
'È': 'E',
|
||
'É': 'E',
|
||
'Ê': 'E',
|
||
'Ë': 'E',
|
||
'Ì': 'I',
|
||
'Í': 'I',
|
||
'Î': 'I',
|
||
'Ï': 'I',
|
||
'Ð': 'D',
|
||
'Ñ': 'N',
|
||
'Ò': 'O',
|
||
'Ó': 'O',
|
||
'Ô': 'O',
|
||
'Õ': 'O',
|
||
'Ö': 'Oe',
|
||
'Ő': 'O',
|
||
'Ø': 'O',
|
||
'Ù': 'U',
|
||
'Ú': 'U',
|
||
'Û': 'U',
|
||
'Ü': 'Ue',
|
||
'Ű': 'U',
|
||
'Ý': 'Y',
|
||
'Þ': 'TH',
|
||
'ß': 'ss',
|
||
'à': 'a',
|
||
'á': 'a',
|
||
'â': 'a',
|
||
'ã': 'a',
|
||
'ä': 'ae',
|
||
'å': 'a',
|
||
'æ': 'ae',
|
||
'ç': 'c',
|
||
'è': 'e',
|
||
'é': 'e',
|
||
'ê': 'e',
|
||
'ë': 'e',
|
||
'ì': 'i',
|
||
'í': 'i',
|
||
'î': 'i',
|
||
'ï': 'i',
|
||
'ð': 'd',
|
||
'ñ': 'n',
|
||
'ò': 'o',
|
||
'ó': 'o',
|
||
'ô': 'o',
|
||
'õ': 'o',
|
||
'ö': 'oe',
|
||
'ő': 'o',
|
||
'ø': 'o',
|
||
'ù': 'u',
|
||
'ú': 'u',
|
||
'û': 'u',
|
||
'ü': 'ue',
|
||
'ű': 'u',
|
||
'ý': 'y',
|
||
'þ': 'th',
|
||
'ÿ': 'y',
|
||
'ẞ': 'SS',
|
||
|
||
// language specific
|
||
|
||
// Arabic
|
||
'ا': 'a',
|
||
'أ': 'a',
|
||
'إ': 'i',
|
||
'آ': 'aa',
|
||
'ؤ': 'u',
|
||
'ئ': 'e',
|
||
'ء': 'a',
|
||
'ب': 'b',
|
||
'ت': 't',
|
||
'ث': 'th',
|
||
'ج': 'j',
|
||
'ح': 'h',
|
||
'خ': 'kh',
|
||
'د': 'd',
|
||
'ذ': 'th',
|
||
'ر': 'r',
|
||
'ز': 'z',
|
||
'س': 's',
|
||
'ش': 'sh',
|
||
'ص': 's',
|
||
'ض': 'dh',
|
||
'ط': 't',
|
||
'ظ': 'z',
|
||
'ع': 'a',
|
||
'غ': 'gh',
|
||
'ف': 'f',
|
||
'ق': 'q',
|
||
'ك': 'k',
|
||
'ل': 'l',
|
||
'م': 'm',
|
||
'ن': 'n',
|
||
'ه': 'h',
|
||
'و': 'w',
|
||
'ي': 'y',
|
||
'ى': 'a',
|
||
'ة': 'h',
|
||
'ﻻ': 'la',
|
||
'ﻷ': 'laa',
|
||
'ﻹ': 'lai',
|
||
'ﻵ': 'laa',
|
||
|
||
// Arabic diactrics
|
||
'َ': 'a',
|
||
'ً': 'an',
|
||
'ِ': 'e',
|
||
'ٍ': 'en',
|
||
'ُ': 'u',
|
||
'ٌ': 'on',
|
||
'ْ': '',
|
||
|
||
// Arabic numbers
|
||
'٠': '0',
|
||
'١': '1',
|
||
'٢': '2',
|
||
'٣': '3',
|
||
'٤': '4',
|
||
'٥': '5',
|
||
'٦': '6',
|
||
'٧': '7',
|
||
'٨': '8',
|
||
'٩': '9',
|
||
|
||
// Burmese consonants
|
||
'က': 'k',
|
||
'ခ': 'kh',
|
||
'ဂ': 'g',
|
||
'ဃ': 'ga',
|
||
'င': 'ng',
|
||
'စ': 's',
|
||
'ဆ': 'sa',
|
||
'ဇ': 'z',
|
||
'စျ': 'za',
|
||
'ည': 'ny',
|
||
'ဋ': 't',
|
||
'ဌ': 'ta',
|
||
'ဍ': 'd',
|
||
'ဎ': 'da',
|
||
'ဏ': 'na',
|
||
'တ': 't',
|
||
'ထ': 'ta',
|
||
'ဒ': 'd',
|
||
'ဓ': 'da',
|
||
'န': 'n',
|
||
'ပ': 'p',
|
||
'ဖ': 'pa',
|
||
'ဗ': 'b',
|
||
'ဘ': 'ba',
|
||
'မ': 'm',
|
||
'ယ': 'y',
|
||
'ရ': 'ya',
|
||
'လ': 'l',
|
||
'ဝ': 'w',
|
||
'သ': 'th',
|
||
'ဟ': 'h',
|
||
'ဠ': 'la',
|
||
'အ': 'a',
|
||
// consonant character combos
|
||
'ြ': 'y',
|
||
'ျ': 'ya',
|
||
'ွ': 'w',
|
||
'ြွ': 'yw',
|
||
'ျွ': 'ywa',
|
||
'ှ': 'h',
|
||
// independent vowels
|
||
'ဧ': 'e',
|
||
'၏': '-e',
|
||
'ဣ': 'i',
|
||
'ဤ': '-i',
|
||
'ဉ': 'u',
|
||
'ဦ': '-u',
|
||
'ဩ': 'aw',
|
||
'သြော': 'aw',
|
||
'ဪ': 'aw',
|
||
// numbers
|
||
'၀': '0',
|
||
'၁': '1',
|
||
'၂': '2',
|
||
'၃': '3',
|
||
'၄': '4',
|
||
'၅': '5',
|
||
'၆': '6',
|
||
'၇': '7',
|
||
'၈': '8',
|
||
'၉': '9',
|
||
// virama and tone marks which are silent in transliteration
|
||
'္': '',
|
||
'့': '',
|
||
'း': '',
|
||
|
||
// Czech
|
||
'č': 'c',
|
||
'ď': 'd',
|
||
'ě': 'e',
|
||
'ň': 'n',
|
||
'ř': 'r',
|
||
'š': 's',
|
||
'ť': 't',
|
||
'ů': 'u',
|
||
'ž': 'z',
|
||
'Č': 'C',
|
||
'Ď': 'D',
|
||
'Ě': 'E',
|
||
'Ň': 'N',
|
||
'Ř': 'R',
|
||
'Š': 'S',
|
||
'Ť': 'T',
|
||
'Ů': 'U',
|
||
'Ž': 'Z',
|
||
|
||
// Dhivehi
|
||
'ހ': 'h',
|
||
'ށ': 'sh',
|
||
'ނ': 'n',
|
||
'ރ': 'r',
|
||
'ބ': 'b',
|
||
'ޅ': 'lh',
|
||
'ކ': 'k',
|
||
'އ': 'a',
|
||
'ވ': 'v',
|
||
'މ': 'm',
|
||
'ފ': 'f',
|
||
'ދ': 'dh',
|
||
'ތ': 'th',
|
||
'ލ': 'l',
|
||
'ގ': 'g',
|
||
'ޏ': 'gn',
|
||
'ސ': 's',
|
||
'ޑ': 'd',
|
||
'ޒ': 'z',
|
||
'ޓ': 't',
|
||
'ޔ': 'y',
|
||
'ޕ': 'p',
|
||
'ޖ': 'j',
|
||
'ޗ': 'ch',
|
||
'ޘ': 'tt',
|
||
'ޙ': 'hh',
|
||
'ޚ': 'kh',
|
||
'ޛ': 'th',
|
||
'ޜ': 'z',
|
||
'ޝ': 'sh',
|
||
'ޞ': 's',
|
||
'ޟ': 'd',
|
||
'ޠ': 't',
|
||
'ޡ': 'z',
|
||
'ޢ': 'a',
|
||
'ޣ': 'gh',
|
||
'ޤ': 'q',
|
||
'ޥ': 'w',
|
||
'ަ': 'a',
|
||
'ާ': 'aa',
|
||
'ި': 'i',
|
||
'ީ': 'ee',
|
||
'ު': 'u',
|
||
'ޫ': 'oo',
|
||
'ެ': 'e',
|
||
'ޭ': 'ey',
|
||
'ޮ': 'o',
|
||
'ޯ': 'oa',
|
||
'ް': '',
|
||
|
||
// Greek
|
||
'α': 'a',
|
||
'β': 'v',
|
||
'γ': 'g',
|
||
'δ': 'd',
|
||
'ε': 'e',
|
||
'ζ': 'z',
|
||
'η': 'i',
|
||
'θ': 'th',
|
||
'ι': 'i',
|
||
'κ': 'k',
|
||
'λ': 'l',
|
||
'μ': 'm',
|
||
'ν': 'n',
|
||
'ξ': 'ks',
|
||
'ο': 'o',
|
||
'π': 'p',
|
||
'ρ': 'r',
|
||
'σ': 's',
|
||
'τ': 't',
|
||
'υ': 'y',
|
||
'φ': 'f',
|
||
'χ': 'x',
|
||
'ψ': 'ps',
|
||
'ω': 'o',
|
||
'ά': 'a',
|
||
'έ': 'e',
|
||
'ί': 'i',
|
||
'ό': 'o',
|
||
'ύ': 'y',
|
||
'ή': 'i',
|
||
'ώ': 'o',
|
||
'ς': 's',
|
||
'ϊ': 'i',
|
||
'ΰ': 'y',
|
||
'ϋ': 'y',
|
||
'ΐ': 'i',
|
||
'Α': 'A',
|
||
'Β': 'B',
|
||
'Γ': 'G',
|
||
'Δ': 'D',
|
||
'Ε': 'E',
|
||
'Ζ': 'Z',
|
||
'Η': 'I',
|
||
'Θ': 'TH',
|
||
'Ι': 'I',
|
||
'Κ': 'K',
|
||
'Λ': 'L',
|
||
'Μ': 'M',
|
||
'Ν': 'N',
|
||
'Ξ': 'KS',
|
||
'Ο': 'O',
|
||
'Π': 'P',
|
||
'Ρ': 'R',
|
||
'Σ': 'S',
|
||
'Τ': 'T',
|
||
'Υ': 'Y',
|
||
'Φ': 'F',
|
||
'Χ': 'X',
|
||
'Ψ': 'PS',
|
||
'Ω': 'W',
|
||
'Ά': 'A',
|
||
'Έ': 'E',
|
||
'Ί': 'I',
|
||
'Ό': 'O',
|
||
'Ύ': 'Y',
|
||
'Ή': 'I',
|
||
'Ώ': 'O',
|
||
'Ϊ': 'I',
|
||
'Ϋ': 'Y',
|
||
|
||
// Latvian
|
||
'ā': 'a',
|
||
// 'č': 'c', // duplicate
|
||
'ē': 'e',
|
||
'ģ': 'g',
|
||
'ī': 'i',
|
||
'ķ': 'k',
|
||
'ļ': 'l',
|
||
'ņ': 'n',
|
||
// 'š': 's', // duplicate
|
||
'ū': 'u',
|
||
// 'ž': 'z', // duplicate
|
||
'Ā': 'A',
|
||
// 'Č': 'C', // duplicate
|
||
'Ē': 'E',
|
||
'Ģ': 'G',
|
||
'Ī': 'I',
|
||
'Ķ': 'k',
|
||
'Ļ': 'L',
|
||
'Ņ': 'N',
|
||
// 'Š': 'S', // duplicate
|
||
'Ū': 'U',
|
||
// 'Ž': 'Z', // duplicate
|
||
|
||
// Macedonian
|
||
'Ќ': 'Kj',
|
||
'ќ': 'kj',
|
||
'Љ': 'Lj',
|
||
'љ': 'lj',
|
||
'Њ': 'Nj',
|
||
'њ': 'nj',
|
||
'Тс': 'Ts',
|
||
'тс': 'ts',
|
||
|
||
// Polish
|
||
'ą': 'a',
|
||
'ć': 'c',
|
||
'ę': 'e',
|
||
'ł': 'l',
|
||
'ń': 'n',
|
||
// 'ó': 'o', // duplicate
|
||
'ś': 's',
|
||
'ź': 'z',
|
||
'ż': 'z',
|
||
'Ą': 'A',
|
||
'Ć': 'C',
|
||
'Ę': 'E',
|
||
'Ł': 'L',
|
||
'Ń': 'N',
|
||
'Ś': 'S',
|
||
'Ź': 'Z',
|
||
'Ż': 'Z',
|
||
|
||
// Ukranian
|
||
'Є': 'Ye',
|
||
'І': 'I',
|
||
'Ї': 'Yi',
|
||
'Ґ': 'G',
|
||
'є': 'ye',
|
||
'і': 'i',
|
||
'ї': 'yi',
|
||
'ґ': 'g',
|
||
|
||
// Romanian
|
||
'ă': 'a',
|
||
'Ă': 'A',
|
||
'ș': 's',
|
||
'Ș': 'S',
|
||
// 'ş': 's', // duplicate
|
||
// 'Ş': 'S', // duplicate
|
||
'ț': 't',
|
||
'Ț': 'T',
|
||
'ţ': 't',
|
||
'Ţ': 'T',
|
||
|
||
// Russian
|
||
'а': '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',
|
||
|
||
// Serbian
|
||
'ђ': 'dj',
|
||
'ј': 'j',
|
||
// 'љ': 'lj', // duplicate
|
||
// 'њ': 'nj', // duplicate
|
||
'ћ': 'c',
|
||
'џ': 'dz',
|
||
'Ђ': 'Dj',
|
||
'Ј': 'j',
|
||
// 'Љ': 'Lj', // duplicate
|
||
// 'Њ': 'Nj', // duplicate
|
||
'Ћ': 'C',
|
||
'Џ': 'Dz',
|
||
|
||
// Slovak
|
||
'ľ': 'l',
|
||
'ĺ': 'l',
|
||
'ŕ': 'r',
|
||
'Ľ': 'L',
|
||
'Ĺ': 'L',
|
||
'Ŕ': 'R',
|
||
|
||
// Turkish
|
||
'ş': 's',
|
||
'Ş': 'S',
|
||
'ı': 'i',
|
||
'İ': 'I',
|
||
// 'ç': 'c', // duplicate
|
||
// 'Ç': 'C', // duplicate
|
||
// 'ü': 'u', // duplicate, see langCharMap
|
||
// 'Ü': 'U', // duplicate, see langCharMap
|
||
// 'ö': 'o', // duplicate, see langCharMap
|
||
// 'Ö': 'O', // duplicate, see langCharMap
|
||
'ğ': 'g',
|
||
'Ğ': 'G',
|
||
|
||
// Vietnamese
|
||
'ả': 'a',
|
||
'Ả': 'A',
|
||
'ẳ': 'a',
|
||
'Ẳ': 'A',
|
||
'ẩ': 'a',
|
||
'Ẩ': 'A',
|
||
'đ': 'd',
|
||
'Đ': 'D',
|
||
'ẹ': 'e',
|
||
'Ẹ': 'E',
|
||
'ẽ': 'e',
|
||
'Ẽ': 'E',
|
||
'ẻ': 'e',
|
||
'Ẻ': 'E',
|
||
'ế': 'e',
|
||
'Ế': 'E',
|
||
'ề': 'e',
|
||
'Ề': 'E',
|
||
'ệ': 'e',
|
||
'Ệ': 'E',
|
||
'ễ': 'e',
|
||
'Ễ': 'E',
|
||
'ể': 'e',
|
||
'Ể': 'E',
|
||
'ọ': 'o',
|
||
'Ọ': 'o',
|
||
'ố': 'o',
|
||
'Ố': 'O',
|
||
'ồ': 'o',
|
||
'Ồ': 'O',
|
||
'ổ': 'o',
|
||
'Ổ': 'O',
|
||
'ộ': 'o',
|
||
'Ộ': 'O',
|
||
'ỗ': 'o',
|
||
'Ỗ': 'O',
|
||
'ơ': 'o',
|
||
'Ơ': 'O',
|
||
'ớ': 'o',
|
||
'Ớ': 'O',
|
||
'ờ': 'o',
|
||
'Ờ': 'O',
|
||
'ợ': 'o',
|
||
'Ợ': 'O',
|
||
'ỡ': 'o',
|
||
'Ỡ': 'O',
|
||
'Ở': 'o',
|
||
'ở': 'o',
|
||
'ị': 'i',
|
||
'Ị': 'I',
|
||
'ĩ': 'i',
|
||
'Ĩ': 'I',
|
||
'ỉ': 'i',
|
||
'Ỉ': 'i',
|
||
'ủ': 'u',
|
||
'Ủ': 'U',
|
||
'ụ': 'u',
|
||
'Ụ': 'U',
|
||
'ũ': 'u',
|
||
'Ũ': 'U',
|
||
'ư': 'u',
|
||
'Ư': 'U',
|
||
'ứ': 'u',
|
||
'Ứ': 'U',
|
||
'ừ': 'u',
|
||
'Ừ': 'U',
|
||
'ự': 'u',
|
||
'Ự': 'U',
|
||
'ữ': 'u',
|
||
'Ữ': 'U',
|
||
'ử': 'u',
|
||
'Ử': 'ư',
|
||
'ỷ': 'y',
|
||
'Ỷ': 'y',
|
||
'ỳ': 'y',
|
||
'Ỳ': 'Y',
|
||
'ỵ': 'y',
|
||
'Ỵ': 'Y',
|
||
'ỹ': 'y',
|
||
'Ỹ': 'Y',
|
||
'ạ': 'a',
|
||
'Ạ': 'A',
|
||
'ấ': 'a',
|
||
'Ấ': 'A',
|
||
'ầ': 'a',
|
||
'Ầ': 'A',
|
||
'ậ': 'a',
|
||
'Ậ': 'A',
|
||
'ẫ': 'a',
|
||
'Ẫ': 'A',
|
||
// 'ă': 'a', // duplicate
|
||
// 'Ă': 'A', // duplicate
|
||
'ắ': 'a',
|
||
'Ắ': 'A',
|
||
'ằ': 'a',
|
||
'Ằ': 'A',
|
||
'ặ': 'a',
|
||
'Ặ': 'A',
|
||
'ẵ': 'a',
|
||
'Ẵ': 'A',
|
||
|
||
// symbols
|
||
'“': '"',
|
||
'”': '"',
|
||
'‘': '\'',
|
||
'’': '\'',
|
||
'∂': 'd',
|
||
'ƒ': 'f',
|
||
'™': '(TM)',
|
||
'©': '(C)',
|
||
'œ': 'oe',
|
||
'Œ': 'OE',
|
||
'®': '(R)',
|
||
'†': '+',
|
||
'℠': '(SM)',
|
||
'…': '...',
|
||
'˚': 'o',
|
||
'º': 'o',
|
||
'ª': 'a',
|
||
'•': '*',
|
||
'၊': ',',
|
||
'။': '.',
|
||
|
||
// currency
|
||
'$': 'USD',
|
||
'€': 'EUR',
|
||
'₢': 'BRN',
|
||
'₣': 'FRF',
|
||
'£': 'GBP',
|
||
'₤': 'ITL',
|
||
'₦': 'NGN',
|
||
'₧': 'ESP',
|
||
'₩': 'KRW',
|
||
'₪': 'ILS',
|
||
'₫': 'VND',
|
||
'₭': 'LAK',
|
||
'₮': 'MNT',
|
||
'₯': 'GRD',
|
||
'₱': 'ARS',
|
||
'₲': 'PYG',
|
||
'₳': 'ARA',
|
||
'₴': 'UAH',
|
||
'₵': 'GHS',
|
||
'¢': 'cent',
|
||
'¥': 'CNY',
|
||
'元': 'CNY',
|
||
'円': 'YEN',
|
||
'﷼': 'IRR',
|
||
'₠': 'EWE',
|
||
'฿': 'THB',
|
||
'₨': 'INR',
|
||
'₹': 'INR',
|
||
'₰': 'PF'
|
||
|
||
};
|
||
|
||
/**
|
||
* special look ahead character array
|
||
* These characters form with consonants to become 'single'/consonant combo
|
||
* @type [Array]
|
||
*/
|
||
var lookAheadCharArray = [
|
||
// burmese
|
||
'်',
|
||
|
||
// Dhivehi
|
||
'ް'
|
||
];
|
||
|
||
/**
|
||
* diatricMap for languages where transliteration changes entirely as more diatrics are added
|
||
* @type {Object}
|
||
*/
|
||
var diatricMap = {
|
||
// Burmese
|
||
// dependent vowels
|
||
'ာ': 'a',
|
||
'ါ': 'a',
|
||
'ေ': 'e',
|
||
'ဲ': 'e',
|
||
'ိ': 'i',
|
||
'ီ': 'i',
|
||
'ို': 'o',
|
||
'ု': 'u',
|
||
'ူ': 'u',
|
||
'ေါင်': 'aung',
|
||
'ော': 'aw',
|
||
'ော်': 'aw',
|
||
'ေါ': 'aw',
|
||
'ေါ်': 'aw',
|
||
'်': '်', // this is special case but the character will be converted to latin in the code
|
||
'က်': 'et',
|
||
'ိုက်': 'aik',
|
||
'ောက်': 'auk',
|
||
'င်': 'in',
|
||
'ိုင်': 'aing',
|
||
'ောင်': 'aung',
|
||
'စ်': 'it',
|
||
'ည်': 'i',
|
||
'တ်': 'at',
|
||
'ိတ်': 'eik',
|
||
'ုတ်': 'ok',
|
||
'ွတ်': 'ut',
|
||
'ေတ်': 'it',
|
||
'ဒ်': 'd',
|
||
'ိုဒ်': 'ok',
|
||
'ုဒ်': 'ait',
|
||
'န်': 'an',
|
||
'ာန်': 'an',
|
||
'ိန်': 'ein',
|
||
'ုန်': 'on',
|
||
'ွန်': 'un',
|
||
'ပ်': 'at',
|
||
'ိပ်': 'eik',
|
||
'ုပ်': 'ok',
|
||
'ွပ်': 'ut',
|
||
'န်ုပ်': 'nub',
|
||
'မ်': 'an',
|
||
'ိမ်': 'ein',
|
||
'ုမ်': 'on',
|
||
'ွမ်': 'un',
|
||
'ယ်': 'e',
|
||
'ိုလ်': 'ol',
|
||
'ဉ်': 'in',
|
||
'ံ': 'an',
|
||
'ိံ': 'ein',
|
||
'ုံ': 'on',
|
||
|
||
// Dhivehi
|
||
'ައް': 'ah',
|
||
'ަށް': 'ah',
|
||
};
|
||
|
||
/**
|
||
* langCharMap language specific characters translations
|
||
* @type {Object}
|
||
*/
|
||
var langCharMap = {
|
||
|
||
'en': {}, // default language
|
||
|
||
'az': { // Azerbaijani
|
||
'ç': 'c',
|
||
'ə': 'e',
|
||
'ğ': 'g',
|
||
'ı': 'i',
|
||
'ö': 'o',
|
||
'ş': 's',
|
||
'ü': 'u',
|
||
'Ç': 'C',
|
||
'Ə': 'E',
|
||
'Ğ': 'G',
|
||
'İ': 'I',
|
||
'Ö': 'O',
|
||
'Ş': 'S',
|
||
'Ü': 'U'
|
||
},
|
||
|
||
'cs': { // Czech
|
||
'č': 'c',
|
||
'ď': 'd',
|
||
'ě': 'e',
|
||
'ň': 'n',
|
||
'ř': 'r',
|
||
'š': 's',
|
||
'ť': 't',
|
||
'ů': 'u',
|
||
'ž': 'z',
|
||
'Č': 'C',
|
||
'Ď': 'D',
|
||
'Ě': 'E',
|
||
'Ň': 'N',
|
||
'Ř': 'R',
|
||
'Š': 'S',
|
||
'Ť': 'T',
|
||
'Ů': 'U',
|
||
'Ž': 'Z'
|
||
},
|
||
|
||
'fi': { // Finnish
|
||
// 'å': 'a', duplicate see charMap/latin
|
||
// 'Å': 'A', duplicate see charMap/latin
|
||
'ä': 'a', // ok
|
||
'Ä': 'A', // ok
|
||
'ö': 'o', // ok
|
||
'Ö': 'O' // ok
|
||
},
|
||
|
||
'hu': { // Hungarian
|
||
'ä': 'a', // ok
|
||
'Ä': 'A', // ok
|
||
// 'á': 'a', duplicate see charMap/latin
|
||
// 'Á': 'A', duplicate see charMap/latin
|
||
'ö': 'o', // ok
|
||
'Ö': 'O', // ok
|
||
// 'ő': 'o', duplicate see charMap/latin
|
||
// 'Ő': 'O', duplicate see charMap/latin
|
||
'ü': 'u',
|
||
'Ü': 'U',
|
||
'ű': 'u',
|
||
'Ű': 'U'
|
||
},
|
||
|
||
'lt': { // Lithuanian
|
||
'ą': 'a',
|
||
'č': 'c',
|
||
'ę': 'e',
|
||
'ė': 'e',
|
||
'į': 'i',
|
||
'š': 's',
|
||
'ų': 'u',
|
||
'ū': 'u',
|
||
'ž': 'z',
|
||
'Ą': 'A',
|
||
'Č': 'C',
|
||
'Ę': 'E',
|
||
'Ė': 'E',
|
||
'Į': 'I',
|
||
'Š': 'S',
|
||
'Ų': 'U',
|
||
'Ū': 'U'
|
||
},
|
||
|
||
'lv': { // Latvian
|
||
'ā': 'a',
|
||
'č': 'c',
|
||
'ē': 'e',
|
||
'ģ': 'g',
|
||
'ī': 'i',
|
||
'ķ': 'k',
|
||
'ļ': 'l',
|
||
'ņ': 'n',
|
||
'š': 's',
|
||
'ū': 'u',
|
||
'ž': 'z',
|
||
'Ā': 'A',
|
||
'Č': 'C',
|
||
'Ē': 'E',
|
||
'Ģ': 'G',
|
||
'Ī': 'i',
|
||
'Ķ': 'k',
|
||
'Ļ': 'L',
|
||
'Ņ': 'N',
|
||
'Š': 'S',
|
||
'Ū': 'u',
|
||
'Ž': 'Z'
|
||
},
|
||
|
||
'pl': { // Polish
|
||
'ą': 'a',
|
||
'ć': 'c',
|
||
'ę': 'e',
|
||
'ł': 'l',
|
||
'ń': 'n',
|
||
'ó': 'o',
|
||
'ś': 's',
|
||
'ź': 'z',
|
||
'ż': 'z',
|
||
'Ą': 'A',
|
||
'Ć': 'C',
|
||
'Ę': 'e',
|
||
'Ł': 'L',
|
||
'Ń': 'N',
|
||
'Ó': 'O',
|
||
'Ś': 'S',
|
||
'Ź': 'Z',
|
||
'Ż': 'Z'
|
||
},
|
||
|
||
'sk': { // Slovak
|
||
'ä': 'a',
|
||
'Ä': 'A'
|
||
},
|
||
|
||
'sr': { // Serbian
|
||
'љ': 'lj',
|
||
'њ': 'nj',
|
||
'Љ': 'Lj',
|
||
'Њ': 'Nj',
|
||
'đ': 'dj',
|
||
'Đ': 'Dj'
|
||
},
|
||
|
||
'tr': { // Turkish
|
||
'Ü': 'U',
|
||
'Ö': 'O',
|
||
'ü': 'u',
|
||
'ö': 'o'
|
||
}
|
||
};
|
||
|
||
/**
|
||
* symbolMap language specific symbol translations
|
||
* translations must be transliterated already
|
||
* @type {Object}
|
||
*/
|
||
var symbolMap = {
|
||
|
||
'ar': {
|
||
'∆': 'delta',
|
||
'∞': 'la-nihaya',
|
||
'♥': 'hob',
|
||
'&': 'wa',
|
||
'|': 'aw',
|
||
'<': 'aqal-men',
|
||
'>': 'akbar-men',
|
||
'∑': 'majmou',
|
||
'¤': 'omla'
|
||
},
|
||
|
||
'az': {},
|
||
|
||
'ca': {
|
||
'∆': 'delta',
|
||
'∞': 'infinit',
|
||
'♥': 'amor',
|
||
'&': 'i',
|
||
'|': 'o',
|
||
'<': 'menys que',
|
||
'>': 'mes que',
|
||
'∑': 'suma dels',
|
||
'¤': 'moneda'
|
||
},
|
||
|
||
'cz': {
|
||
'∆': 'delta',
|
||
'∞': 'nekonecno',
|
||
'♥': 'laska',
|
||
'&': 'a',
|
||
'|': 'nebo',
|
||
'<': 'mene jako',
|
||
'>': 'vice jako',
|
||
'∑': 'soucet',
|
||
'¤': 'mena'
|
||
},
|
||
|
||
'de': {
|
||
'∆': 'delta',
|
||
'∞': 'unendlich',
|
||
'♥': 'Liebe',
|
||
'&': 'und',
|
||
'|': 'oder',
|
||
'<': 'kleiner als',
|
||
'>': 'groesser als',
|
||
'∑': 'Summe von',
|
||
'¤': 'Waehrung'
|
||
},
|
||
|
||
'dv': {
|
||
'∆': 'delta',
|
||
'∞': 'kolunulaa',
|
||
'♥': 'loabi',
|
||
'&': 'aai',
|
||
'|': 'noonee',
|
||
'<': 'ah vure kuda',
|
||
'>': 'ah vure bodu',
|
||
'∑': 'jumula',
|
||
'¤': 'faisaa'
|
||
},
|
||
|
||
'en': {
|
||
'∆': 'delta',
|
||
'∞': 'infinity',
|
||
'♥': 'love',
|
||
'&': 'and',
|
||
'|': 'or',
|
||
'<': 'less than',
|
||
'>': 'greater than',
|
||
'∑': 'sum',
|
||
'¤': 'currency'
|
||
},
|
||
|
||
'es': {
|
||
'∆': 'delta',
|
||
'∞': 'infinito',
|
||
'♥': 'amor',
|
||
'&': 'y',
|
||
'|': 'u',
|
||
'<': 'menos que',
|
||
'>': 'mas que',
|
||
'∑': 'suma de los',
|
||
'¤': 'moneda'
|
||
},
|
||
|
||
'fr': {
|
||
'∆': 'delta',
|
||
'∞': 'infiniment',
|
||
'♥': 'Amour',
|
||
'&': 'et',
|
||
'|': 'ou',
|
||
'<': 'moins que',
|
||
'>': 'superieure a',
|
||
'∑': 'somme des',
|
||
'¤': 'monnaie'
|
||
},
|
||
|
||
'gr': {},
|
||
|
||
'hu': {
|
||
'∆': 'delta',
|
||
'∞': 'vegtelen',
|
||
'♥': 'szerelem',
|
||
'&': 'es',
|
||
'|': 'vagy',
|
||
'<': 'kisebb mint',
|
||
'>': 'nagyobb mint',
|
||
'∑': 'szumma',
|
||
'¤': 'penznem'
|
||
},
|
||
|
||
'it': {
|
||
'∆': 'delta',
|
||
'∞': 'infinito',
|
||
'♥': 'amore',
|
||
'&': 'e',
|
||
'|': 'o',
|
||
'<': 'minore di',
|
||
'>': 'maggiore di',
|
||
'∑': 'somma',
|
||
'¤': 'moneta'
|
||
},
|
||
|
||
'lt': {},
|
||
|
||
'lv': {
|
||
'∆': 'delta',
|
||
'∞': 'bezgaliba',
|
||
'♥': 'milestiba',
|
||
'&': 'un',
|
||
'|': 'vai',
|
||
'<': 'mazak neka',
|
||
'>': 'lielaks neka',
|
||
'∑': 'summa',
|
||
'¤': 'valuta'
|
||
},
|
||
|
||
'my': {
|
||
'∆': 'kwahkhyaet',
|
||
'∞': 'asaonasme',
|
||
'♥': 'akhyait',
|
||
'&': 'nhin',
|
||
'|': 'tho',
|
||
'<': 'ngethaw',
|
||
'>': 'kyithaw',
|
||
'∑': 'paungld',
|
||
'¤': 'ngwekye'
|
||
},
|
||
|
||
'mk': {},
|
||
|
||
'nl': {
|
||
'∆': 'delta',
|
||
'∞': 'oneindig',
|
||
'♥': 'liefde',
|
||
'&': 'en',
|
||
'|': 'of',
|
||
'<': 'kleiner dan',
|
||
'>': 'groter dan',
|
||
'∑': 'som',
|
||
'¤': 'valuta'
|
||
},
|
||
|
||
'pl': {
|
||
'∆': 'delta',
|
||
'∞': 'nieskonczonosc',
|
||
'♥': 'milosc',
|
||
'&': 'i',
|
||
'|': 'lub',
|
||
'<': 'mniejsze niz',
|
||
'>': 'wieksze niz',
|
||
'∑': 'suma',
|
||
'¤': 'waluta'
|
||
},
|
||
|
||
'pt': {
|
||
'∆': 'delta',
|
||
'∞': 'infinito',
|
||
'♥': 'amor',
|
||
'&': 'e',
|
||
'|': 'ou',
|
||
'<': 'menor que',
|
||
'>': 'maior que',
|
||
'∑': 'soma',
|
||
'¤': 'moeda'
|
||
},
|
||
|
||
'ro': {
|
||
'∆': 'delta',
|
||
'∞': 'infinit',
|
||
'♥': 'dragoste',
|
||
'&': 'si',
|
||
'|': 'sau',
|
||
'<': 'mai mic ca',
|
||
'>': 'mai mare ca',
|
||
'∑': 'suma',
|
||
'¤': 'valuta'
|
||
},
|
||
|
||
'ru': {
|
||
'∆': 'delta',
|
||
'∞': 'beskonechno',
|
||
'♥': 'lubov',
|
||
'&': 'i',
|
||
'|': 'ili',
|
||
'<': 'menshe',
|
||
'>': 'bolshe',
|
||
'∑': 'summa',
|
||
'¤': 'valjuta'
|
||
},
|
||
|
||
'sk': {
|
||
'∆': 'delta',
|
||
'∞': 'nekonecno',
|
||
'♥': 'laska',
|
||
'&': 'a',
|
||
'|': 'alebo',
|
||
'<': 'menej ako',
|
||
'>': 'viac ako',
|
||
'∑': 'sucet',
|
||
'¤': 'mena'
|
||
},
|
||
|
||
'sr': {},
|
||
|
||
'tr': {
|
||
'∆': 'delta',
|
||
'∞': 'sonsuzluk',
|
||
'♥': 'ask',
|
||
'&': 've',
|
||
'|': 'veya',
|
||
'<': 'kucuktur',
|
||
'>': 'buyuktur',
|
||
'∑': 'toplam',
|
||
'¤': 'para birimi'
|
||
},
|
||
|
||
'uk': {
|
||
'∆': 'delta',
|
||
'∞': 'bezkinechnist',
|
||
'♥': 'lubov',
|
||
'&': 'i',
|
||
'|': 'abo',
|
||
'<': 'menshe',
|
||
'>': 'bilshe',
|
||
'∑': 'suma',
|
||
'¤': 'valjuta'
|
||
},
|
||
|
||
'vn': {
|
||
'∆': 'delta',
|
||
'∞': 'vo cuc',
|
||
'♥': 'yeu',
|
||
'&': 'va',
|
||
'|': 'hoac',
|
||
'<': 'nho hon',
|
||
'>': 'lon hon',
|
||
'∑': 'tong',
|
||
'¤': 'tien te'
|
||
}
|
||
};
|
||
|
||
if (typeof input !== 'string') {
|
||
return '';
|
||
}
|
||
|
||
if (typeof opts === 'string') {
|
||
separator = opts;
|
||
}
|
||
|
||
symbol = symbolMap.en;
|
||
langChar = langCharMap.en;
|
||
|
||
if (typeof opts === 'object') {
|
||
|
||
maintainCase = opts.maintainCase || false;
|
||
customReplacements = (opts.custom && typeof opts.custom === 'object') ? opts.custom : customReplacements;
|
||
truncate = (+opts.truncate > 1 && opts.truncate) || false;
|
||
uricFlag = opts.uric || false;
|
||
uricNoSlashFlag = opts.uricNoSlash || false;
|
||
markFlag = opts.mark || false;
|
||
convertSymbols = (opts.symbols === false || opts.lang === false) ? false : true;
|
||
separator = opts.separator || separator;
|
||
|
||
if (uricFlag) {
|
||
allowedChars += uricChars.join('');
|
||
}
|
||
|
||
if (uricNoSlashFlag) {
|
||
allowedChars += uricNoSlashChars.join('');
|
||
}
|
||
|
||
if (markFlag) {
|
||
allowedChars += markChars.join('');
|
||
}
|
||
|
||
symbol = (opts.lang && symbolMap[opts.lang] && convertSymbols) ?
|
||
symbolMap[opts.lang] : (convertSymbols ? symbolMap.en : {});
|
||
|
||
langChar = (opts.lang && langCharMap[opts.lang]) ?
|
||
langCharMap[opts.lang] :
|
||
opts.lang === false || opts.lang === true ? {} : langCharMap.en;
|
||
|
||
// if titleCase config is an Array, rewrite to object format
|
||
if (opts.titleCase && typeof opts.titleCase.length === "number" && Array.prototype.toString.call(opts.titleCase)) {
|
||
|
||
opts.titleCase.forEach(function (v) {
|
||
customReplacements[v + ""] = v + "";
|
||
});
|
||
|
||
titleCase = true;
|
||
} else {
|
||
titleCase = !!opts.titleCase;
|
||
}
|
||
|
||
// if custom config is an Array, rewrite to object format
|
||
if (opts.custom && typeof opts.custom.length === "number" && Array.prototype.toString.call(opts.custom)) {
|
||
|
||
opts.custom.forEach(function (v) {
|
||
customReplacements[v + ""] = v + "";
|
||
});
|
||
}
|
||
|
||
// custom replacements
|
||
Object.keys(customReplacements).forEach(function (v) {
|
||
|
||
var r;
|
||
|
||
if (v.length > 1) {
|
||
r = new RegExp('\\b' + escapeChars(v) + '\\b', 'gi');
|
||
} else {
|
||
r = new RegExp(escapeChars(v), 'gi');
|
||
}
|
||
|
||
input = input.replace(r, customReplacements[v]);
|
||
});
|
||
|
||
// add all custom replacement to allowed charlist
|
||
for (ch in customReplacements) {
|
||
allowedChars += ch;
|
||
}
|
||
|
||
}
|
||
|
||
allowedChars += separator;
|
||
|
||
if (titleCase) {
|
||
|
||
input = input.replace(/(\w)(\S*)/g, function (_, i, r) {
|
||
var j = i.toUpperCase() + (r !== null ? r : "");
|
||
return (Object.keys(customReplacements).indexOf(j.toLowerCase()) < 0) ? j : j.toLowerCase();
|
||
});
|
||
}
|
||
|
||
// escape all necessary chars
|
||
allowedChars = escapeChars(allowedChars);
|
||
|
||
// trim whitespaces
|
||
input = input.replace(/(^\s+|\s+$)/g, '');
|
||
|
||
lastCharWasSymbol = false;
|
||
lastCharWasDiatric = false;
|
||
|
||
for (i = 0, l = input.length; i < l; i++) {
|
||
|
||
ch = input[i];
|
||
|
||
if (isReplacedCustomChar(ch, customReplacements)) {
|
||
// don't convert a already converted char
|
||
lastCharWasSymbol = false;
|
||
} else if (langChar[ch]) {
|
||
// process language specific diactrics chars conversion
|
||
ch = lastCharWasSymbol && langChar[ch].match(/[A-Za-z0-9]/) ? ' ' + langChar[ch] : langChar[ch];
|
||
|
||
lastCharWasSymbol = false;
|
||
} else if (ch in charMap) {
|
||
// the transliteration changes entirely when some special characters are added
|
||
if (i + 1 < l && lookAheadCharArray.indexOf(input[i + 1]) >= 0) {
|
||
diatricString += ch;
|
||
ch = '';
|
||
} else if (lastCharWasDiatric === true) {
|
||
ch = diatricMap[diatricString] + charMap[ch];
|
||
diatricString = '';
|
||
} else {
|
||
// process diactrics chars
|
||
ch = lastCharWasSymbol && charMap[ch].match(/[A-Za-z0-9]/) ? ' ' + charMap[ch] : charMap[ch];
|
||
}
|
||
|
||
lastCharWasSymbol = false;
|
||
lastCharWasDiatric = false;
|
||
} else
|
||
if (ch in diatricMap) {
|
||
diatricString += ch;
|
||
ch = '';
|
||
// end of string, put the whole meaningful word
|
||
if (i === l - 1) {
|
||
ch = diatricMap[diatricString];
|
||
}
|
||
lastCharWasDiatric = true;
|
||
} else if (
|
||
// process symbol chars
|
||
symbol[ch] && !(uricFlag && uricChars.join('')
|
||
.indexOf(ch) !== -1) && !(uricNoSlashFlag && uricNoSlashChars.join('')
|
||
//.indexOf(ch) !== -1) && !(markFlag && markChars.join('')
|
||
.indexOf(ch) !== -1)) {
|
||
|
||
ch = lastCharWasSymbol || result.substr(-1).match(/[A-Za-z0-9]/) ? separator + symbol[ch] : symbol[ch];
|
||
ch += input[i + 1] !== void 0 && input[i + 1].match(/[A-Za-z0-9]/) ? separator : '';
|
||
|
||
lastCharWasSymbol = true;
|
||
} else {
|
||
if (lastCharWasDiatric === true) {
|
||
ch = diatricMap[diatricString] + ch;
|
||
diatricString = '';
|
||
lastCharWasDiatric = false;
|
||
} else if (lastCharWasSymbol && (/[A-Za-z0-9]/.test(ch) || result.substr(-1).match(/A-Za-z0-9]/))) {
|
||
// process latin chars
|
||
ch = ' ' + ch;
|
||
}
|
||
lastCharWasSymbol = false;
|
||
}
|
||
|
||
// add allowed chars
|
||
result += ch.replace(new RegExp('[^\\w\\s' + allowedChars + '_-]', 'g'), separator);
|
||
}
|
||
|
||
// eliminate duplicate separators
|
||
// add separator
|
||
// trim separators from start and end
|
||
result = result.replace(/\s+/g, separator)
|
||
.replace(new RegExp('\\' + separator + '+', 'g'), separator)
|
||
.replace(new RegExp('(^\\' + separator + '+|\\' + separator + '+$)', 'g'), '');
|
||
|
||
if (truncate && result.length > truncate) {
|
||
|
||
lucky = result.charAt(truncate) === separator;
|
||
result = result.slice(0, truncate);
|
||
|
||
if (!lucky) {
|
||
result = result.slice(0, result.lastIndexOf(separator));
|
||
}
|
||
}
|
||
|
||
if (!maintainCase && !titleCase) {
|
||
result = result.toLowerCase();
|
||
}
|
||
|
||
return result;
|
||
};
|
||
|
||
/**
|
||
* createSlug curried(opts)(input)
|
||
* @param {object|string} opts config object or input string
|
||
* @return {Function} function getSlugWithConfig()
|
||
**/
|
||
var createSlug = function createSlug(opts) {
|
||
|
||
/**
|
||
* getSlugWithConfig
|
||
* @param {string} input string
|
||
* @return {string} slug string
|
||
*/
|
||
return function getSlugWithConfig(input) {
|
||
return getSlug(input, opts);
|
||
};
|
||
};
|
||
|
||
/**
|
||
* escape Chars
|
||
* @param {string} input string
|
||
*/
|
||
var escapeChars = function escapeChars(input) {
|
||
|
||
return input.replace(/[-\\^$*+?.()|[\]{}\/]/g, '\\$&');
|
||
};
|
||
|
||
/**
|
||
* check if the char is an already converted char from custom list
|
||
* @param {char} ch character to check
|
||
* @param {object} customReplacements custom translation map
|
||
*/
|
||
var isReplacedCustomChar = function (ch, customReplacements) {
|
||
|
||
for (var c in customReplacements) {
|
||
if (customReplacements[c] === ch) {
|
||
return true;
|
||
}
|
||
}
|
||
};
|
||
|
||
if (typeof module !== 'undefined' && module.exports) {
|
||
|
||
// export functions for use in Node
|
||
module.exports = getSlug;
|
||
module.exports.createSlug = createSlug;
|
||
|
||
} else if (typeof define !== 'undefined' && define.amd) {
|
||
|
||
// export function for use in AMD
|
||
define([], function () {
|
||
return getSlug;
|
||
});
|
||
|
||
} else {
|
||
|
||
// don't overwrite global if exists
|
||
try {
|
||
if (root.getSlug || root.createSlug) {
|
||
throw 'speakingurl: globals exists /(getSlug|createSlug)/';
|
||
} else {
|
||
root.getSlug = getSlug;
|
||
root.createSlug = createSlug;
|
||
}
|
||
} catch (e) {}
|
||
|
||
}
|
||
})(this);
|