UNPKG

url-slugify

Version:

Creates SEO friendly URL slugs with multiple language support

79 lines (58 loc) 3.23 kB
'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Hashids = require('hashids'); var library = require('./characters.json'); /** * URLSlug Class * */ var URLSlug = function () { function URLSlug() { _classCallCheck(this, URLSlug); } _createClass(URLSlug, [{ key: 'slugify', /** * Creates SEO and URL friendly slugs * @param title string * @param separator string */ value: function slugify() { var title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '-'; var hashLength = 9; // length of hash var id = this.generateRandom(); // generate a random id var slug = void 0; //initialise slug var defaultSeparator = library.characters.find(function (item) { return item.character === separator; }) === undefined ? separator : '-'; // if character exists in library use default separator if (typeof title !== 'undefined' && title !== '' && typeof id !== 'undefined' && id !== 0) { var hashedId = new Hashids(title, hashLength).encode('' + id + Math.floor(Date.now() / 1000)); // Generates a hash using id and timestamp var newTitle = '' + title + defaultSeparator + hashedId; // Creates a unique hashing using the title newTitle = newTitle.replace(/^\s+|\s+$/g, '') // trim .toLowerCase(); // make title lowercase var transformedTitle = library.characters.reduce(function (acc, item) { // replace special characters, accents with alternatives while (newTitle.indexOf(item.character) !== -1) { newTitle = newTitle.replace(item.character, item.value); } return newTitle; }, {}); transformedTitle = transformedTitle.replace(/[^a-z0-9 -]/g, '') // remove invalid chars .replace(/\s+/g, defaultSeparator); // collapse any whitespace and replace by separator slug = defaultSeparator === '\'\'' ? transformedTitle.replace(new RegExp("\'+", "g"), '') // collapse multiple '' if present : transformedTitle.replace(new RegExp(defaultSeparator + '+', "g"), defaultSeparator); // collapse multiple separators } return slug; } }, { key: 'generateRandom', value: function generateRandom() { var num = Math.floor(Math.random() * (999999 - 1 + 1)) + 1; return num === 0 ? this.generateRandom() : num; } }]); return URLSlug; }(); module.exports = URLSlug;