Skip to main content

oak_markdown/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4/// Root node of the Markdown Abstract Syntax Tree.
5#[derive(Clone, Debug, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct MarkdownRoot {
8    /// List of blocks in the document.
9    pub blocks: Vec<Block>,
10}
11
12/// Block-level elements in Markdown.
13#[derive(Clone, Debug, PartialEq, Eq, Hash)]
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15pub enum Block {
16    /// Heading (h1-h6).
17    Heading(Heading),
18    /// Paragraph.
19    Paragraph(Paragraph),
20    /// Code block.
21    CodeBlock(CodeBlock),
22    /// List.
23    List(List),
24    /// Blockquote.
25    Blockquote(Blockquote),
26    /// Horizontal rule.
27    HorizontalRule(HorizontalRule),
28    /// Table.
29    Table(Table),
30    /// HTML block.
31    Html(Html),
32    /// Abbreviation definition.
33    AbbreviationDefinition(AbbreviationDefinition),
34}
35
36/// Abbreviation definition element.
37#[derive(Clone, Debug, PartialEq, Eq, Hash)]
38#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
39pub struct AbbreviationDefinition {
40    /// Abbreviation key.
41    pub key: String,
42    /// Abbreviation definition.
43    pub definition: String,
44    /// Source code range.
45    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
46    pub span: Range<usize>,
47}
48
49/// Heading element.
50#[derive(Clone, Debug, PartialEq, Eq, Hash)]
51#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
52pub struct Heading {
53    /// Heading level (1-6).
54    pub level: u32,
55    /// Heading text content.
56    pub content: String,
57    /// Source code range.
58    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
59    pub span: Range<usize>,
60}
61
62/// Paragraph element.
63#[derive(Clone, Debug, PartialEq, Eq, Hash)]
64#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
65pub struct Paragraph {
66    /// Paragraph text content.
67    pub content: String,
68    /// Source code range.
69    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
70    pub span: Range<usize>,
71}
72
73/// Code block element.
74#[derive(Clone, Debug, PartialEq, Eq, Hash)]
75#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
76pub struct CodeBlock {
77    /// Programming language identifier.
78    pub language: Option<String>,
79    /// Code content.
80    pub content: String,
81    /// Source code range.
82    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
83    pub span: Range<usize>,
84}
85
86/// List element.
87#[derive(Clone, Debug, PartialEq, Eq, Hash)]
88#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
89pub struct List {
90    /// Whether it's an ordered list.
91    pub is_ordered: bool,
92    /// List items.
93    pub items: Vec<ListItem>,
94    /// Source code range.
95    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
96    pub span: Range<usize>,
97}
98
99/// List item element.
100#[derive(Clone, Debug, PartialEq, Eq, Hash)]
101#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
102pub struct ListItem {
103    /// List item content blocks.
104    pub content: Vec<Block>,
105    /// Whether it's a task list item.
106    pub is_task: bool,
107    /// Task completion status (if is_task is true).
108    pub is_checked: Option<bool>,
109    /// Source code range.
110    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
111    pub span: Range<usize>,
112}
113
114/// Blockquote element.
115#[derive(Clone, Debug, PartialEq, Eq, Hash)]
116#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
117pub struct Blockquote {
118    /// Blockquote content blocks.
119    pub content: Vec<Block>,
120    /// Source code range.
121    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
122    pub span: Range<usize>,
123}
124
125/// Horizontal rule element.
126#[derive(Clone, Debug, PartialEq, Eq, Hash)]
127#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
128pub struct HorizontalRule {
129    /// Source code range.
130    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
131    pub span: Range<usize>,
132}
133
134/// Table element.
135#[derive(Clone, Debug, PartialEq, Eq, Hash)]
136#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
137pub struct Table {
138    /// Table header row.
139    pub header: TableRow,
140    /// Table data rows.
141    pub rows: Vec<TableRow>,
142    /// Source code range.
143    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
144    pub span: Range<usize>,
145}
146
147/// Table row element.
148#[derive(Clone, Debug, PartialEq, Eq, Hash)]
149#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
150pub struct TableRow {
151    /// List of cells in the row.
152    pub cells: Vec<TableCell>,
153    /// Source code range.
154    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
155    pub span: Range<usize>,
156}
157
158/// Table cell element.
159#[derive(Clone, Debug, PartialEq, Eq, Hash)]
160#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
161pub struct TableCell {
162    /// Cell content string.
163    pub content: String,
164    /// Source code range.
165    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
166    pub span: Range<usize>,
167}
168
169/// HTML block element.
170#[derive(Clone, Debug, PartialEq, Eq, Hash)]
171#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
172pub struct Html {
173    /// HTML content string.
174    pub content: String,
175    /// Source code range.
176    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
177    pub span: Range<usize>,
178}
179
180/// Inline-level elements in Markdown.
181#[derive(Clone, Debug, PartialEq, Eq, Hash)]
182#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
183pub enum Inline {
184    /// Plain text.
185    Text(String),
186    /// Bold text.
187    Bold(String),
188    /// Italic text.
189    Italic(String),
190    /// Code span.
191    Code(String),
192    /// Link.
193    Link {
194        /// Link text.
195        text: String,
196        /// Link URL.
197        url: String,
198        /// Link title (optional).
199        title: Option<String>,
200    },
201    /// Image.
202    Image {
203        /// Alt text.
204        alt: String,
205        /// Image URL.
206        url: String,
207        /// Image title (optional).
208        title: Option<String>,
209    },
210    /// Abbreviation usage.
211    Abbreviation {
212        /// Abbreviation key.
213        key: String,
214        /// Abbreviation definition.
215        definition: String,
216    },
217}