# mdast
**Repository Path**: stlstl/mdast
## Basic Information
- **Project Name**: mdast
- **Description**: Markdown Abstract Syntax Tree format
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-10-17
- **Last Updated**: 2025-03-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ![mdast][logo]
**M**ark**d**own **A**bstract **S**yntax **T**ree.
* * *
**mdast** is a specification for representing Markdown in a [syntax
tree][syntax-tree].
It implements the [**unist**][unist] spec.
It can represent several flavours of [Markdown][], such as [CommonMark][],
and [GitHub Flavored Markdown][gfm] extensions.
This document may not be released.
See [releases][] for released documents.
The latest released version is [`3.0.0`][latest].
## Contents
* [Introduction](#introduction)
* [Where this specification fits](#where-this-specification-fits)
* [Nodes](#nodes)
* [`Parent`](#parent)
* [`Literal`](#literal)
* [`Root`](#root)
* [`Paragraph`](#paragraph)
* [`Heading`](#heading)
* [`ThematicBreak`](#thematicbreak)
* [`Blockquote`](#blockquote)
* [`List`](#list)
* [`ListItem`](#listitem)
* [`Table`](#table)
* [`TableRow`](#tablerow)
* [`TableCell`](#tablecell)
* [`HTML`](#html)
* [`Code`](#code)
* [`YAML`](#yaml)
* [`Definition`](#definition)
* [`FootnoteDefinition`](#footnotedefinition)
* [`Text`](#text)
* [`Emphasis`](#emphasis)
* [`Strong`](#strong)
* [`Delete`](#delete)
* [`InlineCode`](#inlinecode)
* [`Break`](#break)
* [`Link`](#link)
* [`Image`](#image)
* [`LinkReference`](#linkreference)
* [`ImageReference`](#imagereference)
* [`Footnote`](#footnote)
* [`FootnoteReference`](#footnotereference)
* [Mixin](#mixin)
* [`Resource`](#resource)
* [`Association`](#association)
* [`Reference`](#reference)
* [`Alternative`](#alternative)
* [Enumeration](#enumeration)
* [`alignType`](#aligntype)
* [`referenceType`](#referencetype)
* [`Content`](#content)
* [`TopLevelContent`](#toplevelcontent)
* [`BlockContent`](#blockcontent)
* [`FrontmatterContent`](#frontmattercontent)
* [`DefinitionContent`](#definitioncontent)
* [`ListContent`](#listcontent)
* [`TableContent`](#tablecontent)
* [`RowContent`](#rowcontent)
* [`PhrasingContent`](#phrasingcontent)
* [`StaticPhrasingContent`](#staticphrasingcontent)
* [Glossary](#glossary)
* [List of utilities](#list-of-utilities)
* [References](#references)
* [Security](#security)
* [Related](#related)
* [Contribute](#contribute)
* [Acknowledgments](#acknowledgments)
* [License](#license)
## Introduction
This document defines a format for representing [Markdown][] as an [abstract
syntax tree][syntax-tree].
Development of mdast started in July 2014, in [**remark**][remark], before
[unist][] existed.
This specification is written in a [Web IDL][webidl]-like grammar.
### Where this specification fits
mdast extends [unist][], a format for syntax trees, to benefit from its
[ecosystem of utilities][utilities].
mdast relates to [JavaScript][] in that it has a rich [ecosystem of
utilities][list-of-utilities] for working with compliant syntax trees in
JavaScript.
However, mdast is not limited to JavaScript and can be used in other programming
languages.
mdast relates to the [unified][] and [remark][] projects in that mdast syntax
trees are used throughout their ecosystems.
## Nodes
### `Parent`
```idl
interface Parent <: UnistParent {
children: [Content]
}
```
**Parent** ([**UnistParent**][dfn-unist-parent]) represents a node in mdast
containing other nodes (said to be [*children*][term-child]).
Its content is limited to only other mdast [**content**][dfn-content].
### `Literal`
```idl
interface Literal <: UnistLiteral {
value: string
}
```
**Literal** ([**UnistLiteral**][dfn-unist-literal]) represents a node in mdast
containing a value.
Its `value` field is a `string`.
### `Root`
```idl
interface Root <: Parent {
type: "root"
}
```
**Root** ([**Parent**][dfn-parent]) represents a document.
**Root** can be used as the [*root*][term-root] of a [*tree*][term-tree], never
as a [*child*][term-child].
Its content model is not limited to [**top-level**][dfn-top-level-content]
content, but can contain any [**content**][dfn-content] with the restriction
that all content must be of the same category.
### `Paragraph`
```idl
interface Paragraph <: Parent {
type: "paragraph"
children: [PhrasingContent]
}
```
**Paragraph** ([**Parent**][dfn-parent]) represents a unit of discourse dealing
with a particular point or idea.
**Paragraph** can be used where [**block**][dfn-block-content] content is
expected.
Its content model is [**phrasing**][dfn-phrasing-content] content.
For example, the following Markdown:
```markdown
Alpha bravo charlie.
```
Yields:
```js
{
type: 'paragraph',
children: [{type: 'text', value: 'Alpha bravo charlie.'}]
}
```
### `Heading`
```idl
interface Heading <: Parent {
type: "heading"
depth: 1 <= number <= 6
children: [PhrasingContent]
}
```
**Heading** ([**Parent**][dfn-parent]) represents a heading of a section.
**Heading** can be used where [**block**][dfn-block-content] content is
expected.
Its content model is [**phrasing**][dfn-phrasing-content] content.
A `depth` field must be present.
A value of `1` is said to be the highest rank and `6` the lowest.
For example, the following Markdown:
```markdown
# Alpha
```
Yields:
```js
{
type: 'heading',
depth: 1,
children: [{type: 'text', value: 'Alpha'}]
}
```
### `ThematicBreak`
```idl
interface ThematicBreak <: Node {
type: "thematicBreak"
}
```
**ThematicBreak** ([**Node**][dfn-node]) represents a thematic break, such as a
scene change in a story, a transition to another topic, or a new document.
**ThematicBreak** can be used where [**block**][dfn-block-content] content is
expected.
It has no content model.
For example, the following Markdown:
```markdown
***
```
Yields:
```js
{type: 'thematicBreak'}
```
### `Blockquote`
```idl
interface Blockquote <: Parent {
type: "blockquote"
children: [BlockContent]
}
```
**Blockquote** ([**Parent**][dfn-parent]) represents a section quoted from
somewhere else.
**Blockquote** can be used where [**block**][dfn-block-content] content is
expected.
Its content model is also [**block**][dfn-block-content] content.
For example, the following Markdown:
```markdown
> Alpha bravo charlie.
```
Yields:
```js
{
type: 'blockquote',
children: [{
type: 'paragraph',
children: [{type: 'text', value: 'Alpha bravo charlie.'}]
}]
}
```
### `List`
```idl
interface List <: Parent {
type: "list"
ordered: boolean?
start: number?
spread: boolean?
children: [ListContent]
}
```
**List** ([**Parent**][dfn-parent]) represents a list of items.
**List** can be used where [**block**][dfn-block-content] content is expected.
Its content model is [**list**][dfn-list-content] content.
An `ordered` field can be present.
It represents that the items have been intentionally ordered (when `true`), or
that the order of items is not important (when `false` or not present).
A `start` field can be present.
It represents, when the `ordered` field is `true`, the starting number of the
list.
A `spread` field can be present.
It represents that one or more of its children are separated with a blank line
from its [siblings][term-sibling] (when `true`), or not (when `false` or not
present).
For example, the following Markdown:
```markdown
1. [x] foo
```
Yields:
```js
{
type: 'list',
ordered: true,
start: 1,
spread: false,
children: [{
type: 'listItem',
checked: true,
spread: false,
children: [{
type: 'paragraph',
children: [{type: 'text', value: 'foo'}]
}]
}]
}
```
### `ListItem`
```idl
interface ListItem <: Parent {
type: "listItem"
checked: boolean?
spread: boolean?
children: [BlockContent]
}
```
**ListItem** ([**Parent**][dfn-parent]) represents an item in a
[**List**][dfn-list].
**ListItem** can be used where [**list**][dfn-list-content] content is expected.
Its content model is [**block**][dfn-block-content] content.
A `checked` field can be present.
It represents whether the item is done (when `true`), not done (when `false`),
or indeterminate or not applicable (when `null` or not present).
A `spread` field can be present.
It represents that the item contains two or more [*children*][term-child]
separated by a blank line (when `true`), or not (when `false` or not present).
For example, the following Markdown:
```markdown
* [x] bar
```
Yields:
```js
{
type: 'listItem',
checked: true,
spread: false,
children: [{
type: 'paragraph',
children: [{type: 'text', value: 'bar'}]
}]
}
```
### `Table`
```idl
interface Table <: Parent {
type: "table"
align: [alignType]?
children: [TableContent]
}
```
**Table** ([**Parent**][dfn-parent]) represents two-dimensional data.
**Table** can be used where [**block**][dfn-block-content] content is expected.
Its content model is [**table**][dfn-table-content] content.
The [*head*][term-head] of the node represents the labels of the columns.
An `align` field can be present.
If present, it must be a list of [**alignType**s][dfn-enum-align-type].
It represents how cells in columns are aligned.
For example, the following Markdown:
```markdown
| foo | bar |
| :-- | :-: |
| baz | qux |
```
Yields:
```js
{
type: 'table',
align: ['left', 'center'],
children: [
{
type: 'tableRow',
children: [
{
type: 'tableCell',
children: [{type: 'text', value: 'foo'}]
},
{
type: 'tableCell',
children: [{type: 'text', value: 'bar'}]
}
]
},
{
type: 'tableRow',
children: [
{
type: 'tableCell',
children: [{type: 'text', value: 'baz'}]
},
{
type: 'tableCell',
children: [{type: 'text', value: 'qux'}]
}
]
}
]
}
```
### `TableRow`
```idl
interface TableRow <: Parent {
type: "tableRow"
children: [RowContent]
}
```
**TableRow** ([**Parent**][dfn-parent]) represents a row of cells in a table.
**TableRow** can be used where [**table**][dfn-table-content] content is
expected.
Its content model is [**row**][dfn-row-content] content.
If the node is a [*head*][term-head], it represents the labels of the columns
for its parent [**Table**][dfn-table].
For an example, see [**Table**][dfn-table].
### `TableCell`
```idl
interface TableCell <: Parent {
type: "tableCell"
children: [PhrasingContent]
}
```
**TableCell** ([**Parent**][dfn-parent]) represents a header cell in a
[**Table**][dfn-table], if its parent is a [*head*][term-head], or a data
cell otherwise.
**TableCell** can be used where [**row**][dfn-row-content] content is expected.
Its content model is [**phrasing**][dfn-phrasing-content] content excluding
[**Break**][dfn-break] nodes.
For an example, see [**Table**][dfn-table].
### `HTML`
```idl
interface HTML <: Literal {
type: "html"
}
```
**HTML** ([**Literal**][dfn-literal]) represents a fragment of raw [HTML][].
**HTML** can be used where [**block**][dfn-block-content] or
[**phrasing**][dfn-phrasing-content] content is expected.
Its content is represented by its `value` field.
HTML nodes do not have the restriction of being valid or complete HTML
([\[HTML\]][html]) constructs.
For example, the following Markdown:
```markdown
```
Yields:
```js
{type: 'html', value: '
'}
```
### `Code`
```idl
interface Code <: Literal {
type: "code"
lang: string?
meta: string?
}
```
**Code** ([**Literal**][dfn-literal]) represents a block of preformatted text,
such as ASCII art or computer code.
**Code** can be used where [**block**][dfn-block-content] content is expected.
Its content is represented by its `value` field.
This node relates to the [**phrasing**][dfn-phrasing-content] content concept
[**InlineCode**][dfn-inline-code].
A `lang` field can be present.
It represents the language of computer code being marked up.
If the `lang` field is present, a `meta` field can be present.
It represents custom information relating to the node.
For example, the following Markdown:
```markdown
foo()
```
Yields:
```js
{
type: 'code',
lang: null,
meta: null,
value: 'foo()'
}
```
And the following Markdown:
````markdown
```js highlight-line="2"
foo()
bar()
baz()
```
````
Yields:
```js
{
type: 'code',
lang: 'javascript',
meta: 'highlight-line="2"',
value: 'foo()\nbar()\nbaz()'
}
```
### `YAML`
```idl
interface YAML <: Literal {
type: "yaml"
}
```
**YAML** ([**Literal**][dfn-literal]) represents a collection of metadata for
the document in the YAML ([\[YAML\]][yaml]) data serialisation language.
**YAML** can be used where [**frontmatter**][dfn-frontmatter-content] content is
expected.
Its content is represented by its `value` field.
For example, the following Markdown:
```markdown
---
foo: bar
---
```
Yields:
```js
{type: 'yaml', value: 'foo: bar'}
```
### `Definition`
```idl
interface Definition <: Node {
type: "definition"
}
Definition includes Association
Definition includes Resource
```
**Definition** ([**Node**][dfn-node]) represents a resource.
**Definition** can be used where [**definition**][dfn-definition-content]
content is expected.
It has no content model.
**Definition** includes the mixins [**Association**][dfn-mxn-association] and
[**Resource**][dfn-mxn-resource].
**Definition** should be associated with
[**LinkReferences**][dfn-link-reference] and
[**ImageReferences**][dfn-image-reference].
For example, the following Markdown:
```markdown
[Alpha]: https://example.com
```
Yields:
```js
{
type: 'definition',
identifier: 'alpha',
label: 'Alpha',
url: 'https://example.com',
title: null
}
```
### `FootnoteDefinition`
```idl
interface FootnoteDefinition <: Parent {
type: "footnoteDefinition"
children: [BlockContent]
}
FootnoteDefinition includes Association
```
**FootnoteDefinition** ([**Parent**][dfn-parent]) represents content relating
to the document that is outside its flow.
**FootnoteDefinition** can be used where
[**definition**][dfn-definition-content] content is expected.
Its content model is [**block**][dfn-block-content] content.
**FootnoteDefinition** includes the mixin
[**Association**][dfn-mxn-association].
**FootnoteDefinition** should be associated with
[**FootnoteReferences**][dfn-footnote-reference].
For example, the following Markdown:
```markdown
[^alpha]: bravo and charlie.
```
Yields:
```js
{
type: 'footnoteDefinition',
identifier: 'alpha',
label: 'alpha',
children: [{
type: 'paragraph',
children: [{type: 'text', value: 'bravo and charlie.'}]
}]
}
```
### `Text`
```idl
interface Text <: Literal {
type: "text"
}
```
**Text** ([**Literal**][dfn-literal]) represents everything that is just text.
**Text** can be used where [**phrasing**][dfn-phrasing-content] content is
expected.
Its content is represented by its `value` field.
For example, the following Markdown:
```markdown
Alpha bravo charlie.
```
Yields:
```js
{type: 'text', value: 'Alpha bravo charlie.'}
```
### `Emphasis`
```idl
interface Emphasis <: Parent {
type: "emphasis"
children: [PhrasingContent]
}
```
**Emphasis** ([**Parent**][dfn-parent]) represents stress emphasis of its
contents.
**Emphasis** can be used where [**phrasing**][dfn-phrasing-content] content is
expected.
Its content model is also [**phrasing**][dfn-phrasing-content] content.
For example, the following Markdown:
```markdown
*alpha* _bravo_
```
Yields:
```js
{
type: 'paragraph',
children: [
{
type: 'emphasis',
children: [{type: 'text', value: 'alpha'}]
},
{type: 'text', value: ' '},
{
type: 'emphasis',
children: [{type: 'text', value: 'bravo'}]
}
]
}
```
### `Strong`
```idl
interface Strong <: Parent {
type: "strong"
children: [PhrasingContent]
}
```
**Strong** ([**Parent**][dfn-parent]) represents strong importance, seriousness,
or urgency for its contents.
**Strong** can be used where [**phrasing**][dfn-phrasing-content] content is
expected.
Its content model is also [**phrasing**][dfn-phrasing-content] content.
For example, the following Markdown:
```markdown
**alpha** __bravo__
```
Yields:
```js
{
type: 'paragraph',
children: [
{
type: 'strong',
children: [{type: 'text', value: 'alpha'}]
},
{type: 'text', value: ' '},
{
type: 'strong',
children: [{type: 'text', value: 'bravo'}]
}
]
}
```
### `Delete`
```idl
interface Delete <: Parent {
type: "delete"
children: [PhrasingContent]
}
```
**Delete** ([**Parent**][dfn-parent]) represents contents that are no longer
accurate or no longer relevant.
**Delete** can be used where [**phrasing**][dfn-phrasing-content] content is
expected.
Its content model is also [**phrasing**][dfn-phrasing-content] content.
For example, the following Markdown:
```markdown
~~alpha~~
```
Yields:
```js
{
type: 'delete',
children: [{type: 'text', value: 'alpha'}]
}
```
### `InlineCode`
```idl
interface InlineCode <: Literal {
type: "inlineCode"
}
```
**InlineCode** ([**Literal**][dfn-literal]) represents a fragment of computer
code, such as a file name, computer program, or anything a computer could parse.
**InlineCode** can be used where [**phrasing**][dfn-phrasing-content] content
is expected.
Its content is represented by its `value` field.
This node relates to the [**block**][dfn-block-content] content concept
[**Code**][dfn-code].
For example, the following Markdown:
```markdown
`foo()`
```
Yields:
```js
{type: 'inlineCode', value: 'foo()'}
```
### `Break`
```idl
interface Break <: Node {
type: "break"
}
```
**Break** ([**Node**][dfn-node]) represents a line break, such as in poems or
addresses.
**Break** can be used where [**phrasing**][dfn-phrasing-content] content is
expected.
It has no content model.
For example, the following Markdown:
```markdown
foo··
bar
```
Yields:
```js
{
type: 'paragraph',
children: [
{type: 'text', value: 'foo'},
{type: 'break'},
{type: 'text', value: 'bar'}
]
}
```
### `Link`
```idl
interface Link <: Parent {
type: "link"
children: [StaticPhrasingContent]
}
Link includes Resource
```
**Link** ([**Parent**][dfn-parent]) represents a hyperlink.
**Link** can be used where [**phrasing**][dfn-phrasing-content] content is
expected.
Its content model is [**static phrasing**][dfn-static-phrasing-content] content.
**Link** includes the mixin [**Resource**][dfn-mxn-resource].
For example, the following Markdown:
```markdown
[alpha](https://example.com "bravo")
```
Yields:
```js
{
type: 'link',
url: 'https://example.com',
title: 'bravo',
children: [{type: 'text', value: 'alpha'}]
}
```
### `Image`
```idl
interface Image <: Node {
type: "image"
}
Image includes Resource
Image includes Alternative
```
**Image** ([**Node**][dfn-node]) represents an image.
**Image** can be used where [**phrasing**][dfn-phrasing-content] content is
expected.
It has no content model, but is described by its `alt` field.
**Image** includes the mixins [**Resource**][dfn-mxn-resource] and
[**Alternative**][dfn-mxn-alternative].
For example, the following Markdown:
```markdown

```
Yields:
```js
{
type: 'image',
url: 'https://example.com/favicon.ico',
title: 'bravo',
alt: 'alpha'
}
```
### `LinkReference`
```idl
interface LinkReference <: Parent {
type: "linkReference"
children: [StaticPhrasingContent]
}
LinkReference includes Reference
```
**LinkReference** ([**Parent**][dfn-parent]) represents a hyperlink through
association, or its original source if there is no association.
**LinkReference** can be used where [**phrasing**][dfn-phrasing-content] content
is expected.
Its content model is [**static phrasing**][dfn-static-phrasing-content] content.
**LinkReference** includes the mixin [**Reference**][dfn-mxn-reference].
**LinkReferences** should be associated with a [**Definition**][dfn-definition].
For example, the following Markdown:
```markdown
[alpha][Bravo]
```
Yields:
```js
{
type: 'linkReference',
identifier: 'bravo',
label: 'Bravo',
referenceType: 'full',
children: [{type: 'text', value: 'alpha'}]
}
```
### `ImageReference`
```idl
interface ImageReference <: Node {
type: "imageReference"
}
ImageReference includes Reference
ImageReference includes Alternative
```
**ImageReference** ([**Node**][dfn-node]) represents an image through
association, or its original source if there is no association.
**ImageReference** can be used where [**phrasing**][dfn-phrasing-content]
content is expected.
It has no content model, but is described by its `alt` field.
**ImageReference** includes the mixins [**Reference**][dfn-mxn-reference] and
[**Alternative**][dfn-mxn-alternative].
**ImageReference** should be associated with a [**Definition**][dfn-definition].
For example, the following Markdown:
```markdown
![alpha][bravo]
```
Yields:
```js
{
type: 'imageReference',
identifier: 'bravo',
label: 'bravo',
referenceType: 'full',
alt: 'alpha'
}
```
### `Footnote`
```idl
interface Footnote <: Parent {
type: "footnote"
children: [PhrasingContent]
}
```
**Footnote** ([**Parent**][dfn-parent]) represents content relating to the
document that is outside its flow.
**Footnote** can be used where [**phrasing**][dfn-phrasing-content] content is
expected.
Its content model is also [**phrasing**][dfn-phrasing-content] content.
For example, the following Markdown:
```markdown
[^alpha bravo]
```
Yields:
```js
{
type: 'footnote',
children: [{type: 'text', value: 'alpha bravo'}]
}
```
### `FootnoteReference`
```idl
interface FootnoteReference <: Node {
type: "footnoteReference"
}
FootnoteReference includes Association
```
**FootnoteReference** ([**Node**][dfn-node]) represents a marker through
association.
**FootnoteReference** can be used where [**phrasing**][dfn-phrasing-content]
content is expected.
It has no content model.
**FootnoteReference** includes the mixin [**Association**][dfn-mxn-association].
**FootnoteReference** should be associated with a
[**FootnoteDefinition**][dfn-footnote-definition].
For example, the following Markdown:
```markdown
[^alpha]
```
Yields:
```js
{
type: 'footnoteReference',
identifier: 'alpha',
label: 'alpha'
}
```
## Mixin
### `Resource`
```idl
interface mixin Resource {
url: string
title: string?
}
```
**Resource** represents a reference to resource.
A `url` field must be present.
It represents a URL to the referenced resource.
A `title` field can be present.
It represents advisory information for the resource, such as would be
appropriate for a tooltip.
### `Association`
```idl
interface mixin Association {
identifier: string
label: string?
}
```
**Association** represents an internal relation from one node to another.
An `identifier` field must be present.
It can match an `identifier` field on another node.
A `label` field can be present.
It represents the original value of the normalised `identifier` field.
Whether the value of `identifier` is expected to be a unique identifier or not
depends on the type of node including the **Association**.
An example of this is that `identifier` on [**Definition**][dfn-definition]
should be a unique identifier, whereas multiple
[**LinkReference**][dfn-link-reference]s can have the same `identifier` and be
associated with one definition.
### `Reference`
```idl
interface mixin Reference {
referenceType: string
}
Reference includes Association
```
**Reference** represents a marker that is [**associated**][dfn-mxn-association]
to another node.
A `referenceType` field must be present.
Its value must be a [**referenceType**][dfn-enum-reference-type].
It represents the explicitness of the reference.
### `Alternative`
```idl
interface mixin Alternative {
alt: string?
}
```
**Alternative** represents a node with a fallback
An `alt` field should be present.
It represents equivalent content for environments that cannot represent the
node as intended.
## Enumeration
### `alignType`
```idl
enum alignType {
"left" | "right" | "center" | null
}
```
**alignType** represents how phrasing content is aligned
([\[CSSTEXT\]][css-text]).
* **`'left'`**: See the [`left`][css-left] value of the `text-align` CSS
property
* **`'right'`**: See the [`right`][css-right] value of the `text-align`
CSS property
* **`'center'`**: See the [`center`][css-center] value of the `text-align`
CSS property
* **`null`**: phrasing content is aligned as defined by the host environment
### `referenceType`
```idl
enum referenceType {
"shortcut" | "collapsed" | "full"
}
```
**referenceType** represents the explicitness of a reference.
* **shortcut**: the reference is implicit, its identifier inferred from its
content
* **collapsed**: the reference is explicit, its identifier inferred from its
content
* **full**: the reference is explicit, its identifier explicitly set
## `Content`
```idl
type Content =
TopLevelContent | ListContent | TableContent | RowContent | PhrasingContent
```
Each node in mdast falls into one or more categories of **Content** that group
nodes with similar characteristics together.
### `TopLevelContent`
```idl
type TopLevelContent = BlockContent | FrontmatterContent | DefinitionContent
```
**Top-level** content represent the sections of document (**block** content),
and metadata such as frontmatter and definitions.
### `BlockContent`
```idl
type BlockContent =
Paragraph | Heading | ThematicBreak | Blockquote | List | Table | HTML | Code
```
**Block** content represent the sections of document.
### `FrontmatterContent`
```idl
type FrontmatterContent = YAML
```
**Frontmatter** content represent out-of-band information about the document.
If frontmatter is present, it must be limited to one node in the
[*tree*][term-tree], and can only exist as a [*head*][term-head].
### `DefinitionContent`
```idl
type DefinitionContent = Definition | FootnoteDefinition
```
**Definition** content represents out-of-band information that typically
affects the document through [**Association**][dfn-mxn-association].
### `ListContent`
```idl
type ListContent = ListItem
```
**List** content represent the items in a list.
### `TableContent`
```idl
type TableContent = TableRow
```
**Table** content represent the rows in a table.
### `RowContent`
```idl
type RowContent = TableCell
```
**Row** content represent the cells in a row.
### `PhrasingContent`
```idl
type PhrasingContent = StaticPhrasingContent | Link | LinkReference
```
**Phrasing** content represent the text in a document, and its markup.
### `StaticPhrasingContent`
```idl
type StaticPhrasingContent =
Text | Emphasis | Strong | Delete | HTML | InlineCode | Break | Image |
ImageReference | Footnote | FootnoteReference
```
**StaticPhrasing** content represent the text in a document, and its
markup, that is not intended for user interaction.
## Glossary
See the [unist glossary][glossary].
## List of utilities
See the [unist list of utilities][utilities] for more utilities.
* [`mdast-add-list-metadata`](https://gitlab.com/staltz/mdast-add-list-metadata)
— Enhances the metadata of list and listItem nodes
* [`mdast-util-assert`](https://github.com/syntax-tree/mdast-util-assert)
— Assert nodes
* [`mdast-builder`](https://github.com/mike-north/mdast-builder)
— Build mdast structures with composable functions
* [`mdast-comment-marker`](https://github.com/syntax-tree/mdast-comment-marker)
— Parse a comment marker
* [`mdast-util-compact`](https://github.com/syntax-tree/mdast-util-compact)
— Make a tree compact
* [`mdast-util-definitions`](https://github.com/syntax-tree/mdast-util-definitions)
— Find definition nodes
* [`mdast-util-from-quill-delta`](https://github.com/syntax-tree/mdast-util-from-quill-delta)
— Transform Quill delta to mdast
* [`mdast-flatten-image-paragraphs`](https://gitlab.com/staltz/mdast-flatten-image-paragraphs)
— Flatten paragraph and image into one image node
* [`mdast-flatten-listitem-paragraphs`](https://gitlab.com/staltz/mdast-flatten-listitem-paragraphs)
— Flatten listItem and (nested) paragraph into one listItem node
* [`mdast-flatten-nested-lists`](https://gitlab.com/staltz/mdast-flatten-nested-lists)
— Transforms a tree to avoid lists inside lists
* [`mdast-util-heading-range`](https://github.com/syntax-tree/mdast-util-heading-range)
— Markdown heading as ranges
* [`mdast-util-heading-style`](https://github.com/syntax-tree/mdast-util-heading-style)
— Get the style of a heading node
* [`mdast-util-inject`](https://github.com/anandthakker/mdast-util-inject)
— Inject a tree into another at a given heading
* [`mdast-move-images-to-root`](https://gitlab.com/staltz/mdast-move-images-to-root)
— Moves image nodes up the tree until they are strict children of the root
* [`mdast-normalize-headings`](https://github.com/syntax-tree/mdast-normalize-headings)
— Ensure at most one top-level heading is in the document
* [`mdast-util-phrasing`](https://github.com/syntax-tree/mdast-util-phrasing)
— Check if a node is phrasing content
* [`mdast-squeeze-paragraphs`](https://github.com/syntax-tree/mdast-squeeze-paragraphs)
— Remove empty paragraphs
* [`mdast-util-toc`](https://github.com/syntax-tree/mdast-util-toc)
— Generate a Table of Contents from a tree
* [`mdast-util-to-hast`](https://github.com/syntax-tree/mdast-util-to-hast)
— Transform to hast
* [`mdast-util-to-nlcst`](https://github.com/syntax-tree/mdast-util-to-nlcst)
— Transform to nlcst
* [`mdast-util-to-string`](https://github.com/syntax-tree/mdast-util-to-string)
— Get the plain text content of a node
* [`mdast-zone`](https://github.com/syntax-tree/mdast-zone)
— HTML comments as ranges or markers
## References
* **unist**:
[Universal Syntax Tree][unist].
T. Wormer; et al.
* **Markdown**:
[Markdown][].
J. Gruber.
* **CommonMark**:
[CommonMark][].
J. MacFarlane; et al.
* **GFM**:
[GitHub Flavored Markdown][gfm].
GitHub.
* **HTML**:
[HTML Standard][html],
A. van Kesteren; et al.
WHATWG.
* **CSSTEXT**:
[CSS Text][css-text],
CSS Text, E. Etemad, K. Ishii.
W3C.
* **JavaScript**:
[ECMAScript Language Specification][javascript].
Ecma International.
* **YAML**:
[YAML Ain’t Markup Language][yaml],
O. Ben-Kiki, C. Evans, I. döt Net.
* **Web IDL**:
[Web IDL][webidl],
C. McCormack.
W3C.
## Security
As mdast can contain HTML and be used to represent HTML, and improper use of
HTML can open you up to a [cross-site scripting (XSS)][xss] attack, improper use
of mdast is also unsafe.
When transforming to HTML (typically through [**hast**][hast]), always be
careful with user input and use [`hast-util-santize`][sanitize] to make the hast
tree safe.
## Related
* [hast](https://github.com/syntax-tree/hast)
— Hypertext Abstract Syntax Tree format
* [nlcst](https://github.com/syntax-tree/nlcst)
— Natural Language Concrete Syntax Tree format
* [xast](https://github.com/syntax-tree/xast)
— Extensible Abstract Syntax Tree
## Contribute
See [`contributing.md`][contributing] in [`syntax-tree/.github`][health] for
ways to get started.
See [`support.md`][support] for ways to get help.
Ideas for new utilities and tools can be posted in [`syntax-tree/ideas`][ideas].
A curated list of awesome syntax-tree, unist, mdast, hast, xast, and nlcst
resources can be found in [awesome syntax-tree][awesome].
This project has a [code of conduct][coc].
By interacting with this repository, organization, or community you agree to
abide by its terms.
## Acknowledgments
The initial release of this project was authored by
[**@wooorm**](https://github.com/wooorm).
Special thanks to [**@eush77**](https://github.com/eush77) for their work,
ideas, and incredibly valuable feedback!
Thanks to
[**@anandthakker**](https://github.com/anandthakker),
[**@arobase-che**](https://github.com/arobase-che),
[**@BarryThePenguin**](https://github.com/BarryThePenguin),
[**@chinesedfan**](https://github.com/chinesedfan),
[**@ChristianMurphy**](https://github.com/ChristianMurphy),
[**@craftzdog**](https://github.com/craftzdog),
[**@d4rekanguok**](https://github.com/d4rekanguok),
[**@detj**](https://github.com/detj),
[**@dominictarr**](https://github.com/dominictarr),
[**@gkatsev**](https://github.com/gkatsev),
[**@Hamms**](https://github.com/Hamms),
[**@Hypercubed**](https://github.com/Hypercubed),
[**@ikatyang**](https://github.com/ikatyang),
[**@izumin5210**](https://github.com/izumin5210),
[**@jasonLaster**](https://github.com/jasonLaster),
[**@Justineo**](https://github.com/Justineo),
[**@justjake**](https://github.com/justjake),
[**@KyleAMathews**](https://github.com/KyleAMathews),
[**@laysent**](https://github.com/laysent),
[**@macklinu**](https://github.com/macklinu),
[**@mike-north**](https://github.com/mike-north),
[**@Murderlon**](https://github.com/Murderlon),
[**@nevik**](https://github.com/nevik),
[**@Rokt33r**](https://github.com/Rokt33r),
[**@rhysd**](https://github.com/rhysd),
[**@rubys**](https://github.com/rubys),
[**@Sarah-Seo**](https://github.com/Sarah-Seo),
[**@sethvincent**](https://github.com/sethvincent),
[**@silvenon**](https://github.com/silvenon),
[**@simov**](https://github.com/simov),
[**@staltz**](https://github.com/staltz),
[**@stefanprobst**](https://github.com/stefanprobst),
[**@tmcw**](https://github.com/tmcw),
and [**@vhf**](https://github.com/vhf)
for contributing to mdast and related
projects!
## License
[CC-BY-4.0][license] © [Titus Wormer][author]
[health]: https://github.com/syntax-tree/.github
[contributing]: https://github.com/syntax-tree/.github/blob/master/contributing.md
[support]: https://github.com/syntax-tree/.github/blob/master/support.md
[coc]: https://github.com/syntax-tree/.github/blob/master/code-of-conduct.md
[awesome]: https://github.com/syntax-tree/awesome-syntax-tree
[ideas]: https://github.com/syntax-tree/ideas
[license]: https://creativecommons.org/licenses/by/4.0/
[author]: https://wooorm.com
[logo]: https://raw.githubusercontent.com/syntax-tree/mdast/79672c0/logo.svg?sanitize=true
[releases]: https://github.com/syntax-tree/mdast/releases
[latest]: https://github.com/syntax-tree/mdast/releases/tag/3.0.0
[dfn-node]: https://github.com/syntax-tree/unist#node
[dfn-unist-parent]: https://github.com/syntax-tree/unist#parent
[dfn-unist-literal]: https://github.com/syntax-tree/unist#literal
[dfn-parent]: #parent
[dfn-literal]: #literal
[dfn-code]: #code
[dfn-inline-code]: #inlinecode
[dfn-list]: #list
[dfn-table]: #table
[dfn-break]: #break
[dfn-link-reference]: #linkreference
[dfn-image-reference]: #imagereference
[dfn-footnote-reference]: #footnotereference
[dfn-definition]: #definition
[dfn-footnote-definition]: #footnotedefinition
[term-tree]: https://github.com/syntax-tree/unist#tree
[term-child]: https://github.com/syntax-tree/unist#child
[term-sibling]: https://github.com/syntax-tree/unist#sibling
[term-root]: https://github.com/syntax-tree/unist#root
[term-head]: https://github.com/syntax-tree/unist#head
[dfn-mxn-resource]: #resource
[dfn-mxn-association]: #association
[dfn-mxn-reference]: #reference
[dfn-mxn-alternative]: #alternative
[dfn-enum-align-type]: #aligntype
[dfn-enum-reference-type]: #referencetype
[dfn-content]: #content
[dfn-top-level-content]: #toplevelcontent
[dfn-block-content]: #blockcontent
[dfn-frontmatter-content]: #frontmattercontent
[dfn-definition-content]: #frontmattercontent
[dfn-list-content]: #listcontent
[dfn-table-content]: #tablecontent
[dfn-row-content]: #rowcontent
[dfn-phrasing-content]: #phrasingcontent
[dfn-static-phrasing-content]: #staticphrasingcontent
[list-of-utilities]: #list-of-utilities
[unist]: https://github.com/syntax-tree/unist
[syntax-tree]: https://github.com/syntax-tree/unist#syntax-tree
[yaml]: https://yaml.org
[html]: https://html.spec.whatwg.org/multipage/
[css-text]: https://drafts.csswg.org/css-text/
[css-left]: https://drafts.csswg.org/css-text/#valdef-text-align-left
[css-right]: https://drafts.csswg.org/css-text/#valdef-text-align-right
[css-center]: https://drafts.csswg.org/css-text/#valdef-text-align-center
[javascript]: https://www.ecma-international.org/ecma-262/9.0/index.html
[webidl]: https://heycam.github.io/webidl/
[markdown]: https://daringfireball.net/projects/markdown/
[commonmark]: https://commonmark.org
[gfm]: https://github.github.com/gfm/
[glossary]: https://github.com/syntax-tree/unist#glossary
[utilities]: https://github.com/syntax-tree/unist#list-of-utilities
[unified]: https://github.com/unifiedjs/unified
[remark]: https://github.com/remarkjs/remark
[xss]: https://en.wikipedia.org/wiki/Cross-site_scripting
[hast]: https://github.com/syntax-tree/hast
[sanitize]: https://github.com/syntax-tree/hast-util-sanitize