@justfork/rehype-autolink-headings
v5.1.1
Published
rehype plugin to add links to headings
Downloads
15
Maintainers
Readme
rehype-autolink-headings
rehype plugin to automatically add links to headings (h1-h6).
Install
npm:
npm install rehype-autolink-headings
Use
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>
And our script, example.js
, looks as follows:
var fs = require('fs')
var rehype = require('rehype')
var slug = require('rehype-slug')
var link = require('rehype-autolink-headings')
var doc = fs.readFileSync('fragment.html')
rehype()
.data('settings', {fragment: true})
.use(slug)
.use(link)
.process(doc, function(err, file) {
if (err) throw err
console.log(String(file))
})
Now, running node example
yields:
<h1 id="lorem-ipsum-"><a aria-hidden="true" href="#lorem-ipsum-"><span class="icon icon-link"></span></a>Lorem ipsum 😪</h1>
<h2 id="dolorsitamet"><a aria-hidden="true" href="#dolorsitamet"><span class="icon icon-link"></span></a>dolor—sit—amet</h2>
<h3 id="consectetur--adipisicing"><a aria-hidden="true" href="#consectetur--adipisicing"><span class="icon icon-link"></span></a>consectetur & adipisicing</h3>
<h4 id="elit"><a aria-hidden="true" href="#elit"><span class="icon icon-link"></span></a>elit</h4>
<h5 id="elit-1"><a aria-hidden="true" href="#elit-1"><span class="icon icon-link"></span></a>elit</h5>
API
rehype().use(link[, options])
Add links to headings (h1-h6) with an id
.
Note: this plugin expects
id
s to already exist on headings. One way to add those automatically, isrehype-slug
(see example).
options
options.behavior
How to create links (string
, default: 'prepend'
).
'prepend'
— inject link before the heading text'append'
— inject link after the heading text'wrap'
— wrap the whole heading text with the link'before'
— insert link before the heading'after'
— insert link after the heading
Supplying wrap
will ignore any value defined by the content
option.
Supplying prepend
, append
, or wrap
will ignore the group
option.
options.properties
Extra properties to set on the link (Object?
).
Defaults to {ariaHidden: true, tabIndex: -1}
when in 'prepend'
or
'append'
mode.
options.content
hast nodes to insert in the link (Function|Node|Children
).
By default, the following is used:
{
type: 'element',
tagName: 'span',
properties: {className: ['icon', 'icon-link']},
children: []
}
If behavior
is wrap
, then content
is ignored.
If content
is a function, it’s called with the current heading (Element
) and
should return one or more nodes:
var toString = require('hast-util-to-string')
var h = require('hastscript')
// …
function content(node) {
return [
h('span.visually-hidden', 'Read the “', toString(node), '” section'),
h('span.icon.icon-link', {ariaHidden: true})
]
}
options.group
hast node to wrap the heading and link with (Function|Node
), if
behavior
is before
or after
.
There is no default.
If behavior
is prepend
, append
, or wrap
, then group
is ignored.
If group
is a function, it’s called with the current heading (Element
) and
should return a hast node.
var h = require('hastscript')
// …
function group(node) {
return h('.heading-' + node.charAt(1) + '-group')
}
Security
Use of rehype-autolink-headings
can open you up to a
cross-site scripting (XSS) attack if you pass user provided content in
properties
or content
.
Always be wary of user input and use rehype-sanitize
.
Related
rehype-slug
— Addid
s to headingsrehype-highlight
— Syntax highlight code blocksrehype-toc
— Add a table of contents (TOC)
Contribute
See contributing.md
in rehypejs/.github
for ways
to get started.
See support.md
for ways to get help.
This project has a code of conduct. By interacting with this repository, organization, or community you agree to abide by its terms.