Skip to main content

oak_markdown/ast/
mod.rs

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