Slugifies strings, even when they contain Unicode.
Make strings URL-safe.
- Respects RFC 3986
- No dependencies
- Works in the browser or in Node.js
npm install slug
If you are using TypeScript you can install the accompanying types
npm install --save-dev @types/slug
importslugfrom'slug'varprint=console.log.bind(console,'>')print(slug('i love unicode'))// > i-love-unicodeprint(slug('i love unicode','_'))// If you prefer something else than `-` as separator// > i_love_unicodeslug.charmap['♥']='freaking love'// change default charmap or use option {charmap:{…}} as 2. argumentprint(slug('I ♥ UNICODE'))// > i-freaking-love-unicode// To reset modifications to slug.charmap, use slug.reset():slug.reset()print(slug('I ♥ UNICODE'))// > i-unicodeprint(slug('Telephone-Number'))// lower case by default// > telephone-numberprint(slug('Telephone-Number',{lower: false}))// If you want to preserve case// > Telephone-Number// We try to provide sensible defaults.// So Cyrillic text will be transliterated as if it were Russian:print(slug('маленький подъезд'))// > malenkij-poduezd// But maybe you know it's Bulgarian:print(slug('маленький подъезд',{locale: 'bg'}))// > malenykiy-podaezd// To set the default locale:slug.setLocale('bg')print(slug('маленький подъезд'))// > malenykiy-podaezdprint(slug('unicode is ☢'))// > unicode-isslug.extend({'☢': 'radioactive'})print(slug('unicode ♥ is ☢'))// > unicode-is-radioactive// slug.extend() modifies the default charmap for the entire process.// If you need to reset charmap, multicharmap, and the default locale, use slug.reset():slug.reset()print(slug('unicode ♥ is ☢'))// > unicode-is// Custom removal of characters from resulting slug. Let's say that we want to// remove all numbers for some reason.print(slug('one 1 two 2 three 3'))// > one-1-two-2-three-3print(slug('one 1 two 2 three 3',{remove: /[0-9]/g}))// > one-two-three// options is either object or replacement (sets options.replacement)slug('string',[{options}||'replacement']);slug.defaults.mode='pretty';slug.defaults.modes['rfc3986']={replacement: '-',// replace spaces with replacementremove: null,// (optional) regex to remove characterslower: true,// result in lower casecharmap: slug.charmap,// replace special charactersmulticharmap: slug.multicharmap,// replace multiple code unit characterstrim: true,// trim leading and trailing replacement charsfallback: true// use base64 to generate slug for empty results};slug.defaults.modes['pretty']={replacement: '-',remove: null,lower: true,charmap: slug.charmap,multicharmap: slug.multicharmap,trim: true,fallback: true};Here are some key differences between this package and slugify.
- Stability:
slugis ESM-only.slugifysupports CommonJS and ESM. - Defaults:
slughas theloweroption enabled by default, lowercasing all slugs ('On SALE'becomes'on-sale').slugifyhas theloweroption disabled by default ('On SALE'becomes'On-SALE'). - Symbols:
slugremoves unrecognized symbols ('$100'becomes'100','<5'becomes'5', etc.).slugifymaps them to words ('$100'becomes'dollar100','<5'becomes'less5', etc.). - Empty Output:
slugwill return a short, predictable hash (' 'becomes'icag'and'🎉'becomes'8joiq').slugifywill return an empty string (' 'and'🎉'become'').
A web playground is available at https://trott.github.io/slug/.
There is also a CLI tool available via npx slug. It doesn't allow you to
specify options, so it's utility is minimal.