Skip to content

Latest commit

 

History

History

remark-remove-url-trailing-slash

Black Lives Matter! Last commit timestamp Codecov Source license Monthly Downloads NPM version Uses Semantic Release!

remark-remove-url-trailing-slash

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.


Install

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

Usage

Via API

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));
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
  ]
};

API

Detailed interface information can be found under docs/.

Options

This plugin recognizes the following options:

onlyConsiderHostUrls

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.

Examples

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/

Using the Default Configuration

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/

Using onlyConsiderHostUrls

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/

Related

Contributing and Support

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.

Contributors

See the table of contributors.