UNPKG

url-slugify

Version:

Creates SEO friendly URL slugs with multiple language support

57 lines (42 loc) 2.02 kB
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;