slugg.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. (function (root) {
  2. var defaultSeparator = '-'
  3. var defaultToStrip = /['"’‘”“]/g
  4. var defaultToLowerCase = true
  5. function slugg(string, separator, toStrip) {
  6. // Coerce the value into a string.
  7. if ([ undefined, null ].indexOf(string) !== -1) string = ''
  8. string = typeof string.toString === 'function' ? string.toString() : ''
  9. var options = {}
  10. if (typeof separator === 'object') {
  11. options = separator
  12. } else {
  13. options.separator = separator
  14. options.toStrip = toStrip
  15. // Separator might be omitted and toStrip in its place
  16. if (options.separator instanceof RegExp) {
  17. options.toStrip = separator
  18. options.separator = defaultSeparator
  19. }
  20. // Only a separator was passed
  21. if (typeof options.toStrip === 'undefined') options.toStrip = /['"’‘”“]/g
  22. }
  23. // Separator is optional
  24. if (typeof options.separator === 'undefined') options.separator = defaultSeparator
  25. // toStrip is optional
  26. if (typeof options.toStrip === 'undefined') options.toStrip = defaultToStrip
  27. // toLowerCase is optional
  28. if (typeof options.toLowerCase === 'undefined') options.toLowerCase = defaultToLowerCase
  29. // Make lower-case
  30. if (options.toLowerCase) string = string.toLowerCase()
  31. // Swap out non-english characters for their english equivalent
  32. for (var i = 0, len = string.length; i < len; i++) {
  33. if (chars[string.charAt(i)]) {
  34. string = string.replace(string.charAt(i), chars[string.charAt(i)])
  35. }
  36. }
  37. string = string
  38. // Strip chars that shouldn't be replaced with separator
  39. .replace(options.toStrip, '')
  40. // Replace non-word characters with separator
  41. .replace(/[\W|_]+/g, options.separator)
  42. // Strip dashes from the beginning
  43. .replace(new RegExp('^' + options.separator + '+'), '')
  44. // Strip dashes from the end
  45. .replace(new RegExp(options.separator + '+$'), '')
  46. return string
  47. }
  48. // Conversion table. Modified version of:
  49. // https://github.com/dodo/node-slug/blob/master/src/slug.coffee
  50. var chars = slugg.chars = {
  51. // Latin
  52. 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE',
  53. 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I',
  54. 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O',
  55. 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U',
  56. 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'ß': 'ss', 'à': 'a', 'á': 'a',
  57. 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e',
  58. 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i',
  59. 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o',
  60. 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', 'ű': 'u',
  61. 'ý': 'y', 'þ': 'th', 'ÿ': 'y', 'ẞ': 'SS', 'œ': 'oe', 'Œ': 'OE',
  62. // Greek
  63. 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h',
  64. 'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3',
  65. 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f',
  66. 'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o',
  67. 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y',
  68. 'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z',
  69. 'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N',
  70. 'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y',
  71. 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I',
  72. 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y',
  73. // Turkish
  74. 'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ğ': 'g', 'Ğ': 'G',
  75. // Russian
  76. 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo',
  77. 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm',
  78. 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u',
  79. 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': 'u',
  80. 'ы': 'y', 'э': 'e', 'ю': 'yu', 'я': 'ya', 'А': 'A', 'Б': 'B',
  81. 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', 'Ж': 'Zh', 'З': 'Z',
  82. 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', 'Н': 'N', 'О': 'O',
  83. 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', 'Ф': 'F', 'Х': 'H',
  84. 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': 'U', 'Ы': 'Y',
  85. 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya',
  86. // Ukranian
  87. 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G',
  88. 'є': 'ye', 'і': 'i', 'ї': 'yi', 'ґ': 'g',
  89. // Czech
  90. 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's',
  91. 'ť': 't', 'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E',
  92. 'Ň': 'N', 'Ř': 'R', 'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z',
  93. // Polish
  94. 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ś': 's',
  95. 'ź': 'z', 'ż': 'z', 'Ą': 'A', 'Ć': 'C', 'Ę': 'e', 'Ł': 'L',
  96. 'Ń': 'N', 'Ś': 'S', 'Ź': 'Z', 'Ż': 'Z',
  97. // Latvian
  98. 'ā': 'a', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l',
  99. 'ņ': 'n', 'ū': 'u', 'Ā': 'A', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'i',
  100. 'Ķ': 'k', 'Ļ': 'L', 'Ņ': 'N', 'Ū': 'u'
  101. }
  102. // Be compatible with different module systems
  103. if (typeof define !== 'undefined' && define.amd) {
  104. // AMD
  105. define([], function () {
  106. return slugg
  107. })
  108. } else if (typeof module !== 'undefined' && module.exports) {
  109. // CommonJS
  110. module.exports = slugg
  111. } else {
  112. // Script tag
  113. root.slugg = slugg
  114. }
  115. }(this))