rehype plugin to add id
s to headings with the option for custom IDs.
This package is ESM only:
Node 12+ is needed to use it and it must be import
ed instead of require
d.
npm:
npm install rehype-slug-custom-id
Say we have the following file, fragment.html
:
<h1>Lorem ipsum 😪</h1>
<h2>dolor—sit—amet</h2>
<h3>consectetur & adipisicing</h3>
<h4>elit</h4>
<h5>elit</h5>
<h6>Custom ID Should Be Here {#custom-id}</h6>
And our script, example.js
, looks as follows:
import fs from 'node:fs'
import {rehype} from 'rehype'
import slug from 'rehype-slug'
const buf = fs.readFileSync('fragment.html')
rehype()
.data('settings', {fragment: true})
.use(slug)
.process(buf)
.then((file) => {
console.log(String(file))
})
Now, running node example
yields:
<h1 id="lorem-ipsum-">Lorem ipsum 😪</h1>
<h2 id="dolorsitamet">dolor—sit—amet</h2>
<h3 id="consectetur--adipisicing">consectetur & adipisicing</h3>
<h4 id="elit">elit</h4>
<h5 id="elit-1">elit</h5>
<h6 id="custom-id">Custom ID Should Be Here</h6>
The default export is rehypeSlug
.
Add id
properties to h1-h6 headings that don’t already have one.
Uses github-slugger to create GitHub style id
s, or a custom ID if supplied like so:
<h1>ID {#custom-id-here}</h1>
We support the following options for the plugin:
enableCustomId
:Boolean
. Enable custom header IDs with {#id} (optional)maintainCase
:Boolean
. Maintains the case for markdown header (optional)removeAccents
:Boolean
. Remove accents from generated headings IDs (optional)
Use of rehype-slug
can open you up to a cross-site scripting (XSS)
attack as it sets id
attributes on headings.
In a browser, elements are retrievable by id
with JavaScript and CSS.
If a user injects a heading that slugs to an id
you are already using,
the user content may impersonate the website.
Always be wary with user input and use rehype-sanitize
.
rehype-slug
— Add slugs to headings in htmlremark-slug
— Add slugs to headings in markdowngatsby-remark-autolink-headers
— Add slugs to headings in markdown for Gatsby