1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4#[derive(Clone, Debug, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct MarkdownRoot {
8 pub blocks: Vec<Block>,
10}
11
12#[derive(Clone, Debug, PartialEq, Eq, Hash)]
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15pub enum Block {
16 Heading(Heading),
18 Paragraph(Paragraph),
20 CodeBlock(CodeBlock),
22 List(List),
24 Blockquote(Blockquote),
26 HorizontalRule(HorizontalRule),
28 Table(Table),
30 Html(Html),
32 AbbreviationDefinition(AbbreviationDefinition),
34}
35
36#[derive(Clone, Debug, PartialEq, Eq, Hash)]
38#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
39pub struct AbbreviationDefinition {
40 pub key: String,
42 pub definition: 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(serde::Serialize, serde::Deserialize))]
52pub struct Heading {
53 pub level: u32,
55 pub content: String,
57 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
59 pub span: Range<usize>,
60}
61
62#[derive(Clone, Debug, PartialEq, Eq, Hash)]
64#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
65pub struct Paragraph {
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(serde::Serialize, serde::Deserialize))]
76pub struct CodeBlock {
77 pub language: Option<String>,
79 pub content: String,
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(serde::Serialize, serde::Deserialize))]
89pub struct List {
90 pub is_ordered: bool,
92 pub items: Vec<ListItem>,
94 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
96 pub span: Range<usize>,
97}
98
99#[derive(Clone, Debug, PartialEq, Eq, Hash)]
101#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
102pub struct ListItem {
103 pub content: Vec<Block>,
105 pub is_task: bool,
107 pub is_checked: Option<bool>,
109 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
111 pub span: Range<usize>,
112}
113
114#[derive(Clone, Debug, PartialEq, Eq, Hash)]
116#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
117pub struct Blockquote {
118 pub content: Vec<Block>,
120 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
122 pub span: Range<usize>,
123}
124
125#[derive(Clone, Debug, PartialEq, Eq, Hash)]
127#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
128pub struct HorizontalRule {
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(serde::Serialize, serde::Deserialize))]
137pub struct Table {
138 pub header: TableRow,
140 pub rows: Vec<TableRow>,
142 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
144 pub span: Range<usize>,
145}
146
147#[derive(Clone, Debug, PartialEq, Eq, Hash)]
149#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
150pub struct TableRow {
151 pub cells: Vec<TableCell>,
153 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
155 pub span: Range<usize>,
156}
157
158#[derive(Clone, Debug, PartialEq, Eq, Hash)]
160#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
161pub struct TableCell {
162 pub content: String,
164 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
166 pub span: Range<usize>,
167}
168
169#[derive(Clone, Debug, PartialEq, Eq, Hash)]
171#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
172pub struct Html {
173 pub content: String,
175 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
177 pub span: Range<usize>,
178}
179
180#[derive(Clone, Debug, PartialEq, Eq, Hash)]
182#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
183pub enum Inline {
184 Text(String),
186 Bold(String),
188 Italic(String),
190 Code(String),
192 Link {
194 text: String,
196 url: String,
198 title: Option<String>,
200 },
201 Image {
203 alt: String,
205 url: String,
207 title: Option<String>,
209 },
210 Abbreviation {
212 key: String,
214 definition: String,
216 },
217}