url-slugify
Version:
Creates SEO friendly URL slugs with multiple language support
79 lines (58 loc) • 3.23 kB
JavaScript
;
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;