speakingurl.js 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483
  1. (function (root, undefined) {
  2. 'use strict';
  3. /**
  4. * getSlug
  5. * @param {string} input input string
  6. * @param {object|string} opts config object or separator string/char
  7. * @api public
  8. * @return {string} sluggified string
  9. */
  10. var getSlug = function getSlug(input, opts) {
  11. var separator = '-';
  12. var uricChars = [';', '?', ':', '@', '&', '=', '+', '$', ',', '/'];
  13. var uricNoSlashChars = [';', '?', ':', '@', '&', '=', '+', '$', ','];
  14. var markChars = ['.', '!', '~', '*', '\'', '(', ')'];
  15. var result = '';
  16. var diatricString = '';
  17. var convertSymbols = true;
  18. var customReplacements = {};
  19. var maintainCase;
  20. var titleCase;
  21. var truncate;
  22. var uricFlag;
  23. var uricNoSlashFlag;
  24. var markFlag;
  25. var symbol;
  26. var langChar;
  27. var lucky;
  28. var i;
  29. var ch;
  30. var l;
  31. var lastCharWasSymbol;
  32. var lastCharWasDiatric;
  33. var allowedChars;
  34. /**
  35. * charMap
  36. * @type {Object}
  37. */
  38. var charMap = {
  39. // latin
  40. 'À': 'A',
  41. 'Á': 'A',
  42. 'Â': 'A',
  43. 'Ã': 'A',
  44. 'Ä': 'Ae',
  45. 'Å': 'A',
  46. 'Æ': 'AE',
  47. 'Ç': 'C',
  48. 'È': 'E',
  49. 'É': 'E',
  50. 'Ê': 'E',
  51. 'Ë': 'E',
  52. 'Ì': 'I',
  53. 'Í': 'I',
  54. 'Î': 'I',
  55. 'Ï': 'I',
  56. 'Ð': 'D',
  57. 'Ñ': 'N',
  58. 'Ò': 'O',
  59. 'Ó': 'O',
  60. 'Ô': 'O',
  61. 'Õ': 'O',
  62. 'Ö': 'Oe',
  63. 'Ő': 'O',
  64. 'Ø': 'O',
  65. 'Ù': 'U',
  66. 'Ú': 'U',
  67. 'Û': 'U',
  68. 'Ü': 'Ue',
  69. 'Ű': 'U',
  70. 'Ý': 'Y',
  71. 'Þ': 'TH',
  72. 'ß': 'ss',
  73. 'à': 'a',
  74. 'á': 'a',
  75. 'â': 'a',
  76. 'ã': 'a',
  77. 'ä': 'ae',
  78. 'å': 'a',
  79. 'æ': 'ae',
  80. 'ç': 'c',
  81. 'è': 'e',
  82. 'é': 'e',
  83. 'ê': 'e',
  84. 'ë': 'e',
  85. 'ì': 'i',
  86. 'í': 'i',
  87. 'î': 'i',
  88. 'ï': 'i',
  89. 'ð': 'd',
  90. 'ñ': 'n',
  91. 'ò': 'o',
  92. 'ó': 'o',
  93. 'ô': 'o',
  94. 'õ': 'o',
  95. 'ö': 'oe',
  96. 'ő': 'o',
  97. 'ø': 'o',
  98. 'ù': 'u',
  99. 'ú': 'u',
  100. 'û': 'u',
  101. 'ü': 'ue',
  102. 'ű': 'u',
  103. 'ý': 'y',
  104. 'þ': 'th',
  105. 'ÿ': 'y',
  106. 'ẞ': 'SS',
  107. // language specific
  108. // Arabic
  109. 'ا': 'a',
  110. 'أ': 'a',
  111. 'إ': 'i',
  112. 'آ': 'aa',
  113. 'ؤ': 'u',
  114. 'ئ': 'e',
  115. 'ء': 'a',
  116. 'ب': 'b',
  117. 'ت': 't',
  118. 'ث': 'th',
  119. 'ج': 'j',
  120. 'ح': 'h',
  121. 'خ': 'kh',
  122. 'د': 'd',
  123. 'ذ': 'th',
  124. 'ر': 'r',
  125. 'ز': 'z',
  126. 'س': 's',
  127. 'ش': 'sh',
  128. 'ص': 's',
  129. 'ض': 'dh',
  130. 'ط': 't',
  131. 'ظ': 'z',
  132. 'ع': 'a',
  133. 'غ': 'gh',
  134. 'ف': 'f',
  135. 'ق': 'q',
  136. 'ك': 'k',
  137. 'ل': 'l',
  138. 'م': 'm',
  139. 'ن': 'n',
  140. 'ه': 'h',
  141. 'و': 'w',
  142. 'ي': 'y',
  143. 'ى': 'a',
  144. 'ة': 'h',
  145. 'ﻻ': 'la',
  146. 'ﻷ': 'laa',
  147. 'ﻹ': 'lai',
  148. 'ﻵ': 'laa',
  149. // Arabic diactrics
  150. 'َ': 'a',
  151. 'ً': 'an',
  152. 'ِ': 'e',
  153. 'ٍ': 'en',
  154. 'ُ': 'u',
  155. 'ٌ': 'on',
  156. 'ْ': '',
  157. // Arabic numbers
  158. '٠': '0',
  159. '١': '1',
  160. '٢': '2',
  161. '٣': '3',
  162. '٤': '4',
  163. '٥': '5',
  164. '٦': '6',
  165. '٧': '7',
  166. '٨': '8',
  167. '٩': '9',
  168. // Burmese consonants
  169. 'က': 'k',
  170. 'ခ': 'kh',
  171. 'ဂ': 'g',
  172. 'ဃ': 'ga',
  173. 'င': 'ng',
  174. 'စ': 's',
  175. 'ဆ': 'sa',
  176. 'ဇ': 'z',
  177. 'စျ': 'za',
  178. 'ည': 'ny',
  179. 'ဋ': 't',
  180. 'ဌ': 'ta',
  181. 'ဍ': 'd',
  182. 'ဎ': 'da',
  183. 'ဏ': 'na',
  184. 'တ': 't',
  185. 'ထ': 'ta',
  186. 'ဒ': 'd',
  187. 'ဓ': 'da',
  188. 'န': 'n',
  189. 'ပ': 'p',
  190. 'ဖ': 'pa',
  191. 'ဗ': 'b',
  192. 'ဘ': 'ba',
  193. 'မ': 'm',
  194. 'ယ': 'y',
  195. 'ရ': 'ya',
  196. 'လ': 'l',
  197. 'ဝ': 'w',
  198. 'သ': 'th',
  199. 'ဟ': 'h',
  200. 'ဠ': 'la',
  201. 'အ': 'a',
  202. // consonant character combos
  203. 'ြ': 'y',
  204. 'ျ': 'ya',
  205. 'ွ': 'w',
  206. 'ြွ': 'yw',
  207. 'ျွ': 'ywa',
  208. 'ှ': 'h',
  209. // independent vowels
  210. 'ဧ': 'e',
  211. '၏': '-e',
  212. 'ဣ': 'i',
  213. 'ဤ': '-i',
  214. 'ဉ': 'u',
  215. 'ဦ': '-u',
  216. 'ဩ': 'aw',
  217. 'သြော': 'aw',
  218. 'ဪ': 'aw',
  219. // numbers
  220. '၀': '0',
  221. '၁': '1',
  222. '၂': '2',
  223. '၃': '3',
  224. '၄': '4',
  225. '၅': '5',
  226. '၆': '6',
  227. '၇': '7',
  228. '၈': '8',
  229. '၉': '9',
  230. // virama and tone marks which are silent in transliteration
  231. '္': '',
  232. '့': '',
  233. 'း': '',
  234. // Czech
  235. 'č': 'c',
  236. 'ď': 'd',
  237. 'ě': 'e',
  238. 'ň': 'n',
  239. 'ř': 'r',
  240. 'š': 's',
  241. 'ť': 't',
  242. 'ů': 'u',
  243. 'ž': 'z',
  244. 'Č': 'C',
  245. 'Ď': 'D',
  246. 'Ě': 'E',
  247. 'Ň': 'N',
  248. 'Ř': 'R',
  249. 'Š': 'S',
  250. 'Ť': 'T',
  251. 'Ů': 'U',
  252. 'Ž': 'Z',
  253. // Dhivehi
  254. 'ހ': 'h',
  255. 'ށ': 'sh',
  256. 'ނ': 'n',
  257. 'ރ': 'r',
  258. 'ބ': 'b',
  259. 'ޅ': 'lh',
  260. 'ކ': 'k',
  261. 'އ': 'a',
  262. 'ވ': 'v',
  263. 'މ': 'm',
  264. 'ފ': 'f',
  265. 'ދ': 'dh',
  266. 'ތ': 'th',
  267. 'ލ': 'l',
  268. 'ގ': 'g',
  269. 'ޏ': 'gn',
  270. 'ސ': 's',
  271. 'ޑ': 'd',
  272. 'ޒ': 'z',
  273. 'ޓ': 't',
  274. 'ޔ': 'y',
  275. 'ޕ': 'p',
  276. 'ޖ': 'j',
  277. 'ޗ': 'ch',
  278. 'ޘ': 'tt',
  279. 'ޙ': 'hh',
  280. 'ޚ': 'kh',
  281. 'ޛ': 'th',
  282. 'ޜ': 'z',
  283. 'ޝ': 'sh',
  284. 'ޞ': 's',
  285. 'ޟ': 'd',
  286. 'ޠ': 't',
  287. 'ޡ': 'z',
  288. 'ޢ': 'a',
  289. 'ޣ': 'gh',
  290. 'ޤ': 'q',
  291. 'ޥ': 'w',
  292. 'ަ': 'a',
  293. 'ާ': 'aa',
  294. 'ި': 'i',
  295. 'ީ': 'ee',
  296. 'ު': 'u',
  297. 'ޫ': 'oo',
  298. 'ެ': 'e',
  299. 'ޭ': 'ey',
  300. 'ޮ': 'o',
  301. 'ޯ': 'oa',
  302. 'ް': '',
  303. // Greek
  304. 'α': 'a',
  305. 'β': 'v',
  306. 'γ': 'g',
  307. 'δ': 'd',
  308. 'ε': 'e',
  309. 'ζ': 'z',
  310. 'η': 'i',
  311. 'θ': 'th',
  312. 'ι': 'i',
  313. 'κ': 'k',
  314. 'λ': 'l',
  315. 'μ': 'm',
  316. 'ν': 'n',
  317. 'ξ': 'ks',
  318. 'ο': 'o',
  319. 'π': 'p',
  320. 'ρ': 'r',
  321. 'σ': 's',
  322. 'τ': 't',
  323. 'υ': 'y',
  324. 'φ': 'f',
  325. 'χ': 'x',
  326. 'ψ': 'ps',
  327. 'ω': 'o',
  328. 'ά': 'a',
  329. 'έ': 'e',
  330. 'ί': 'i',
  331. 'ό': 'o',
  332. 'ύ': 'y',
  333. 'ή': 'i',
  334. 'ώ': 'o',
  335. 'ς': 's',
  336. 'ϊ': 'i',
  337. 'ΰ': 'y',
  338. 'ϋ': 'y',
  339. 'ΐ': 'i',
  340. 'Α': 'A',
  341. 'Β': 'B',
  342. 'Γ': 'G',
  343. 'Δ': 'D',
  344. 'Ε': 'E',
  345. 'Ζ': 'Z',
  346. 'Η': 'I',
  347. 'Θ': 'TH',
  348. 'Ι': 'I',
  349. 'Κ': 'K',
  350. 'Λ': 'L',
  351. 'Μ': 'M',
  352. 'Ν': 'N',
  353. 'Ξ': 'KS',
  354. 'Ο': 'O',
  355. 'Π': 'P',
  356. 'Ρ': 'R',
  357. 'Σ': 'S',
  358. 'Τ': 'T',
  359. 'Υ': 'Y',
  360. 'Φ': 'F',
  361. 'Χ': 'X',
  362. 'Ψ': 'PS',
  363. 'Ω': 'W',
  364. 'Ά': 'A',
  365. 'Έ': 'E',
  366. 'Ί': 'I',
  367. 'Ό': 'O',
  368. 'Ύ': 'Y',
  369. 'Ή': 'I',
  370. 'Ώ': 'O',
  371. 'Ϊ': 'I',
  372. 'Ϋ': 'Y',
  373. // Latvian
  374. 'ā': 'a',
  375. // 'č': 'c', // duplicate
  376. 'ē': 'e',
  377. 'ģ': 'g',
  378. 'ī': 'i',
  379. 'ķ': 'k',
  380. 'ļ': 'l',
  381. 'ņ': 'n',
  382. // 'š': 's', // duplicate
  383. 'ū': 'u',
  384. // 'ž': 'z', // duplicate
  385. 'Ā': 'A',
  386. // 'Č': 'C', // duplicate
  387. 'Ē': 'E',
  388. 'Ģ': 'G',
  389. 'Ī': 'I',
  390. 'Ķ': 'k',
  391. 'Ļ': 'L',
  392. 'Ņ': 'N',
  393. // 'Š': 'S', // duplicate
  394. 'Ū': 'U',
  395. // 'Ž': 'Z', // duplicate
  396. // Macedonian
  397. 'Ќ': 'Kj',
  398. 'ќ': 'kj',
  399. 'Љ': 'Lj',
  400. 'љ': 'lj',
  401. 'Њ': 'Nj',
  402. 'њ': 'nj',
  403. 'Тс': 'Ts',
  404. 'тс': 'ts',
  405. // Polish
  406. 'ą': 'a',
  407. 'ć': 'c',
  408. 'ę': 'e',
  409. 'ł': 'l',
  410. 'ń': 'n',
  411. // 'ó': 'o', // duplicate
  412. 'ś': 's',
  413. 'ź': 'z',
  414. 'ż': 'z',
  415. 'Ą': 'A',
  416. 'Ć': 'C',
  417. 'Ę': 'E',
  418. 'Ł': 'L',
  419. 'Ń': 'N',
  420. 'Ś': 'S',
  421. 'Ź': 'Z',
  422. 'Ż': 'Z',
  423. // Ukranian
  424. 'Є': 'Ye',
  425. 'І': 'I',
  426. 'Ї': 'Yi',
  427. 'Ґ': 'G',
  428. 'є': 'ye',
  429. 'і': 'i',
  430. 'ї': 'yi',
  431. 'ґ': 'g',
  432. // Romanian
  433. 'ă': 'a',
  434. 'Ă': 'A',
  435. 'ș': 's',
  436. 'Ș': 'S',
  437. // 'ş': 's', // duplicate
  438. // 'Ş': 'S', // duplicate
  439. 'ț': 't',
  440. 'Ț': 'T',
  441. 'ţ': 't',
  442. 'Ţ': 'T',
  443. // Russian https://en.wikipedia.org/wiki/Romanization_of_Russian
  444. // ICAO
  445. 'а': 'a',
  446. 'б': 'b',
  447. 'в': 'v',
  448. 'г': 'g',
  449. 'д': 'd',
  450. 'е': 'e',
  451. 'ё': 'yo',
  452. 'ж': 'zh',
  453. 'з': 'z',
  454. 'и': 'i',
  455. 'й': 'i',
  456. 'к': 'k',
  457. 'л': 'l',
  458. 'м': 'm',
  459. 'н': 'n',
  460. 'о': 'o',
  461. 'п': 'p',
  462. 'р': 'r',
  463. 'с': 's',
  464. 'т': 't',
  465. 'у': 'u',
  466. 'ф': 'f',
  467. 'х': 'kh',
  468. 'ц': 'c',
  469. 'ч': 'ch',
  470. 'ш': 'sh',
  471. 'щ': 'sh',
  472. 'ъ': '',
  473. 'ы': 'y',
  474. 'ь': '',
  475. 'э': 'e',
  476. 'ю': 'yu',
  477. 'я': 'ya',
  478. 'А': 'A',
  479. 'Б': 'B',
  480. 'В': 'V',
  481. 'Г': 'G',
  482. 'Д': 'D',
  483. 'Е': 'E',
  484. 'Ё': 'Yo',
  485. 'Ж': 'Zh',
  486. 'З': 'Z',
  487. 'И': 'I',
  488. 'Й': 'I',
  489. 'К': 'K',
  490. 'Л': 'L',
  491. 'М': 'M',
  492. 'Н': 'N',
  493. 'О': 'O',
  494. 'П': 'P',
  495. 'Р': 'R',
  496. 'С': 'S',
  497. 'Т': 'T',
  498. 'У': 'U',
  499. 'Ф': 'F',
  500. 'Х': 'Kh',
  501. 'Ц': 'C',
  502. 'Ч': 'Ch',
  503. 'Ш': 'Sh',
  504. 'Щ': 'Sh',
  505. 'Ъ': '',
  506. 'Ы': 'Y',
  507. 'Ь': '',
  508. 'Э': 'E',
  509. 'Ю': 'Yu',
  510. 'Я': 'Ya',
  511. // Serbian
  512. 'ђ': 'dj',
  513. 'ј': 'j',
  514. // 'љ': 'lj', // duplicate
  515. // 'њ': 'nj', // duplicate
  516. 'ћ': 'c',
  517. 'џ': 'dz',
  518. 'Ђ': 'Dj',
  519. 'Ј': 'j',
  520. // 'Љ': 'Lj', // duplicate
  521. // 'Њ': 'Nj', // duplicate
  522. 'Ћ': 'C',
  523. 'Џ': 'Dz',
  524. // Slovak
  525. 'ľ': 'l',
  526. 'ĺ': 'l',
  527. 'ŕ': 'r',
  528. 'Ľ': 'L',
  529. 'Ĺ': 'L',
  530. 'Ŕ': 'R',
  531. // Turkish
  532. 'ş': 's',
  533. 'Ş': 'S',
  534. 'ı': 'i',
  535. 'İ': 'I',
  536. // 'ç': 'c', // duplicate
  537. // 'Ç': 'C', // duplicate
  538. // 'ü': 'u', // duplicate, see langCharMap
  539. // 'Ü': 'U', // duplicate, see langCharMap
  540. // 'ö': 'o', // duplicate, see langCharMap
  541. // 'Ö': 'O', // duplicate, see langCharMap
  542. 'ğ': 'g',
  543. 'Ğ': 'G',
  544. // Vietnamese
  545. 'ả': 'a',
  546. 'Ả': 'A',
  547. 'ẳ': 'a',
  548. 'Ẳ': 'A',
  549. 'ẩ': 'a',
  550. 'Ẩ': 'A',
  551. 'đ': 'd',
  552. 'Đ': 'D',
  553. 'ẹ': 'e',
  554. 'Ẹ': 'E',
  555. 'ẽ': 'e',
  556. 'Ẽ': 'E',
  557. 'ẻ': 'e',
  558. 'Ẻ': 'E',
  559. 'ế': 'e',
  560. 'Ế': 'E',
  561. 'ề': 'e',
  562. 'Ề': 'E',
  563. 'ệ': 'e',
  564. 'Ệ': 'E',
  565. 'ễ': 'e',
  566. 'Ễ': 'E',
  567. 'ể': 'e',
  568. 'Ể': 'E',
  569. 'ọ': 'o',
  570. 'Ọ': 'o',
  571. 'ố': 'o',
  572. 'Ố': 'O',
  573. 'ồ': 'o',
  574. 'Ồ': 'O',
  575. 'ổ': 'o',
  576. 'Ổ': 'O',
  577. 'ộ': 'o',
  578. 'Ộ': 'O',
  579. 'ỗ': 'o',
  580. 'Ỗ': 'O',
  581. 'ơ': 'o',
  582. 'Ơ': 'O',
  583. 'ớ': 'o',
  584. 'Ớ': 'O',
  585. 'ờ': 'o',
  586. 'Ờ': 'O',
  587. 'ợ': 'o',
  588. 'Ợ': 'O',
  589. 'ỡ': 'o',
  590. 'Ỡ': 'O',
  591. 'Ở': 'o',
  592. 'ở': 'o',
  593. 'ị': 'i',
  594. 'Ị': 'I',
  595. 'ĩ': 'i',
  596. 'Ĩ': 'I',
  597. 'ỉ': 'i',
  598. 'Ỉ': 'i',
  599. 'ủ': 'u',
  600. 'Ủ': 'U',
  601. 'ụ': 'u',
  602. 'Ụ': 'U',
  603. 'ũ': 'u',
  604. 'Ũ': 'U',
  605. 'ư': 'u',
  606. 'Ư': 'U',
  607. 'ứ': 'u',
  608. 'Ứ': 'U',
  609. 'ừ': 'u',
  610. 'Ừ': 'U',
  611. 'ự': 'u',
  612. 'Ự': 'U',
  613. 'ữ': 'u',
  614. 'Ữ': 'U',
  615. 'ử': 'u',
  616. 'Ử': 'ư',
  617. 'ỷ': 'y',
  618. 'Ỷ': 'y',
  619. 'ỳ': 'y',
  620. 'Ỳ': 'Y',
  621. 'ỵ': 'y',
  622. 'Ỵ': 'Y',
  623. 'ỹ': 'y',
  624. 'Ỹ': 'Y',
  625. 'ạ': 'a',
  626. 'Ạ': 'A',
  627. 'ấ': 'a',
  628. 'Ấ': 'A',
  629. 'ầ': 'a',
  630. 'Ầ': 'A',
  631. 'ậ': 'a',
  632. 'Ậ': 'A',
  633. 'ẫ': 'a',
  634. 'Ẫ': 'A',
  635. // 'ă': 'a', // duplicate
  636. // 'Ă': 'A', // duplicate
  637. 'ắ': 'a',
  638. 'Ắ': 'A',
  639. 'ằ': 'a',
  640. 'Ằ': 'A',
  641. 'ặ': 'a',
  642. 'Ặ': 'A',
  643. 'ẵ': 'a',
  644. 'Ẵ': 'A',
  645. // symbols
  646. '“': '"',
  647. '”': '"',
  648. '‘': '\'',
  649. '’': '\'',
  650. '∂': 'd',
  651. 'ƒ': 'f',
  652. '™': '(TM)',
  653. '©': '(C)',
  654. 'œ': 'oe',
  655. 'Œ': 'OE',
  656. '®': '(R)',
  657. '†': '+',
  658. '℠': '(SM)',
  659. '…': '...',
  660. '˚': 'o',
  661. 'º': 'o',
  662. 'ª': 'a',
  663. '•': '*',
  664. '၊': ',',
  665. '။': '.',
  666. // currency
  667. '$': 'USD',
  668. '€': 'EUR',
  669. '₢': 'BRN',
  670. '₣': 'FRF',
  671. '£': 'GBP',
  672. '₤': 'ITL',
  673. '₦': 'NGN',
  674. '₧': 'ESP',
  675. '₩': 'KRW',
  676. '₪': 'ILS',
  677. '₫': 'VND',
  678. '₭': 'LAK',
  679. '₮': 'MNT',
  680. '₯': 'GRD',
  681. '₱': 'ARS',
  682. '₲': 'PYG',
  683. '₳': 'ARA',
  684. '₴': 'UAH',
  685. '₵': 'GHS',
  686. '¢': 'cent',
  687. '¥': 'CNY',
  688. '元': 'CNY',
  689. '円': 'YEN',
  690. '﷼': 'IRR',
  691. '₠': 'EWE',
  692. '฿': 'THB',
  693. '₨': 'INR',
  694. '₹': 'INR',
  695. '₰': 'PF'
  696. };
  697. /**
  698. * special look ahead character array
  699. * These characters form with consonants to become 'single'/consonant combo
  700. * @type [Array]
  701. */
  702. var lookAheadCharArray = [
  703. // burmese
  704. '်',
  705. // Dhivehi
  706. 'ް'
  707. ];
  708. /**
  709. * diatricMap for languages where transliteration changes entirely as more diatrics are added
  710. * @type {Object}
  711. */
  712. var diatricMap = {
  713. // Burmese
  714. // dependent vowels
  715. 'ာ': 'a',
  716. 'ါ': 'a',
  717. 'ေ': 'e',
  718. 'ဲ': 'e',
  719. 'ိ': 'i',
  720. 'ီ': 'i',
  721. 'ို': 'o',
  722. 'ု': 'u',
  723. 'ူ': 'u',
  724. 'ေါင်': 'aung',
  725. 'ော': 'aw',
  726. 'ော်': 'aw',
  727. 'ေါ': 'aw',
  728. 'ေါ်': 'aw',
  729. '်': '်', // this is special case but the character will be converted to latin in the code
  730. 'က်': 'et',
  731. 'ိုက်': 'aik',
  732. 'ောက်': 'auk',
  733. 'င်': 'in',
  734. 'ိုင်': 'aing',
  735. 'ောင်': 'aung',
  736. 'စ်': 'it',
  737. 'ည်': 'i',
  738. 'တ်': 'at',
  739. 'ိတ်': 'eik',
  740. 'ုတ်': 'ok',
  741. 'ွတ်': 'ut',
  742. 'ေတ်': 'it',
  743. 'ဒ်': 'd',
  744. 'ိုဒ်': 'ok',
  745. 'ုဒ်': 'ait',
  746. 'န်': 'an',
  747. 'ာန်': 'an',
  748. 'ိန်': 'ein',
  749. 'ုန်': 'on',
  750. 'ွန်': 'un',
  751. 'ပ်': 'at',
  752. 'ိပ်': 'eik',
  753. 'ုပ်': 'ok',
  754. 'ွပ်': 'ut',
  755. 'န်ုပ်': 'nub',
  756. 'မ်': 'an',
  757. 'ိမ်': 'ein',
  758. 'ုမ်': 'on',
  759. 'ွမ်': 'un',
  760. 'ယ်': 'e',
  761. 'ိုလ်': 'ol',
  762. 'ဉ်': 'in',
  763. 'ံ': 'an',
  764. 'ိံ': 'ein',
  765. 'ုံ': 'on',
  766. // Dhivehi
  767. 'ައް': 'ah',
  768. 'ަށް': 'ah',
  769. };
  770. /**
  771. * langCharMap language specific characters translations
  772. * @type {Object}
  773. */
  774. var langCharMap = {
  775. 'en': {}, // default language
  776. 'az': { // Azerbaijani
  777. 'ç': 'c',
  778. 'ə': 'e',
  779. 'ğ': 'g',
  780. 'ı': 'i',
  781. 'ö': 'o',
  782. 'ş': 's',
  783. 'ü': 'u',
  784. 'Ç': 'C',
  785. 'Ə': 'E',
  786. 'Ğ': 'G',
  787. 'İ': 'I',
  788. 'Ö': 'O',
  789. 'Ş': 'S',
  790. 'Ü': 'U'
  791. },
  792. 'cs': { // Czech
  793. 'č': 'c',
  794. 'ď': 'd',
  795. 'ě': 'e',
  796. 'ň': 'n',
  797. 'ř': 'r',
  798. 'š': 's',
  799. 'ť': 't',
  800. 'ů': 'u',
  801. 'ž': 'z',
  802. 'Č': 'C',
  803. 'Ď': 'D',
  804. 'Ě': 'E',
  805. 'Ň': 'N',
  806. 'Ř': 'R',
  807. 'Š': 'S',
  808. 'Ť': 'T',
  809. 'Ů': 'U',
  810. 'Ž': 'Z'
  811. },
  812. 'fi': { // Finnish
  813. // 'å': 'a', duplicate see charMap/latin
  814. // 'Å': 'A', duplicate see charMap/latin
  815. 'ä': 'a', // ok
  816. 'Ä': 'A', // ok
  817. 'ö': 'o', // ok
  818. 'Ö': 'O' // ok
  819. },
  820. 'hu': { // Hungarian
  821. 'ä': 'a', // ok
  822. 'Ä': 'A', // ok
  823. // 'á': 'a', duplicate see charMap/latin
  824. // 'Á': 'A', duplicate see charMap/latin
  825. 'ö': 'o', // ok
  826. 'Ö': 'O', // ok
  827. // 'ő': 'o', duplicate see charMap/latin
  828. // 'Ő': 'O', duplicate see charMap/latin
  829. 'ü': 'u',
  830. 'Ü': 'U',
  831. 'ű': 'u',
  832. 'Ű': 'U'
  833. },
  834. 'lt': { // Lithuanian
  835. 'ą': 'a',
  836. 'č': 'c',
  837. 'ę': 'e',
  838. 'ė': 'e',
  839. 'į': 'i',
  840. 'š': 's',
  841. 'ų': 'u',
  842. 'ū': 'u',
  843. 'ž': 'z',
  844. 'Ą': 'A',
  845. 'Č': 'C',
  846. 'Ę': 'E',
  847. 'Ė': 'E',
  848. 'Į': 'I',
  849. 'Š': 'S',
  850. 'Ų': 'U',
  851. 'Ū': 'U'
  852. },
  853. 'lv': { // Latvian
  854. 'ā': 'a',
  855. 'č': 'c',
  856. 'ē': 'e',
  857. 'ģ': 'g',
  858. 'ī': 'i',
  859. 'ķ': 'k',
  860. 'ļ': 'l',
  861. 'ņ': 'n',
  862. 'š': 's',
  863. 'ū': 'u',
  864. 'ž': 'z',
  865. 'Ā': 'A',
  866. 'Č': 'C',
  867. 'Ē': 'E',
  868. 'Ģ': 'G',
  869. 'Ī': 'i',
  870. 'Ķ': 'k',
  871. 'Ļ': 'L',
  872. 'Ņ': 'N',
  873. 'Š': 'S',
  874. 'Ū': 'u',
  875. 'Ž': 'Z'
  876. },
  877. 'pl': { // Polish
  878. 'ą': 'a',
  879. 'ć': 'c',
  880. 'ę': 'e',
  881. 'ł': 'l',
  882. 'ń': 'n',
  883. 'ó': 'o',
  884. 'ś': 's',
  885. 'ź': 'z',
  886. 'ż': 'z',
  887. 'Ą': 'A',
  888. 'Ć': 'C',
  889. 'Ę': 'e',
  890. 'Ł': 'L',
  891. 'Ń': 'N',
  892. 'Ó': 'O',
  893. 'Ś': 'S',
  894. 'Ź': 'Z',
  895. 'Ż': 'Z'
  896. },
  897. 'sk': { // Slovak
  898. 'ä': 'a',
  899. 'Ä': 'A'
  900. },
  901. 'sr': { // Serbian
  902. 'љ': 'lj',
  903. 'њ': 'nj',
  904. 'Љ': 'Lj',
  905. 'Њ': 'Nj',
  906. 'đ': 'dj',
  907. 'Đ': 'Dj'
  908. },
  909. 'tr': { // Turkish
  910. 'Ü': 'U',
  911. 'Ö': 'O',
  912. 'ü': 'u',
  913. 'ö': 'o'
  914. }
  915. };
  916. /**
  917. * symbolMap language specific symbol translations
  918. * translations must be transliterated already
  919. * @type {Object}
  920. */
  921. var symbolMap = {
  922. 'ar': {
  923. '∆': 'delta',
  924. '∞': 'la-nihaya',
  925. '♥': 'hob',
  926. '&': 'wa',
  927. '|': 'aw',
  928. '<': 'aqal-men',
  929. '>': 'akbar-men',
  930. '∑': 'majmou',
  931. '¤': 'omla'
  932. },
  933. 'az': {},
  934. 'ca': {
  935. '∆': 'delta',
  936. '∞': 'infinit',
  937. '♥': 'amor',
  938. '&': 'i',
  939. '|': 'o',
  940. '<': 'menys que',
  941. '>': 'mes que',
  942. '∑': 'suma dels',
  943. '¤': 'moneda'
  944. },
  945. 'cz': {
  946. '∆': 'delta',
  947. '∞': 'nekonecno',
  948. '♥': 'laska',
  949. '&': 'a',
  950. '|': 'nebo',
  951. '<': 'mene jako',
  952. '>': 'vice jako',
  953. '∑': 'soucet',
  954. '¤': 'mena'
  955. },
  956. 'de': {
  957. '∆': 'delta',
  958. '∞': 'unendlich',
  959. '♥': 'Liebe',
  960. '&': 'und',
  961. '|': 'oder',
  962. '<': 'kleiner als',
  963. '>': 'groesser als',
  964. '∑': 'Summe von',
  965. '¤': 'Waehrung'
  966. },
  967. 'dv': {
  968. '∆': 'delta',
  969. '∞': 'kolunulaa',
  970. '♥': 'loabi',
  971. '&': 'aai',
  972. '|': 'noonee',
  973. '<': 'ah vure kuda',
  974. '>': 'ah vure bodu',
  975. '∑': 'jumula',
  976. '¤': 'faisaa'
  977. },
  978. 'en': {
  979. '∆': 'delta',
  980. '∞': 'infinity',
  981. '♥': 'love',
  982. '&': 'and',
  983. '|': 'or',
  984. '<': 'less than',
  985. '>': 'greater than',
  986. '∑': 'sum',
  987. '¤': 'currency'
  988. },
  989. 'es': {
  990. '∆': 'delta',
  991. '∞': 'infinito',
  992. '♥': 'amor',
  993. '&': 'y',
  994. '|': 'u',
  995. '<': 'menos que',
  996. '>': 'mas que',
  997. '∑': 'suma de los',
  998. '¤': 'moneda'
  999. },
  1000. 'fr': {
  1001. '∆': 'delta',
  1002. '∞': 'infiniment',
  1003. '♥': 'Amour',
  1004. '&': 'et',
  1005. '|': 'ou',
  1006. '<': 'moins que',
  1007. '>': 'superieure a',
  1008. '∑': 'somme des',
  1009. '¤': 'monnaie'
  1010. },
  1011. 'gr': {},
  1012. 'hu': {
  1013. '∆': 'delta',
  1014. '∞': 'vegtelen',
  1015. '♥': 'szerelem',
  1016. '&': 'es',
  1017. '|': 'vagy',
  1018. '<': 'kisebb mint',
  1019. '>': 'nagyobb mint',
  1020. '∑': 'szumma',
  1021. '¤': 'penznem'
  1022. },
  1023. 'it': {
  1024. '∆': 'delta',
  1025. '∞': 'infinito',
  1026. '♥': 'amore',
  1027. '&': 'e',
  1028. '|': 'o',
  1029. '<': 'minore di',
  1030. '>': 'maggiore di',
  1031. '∑': 'somma',
  1032. '¤': 'moneta'
  1033. },
  1034. 'lt': {},
  1035. 'lv': {
  1036. '∆': 'delta',
  1037. '∞': 'bezgaliba',
  1038. '♥': 'milestiba',
  1039. '&': 'un',
  1040. '|': 'vai',
  1041. '<': 'mazak neka',
  1042. '>': 'lielaks neka',
  1043. '∑': 'summa',
  1044. '¤': 'valuta'
  1045. },
  1046. 'my': {
  1047. '∆': 'kwahkhyaet',
  1048. '∞': 'asaonasme',
  1049. '♥': 'akhyait',
  1050. '&': 'nhin',
  1051. '|': 'tho',
  1052. '<': 'ngethaw',
  1053. '>': 'kyithaw',
  1054. '∑': 'paungld',
  1055. '¤': 'ngwekye'
  1056. },
  1057. 'mk': {},
  1058. 'nl': {
  1059. '∆': 'delta',
  1060. '∞': 'oneindig',
  1061. '♥': 'liefde',
  1062. '&': 'en',
  1063. '|': 'of',
  1064. '<': 'kleiner dan',
  1065. '>': 'groter dan',
  1066. '∑': 'som',
  1067. '¤': 'valuta'
  1068. },
  1069. 'pl': {
  1070. '∆': 'delta',
  1071. '∞': 'nieskonczonosc',
  1072. '♥': 'milosc',
  1073. '&': 'i',
  1074. '|': 'lub',
  1075. '<': 'mniejsze niz',
  1076. '>': 'wieksze niz',
  1077. '∑': 'suma',
  1078. '¤': 'waluta'
  1079. },
  1080. 'pt': {
  1081. '∆': 'delta',
  1082. '∞': 'infinito',
  1083. '♥': 'amor',
  1084. '&': 'e',
  1085. '|': 'ou',
  1086. '<': 'menor que',
  1087. '>': 'maior que',
  1088. '∑': 'soma',
  1089. '¤': 'moeda'
  1090. },
  1091. 'ro': {
  1092. '∆': 'delta',
  1093. '∞': 'infinit',
  1094. '♥': 'dragoste',
  1095. '&': 'si',
  1096. '|': 'sau',
  1097. '<': 'mai mic ca',
  1098. '>': 'mai mare ca',
  1099. '∑': 'suma',
  1100. '¤': 'valuta'
  1101. },
  1102. 'ru': {
  1103. '∆': 'delta',
  1104. '∞': 'beskonechno',
  1105. '♥': 'lubov',
  1106. '&': 'i',
  1107. '|': 'ili',
  1108. '<': 'menshe',
  1109. '>': 'bolshe',
  1110. '∑': 'summa',
  1111. '¤': 'valjuta'
  1112. },
  1113. 'sk': {
  1114. '∆': 'delta',
  1115. '∞': 'nekonecno',
  1116. '♥': 'laska',
  1117. '&': 'a',
  1118. '|': 'alebo',
  1119. '<': 'menej ako',
  1120. '>': 'viac ako',
  1121. '∑': 'sucet',
  1122. '¤': 'mena'
  1123. },
  1124. 'sr': {},
  1125. 'tr': {
  1126. '∆': 'delta',
  1127. '∞': 'sonsuzluk',
  1128. '♥': 'ask',
  1129. '&': 've',
  1130. '|': 'veya',
  1131. '<': 'kucuktur',
  1132. '>': 'buyuktur',
  1133. '∑': 'toplam',
  1134. '¤': 'para birimi'
  1135. },
  1136. 'uk': {
  1137. '∆': 'delta',
  1138. '∞': 'bezkinechnist',
  1139. '♥': 'lubov',
  1140. '&': 'i',
  1141. '|': 'abo',
  1142. '<': 'menshe',
  1143. '>': 'bilshe',
  1144. '∑': 'suma',
  1145. '¤': 'valjuta'
  1146. },
  1147. 'vn': {
  1148. '∆': 'delta',
  1149. '∞': 'vo cuc',
  1150. '♥': 'yeu',
  1151. '&': 'va',
  1152. '|': 'hoac',
  1153. '<': 'nho hon',
  1154. '>': 'lon hon',
  1155. '∑': 'tong',
  1156. '¤': 'tien te'
  1157. }
  1158. };
  1159. if (typeof input !== 'string') {
  1160. return '';
  1161. }
  1162. if (typeof opts === 'string') {
  1163. separator = opts;
  1164. }
  1165. symbol = symbolMap.en;
  1166. langChar = langCharMap.en;
  1167. if (typeof opts === 'object') {
  1168. maintainCase = opts.maintainCase || false;
  1169. customReplacements = (opts.custom && typeof opts.custom === 'object') ? opts.custom : customReplacements;
  1170. truncate = (+opts.truncate > 1 && opts.truncate) || false;
  1171. uricFlag = opts.uric || false;
  1172. uricNoSlashFlag = opts.uricNoSlash || false;
  1173. markFlag = opts.mark || false;
  1174. convertSymbols = (opts.symbols === false || opts.lang === false) ? false : true;
  1175. separator = opts.separator || separator;
  1176. if (uricFlag) {
  1177. allowedChars += uricChars.join('');
  1178. }
  1179. if (uricNoSlashFlag) {
  1180. allowedChars += uricNoSlashChars.join('');
  1181. }
  1182. if (markFlag) {
  1183. allowedChars += markChars.join('');
  1184. }
  1185. symbol = (opts.lang && symbolMap[opts.lang] && convertSymbols) ?
  1186. symbolMap[opts.lang] : (convertSymbols ? symbolMap.en : {});
  1187. langChar = (opts.lang && langCharMap[opts.lang]) ?
  1188. langCharMap[opts.lang] :
  1189. opts.lang === false || opts.lang === true ? {} : langCharMap.en;
  1190. // if titleCase config is an Array, rewrite to object format
  1191. if (opts.titleCase && typeof opts.titleCase.length === "number" && Array.prototype.toString.call(opts.titleCase)) {
  1192. opts.titleCase.forEach(function (v) {
  1193. customReplacements[v + ""] = v + "";
  1194. });
  1195. titleCase = true;
  1196. } else {
  1197. titleCase = !!opts.titleCase;
  1198. }
  1199. // if custom config is an Array, rewrite to object format
  1200. if (opts.custom && typeof opts.custom.length === "number" && Array.prototype.toString.call(opts.custom)) {
  1201. opts.custom.forEach(function (v) {
  1202. customReplacements[v + ""] = v + "";
  1203. });
  1204. }
  1205. // custom replacements
  1206. Object.keys(customReplacements).forEach(function (v) {
  1207. var r;
  1208. if (v.length > 1) {
  1209. r = new RegExp('\\b' + escapeChars(v) + '\\b', 'gi');
  1210. } else {
  1211. r = new RegExp(escapeChars(v), 'gi');
  1212. }
  1213. input = input.replace(r, customReplacements[v]);
  1214. });
  1215. // add all custom replacement to allowed charlist
  1216. for (ch in customReplacements) {
  1217. allowedChars += ch;
  1218. }
  1219. }
  1220. allowedChars += separator;
  1221. if (titleCase) {
  1222. input = input.replace(/(\w)(\S*)/g, function (_, i, r) {
  1223. var j = i.toUpperCase() + (r !== null ? r : "");
  1224. return (Object.keys(customReplacements).indexOf(j.toLowerCase()) < 0) ? j : j.toLowerCase();
  1225. });
  1226. }
  1227. // escape all necessary chars
  1228. allowedChars = escapeChars(allowedChars);
  1229. // trim whitespaces
  1230. input = input.replace(/(^\s+|\s+$)/g, '');
  1231. lastCharWasSymbol = false;
  1232. lastCharWasDiatric = false;
  1233. for (i = 0, l = input.length; i < l; i++) {
  1234. ch = input[i];
  1235. if (isReplacedCustomChar(ch, customReplacements)) {
  1236. // don't convert a already converted char
  1237. lastCharWasSymbol = false;
  1238. } else if (langChar[ch]) {
  1239. // process language specific diactrics chars conversion
  1240. ch = lastCharWasSymbol && langChar[ch].match(/[A-Za-z0-9]/) ? ' ' + langChar[ch] : langChar[ch];
  1241. lastCharWasSymbol = false;
  1242. } else if (ch in charMap) {
  1243. // the transliteration changes entirely when some special characters are added
  1244. if (i + 1 < l && lookAheadCharArray.indexOf(input[i + 1]) >= 0) {
  1245. diatricString += ch;
  1246. ch = '';
  1247. } else if (lastCharWasDiatric === true) {
  1248. ch = diatricMap[diatricString] + charMap[ch];
  1249. diatricString = '';
  1250. } else {
  1251. // process diactrics chars
  1252. ch = lastCharWasSymbol && charMap[ch].match(/[A-Za-z0-9]/) ? ' ' + charMap[ch] : charMap[ch];
  1253. }
  1254. lastCharWasSymbol = false;
  1255. lastCharWasDiatric = false;
  1256. } else
  1257. if (ch in diatricMap) {
  1258. diatricString += ch;
  1259. ch = '';
  1260. // end of string, put the whole meaningful word
  1261. if (i === l - 1) {
  1262. ch = diatricMap[diatricString];
  1263. }
  1264. lastCharWasDiatric = true;
  1265. } else if (
  1266. // process symbol chars
  1267. symbol[ch] && !(uricFlag && uricChars.join('')
  1268. .indexOf(ch) !== -1) && !(uricNoSlashFlag && uricNoSlashChars.join('')
  1269. //.indexOf(ch) !== -1) && !(markFlag && markChars.join('')
  1270. .indexOf(ch) !== -1)) {
  1271. ch = lastCharWasSymbol || result.substr(-1).match(/[A-Za-z0-9]/) ? separator + symbol[ch] : symbol[ch];
  1272. ch += input[i + 1] !== void 0 && input[i + 1].match(/[A-Za-z0-9]/) ? separator : '';
  1273. lastCharWasSymbol = true;
  1274. } else {
  1275. if (lastCharWasDiatric === true) {
  1276. ch = diatricMap[diatricString] + ch;
  1277. diatricString = '';
  1278. lastCharWasDiatric = false;
  1279. } else if (lastCharWasSymbol && (/[A-Za-z0-9]/.test(ch) || result.substr(-1).match(/A-Za-z0-9]/))) {
  1280. // process latin chars
  1281. ch = ' ' + ch;
  1282. }
  1283. lastCharWasSymbol = false;
  1284. }
  1285. // add allowed chars
  1286. result += ch.replace(new RegExp('[^\\w\\s' + allowedChars + '_-]', 'g'), separator);
  1287. }
  1288. // eliminate duplicate separators
  1289. // add separator
  1290. // trim separators from start and end
  1291. result = result.replace(/\s+/g, separator)
  1292. .replace(new RegExp('\\' + separator + '+', 'g'), separator)
  1293. .replace(new RegExp('(^\\' + separator + '+|\\' + separator + '+$)', 'g'), '');
  1294. if (truncate && result.length > truncate) {
  1295. lucky = result.charAt(truncate) === separator;
  1296. result = result.slice(0, truncate);
  1297. if (!lucky) {
  1298. result = result.slice(0, result.lastIndexOf(separator));
  1299. }
  1300. }
  1301. if (!maintainCase && !titleCase) {
  1302. result = result.toLowerCase();
  1303. }
  1304. return result;
  1305. };
  1306. /**
  1307. * createSlug curried(opts)(input)
  1308. * @param {object|string} opts config object or input string
  1309. * @return {Function} function getSlugWithConfig()
  1310. **/
  1311. var createSlug = function createSlug(opts) {
  1312. /**
  1313. * getSlugWithConfig
  1314. * @param {string} input string
  1315. * @return {string} slug string
  1316. */
  1317. return function getSlugWithConfig(input) {
  1318. return getSlug(input, opts);
  1319. };
  1320. };
  1321. /**
  1322. * escape Chars
  1323. * @param {string} input string
  1324. */
  1325. var escapeChars = function escapeChars(input) {
  1326. return input.replace(/[-\\^$*+?.()|[\]{}\/]/g, '\\$&');
  1327. };
  1328. /**
  1329. * check if the char is an already converted char from custom list
  1330. * @param {char} ch character to check
  1331. * @param {object} customReplacements custom translation map
  1332. */
  1333. var isReplacedCustomChar = function (ch, customReplacements) {
  1334. for (var c in customReplacements) {
  1335. if (customReplacements[c] === ch) {
  1336. return true;
  1337. }
  1338. }
  1339. };
  1340. if (typeof module !== 'undefined' && module.exports) {
  1341. // export functions for use in Node
  1342. module.exports = getSlug;
  1343. module.exports.createSlug = createSlug;
  1344. } else if (typeof define !== 'undefined' && define.amd) {
  1345. // export function for use in AMD
  1346. define([], function () {
  1347. return getSlug;
  1348. });
  1349. } else {
  1350. // don't overwrite global if exists
  1351. try {
  1352. if (root.getSlug || root.createSlug) {
  1353. throw 'speakingurl: globals exists /(getSlug|createSlug)/';
  1354. } else {
  1355. root.getSlug = getSlug;
  1356. root.createSlug = createSlug;
  1357. }
  1358. } catch (e) {}
  1359. }
  1360. })(this);