This is a unified (remark) plugin that removes trailing slashes from the ends of all URL paths (not query strings or hashes).
Since this is not always a purely cosmetic change, you might also be interested in remark-ignore, which lets you instruct remark not to transform parts of your Markdown documents (such as a link).
See also the onlyConsiderHostUrls
option.
Due to the nature of the unified ecosystem, this package is ESM only and cannot be
require
'd.
npm install --save-dev remark-remove-url-trailing-slash
import { read } from 'to-vfile';
import { remark } from 'remark';
import remarkRemoveUrlTrailingSlash from 'remark-remove-url-trailing-slash';
const file = await remark()
.use(remarkRemoveUrlTrailingSlash)
.process(await read('example.md'));
console.log(String(file));
Via remark-cli
remark -o --use remove-url-trailing-slash README.md
In package.json
:
/* … */
"remarkConfig": {
"plugins": [
"remark-remove-url-trailing-slash"
/* … */
]
},
/* … */
In .remarkrc.js
:
module.exports = {
plugins: [
// …
'remove-url-trailing-slash'
]
};
In .remarkrc.mjs
:
import remarkRemoveUrlTrailingSlash from 'remark-remove-url-trailing-slash';
export default {
plugins: [
// …
remarkRemoveUrlTrailingSlash
]
};
Detailed interface information can be found under docs/
.
This plugin recognizes the following options:
Valid values: boolean
Default: false
Trailing slashes will be removed from all URL paths by default, including
single-character /
paths (i.e. "empty" paths).
If this option is true
, trailing slashes will only be removed from
non-relative URLs with empty paths, e.g.
https://example.com/#readme => https://example.com#readme
.
Suppose we have the following Markdown file example.md
:
[link 1](https://example.com)
[link 2](https://example.com/)
[link 3](https://example.com/some/path/)
[link 4](https://example.com/#readme)
[link 5](https://example.com/some/path/#readme)
[link 6](https://example.com/some/path/#readme/)
[link 7][1]
[1]: https://www.youtube.com/watch/?v=dFs4yX4V7NQ/
Running the following JavaScript:
import { read } from 'to-vfile';
import { remark } from 'remark';
import remarkRemoveUrlTrailingSlash from 'remark-remove-url-trailing-slash';
const file = await remark()
.use(remarkRemoveUrlTrailingSlash)
.process(await read('example.md'));
console.log(String(file));
Would output the following:
[link 1](https://example.com)
[link 2](https://example.com)
[link 3](https://example.com/some/path)
[link 4](https://example.com#readme)
[link 5](https://example.com/some/path#readme)
[link 6](https://example.com/some/path#readme/)
[link 7][1]
[1]: https://www.youtube.com/watch?v=dFs4yX4V7NQ/
Running the following JavaScript:
import { read } from 'to-vfile';
import { remark } from 'remark';
import remarkRemoveUrlTrailingSlash from 'remark-remove-url-trailing-slash';
const file = await remark()
.use(remarkRemoveUrlTrailingSlash, {
// Do not change URLs with paths
excludeHeadingLevel: { onlyConsiderHostUrls: true }
})
.process(await read('example.md'));
console.log(String(file));
Would output the following:
[link 1](https://example.com)
[link 2](https://example.com)
[link 3](https://example.com/some/path/)
[link 4](https://example.com#readme)
[link 5](https://example.com/some/path/#readme)
[link 6](https://example.com/some/path/#readme/)
[link 7][1]
[1]: https://www.youtube.com/watch/?v=dFs4yX4V7NQ/
- remark-lint-no-url-trailing-slash — the remark-lint version of and inspiration for this package.
- remark-ignore — use comments to exclude one or more nodes from transformation.
New issues and pull requests are always welcome and greatly appreciated! 🤩 Just as well, you can star 🌟 this project to let me know you found it useful! ✊🏿 Thank you!
See CONTRIBUTING.md and SUPPORT.md for more information.
See the table of contributors.