Slug generator with less than 1 KB and no dependencies, RFC 3986 compliant
npm install url-slug- Less than 1kB minified and gzipped;
- Uses default JavaScript APIs, no dependencies;
- SEO friendly;
- RFC 3986 compliant, compatible with URL hosts, paths, queries and
fragments;
- Supports custom dictionaries to replace characters;
- Easily revert slugs.
``bash`
npm install url-slug
`javascript
import urlSlug from 'url-slug'
urlSlug('Sir James Paul McCartney MBE is an English singer-songwriter')
// sir-james-paul-mc-cartney-mbe-is-an-english-singer-songwriter
`
> ⚠️ Only named exports are available in Node.js.
`javascript
import { convert } from 'url-slug'
urlSlug('Sir James Paul McCartney MBE is an English singer-songwriter')
// sir-james-paul-mc-cartney-mbe-is-an-english-singer-songwriter
`
`javascript
const { convert } = require('url-slug')
urlSlug('Sir James Paul McCartney MBE is an English singer-songwriter')
// sir-james-paul-mc-cartney-mbe-is-an-english-singer-songwriter
`
Returns value value converted to a slug.
#### value
A string to be slugified.
#### options
| Name | Description | Default |
| ----------- | --------------------------------------------------------------------------------- | ----------------------- |
| camelCase | Split on camel case occurrences | true |{}
| dictionary | [Chars to be replaced][8] | |'-'
| separator | [Character or string][9] used to separate the slug fragments | |null
| transformer | A built-in transformer or a custom function ( to keep the string unchanged) | LOWERCASE_TRANSFORMER |
#### Examples
`javascript
import * as urlSlug from 'url-slug'
urlSlug.convert('Comfortably Numb', {
transformer: urlSlug.UPPERCASE_TRANSFORMER,
})
// COMFORTABLY-NUMB
urlSlug.convert('á é í ó ú Á É Í Ó Ú ç Ç ª º ¹ ² ½ ¼', {
separator: '_',
transformer: false,
})
// a_e_i_o_u_A_E_I_O_U_c_C_a_o_1_2_1_2_1_4
urlSlug.convert('Red, red wine, stay close to me…', {
separator: '',
transformer: urlSlug.TITLECASE_TRANSFORMER,
})
// RedRedWineStayCloseToMe
urlSlug.convert('Schwarzweiß', {
dictionary: { ß: 'ss', z: 'z ' },
})
// schwarz-weiss
`
Returns the value value converted to a regular sentence.
#### value
A slug to be reverted to a sentence.
#### options
| Name | Description | Default |
| ----------- | --------------------------------------------------------------------------------- | ------- |
| camelCase | Split on camel case occurrences | false |null
| separator | [Character or string][9] to split the slug ( for automatic splitting) | null |null
| transformer | A built-in transformer or a custom function ( to keep the string unchanged) | false |
#### Examples
`javascript
import { revert, TITLECASE_TRANSFORMER } from 'url-slug'
revert('Replace-every_separator.allowed~andSplitCamelCaseToo', {
camelCase: true,
})
// Replace every separator allowed and Split Camel Case Too
revert('this-slug-needs-a-title_case', {
separator: '-',
transformer: TITLECASE_TRANSFORMER,
})
// This Slug Needs A Title_case
`
Custom transformers are expressed by a function that receives two arguments:
fragments, an array containing the words of a sentence or a slug, andseparator, which is the separator string set in convert() options. Whenrevert() calls a transformer, the separator argument will always be a space' '
character () — the separator option will be used to split the slug.
Transformers should always return a string.
#### Examples
`javascript
import { convert, revert } from 'url-slug'
convert('O’Neill is an American surfboard, surfwear and equipment brand', {
transformer: (fragments) => fragments.join('x').toUpperCase(),
})
// OxNEILLxISxANxAMERICANxSURFBOARDxSURFWEARxANDxEQUIPMENTxBRAND
revert('WEIrd_SNAke_CAse', {
separator: '_',
transformer: (fragments, separator) =>
fragments
.map(
(fragment) =>
fragment.slice(0, -2).toLowerCase() + fragment.slice(-2).toUpperCase()
)
.join(separator),
})
// weiRD snaKE caSE
`
#### LOWERCASE_TRANSFORMER
Converts the result to lowercase. E.g.: // SOME WORDS >> some words
#### SENTENCECASE_TRANSFORMER
Converts the result to sentence case. E.g.: // sOME WORDS >> Some words
#### UPPERCASE_TRANSFORMER
Converts the result to uppercase. E.g.: // some words >> SOME WORDS
#### TITLECASE_TRANSFORMER
Converts the result to title case. E.g.: // sOME wORDS >> Some Words
Any character or an empty string can be used in the separator property. Whenseparator
the is an empty string, the revert() method will split the slugcamelCase
only on camel case occurrences if option is set to true,revert()
or else it returns an untouched string. The following characters are valid
according to RFC 3986 — defined as _unreserved_ or _sub-delims_ —, and will be
used in function if automatic splitting is enabled — separator isnull
set to :
-, ., _, ~, ^, -, ., _, ~, !, $, &, ', (, ), *,+, ,, ; or =
It must be an object, with keys set as single characters and values as strings
of any length:
`js
import { convert } from 'url-slug'
convert('♥øß', {
dictionary: {
'♥': 'love',
ø: 'o',
ß: 'ss',
//...
},
})
// loveoss
`
To add separators before or after a specific character, add a space before or
after the dictionary definition:
`js
import { convert } from 'url-slug'
convert('♥øß', {
dictionary: {
'♥': 'love',
ø: ' o', // A space was added before
ß: 'ss',
//...
},
})
// love-oss
convert('♥øß', {
dictionary: {
'♥': 'love',
ø: ' o ', // A space was added before and after
ß: 'ss',
//...
},
})
// love-o-ss
convert('♥øß', {
dictionary: {
'♥': 'love',
ø: 'o ', // A space was added after
ß: 'ss',
//...
},
})
// loveo-ss
``
Compatible with any environment with ES6 support.
[The MIT License][license]
[1]: https://img.shields.io/github/actions/workflow/status/stldo/url-slug/test.yml?branch=master
[2]: https://github.com/stldo/url-slug/actions/workflows/test.js.yml
[3]: https://img.shields.io/npm/dm/url-slug
[4]: https://img.shields.io/npm/v/url-slug
[5]: https://www.npmjs.com/package/url-slug
[6]: https://img.shields.io/bundlephobia/minzip/url-slug
[7]: https://bundlephobia.com/package/url-slug
[8]: #dictionary-option
[9]: #separator-characters
[license]: ./LICENSE