657 lines
21 KiB
Markdown
657 lines
21 KiB
Markdown
# micromark-extension-gfm-footnote
|
||
|
||
[![Build][build-badge]][build]
|
||
[![Coverage][coverage-badge]][coverage]
|
||
[![Downloads][downloads-badge]][downloads]
|
||
[![Size][size-badge]][size]
|
||
[![Sponsors][sponsors-badge]][collective]
|
||
[![Backers][backers-badge]][collective]
|
||
[![Chat][chat-badge]][chat]
|
||
|
||
[micromark][] extensions to support GFM [footnotes][post].
|
||
|
||
## Contents
|
||
|
||
* [What is this?](#what-is-this)
|
||
* [When to use this](#when-to-use-this)
|
||
* [Install](#install)
|
||
* [Use](#use)
|
||
* [API](#api)
|
||
* [`defaultBackLabel(referenceIndex, rereferenceIndex)`](#defaultbacklabelreferenceindex-rereferenceindex)
|
||
* [`gfmFootnote()`](#gfmfootnote)
|
||
* [`gfmFootnoteHtml(options?)`](#gfmfootnotehtmloptions)
|
||
* [`BackLabelTemplate`](#backlabeltemplate)
|
||
* [`HtmlOptions`](#htmloptions)
|
||
* [Bugs](#bugs)
|
||
* [Authoring](#authoring)
|
||
* [HTML](#html)
|
||
* [CSS](#css)
|
||
* [Syntax](#syntax)
|
||
* [Types](#types)
|
||
* [Compatibility](#compatibility)
|
||
* [Security](#security)
|
||
* [Related](#related)
|
||
* [Contribute](#contribute)
|
||
* [License](#license)
|
||
|
||
## What is this?
|
||
|
||
This package contains extensions that add support for footnotes as enabled by
|
||
GFM to [`micromark`][micromark].
|
||
|
||
GitHub announced footnotes [on September 30, 2021][post] but did not specify
|
||
them in their GFM spec.
|
||
As they are implemented in their parser and supported in all places where
|
||
other GFM features work, they can be considered part of GFM.
|
||
GitHub employs several other features (such as mentions or frontmatter) that
|
||
are either not in their parser, or not in all places where GFM features work,
|
||
which should not be considered GFM.
|
||
|
||
The implementation of footnotes on github.com is currently buggy.
|
||
The bugs have been reported on [`cmark-gfm`][cmark-gfm].
|
||
This micromark extension matches github.com except for its bugs.
|
||
|
||
## When to use this
|
||
|
||
This project is useful when you want to support footnotes in markdown.
|
||
|
||
You can use these extensions when you are working with [`micromark`][micromark].
|
||
To support all GFM features, use
|
||
[`micromark-extension-gfm`][micromark-extension-gfm] instead.
|
||
|
||
When you need a syntax tree, combine this package with
|
||
[`mdast-util-gfm-footnote`][mdast-util-gfm-footnote].
|
||
|
||
All these packages are used in [`remark-gfm`][remark-gfm], which focusses on
|
||
making it easier to transform content by abstracting these internals away.
|
||
|
||
## Install
|
||
|
||
This package is [ESM only][esm].
|
||
In Node.js (version 16+), install with [npm][]:
|
||
|
||
```sh
|
||
npm install micromark-extension-gfm-footnote
|
||
```
|
||
|
||
In Deno with [`esm.sh`][esmsh]:
|
||
|
||
```js
|
||
import {gfmFootnote, gfmFootnoteHtml} from 'https://esm.sh/micromark-extension-gfm-footnote@2'
|
||
```
|
||
|
||
In browsers with [`esm.sh`][esmsh]:
|
||
|
||
```html
|
||
<script type="module">
|
||
import {gfmFootnote, gfmFootnoteHtml} from 'https://esm.sh/micromark-extension-gfm-footnote@2?bundle'
|
||
</script>
|
||
```
|
||
|
||
## Use
|
||
|
||
Say our document `example.md` contains:
|
||
|
||
````markdown
|
||
Using footnotes is fun![^1] They let you reference relevant information without disrupting the flow of what you’re trying to say.[^bignote]
|
||
|
||
[^1]: This is the first footnote.
|
||
[^bignote]: Here’s one with multiple paragraphs and code.
|
||
|
||
Indent paragraphs to include them in the footnote.
|
||
|
||
```
|
||
my code
|
||
```
|
||
|
||
Add as many paragraphs as you like.
|
||
|
||
Text here and here and here.
|
||
[Learn more about markdown and footnotes in markdown](https://docs.github.com/en/github/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#footnotes)
|
||
````
|
||
|
||
…and our module `example.js` looks as follows:
|
||
|
||
```js
|
||
import fs from 'node:fs/promises'
|
||
import {micromark} from 'micromark'
|
||
import {gfmFootnote, gfmFootnoteHtml} from 'micromark-extension-gfm-footnote'
|
||
|
||
const output = micromark(await fs.readFile('example.md'), {
|
||
extensions: [gfmFootnote()],
|
||
htmlExtensions: [gfmFootnoteHtml()]
|
||
})
|
||
|
||
console.log(output)
|
||
```
|
||
|
||
…now running `node example.js` yields:
|
||
|
||
```html
|
||
<p>Using footnotes is fun!<sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref="" aria-describedby="footnote-label">1</a></sup> They let you reference relevant information without disrupting the flow of what you’re trying to say.<sup><a href="#user-content-fn-bignote" id="user-content-fnref-bignote" data-footnote-ref="" aria-describedby="footnote-label">2</a></sup></p>
|
||
<p>Text here and here and here.
|
||
<a href="https://docs.github.com/en/github/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#footnotes">Learn more about markdown and footnotes in markdown</a></p>
|
||
<section data-footnotes="" class="footnotes"><h2 id="footnote-label" class="sr-only">Footnotes</h2>
|
||
<ol>
|
||
<li id="user-content-fn-1">
|
||
<p>This is the first footnote. <a href="#user-content-fnref-1" data-footnote-backref="" class="data-footnote-backref" aria-label="Back to content">↩</a></p>
|
||
</li>
|
||
<li id="user-content-fn-bignote">
|
||
<p>Here’s one with multiple paragraphs and code.</p>
|
||
<p>Indent paragraphs to include them in the footnote.</p>
|
||
<pre><code>my code
|
||
</code></pre>
|
||
<p>Add as many paragraphs as you like. <a href="#user-content-fnref-bignote" data-footnote-backref="" class="data-footnote-backref" aria-label="Back to content">↩</a></p>
|
||
</li>
|
||
</ol>
|
||
</section>
|
||
```
|
||
|
||
## API
|
||
|
||
This package exports the identifiers
|
||
[`defaultBackLabel`][api-default-back-label],
|
||
[`gfmFootnote`][api-gfm-footnote], and
|
||
[`gfmFootnoteHtml`][api-gfm-footnote-html].
|
||
There is no default export.
|
||
|
||
The export map supports the [`development` condition][development].
|
||
Run `node --conditions development module.js` to get instrumented dev code.
|
||
Without this condition, production code is loaded.
|
||
|
||
### `defaultBackLabel(referenceIndex, rereferenceIndex)`
|
||
|
||
Generate the default label that GitHub uses on backreferences
|
||
([`BackLabelTemplate`][api-back-label-template]).
|
||
|
||
### `gfmFootnote()`
|
||
|
||
Create an extension for `micromark` to enable GFM footnote syntax.
|
||
|
||
###### Returns
|
||
|
||
Extension for `micromark` that can be passed in `extensions` to enable GFM
|
||
footnote syntax ([`Extension`][micromark-extension]).
|
||
|
||
### `gfmFootnoteHtml(options?)`
|
||
|
||
Create an extension for `micromark` to support GFM footnotes when serializing
|
||
to HTML.
|
||
|
||
###### Parameters
|
||
|
||
* `options` ([`HtmlOptions`][api-html-options], optional)
|
||
— configuration
|
||
|
||
###### Returns
|
||
|
||
Extension for `micromark` that can be passed in `htmlExtensions` to support GFM
|
||
footnotes when serializing to HTML
|
||
([`HtmlExtension`][micromark-html-extension]).
|
||
|
||
### `BackLabelTemplate`
|
||
|
||
Generate a back label dynamically (TypeScript type).
|
||
|
||
For the following markdown:
|
||
|
||
```markdown
|
||
Alpha[^micromark], bravo[^micromark], and charlie[^remark].
|
||
|
||
[^remark]: things about remark
|
||
[^micromark]: things about micromark
|
||
```
|
||
|
||
This function will be called with:
|
||
|
||
* `0` and `0` for the backreference from `things about micromark` to
|
||
`alpha`, as it is the first used definition, and the first call to it
|
||
* `0` and `1` for the backreference from `things about micromark` to
|
||
`bravo`, as it is the first used definition, and the second call to it
|
||
* `1` and `0` for the backreference from `things about remark` to
|
||
`charlie`, as it is the second used definition
|
||
|
||
###### Parameters
|
||
|
||
* `referenceIndex` (`number`)
|
||
— index of the definition in the order that they are first referenced,
|
||
0-indexed
|
||
* `rereferenceIndex` (`number`)
|
||
— index of calls to the same definition, 0-indexed
|
||
|
||
###### Returns
|
||
|
||
Back label to use when linking back from definitions to their reference
|
||
(`string`).
|
||
|
||
### `HtmlOptions`
|
||
|
||
Configuration (TypeScript type).
|
||
|
||
##### Fields
|
||
|
||
###### `clobberPrefix`
|
||
|
||
Prefix to use before the `id` attribute on footnotes to prevent them from
|
||
*clobbering* (`string`, default: `'user-content-'`).
|
||
|
||
Pass `''` for trusted markdown and when you are careful with polyfilling.
|
||
You could pass a different prefix.
|
||
|
||
DOM clobbering is this:
|
||
|
||
```html
|
||
<p id="x"></p>
|
||
<script>alert(x) // `x` now refers to the `p#x` DOM element</script>
|
||
```
|
||
|
||
The above example shows that elements are made available by browsers, by their
|
||
ID, on the `window` object.
|
||
This is a security risk because you might be expecting some other variable at
|
||
that place.
|
||
It can also break polyfills.
|
||
Using a prefix solves these problems.
|
||
|
||
###### `label`
|
||
|
||
Textual label to use for the footnotes section (`string`, default:
|
||
`'Footnotes'`).
|
||
|
||
Change it when the markdown is not in English.
|
||
|
||
This label is typically hidden visually (assuming a `sr-only` CSS class
|
||
is defined that does that) and so affects screen readers only.
|
||
|
||
###### `labelAttributes`
|
||
|
||
Attributes to use on the footnote label (`string`, default:
|
||
`'class="sr-only"'`).
|
||
|
||
Change it to show the label and add other attributes.
|
||
|
||
This label is typically hidden visually (assuming an `sr-only` CSS class
|
||
is defined that does that) and so affects screen readers only.
|
||
If you do have such a class, but want to show this section to everyone,
|
||
pass an empty string.
|
||
You can also add different attributes.
|
||
|
||
> 👉 **Note**: `id="footnote-label"` is always added, because footnote
|
||
> calls use it with `aria-describedby` to provide an accessible label.
|
||
|
||
###### `labelTagName`
|
||
|
||
HTML tag name to use for the footnote label element (`string`, default:
|
||
`'h2'`).
|
||
|
||
Change it to match your document structure.
|
||
|
||
This label is typically hidden visually (assuming a `sr-only` CSS class
|
||
is defined that does that) and so affects screen readers only.
|
||
|
||
###### `backLabel`
|
||
|
||
Textual label to describe the backreference back to footnote calls
|
||
([`BackLabelTemplate`][api-back-label-template] or `string`,
|
||
default: [`defaultBackLabel`][api-default-back-label]).
|
||
|
||
Change it when the markdown is not in English.
|
||
|
||
This label is used in the [`aria-label`][aria-label] attribute on each
|
||
backreference (the `↩` links).
|
||
It affects users of assistive technology.
|
||
|
||
## Bugs
|
||
|
||
GitHub’s own algorithm to parse footnote definitions contains several bugs.
|
||
These are not present in this project.
|
||
The issues relating to footnote definitions are:
|
||
|
||
* [Footnote reference call identifiers are trimmed, but definition
|
||
identifiers aren’t](https://github.com/github/cmark-gfm/issues/237)\
|
||
— initial and final whitespace in labels causes them not to match
|
||
* [Footnotes are matched case-insensitive, but links keep their casing,
|
||
breaking them](https://github.com/github/cmark-gfm/issues/239)\
|
||
— using uppercase (or any character that will be percent encoded) in
|
||
identifiers breaks links
|
||
* [Colons in footnotes generate links w/o
|
||
`href`](https://github.com/github/cmark-gfm/issues/250)\
|
||
— colons in identifiers generate broken links
|
||
* [Character escape of `]` does not work in footnote
|
||
identifiers](https://github.com/github/cmark-gfm/issues/240)\
|
||
— some character escapes don’t work
|
||
* [Footnotes in links are
|
||
broken](https://github.com/github/cmark-gfm/issues/249)\
|
||
— while `CommonMark` prevents links in links, GitHub does not prevent
|
||
footnotes (which turn into links) in links
|
||
* [Footnote-like brackets around image, break that
|
||
image](https://github.com/github/cmark-gfm/issues/275)\
|
||
— images can’t be used in what looks like a footnote call
|
||
* [GFM footnotes: line ending in footnote definition label causes text to
|
||
disappear](https://github.com/github/cmark-gfm/issues/282)\
|
||
— line endings in footnote definitions cause text to disappear
|
||
|
||
## Authoring
|
||
|
||
When authoring markdown with footnotes it’s recommended to use words instead
|
||
of numbers (or letters or anything with an order) as identifiers.
|
||
That makes it easier to reuse and reorder footnotes.
|
||
|
||
It’s recommended to place footnotes definitions at the bottom of the document.
|
||
|
||
## HTML
|
||
|
||
GFM footnotes do not, on their own, relate to anything in HTML.
|
||
When a footnote reference matches with a definition, they each relate to several
|
||
elements in HTML.
|
||
|
||
The reference relates to `<sup>` and `<a>` elements in HTML:
|
||
|
||
```html
|
||
<sup><a href="#user-content-fn-x" id="user-content-fnref-x" data-footnote-ref="" aria-describedby="footnote-label">1</a></sup></p>
|
||
```
|
||
|
||
…where `x` is the identifier used in the markdown source and `1` the number of
|
||
corresponding, listed, definition.
|
||
|
||
See [*§ 4.5.19 The `sub` and `sup` elements*][html-sup],
|
||
[*§ 4.5.1 The `a` element*][html-a], and
|
||
[*§ 3.2.6.6 Embedding custom non-visible data with the `data-*`
|
||
attributes*][html-data]
|
||
in the HTML spec, and
|
||
[*§ 6.8 `aria-describedby` property*][aria-describedby]
|
||
in WAI-ARIA, for more info.
|
||
|
||
When one or more definitions are referenced, a footnote section is generated at
|
||
the end of the document, using `<section>`, `<h2>`, and `<ol>` elements:
|
||
|
||
```html
|
||
<section data-footnotes="" class="footnotes"><h2 id="footnote-label" class="sr-only">Footnotes</h2>
|
||
<ol>…</ol>
|
||
</section>
|
||
```
|
||
|
||
Each definition is generated as a `<li>` in the `<ol>` in the order they were
|
||
first referenced:
|
||
|
||
```html
|
||
<li id="user-content-fn-1">…</li>
|
||
```
|
||
|
||
Backreferences are injected at the end of the first paragraph, or, when there
|
||
is no paragraph, at the end of the definition.
|
||
When a definition is referenced multiple times, multiple backreferences are
|
||
generated.
|
||
Further backreferences use an extra counter in the `href` attribute and
|
||
visually in a `<span>` after `↩`.
|
||
|
||
```html
|
||
<a href="#user-content-fnref-1" data-footnote-backref="" class="data-footnote-backref" aria-label="Back to content">↩</a> <a href="#user-content-fnref-1-2" data-footnote-backref="" class="data-footnote-backref" aria-label="Back to content">↩<sup>2</sup></a>
|
||
```
|
||
|
||
See
|
||
[*§ 4.5.1 The `a` element*][html-a],
|
||
[*§ 4.3.6 The `h1`, `h2`, `h3`, `h4`, `h5`, and `h6` elements*][html-h],
|
||
[*§ 4.4.8 The `li` element*][html-li],
|
||
[*§ 4.4.5 The `ol` element*][html-ol],
|
||
[*§ 4.4.1 The `p` element*][html-p],
|
||
[*§ 4.3.3 The `section` element*][html-section], and
|
||
[*§ 4.5.19 The `sub` and `sup` elements*][html-sup]
|
||
in the HTML spec, and
|
||
[*§ 6.8 `aria-label` property*][aria-label]
|
||
in WAI-ARIA, for more info.
|
||
|
||
## CSS
|
||
|
||
The following CSS is needed to make footnotes look a bit like GitHub (and fixes
|
||
a bug).
|
||
For the complete actual CSS see
|
||
[`sindresorhus/github-markdown-css`](https://github.com/sindresorhus/github-markdown-css).
|
||
|
||
```css
|
||
/* Style the footnotes section. */
|
||
.footnotes {
|
||
font-size: smaller;
|
||
color: #8b949e;
|
||
border-top: 1px solid #30363d;
|
||
}
|
||
|
||
/* Hide the section label for visual users. */
|
||
.sr-only {
|
||
position: absolute;
|
||
width: 1px;
|
||
height: 1px;
|
||
padding: 0;
|
||
overflow: hidden;
|
||
clip: rect(0, 0, 0, 0);
|
||
word-wrap: normal;
|
||
border: 0;
|
||
}
|
||
|
||
/* Place `[` and `]` around footnote references. */
|
||
[data-footnote-ref]::before {
|
||
content: '[';
|
||
}
|
||
|
||
[data-footnote-ref]::after {
|
||
content: ']';
|
||
}
|
||
```
|
||
|
||
## Syntax
|
||
|
||
Footnotes form with, roughly, the following BNF:
|
||
|
||
```bnf
|
||
gfm_footnote_reference ::= gfm_footnote_label
|
||
|
||
gfm_footnote_definition_start ::= gfm_footnote_label ':' *space_or_tab
|
||
; Restriction: blank line allowed.
|
||
gfm_footnote_definition_cont ::= 4(space_or_tab)
|
||
|
||
; Restriction: maximum `999` codes between `^` and `]`.
|
||
gfm_footnote_label ::= '[' '^' 1*(gfm_footnote_label_byte | gfm_footnote_label_escape) ']'
|
||
gfm_footnote_label_byte ::= text - '[' - '\\' - ']'
|
||
gfm_footnote_label_escape ::= '\\' ['[' | '\\' | ']']
|
||
|
||
; Any byte (u8)
|
||
byte ::= 0x00..=0xFFFF
|
||
space_or_tab ::= '\t' | ' '
|
||
eol ::= '\n' | '\r' | '\r\n'
|
||
line ::= byte - eol
|
||
text ::= line - space_or_tab
|
||
```
|
||
|
||
Further lines after `gfm_footnote_definition_start` that are not prefixed with
|
||
`gfm_footnote_definition_cont` cause the footnote definition to be exited,
|
||
except when those lines are lazy continuation or blank.
|
||
Like so many things in markdown, footnote definition too are complex.
|
||
See [*§ Phase 1: block structure* in `CommonMark`][commonmark-block] for more
|
||
on parsing details.
|
||
|
||
The identifiers in the `label` parts are interpreted as the
|
||
[string][micromark-content-types] content type.
|
||
That means that character escapes and character references are allowed.
|
||
|
||
Definitions match to references through identifiers.
|
||
To match, both labels must be equal after normalizing with
|
||
[`normalizeIdentifier`][micromark-normalize-identifier].
|
||
One definition can match to multiple calls.
|
||
Multiple definitions with the same, normalized, identifier are ignored: the
|
||
first definition is preferred.
|
||
To illustrate, the definition with the content of `x` wins:
|
||
|
||
```markdown
|
||
[^a]: x
|
||
[^a]: y
|
||
|
||
[^a]
|
||
```
|
||
|
||
Importantly, while labels *can* include [string][micromark-content-types]
|
||
content (character escapes and character references), these are not considered
|
||
when matching.
|
||
To illustrate, neither definition matches the reference:
|
||
|
||
```markdown
|
||
[^a&b]: x
|
||
[^a\&b]: y
|
||
|
||
[^a&b]
|
||
```
|
||
|
||
Because footnote definitions are containers (like block quotes and list items),
|
||
they can contain more footnote definitions.
|
||
They can even include references to themselves.
|
||
|
||
## Types
|
||
|
||
This package is fully typed with [TypeScript][].
|
||
It exports the additional types [`BackLabelTemplate`][api-back-label-template]
|
||
and [`HtmlOptions`][api-html-options].
|
||
|
||
## Compatibility
|
||
|
||
Projects maintained by the unified collective are compatible with maintained
|
||
versions of Node.js.
|
||
|
||
When we cut a new major release, we drop support for unmaintained versions of
|
||
Node.
|
||
This means we try to keep the current release line,
|
||
`micromark-extension-gfm-footnote@^2`, compatible with Node.js 16.
|
||
|
||
This package works with `micromark` version `3` and later.
|
||
|
||
## Security
|
||
|
||
This package is safe.
|
||
Setting `clobberPrefix = ''` is dangerous, it opens you up to DOM clobbering.
|
||
The `labelTagName` and `labelAttributes` options are unsafe when used with user
|
||
content, they allow defining arbitrary HTML.
|
||
|
||
## Related
|
||
|
||
* [`micromark-extension-gfm`][micromark-extension-gfm]
|
||
— support all of GFM
|
||
* [`mdast-util-gfm-footnote`][mdast-util-gfm-footnote]
|
||
— support all of GFM in mdast
|
||
* [`mdast-util-gfm`][mdast-util-gfm]
|
||
— support all of GFM in mdast
|
||
* [`remark-gfm`][remark-gfm]
|
||
— support all of GFM in remark
|
||
|
||
## Contribute
|
||
|
||
See [`contributing.md` in `micromark/.github`][contributing] for ways to get
|
||
started.
|
||
See [`support.md`][support] for ways to get help.
|
||
|
||
This project has a [code of conduct][coc].
|
||
By interacting with this repository, organization, or community you agree to
|
||
abide by its terms.
|
||
|
||
## License
|
||
|
||
[MIT][license] © [Titus Wormer][author]
|
||
|
||
<!-- Definitions -->
|
||
|
||
[build-badge]: https://github.com/micromark/micromark-extension-gfm-footnote/workflows/main/badge.svg
|
||
|
||
[build]: https://github.com/micromark/micromark-extension-gfm-footnote/actions
|
||
|
||
[coverage-badge]: https://img.shields.io/codecov/c/github/micromark/micromark-extension-gfm-footnote.svg
|
||
|
||
[coverage]: https://codecov.io/github/micromark/micromark-extension-gfm-footnote
|
||
|
||
[downloads-badge]: https://img.shields.io/npm/dm/micromark-extension-gfm-footnote.svg
|
||
|
||
[downloads]: https://www.npmjs.com/package/micromark-extension-gfm-footnote
|
||
|
||
[size-badge]: https://img.shields.io/badge/dynamic/json?label=minzipped%20size&query=$.size.compressedSize&url=https://deno.bundlejs.com/?q=micromark-extension-gfm-footnote
|
||
|
||
[size]: https://bundlejs.com/?q=micromark-extension-gfm-footnote
|
||
|
||
[sponsors-badge]: https://opencollective.com/unified/sponsors/badge.svg
|
||
|
||
[backers-badge]: https://opencollective.com/unified/backers/badge.svg
|
||
|
||
[collective]: https://opencollective.com/unified
|
||
|
||
[chat-badge]: https://img.shields.io/badge/chat-discussions-success.svg
|
||
|
||
[chat]: https://github.com/micromark/micromark/discussions
|
||
|
||
[npm]: https://docs.npmjs.com/cli/install
|
||
|
||
[esmsh]: https://esm.sh
|
||
|
||
[license]: license
|
||
|
||
[author]: https://wooorm.com
|
||
|
||
[contributing]: https://github.com/micromark/.github/blob/main/contributing.md
|
||
|
||
[support]: https://github.com/micromark/.github/blob/main/support.md
|
||
|
||
[coc]: https://github.com/micromark/.github/blob/main/code-of-conduct.md
|
||
|
||
[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c
|
||
|
||
[typescript]: https://www.typescriptlang.org
|
||
|
||
[development]: https://nodejs.org/api/packages.html#packages_resolving_user_conditions
|
||
|
||
[micromark]: https://github.com/micromark/micromark
|
||
|
||
[micromark-content-types]: https://github.com/micromark/micromark#content-types
|
||
|
||
[micromark-extension]: https://github.com/micromark/micromark#syntaxextension
|
||
|
||
[micromark-html-extension]: https://github.com/micromark/micromark#htmlextension
|
||
|
||
[micromark-normalize-identifier]: https://github.com/micromark/micromark/tree/main/packages/micromark-util-normalize-identifier
|
||
|
||
[micromark-extension-gfm]: https://github.com/micromark/micromark-extension-gfm
|
||
|
||
[mdast-util-gfm-footnote]: https://github.com/syntax-tree/mdast-util-gfm-footnote
|
||
|
||
[mdast-util-gfm]: https://github.com/syntax-tree/mdast-util-gfm
|
||
|
||
[remark-gfm]: https://github.com/remarkjs/remark-gfm
|
||
|
||
[post]: https://github.blog/changelog/2021-09-30-footnotes-now-supported-in-markdown-fields/
|
||
|
||
[cmark-gfm]: https://github.com/github/cmark-gfm
|
||
|
||
[commonmark-block]: https://spec.commonmark.org/0.30/#phase-1-block-structure
|
||
|
||
[html-a]: https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element
|
||
|
||
[html-data]: https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes
|
||
|
||
[html-h]: https://html.spec.whatwg.org/multipage/sections.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements
|
||
|
||
[html-li]: https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element
|
||
|
||
[html-ol]: https://html.spec.whatwg.org/multipage/grouping-content.html#the-ol-element
|
||
|
||
[html-p]: https://html.spec.whatwg.org/multipage/grouping-content.html#the-p-element
|
||
|
||
[html-section]: https://html.spec.whatwg.org/multipage/sections.html#the-section-element
|
||
|
||
[html-sup]: https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-sub-and-sup-elements
|
||
|
||
[aria-describedby]: https://w3c.github.io/aria/#aria-describedby
|
||
|
||
[aria-label]: https://w3c.github.io/aria/#aria-label
|
||
|
||
[api-gfm-footnote]: #gfmfootnote
|
||
|
||
[api-gfm-footnote-html]: #gfmfootnotehtmloptions
|
||
|
||
[api-html-options]: #htmloptions
|
||
|
||
[api-default-back-label]: #defaultbacklabelreferenceindex-rereferenceindex
|
||
|
||
[api-back-label-template]: #backlabeltemplate
|