New syntax to add attributes to Markdown.
34
stars
222
commits
TypeScript
primary language
Aug 4, 2026
updated
This plugin adds support for custom attributes in Markdown. Attributes can be added using HTML comment syntax, but they won’t appear in the preview, similar to remark-attr.
This package is ESM only: Node 12+ is needed to use it and it must be import instead of require.
npm install rehype-attr
LinksHTML Example<a href="https://github.com">github</a><!--rehype:rel=external&style=color:pink;&data-name=kenny-->
Output:
<a href="https://github.com" rel="external" style="color:pink;" data-name="kenny">github</a>
import { rehype } from 'rehype';
import rehypeAttrs from 'rehype-attr';
const htmlStr = rehype()
.data('settings', { fragment: true })
.use(rehypeAttrs, { properties: 'attr' })
.processSync(`<a href="https://github.com">github</a><!--rehype:rel=external-->`)
.toString()
Markdown Example[github](https://github.com)<!--rehype:rel=external-->
Output:
<p> <a href="https://github.com" rel="external">github</a> <!--rehype:rel=external--> </p>
import { unified } from 'unified';
import stringify from 'rehype-stringify';
import rehypeRaw from 'rehype-raw';
import remark2rehype from 'remark-rehype';
import remarkParse from 'remark-parse';
import rehypeAttrs from 'rehype-attr';
const htmlStr = unified()
.use(remarkParse)
.use(remark2rehype, { allowDangerousHtml: true })
.use(rehypeRaw)
.use(rehypeAttrs, { properties: 'attr' })
.use(stringify)
.processSync(`[github](https://github.com)<!--rehype:rel=external-->`)
.toString()
HeaderHTML Example<h1>This is a title</h1><!--rehype:style=color:pink;-->
Output:
<h1 style="color:pink;">This is a title</h1>
import { rehype } from 'rehype';
import rehypeAttrs from 'rehype-attr';
const htmlStr = rehype()
.data('settings', { fragment: true })
.use(rehypeAttrs, { properties: 'attr' })
.processSync(`<h1>This is a title</h1><!--rehype:style=color:pink;-->`)
.toString()
Markdown ExampleThis is a title
====
<!--rehype:style=color:pink;-->
Output:
<h1 style="color:pink;">This is a title</h1>
# This is a title
<!--rehype:style=color:pink;-->
Output:
<h1 style="color:pink;">This is a title</h1>
StrongHTML ExampleThis is a <strong>Unicorn</strong><!--rehype:style=color: grey-->
Output:
This is a <strong style="color: grey">Unicorn</strong>
Markdown ExampleThis is a **Unicorn**<!--rehype:style=color: grey-->
Output:
<p>This is a <strong style="color: grey">Unicorn</strong> <!--rehype:style=color: grey--></p>
EmphasisHTML ExampleNpm stand for <em>node</em><!--rehype:style=color: red--> packet manager.
Output:
Npm stand for <em style="color: red">node</em> packet manager.
Markdown ExampleNpm stand for *node* <!--rehype:style=color: red--> packet manager.
Output:
<p>Npm stand for <em style="color: red">node</em><!--rehype:style=color: red--> packet manager.</p>
Code<!--rehype:title=Rehype Attrs&abc=1&hello=2-->
\```js
console.log('')
\```
Output:
<pre data-type="rehyp"> <code class="language-js" data-config="[object Object]"> console.log('') </code> </pre>
Inlne CodeHTML ExampleThis is the <code>content</code><!--rehype:style=color:pink;-->
Output:
This is the <code style="color:pink;">content</code>
Markdown ExampleThis is the `content`<!--rehype:style=color:pink;-->
Output:
<p>This is the <code style="color:pink;">content</code><!--rehype:style=color:pink;--></p>
List- list
<!--rehype:style=width:100px;-->
Output:
<ul style="width:100px;"> <li>list</li> </ul> <!--rehype:style=width:100px;-->
HTML Exampleimport { rehype } from 'rehype';
import rehypeAttrs from 'rehype-attr';
const htmlStr = rehype()
.data('settings', { fragment: true })
.use(rehypeAttrs, { properties: 'attr' })
.processSync(`<a href="https://github.com">github</a><!--rehype:rel=external-->`)
.toString()
Output:
<h1 style="color:pink;">This is a title</h1>
Markdown Exampleimport { unified } from 'unified';
import stringify from 'rehype-stringify';
import rehypeRaw from 'rehype-raw';
import remarkParse from 'remark-parse';
import remark2rehype from 'remark-rehype';
import rehypeAttrs from 'rehype-attr';
const mrkStr = `[github](https://github.com)<!--rehype:rel=external-->`
const htmlStr = unified()
.use(remarkParse)
.use(remark2rehype, { allowDangerousHtml: true })
.use(rehypeRaw)
.use(rehypeAttrs, { properties: 'attr' })
.use(stringify)
.processSync(mrkStr)
.toString()
Output:
<p>
<a href="https://github.com" rel="external">github</a>
<!--rehype:rel=external-->
</p>
propertiesDefault Value:
data
Value:data,string,attr
codeBlockParamesCode block passing parameters
Default Value:
true
commentStartOptional start delimiter for comments @example \\{\\*
Default Value:
<!--
commentEndOptional end delimiter for comments @example \\*\\}
Default Value:
-->
rehype-video Add improved video syntax: links to .mp4 and .mov turn into videos.rehype-rewrite Rewrite element with rehype.rehype-ignore Ignore content display via HTML comments, Shown in GitHub readme, excluded in HTML.remark-github-blockquote-alert Remark plugin to add support for GitHub AlertAs always, thanks to our amazing contributors!
Made with github-action-contributors.
MIT © Kenny Wong
TypeScript
100.0%
New syntax to add attributes to Markdown.
34
stars
222
commits
TypeScript
primary language
Aug 4, 2026
updated
This plugin adds support for custom attributes in Markdown. Attributes can be added using HTML comment syntax, but they won’t appear in the preview, similar to remark-attr.
This package is ESM only: Node 12+ is needed to use it and it must be import instead of require.
npm install rehype-attr
LinksHTML Example<a href="https://github.com">github</a><!--rehype:rel=external&style=color:pink;&data-name=kenny-->
Output:
<a href="https://github.com" rel="external" style="color:pink;" data-name="kenny">github</a>
import { rehype } from 'rehype';
import rehypeAttrs from 'rehype-attr';
const htmlStr = rehype()
.data('settings', { fragment: true })
.use(rehypeAttrs, { properties: 'attr' })
.processSync(`<a href="https://github.com">github</a><!--rehype:rel=external-->`)
.toString()
Markdown Example[github](https://github.com)<!--rehype:rel=external-->
Output:
<p> <a href="https://github.com" rel="external">github</a> <!--rehype:rel=external--> </p>
import { unified } from 'unified';
import stringify from 'rehype-stringify';
import rehypeRaw from 'rehype-raw';
import remark2rehype from 'remark-rehype';
import remarkParse from 'remark-parse';
import rehypeAttrs from 'rehype-attr';
const htmlStr = unified()
.use(remarkParse)
.use(remark2rehype, { allowDangerousHtml: true })
.use(rehypeRaw)
.use(rehypeAttrs, { properties: 'attr' })
.use(stringify)
.processSync(`[github](https://github.com)<!--rehype:rel=external-->`)
.toString()
HeaderHTML Example<h1>This is a title</h1><!--rehype:style=color:pink;-->
Output:
<h1 style="color:pink;">This is a title</h1>
import { rehype } from 'rehype';
import rehypeAttrs from 'rehype-attr';
const htmlStr = rehype()
.data('settings', { fragment: true })
.use(rehypeAttrs, { properties: 'attr' })
.processSync(`<h1>This is a title</h1><!--rehype:style=color:pink;-->`)
.toString()
Markdown ExampleThis is a title
====
<!--rehype:style=color:pink;-->
Output:
<h1 style="color:pink;">This is a title</h1>
# This is a title
<!--rehype:style=color:pink;-->
Output:
<h1 style="color:pink;">This is a title</h1>
StrongHTML ExampleThis is a <strong>Unicorn</strong><!--rehype:style=color: grey-->
Output:
This is a <strong style="color: grey">Unicorn</strong>
Markdown ExampleThis is a **Unicorn**<!--rehype:style=color: grey-->
Output:
<p>This is a <strong style="color: grey">Unicorn</strong> <!--rehype:style=color: grey--></p>
EmphasisHTML ExampleNpm stand for <em>node</em><!--rehype:style=color: red--> packet manager.
Output:
Npm stand for <em style="color: red">node</em> packet manager.
Markdown ExampleNpm stand for *node* <!--rehype:style=color: red--> packet manager.
Output:
<p>Npm stand for <em style="color: red">node</em><!--rehype:style=color: red--> packet manager.</p>
Code<!--rehype:title=Rehype Attrs&abc=1&hello=2-->
\```js
console.log('')
\```
Output:
<pre data-type="rehyp"> <code class="language-js" data-config="[object Object]"> console.log('') </code> </pre>
Inlne CodeHTML ExampleThis is the <code>content</code><!--rehype:style=color:pink;-->
Output:
This is the <code style="color:pink;">content</code>
Markdown ExampleThis is the `content`<!--rehype:style=color:pink;-->
Output:
<p>This is the <code style="color:pink;">content</code><!--rehype:style=color:pink;--></p>
List- list
<!--rehype:style=width:100px;-->
Output:
<ul style="width:100px;"> <li>list</li> </ul> <!--rehype:style=width:100px;-->
HTML Exampleimport { rehype } from 'rehype';
import rehypeAttrs from 'rehype-attr';
const htmlStr = rehype()
.data('settings', { fragment: true })
.use(rehypeAttrs, { properties: 'attr' })
.processSync(`<a href="https://github.com">github</a><!--rehype:rel=external-->`)
.toString()
Output:
<h1 style="color:pink;">This is a title</h1>
Markdown Exampleimport { unified } from 'unified';
import stringify from 'rehype-stringify';
import rehypeRaw from 'rehype-raw';
import remarkParse from 'remark-parse';
import remark2rehype from 'remark-rehype';
import rehypeAttrs from 'rehype-attr';
const mrkStr = `[github](https://github.com)<!--rehype:rel=external-->`
const htmlStr = unified()
.use(remarkParse)
.use(remark2rehype, { allowDangerousHtml: true })
.use(rehypeRaw)
.use(rehypeAttrs, { properties: 'attr' })
.use(stringify)
.processSync(mrkStr)
.toString()
Output:
<p>
<a href="https://github.com" rel="external">github</a>
<!--rehype:rel=external-->
</p>
propertiesDefault Value:
data
Value:data,string,attr
codeBlockParamesCode block passing parameters
Default Value:
true
commentStartOptional start delimiter for comments @example \\{\\*
Default Value:
<!--
commentEndOptional end delimiter for comments @example \\*\\}
Default Value:
-->
rehype-video Add improved video syntax: links to .mp4 and .mov turn into videos.rehype-rewrite Rewrite element with rehype.rehype-ignore Ignore content display via HTML comments, Shown in GitHub readme, excluded in HTML.remark-github-blockquote-alert Remark plugin to add support for GitHub AlertAs always, thanks to our amazing contributors!
Made with github-action-contributors.
MIT © Kenny Wong
TypeScript
100.0%