Markdown AST parser

Downloads in past


3970.3.02 years ago6 years agoMinified + gzip package size for markdown-ast in KB


npm Build status Coverage status Bundle size Install size Code style: Prettier Donate
Fork of snarkdown that returns an array of AST nodes, instead of an HTML string.
TypeScript support included!
import md from 'markdown-ast'

const ast = md(code)

The goal is to support Github-style markdown. Please file an issue if you run into any inconsistencies.

Notable behavior

  • Node locations are not tracked.
  • No HTML parsing. Embedded HTML is plain text.
  • Single \n chars are removed from the start/end of plain text.


Node types

Every node has a type property equal to one of these:
  • bold: __text__ or **text**
  • border: 3+ character sequence of [*-_] w/ optional spaces between
  • break: \n\n or \r\n\r\n or \s\s\n or \s\s\r\n
  • codeBlock: triple backticks or 4-spaces/tab indented
  • codeSpan: inline backticks
  • image: ![alt](url) or ![alt][key] or just ![altAsKey]
  • italic: _text_ or *text*
  • link: [text](url) or [text][key] or just [textAsKey]
  • linkDef: [key]: url
  • list: markdown w/ [-+*]|\d+[\.\)] prefix
  • quote: markdown w/ > prefix
  • strike: ~~text~~
  • text
  • title: markdown w/ #{1,6} prefix or underlined w/ 3+ =|- symbols

Available properties are defined here.

Block nodes

"Block nodes" have a block property containing any nested nodes. Blocks are auto-closed when their parent block is closed (unless the nested block is already closed, of course).
Some nodes (which may not be blocks) auto-close all open blocks. These include border, break, list, quote, and title nodes.
"Inline blocks" can be used anywhere in the document. These include bold, codeSpan, image, italic, link, and strike nodes.
"Recursive blocks" use their own parsing context to process any nested nodes. These include list, quote, and title nodes.