mdast-util-gfm
mdast extensions to parse and serialize GFM (autolink literals, footnotes, strikethrough, tables, tasklists).
Contents
- What is this?
- When to use this
- Install
- Use
- API
- Syntax tree
- Types
- Compatibility
- Related
- Contribute
- License
What is this?
This package contains extensions for
mdast-util-from-markdown
and
mdast-util-to-markdown
to enable the features that
GitHub adds to markdown: autolink literals (www.x.com
), footnotes ([^1]
),
strikethrough (~~stuff~~
), tables (| cell |…
), and tasklists (* [x]
).
When to use this
These tools are all rather low-level.
In many cases, you’d want to use remark-gfm
with remark instead.
This project is useful when you want to support the same features that GitHub
does in files in a repo, Gists, and several other places.
Users frequently believe that some of these extensions, specifically autolink
literals and tables, are part of normal markdown, so using mdast-util-gfm
will
help match your implementation to their understanding of markdown.
There are several edge cases where GitHub’s implementation works in unexpected
ways or even different than described in their spec, so writing in GFM is not
always the best choice.
Instead of this package, you can also use the extensions separately:
syntax-tree/mdast-util-gfm-autolink-literal
— support GFM autolink literalssyntax-tree/mdast-util-gfm-footnote
— support GFM footnotessyntax-tree/mdast-util-gfm-strikethrough
— support GFM strikethroughsyntax-tree/mdast-util-gfm-table
— support GFM tablessyntax-tree/mdast-util-gfm-task-list-item
— support GFM tasklists
When working with mdast-util-from-markdown
, you must combine this package with
micromark-extension-gfm
.
A different utility, mdast-util-frontmatter
, adds
support for frontmatter.
GitHub supports YAML frontmatter for files in repos and Gists but they don’t
treat it as part of GFM.
This utility does not handle how markdown is turned to HTML.
That’s done by mdast-util-to-hast
.
If your content is not in English, you should configure that utility.
Install
This package is ESM only. In Node.js (version 12.20+, 14.14+, or 16.0+), install with npm:
npm install mdast-util-gfm
In Deno with esm.sh
:
import {gfmFromMarkdown, gfmToMarkdown} from 'https://esm.sh/mdast-util-gfm@2'
In browsers with esm.sh
:
<script type="module">
import {gfmFromMarkdown, gfmToMarkdown} from 'https://esm.sh/mdast-util-gfm@2?bundle'
</script>
Use
Say our document example.md
contains:
# GFM
## Autolink literals
www.example.com, https://example.com, and [email protected].
## Footnote
A note[^1]
[^1]: Big note.
## Strikethrough
~one~ or ~~two~~ tildes.
## Table
| a | b | c | d |
| - | :- | -: | :-: |
## Tasklist
* [ ] to do
* [x] done
…and our module example.js
looks as follows:
import fs from 'node:fs/promises'
import {fromMarkdown} from 'mdast-util-from-markdown'
import {toMarkdown} from 'mdast-util-to-markdown'
import {gfm} from 'micromark-extension-gfm'
import {gfmFromMarkdown, gfmToMarkdown} from 'mdast-util-gfm'
const doc = await fs.readFile('example.md')
const tree = fromMarkdown(doc, {
extensions: [gfm()],
mdastExtensions: [gfmFromMarkdown()]
})
console.log(tree)
const out = toMarkdown(tree, {extensions: [gfmToMarkdown()]})
console.log(out)
…now running node example.js
yields (positional info removed for brevity):
{
type: 'root',
children: [
{type: 'heading', depth: 1, children: [{type: 'text', value: 'GFM'}]},
{
type: 'heading',
depth: 2,
children: [{type: 'text', value: 'Autolink literals'}]
},
{
type: 'paragraph',
children: [
{
type: 'link',
title: null,
url: 'http://www.example.com',
children: [{type: 'text', value: 'www.example.com'}]
},
{type: 'text', value: ', '},
{
type: 'link',
title: null,
url: 'https://example.com',
children: [{type: 'text', value: 'https://example.com'}]
},
{type: 'text', value: ', and '},
{
type: 'link',
title: null,
url: 'mailto:[email protected]',
children: [{type: 'text', value: '[email protected]'}]
},
{type: 'text', value: '.'}
]
},
{type: 'heading', depth: 2, children: [{type: 'text', value: 'Footnote'}]},
{
type: 'paragraph',
children: [
{type: 'text', value: 'A note'},
{type: 'footnoteReference', identifier: '1', label: '1'}
]
},
{
type: 'footnoteDefinition',
identifier: '1',
label: '1',
children: [
{type: 'paragraph', children: [{type: 'text', value: 'Big note.'}]}
]
},
{
type: 'heading',
depth: 2,
children: [{type: 'text', value: 'Strikethrough'}]
},
{
type: 'paragraph',
children: [
{
type: 'delete',
children: [{type: 'text', value: 'one'}]
},
{type: 'text', value: ' or '},
{
type: 'delete',
children: [{type: 'text', value: 'two'}]
},
{type: 'text', value: ' tildes.'}
]
},
{type: 'heading', depth: 2, children: [{type: 'text', value: 'Table'}]},
{
type: 'table',
align: [null, 'left', 'right', 'center'],
children: [
{
type: 'tableRow',
children: [
{type: 'tableCell', children: [{type: 'text', value: 'a'}]},
{type: 'tableCell', children: [{type: 'text', value: 'b'}]},
{type: 'tableCell', children: [{type: 'text', value: 'c'}]},
{type: 'tableCell', children: [{type: 'text', value: 'd'}]}
]
}
]
},
{type: 'heading', depth: 2, children: [{type: 'text', value: 'Tasklist'}]},
{
type: 'list',
ordered: false,
start: null,
spread: false,
children: [
{
type: 'listItem',
spread: false,
checked: false,
children: [
{type: 'paragraph', children: [{type: 'text', value: 'to do'}]}
]
},
{
type: 'listItem',
spread: false,
checked: true,
children: [
{type: 'paragraph', children: [{type: 'text', value: 'done'}]}
]
}
]
}
]
}
# GFM
## Autolink literals
[www.example.com](http://www.example.com), <https://example.com>, and <[email protected]>.
## Footnote
A note[^1]
[^1]: Big note.
## Strikethrough
~~one~~ or ~~two~~ tildes.
## Table
| a | b | c | d |
| - | :- | -: | :-: |
## Tasklist
* [ ] to do
* [x] done
API
This package exports the identifiers gfmFromMarkdown
and gfmToMarkdown
.
There is no default export.
gfmFromMarkdown()
Function that can be called to get an extension for
mdast-util-from-markdown
.
gfmToMarkdown(options?)
Function that can be called to get an extension for
mdast-util-to-markdown
.
options
Configuration (optional).
Currently passes through tableCellPadding
, tablePipeAlign
, and
stringLength
to mdast-util-gfm-table
.
Syntax tree
This utility combines several mdast utilities. See their readmes for the node types supported in the tree:
syntax-tree/mdast-util-gfm-autolink-literal
— GFM autolink literalssyntax-tree/mdast-util-gfm-footnote
— GFM footnotessyntax-tree/mdast-util-gfm-strikethrough
— GFM strikethroughsyntax-tree/mdast-util-gfm-table
— GFM tablessyntax-tree/mdast-util-gfm-task-list-item
— GFM tasklists
Types
This package is fully typed with TypeScript.
It exports an Options
type, which specifies the interface of the accepted
options.
The Delete
, FootnoteDefinition
, FootnoteReference
, Table
, TableCell
,
and TableRow
node types are supported in @types/mdast
by default.
Compatibility
Projects maintained by the unified collective are compatible with all maintained versions of Node.js. As of now, that is Node.js 12.20+, 14.14+, and 16.0+. Our projects sometimes work with older versions, but this is not guaranteed.
This plugin works with mdast-util-from-markdown
version 1+ and
mdast-util-to-markdown
version 1+.
Related
remarkjs/remark-gfm
— remark plugin to support GFMmicromark/micromark-extension-gfm
— micromark extension to parse GFM
Contribute
See contributing.md
in syntax-tree/.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.