url-slugify
Version:
Creates SEO friendly URL slugs with multiple language support
57 lines (42 loc) • 2.02 kB
JavaScript
const Hashids = require('hashids');
const library = require('./characters.json');
/**
* URLSlug Class
*
*/
class URLSlug {
/**
* Creates SEO and URL friendly slugs
* @param title string
* @param separator string
*/
slugify(title = '', separator = '-') {
const hashLength = 9; // length of hash
const id = this.generateRandom(); // generate a random id
let slug; //initialise slug
const defaultSeparator = library.characters.find(item => item.character === separator) === undefined ? separator : '-'; // if character exists in library use default separator
if (typeof title !== 'undefined' && title !== '' && typeof id !== 'undefined' && id !== 0) {
const hashedId = new Hashids(title, hashLength).encode(`${id}${Math.floor(Date.now() / 1000)}`); // Generates a hash using id and timestamp
let newTitle = `${title}${defaultSeparator}${hashedId}`; // Creates a unique hashing using the title
newTitle = newTitle.replace(/^\s+|\s+$/g, '') // trim
.toLowerCase(); // make title lowercase
let transformedTitle = library.characters.reduce((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;
}
generateRandom() {
let num = Math.floor(Math.random() * (999999 - 1 + 1)) + 1;
return num === 0 ? this.generateRandom() : num;
}
}
module.exports = URLSlug;