AST Nodes

AST node types and structure

2 min read 419 words

Patitas parses Markdown into a typed Abstract Syntax Tree (AST).

All nodes are frozen dataclasses with slots for memory efficiency and thread safety.

Block Nodes

Block nodes form the document structure.

Document

The root node (not typically used directly).

@dataclass(frozen=True, slots=True)
class Document:
    children: tuple[Block, ...]
    source_file: str | None = None

Heading

@dataclass(frozen=True, slots=True)
class Heading:
    level: int  # 1-6
    children: tuple[Inline, ...]
    location: SourceLocation | None = None

Paragraph

@dataclass(frozen=True, slots=True)
class Paragraph:
    children: tuple[Inline, ...]
    location: SourceLocation | None = None

List

@dataclass(frozen=True, slots=True)
class List:
    ordered: bool
    start: int | None  # For ordered lists
    tight: bool
    children: tuple[ListItem, ...]
    location: SourceLocation | None = None

ListItem

@dataclass(frozen=True, slots=True)
class ListItem:
    children: tuple[Block, ...]
    location: SourceLocation | None = None

BlockQuote

@dataclass(frozen=True, slots=True)
class BlockQuote:
    children: tuple[Block, ...]
    location: SourceLocation | None = None

CodeBlock

@dataclass(frozen=True, slots=True)
class CodeBlock:
    info: str  # Language hint
    literal: str  # Code content
    location: SourceLocation | None = None

ThematicBreak

@dataclass(frozen=True, slots=True)
class ThematicBreak:
    location: SourceLocation | None = None

HtmlBlock

@dataclass(frozen=True, slots=True)
class HtmlBlock:
    literal: str
    location: SourceLocation | None = None

Inline Nodes

Inline nodes appear within blocks.

Text

@dataclass(frozen=True, slots=True)
class Text:
    literal: str
    location: SourceLocation | None = None

Emphasis

@dataclass(frozen=True, slots=True)
class Emphasis:
    children: tuple[Inline, ...]
    location: SourceLocation | None = None

Strong

@dataclass(frozen=True, slots=True)
class Strong:
    children: tuple[Inline, ...]
    location: SourceLocation | None = None

Code

Inline code span.

@dataclass(frozen=True, slots=True)
class Code:
    literal: str
    location: SourceLocation | None = None
@dataclass(frozen=True, slots=True)
class Link:
    destination: str
    title: str
    children: tuple[Inline, ...]
    location: SourceLocation | None = None

Image

@dataclass(frozen=True, slots=True)
class Image:
    destination: str
    title: str
    alt: str
    location: SourceLocation | None = None

SoftBreak

@dataclass(frozen=True, slots=True)
class SoftBreak:
    location: SourceLocation | None = None

HardBreak

@dataclass(frozen=True, slots=True)
class HardBreak:
    location: SourceLocation | None = None

HtmlInline

@dataclass(frozen=True, slots=True)
class HtmlInline:
    literal: str
    location: SourceLocation | None = None

Type Aliases

Block = Heading | Paragraph | List | ListItem | BlockQuote | CodeBlock | ThematicBreak | HtmlBlock | Directive

Inline = Text | Emphasis | Strong | Code | Link | Image | SoftBreak | HardBreak | HtmlInline