dragonroll/backend/node_modules/speakingurl/lib/speakingurl.js

1482 lines
38 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(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);