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
Link
@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