index.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. var emoji = require('emoji-regex')
  2. module.exports = BananaSlug
  3. function BananaSlug () {
  4. var self = this
  5. if (!(self instanceof BananaSlug)) return new BananaSlug()
  6. self.reset()
  7. }
  8. /**
  9. * Generate a unique slug.
  10. * @param {string} value String of text to slugify
  11. * @param {boolean} [false] Keep the current case, otherwise make all lowercase
  12. * @return {string} A unique slug string
  13. */
  14. BananaSlug.prototype.slug = function (value, maintainCase) {
  15. maintainCase = maintainCase === true
  16. var self = this
  17. var slug = slugger(value, maintainCase)
  18. var occurrences = self.occurrences[slug]
  19. if (self.occurrences.hasOwnProperty(slug)) {
  20. occurrences++
  21. } else {
  22. occurrences = 0
  23. }
  24. self.occurrences[slug] = occurrences
  25. if (occurrences) {
  26. slug = slug + '-' + occurrences
  27. }
  28. return slug
  29. }
  30. /**
  31. * Reset - Forget all previous slugs
  32. * @return void
  33. */
  34. BananaSlug.prototype.reset = function () {
  35. this.occurrences = {}
  36. }
  37. var whitespace = /\s/g
  38. function lower (string) {
  39. return string.toLowerCase()
  40. }
  41. function slugger (string, maintainCase) {
  42. var re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g
  43. var replacement = '-'
  44. if (typeof string !== 'string') return ''
  45. if (!maintainCase) string = string.replace(/[A-Z]+/g, lower)
  46. return string.trim()
  47. .replace(re, '')
  48. .replace(emoji(), '')
  49. .replace(whitespace, replacement)
  50. }