| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483 |
- (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 https://en.wikipedia.org/wiki/Romanization_of_Russian
- // ICAO
- 'а': 'a',
- 'б': 'b',
- 'в': 'v',
- 'г': 'g',
- 'д': 'd',
- 'е': 'e',
- 'ё': 'yo',
- 'ж': 'zh',
- 'з': 'z',
- 'и': 'i',
- 'й': 'i',
- 'к': 'k',
- 'л': 'l',
- 'м': 'm',
- 'н': 'n',
- 'о': 'o',
- 'п': 'p',
- 'р': 'r',
- 'с': 's',
- 'т': 't',
- 'у': 'u',
- 'ф': 'f',
- 'х': 'kh',
- 'ц': 'c',
- 'ч': 'ch',
- 'ш': 'sh',
- 'щ': 'sh',
- 'ъ': '',
- 'ы': 'y',
- 'ь': '',
- 'э': 'e',
- 'ю': 'yu',
- 'я': 'ya',
- 'А': 'A',
- 'Б': 'B',
- 'В': 'V',
- 'Г': 'G',
- 'Д': 'D',
- 'Е': 'E',
- 'Ё': 'Yo',
- 'Ж': 'Zh',
- 'З': 'Z',
- 'И': 'I',
- 'Й': 'I',
- 'К': 'K',
- 'Л': 'L',
- 'М': 'M',
- 'Н': 'N',
- 'О': 'O',
- 'П': 'P',
- 'Р': 'R',
- 'С': 'S',
- 'Т': 'T',
- 'У': 'U',
- 'Ф': 'F',
- 'Х': 'Kh',
- 'Ц': '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);
|