Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/remcohaszing/rehype-mermaid
A rehype plugin to render mermaid diagrams
https://github.com/remcohaszing/rehype-mermaid
mdx mermaid plugin rehype rehype-plugin remark unified
Last synced: 3 days ago
JSON representation
A rehype plugin to render mermaid diagrams
- Host: GitHub
- URL: https://github.com/remcohaszing/rehype-mermaid
- Owner: remcohaszing
- License: mit
- Created: 2023-05-04T13:21:13.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-10-08T18:52:33.000Z (2 months ago)
- Last Synced: 2024-11-29T08:58:37.447Z (15 days ago)
- Topics: mdx, mermaid, plugin, rehype, rehype-plugin, remark, unified
- Language: HTML
- Homepage:
- Size: 1.49 MB
- Stars: 89
- Watchers: 4
- Forks: 9
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# rehype-mermaid
[![github actions](https://github.com/remcohaszing/rehype-mermaid/actions/workflows/ci.yaml/badge.svg)](https://github.com/remcohaszing/rehype-mermaid/actions/workflows/ci.yaml)
[![codecov](https://codecov.io/gh/remcohaszing/rehype-mermaid/branch/main/graph/badge.svg)](https://codecov.io/gh/remcohaszing/rehype-mermaid)
[![npm version](https://img.shields.io/npm/v/rehype-mermaid)](https://www.npmjs.com/package/rehype-mermaid)
[![npm downloads](https://img.shields.io/npm/dm/rehype-mermaid)](https://www.npmjs.com/package/rehype-mermaid)A [rehype](https://rehype.js.org) plugin to render [mermaid](https://mermaid-js.github.io) diagrams.
## Table of Contents
- [Installation](#installation)
- [Usage](#usage)
- [`'img-png'`](#img-png)
- [`'img-svg'`](#img-svg)
- [`'inline-svg'`](#inline-svg)
- [`'pre-mermaid'`](#pre-mermaid)
- [API](#api)
- [`unified().use(rehypeMermaid, options?)`](#unifieduserehypemermaid-options)
- [Examples](#examples)
- [remark](#remark)
- [MDX](#mdx)
- [Compatibility](#compatibility)
- [Related Projects](#related-projects)
- [Contributing](#contributing)
- [Acknowledgements](#acknowledgements)
- [License](#license)## Installation
```sh
npm install rehype-mermaid
```Outside of browsers `rehype-mermaid` uses [Playwright](https://playwright.dev). If you use this
outside of a browser, you need to install Playwright and a Playwright browser.```sh
npm install playwright
npx playwright install --with-deps chromium
```See the Playwright [Browsers](https://playwright.dev/docs/browsers) documentation for more
information.## Usage
This plugin takes all `
` and `` elements, and
replaces them with a rendered version of the diagram. If the `` element is wrapped in a
`` element, the `` element is replaced as well. This is compatible with what Mermaid would
render client side, as well as the output of `mermaid` code blocks processed by
[`remark-rehype`](https://github.com/remarkjs/remark-rehype).The plugin has several rendering strategies described below.
Given a file named `index.html`:
```html
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
```
The following script:
```js
import { readFile } from 'node:fs/promises'import { rehype } from 'rehype'
import rehypeMermaid from 'rehype-mermaid'const { value } = await rehype()
.use(rehypeMermaid, {
// The default strategy is 'inline-svg'
// strategy: 'img-png'
// strategy: 'img-svg'
// strategy: 'inline-svg'
// strategy: 'pre-mermaid'
})
.process(await readFile('index.html'))console.log(value)
```Yields the following results, depending on the stragey used.
### `'img-png'`
This strategy renders a diagram as an `` element with an inline base64 PNG image. Given the
example, this yields:```html
```
This strategy is asynchronous.
This strategy supports the [`dark`](#dark) option.
### `'img-svg'`
This strategy renders a diagram as an `` element with an inline SVG image. Given the example,
this yields:```html
```
This strategy is asynchronous.
This strategy supports the [`dark`](#dark) option.
### `'inline-svg'`
This strategy renders a diagram as an inline `` element. Given the example, this yields:
```html
…
…
```
This strategy is asynchronous.
This strategy does not support the [`dark`](#dark) option.
### `'pre-mermaid'`
This strategy replaces the element with a `
` element with only the diagram as
its child. Given the example, this yields:```html
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
```
This allows Mermaid to render the diagram on the client side, for example using:
```js
import mermaid from 'mermaid'mermaid.initialize({ startOnLoad: true })
```This strategy is synchronous.
This strategy does not support the [`dark`](#dark) option.
## API
This package has a default export `rehypeMermaid`.
### `unified().use(rehypeMermaid, options?)`
#### `options`
##### `browser`
The Playwright browser to use. (`object`, default: chromium)
##### `colorScheme`
The default color scheme.
If not specified, `rehype-mermaid` will determine the color scheme based on the `color-scheme` meta
tag. If this doesn’t exist, the default color scheme is `light`. (`string`)##### `css`
A URL that points to a custom CSS file to load. Use this to load custom fonts. This option is
ignored in the browser. You need to include the CSS in your build manually. (`string` | `URL`)##### `dark`
If specified, add responsive dark mode using a `` element.
This option is only supported by the [`img-png`](#img-png) and [`img-svg`](#img-svg) strategies.
##### `errorFallback`
Create a fallback node if processing of a mermaid diagram fails. If nothing is returned, the code
block is removed. The function receives the following arguments:- `element` The hast element that could not be rendered.
- `diagram` The Mermaid diagram that could not be rendered as a string.
- `error`: The error that was thrown.
- `file`: The file on which the error occurred.##### `launchOptions`
The options used to launch the browser. (`object`)
##### `mermaidConfig`
A custom Mermaid configuration. By default `fontFamily` is set to `arial,sans-serif`. This option is
ignored in the browser. You need to call `mermaid.initialize()` manually. (`object`)##### `prefix`
A custom prefix to use for Mermaid IDs. (`string`, default: `mermaid`)
##### `strategy`
The render strategy to use. One of [`'img-png'`](#img-png), [`'img-svg'`](#img-svg),
[`'inline-svg'`](#inline-svg), or [`'pre-mermaid'`](#pre-mermaid). (default:
[`'inline-svg'`](#inline-svg))## Examples
### remark
This package works with Mermaid codeblocks in markdown using
[`remark-parse`](https://github.com/remarkjs/remark/tree/main/packages/remark-parse),
[`remark-rehype`](https://github.com/remarkjs/remark-rehype), and
[`rehype-stringify`](https://github.com/rehypejs/rehype/tree/main/packages/rehype-stringify).```js
import rehypeMermaid from 'rehype-mermaid'
import rehypeStringify from 'rehype-stringify'
import remarkParse from 'remark'
import remarkRehype from 'remark-rehype'
import { unified } from 'unified'const processor = unified()
.use(remarkParse)
.use(remarkRehype)
.use(rehypeMermaid)
.use(rehypeStringify)const markdown = `
# Mermaid Diagram\`\`\`mermaid
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
\`\`\`
`const { value } = await processor.process(markdown)
console.log(value)
```### MDX
This package works with Mermaid codeblocks in MDX.
```js
import { compile } from '@mdx-js/mdx'
import rehypeMermaid from 'rehype-mermaid'const mdx = `
# Mermaid Diagram\`\`\`mermaid
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
\`\`\`
`const { value } = await compile(mdx, {
rehypePlugins: [rehypeMermaid]
})console.log(value)
```## Compatibility
This project is compatible with Node.js 18 or greater. It’s compatible with `mermaid` code blocks
processed by [`remark-rehype`](https://github.com/remarkjs/remark-rehype). This means it’s also
compatible with [MDX](https://mdxjs.com).## Related Projects
- [`mermaid`](https://mermaid.js.org) is the library that’s used to render the diagrams.
- [`mermaid-isomorphic`](https://github.com/remcohaszing/mermaid-isomorphic) allows this package to
render Mermaid diagrams in both Node.js and the browser.
- [`rehype`](https://github.com/rehypejs/rehype) provides HTML processing using a
[unified](https://unifiedjs.com) pipeline.## Contributing
Test fixtures are generated and verified using Linux. Rendering on other platforms may yield
slightly different results. Don’t worry about adding new fixtures, but don’t update existing ones
that cause CI to fail. Furthermore see my global
[contributing guidelines](https://github.com/remcohaszing/.github/blob/main/CONTRIBUTING.md).## Acknowledgements
Thanks to [@bitekong](https://github.com/bitekong) for giving me the npm package name.
## License
[MIT](LICENSE.md) © [Remco Haszing](https://github.com/remcohaszing)