1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Debug, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub struct MarkdownRoot {
10 pub blocks: Vec<Block>,
12}
13
14#[derive(Clone, Debug, PartialEq, Eq, Hash)]
16#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
17pub enum Block {
18 Heading(Heading),
20 Paragraph(Paragraph),
22 CodeBlock(CodeBlock),
24 List(List),
26 Blockquote(Blockquote),
28 HorizontalRule(HorizontalRule),
30 Table(Table),
32 Html(Html),
34}
35
36#[derive(Clone, Debug, PartialEq, Eq, Hash)]
38#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
39pub struct Heading {
40 pub level: u32,
42 pub content: String,
44 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
46 pub span: Range<usize>,
47}
48
49#[derive(Clone, Debug, PartialEq, Eq, Hash)]
51#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
52pub struct Paragraph {
53 pub content: String,
55 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
57 pub span: Range<usize>,
58}
59
60#[derive(Clone, Debug, PartialEq, Eq, Hash)]
62#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
63pub struct CodeBlock {
64 pub language: Option<String>,
66 pub content: String,
68 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
70 pub span: Range<usize>,
71}
72
73#[derive(Clone, Debug, PartialEq, Eq, Hash)]
75#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
76pub struct List {
77 pub is_ordered: bool,
79 pub items: Vec<ListItem>,
81 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
83 pub span: Range<usize>,
84}
85
86#[derive(Clone, Debug, PartialEq, Eq, Hash)]
88#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
89pub struct ListItem {
90 pub content: Vec<Block>,
92 pub is_task: bool,
94 pub is_checked: Option<bool>,
96 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
98 pub span: Range<usize>,
99}
100
101#[derive(Clone, Debug, PartialEq, Eq, Hash)]
103#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
104pub struct Blockquote {
105 pub content: Vec<Block>,
107 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
109 pub span: Range<usize>,
110}
111
112#[derive(Clone, Debug, PartialEq, Eq, Hash)]
114#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
115pub struct HorizontalRule {
116 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
118 pub span: Range<usize>,
119}
120
121#[derive(Clone, Debug, PartialEq, Eq, Hash)]
123#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
124pub struct Table {
125 pub header: TableRow,
127 pub rows: Vec<TableRow>,
129 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
131 pub span: Range<usize>,
132}
133
134#[derive(Clone, Debug, PartialEq, Eq, Hash)]
136#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
137pub struct TableRow {
138 pub cells: Vec<TableCell>,
140 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
142 pub span: Range<usize>,
143}
144
145#[derive(Clone, Debug, PartialEq, Eq, Hash)]
147#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
148pub struct TableCell {
149 pub content: String,
151 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
153 pub span: Range<usize>,
154}
155
156#[derive(Clone, Debug, PartialEq, Eq, Hash)]
158#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
159pub struct Html {
160 pub content: String,
162 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
164 pub span: Range<usize>,
165}
166
167#[derive(Clone, Debug, PartialEq, Eq, Hash)]
169#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
170pub enum Inline {
171 Text(String),
173 Bold(String),
175 Italic(String),
177 Code(String),
179 Link {
181 text: String,
183 url: String,
185 title: Option<String>,
187 },
188 Image {
190 alt: String,
192 url: String,
194 title: Option<String>,
196 },
197}