1use crate::{SourceSpan, TextFingerprint};
2use serde::{Deserialize, Serialize};
3use std::path::PathBuf;
4
5#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub struct KmmNodeId(pub String);
7
8#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9pub struct KmmDocument {
10 pub path: PathBuf,
11 pub fingerprint: TextFingerprint,
12 pub nodes: Vec<KmmNode>,
13}
14
15#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
16pub struct KmmNode {
17 pub id: KmmNodeId,
18 pub kind: KmmNodeKind,
19 pub source: SourceSpan,
20 pub children: Vec<KmmNode>,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
24pub enum KmmNodeKind {
25 Heading(HeadingNode),
26 Paragraph,
27 Text(TextSpan),
28 Strong(InlineSpan),
29 Emphasis(InlineSpan),
30 Strikethrough(InlineSpan),
31 InlineCode(InlineCodeNode),
32 InlineHtml(InlineHtmlNode),
33 Link(LinkNode),
34 Image(ImageNode),
35 FootnoteReference(FootnoteReferenceNode),
36 FootnoteDefinition(FootnoteDefinitionNode),
37 InlineMath(InlineMathNode),
38 DollarMathBlock(DollarMathBlockNode),
39 Emoji(EmojiNode),
40 HtmlBlock(HtmlBlockRole),
41 List(ListNode),
42 CodeBlock(CodeBlockRole),
43 Table(TableNode),
44 BlockQuote,
45 Alert { label: String },
46 DescriptionList { items: Vec<DescriptionItem> },
47 ThematicBreak,
48 RawBlock { reason: String },
49}
50
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
52pub struct HeadingNode {
53 pub level: u8,
54 pub text: String,
55}
56
57#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
58pub struct EmojiNode {
59 pub value: String,
60 pub shortcode: Option<String>,
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
64pub struct TextSpan {
65 pub text: String,
66}
67
68#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
69pub struct InlineSpan {
70 pub text: String,
71}
72
73#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
74pub struct InlineCodeNode {
75 pub code: String,
76}
77
78#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
79pub struct InlineHtmlNode {
80 pub html: String,
81}
82
83#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
84pub struct LinkNode {
85 pub label: String,
86 pub destination: String,
87 pub title: Option<String>,
88 pub autolink: bool,
89}
90
91#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
92pub struct ImageNode {
93 pub alt: String,
94 pub src: String,
95 pub title: Option<String>,
96}
97
98#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
99pub struct FootnoteReferenceNode {
100 pub label: String,
101}
102
103#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
104pub struct FootnoteDefinitionNode {
105 pub label: String,
106 pub text: String,
107}
108
109#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
110pub struct InlineMathNode {
111 pub expression: String,
112}
113
114#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
115pub struct DollarMathBlockNode {
116 pub expression: String,
117}
118
119#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
120pub enum HtmlBlockRole {
121 Generic,
122 Centered,
123 BadgeRow,
124}
125
126#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
127pub struct ListNode {
128 pub ordered: bool,
129 pub task_markers: Vec<String>,
130 pub items: Vec<ListItemNode>,
131}
132
133#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
134pub struct ListItemNode {
135 pub marker: String,
136 pub ordered_number: Option<usize>,
137 pub task_marker: Option<String>,
138 pub body: Vec<KmmNode>,
139 pub children: Vec<KmmNode>,
140 pub source: SourceSpan,
141}
142
143#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
144pub enum CodeBlockRole {
145 Plain { language: Option<String> },
146 Diagram { kind: DiagramKind },
147 Math,
148}
149
150#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
151pub enum DiagramKind {
152 Mermaid,
153 DrawIo,
154 PlantUml,
155}
156
157#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
158pub struct TableNode {
159 pub alignments: Vec<TableAlignment>,
160 pub rows: Vec<TableRow>,
161}
162
163#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
164pub enum TableAlignment {
165 Left,
166 Center,
167 Right,
168 Unspecified,
169}
170
171#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
172pub struct TableRow {
173 pub cells: Vec<TableCell>,
174}
175
176#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
177pub struct TableCell {
178 pub text: String,
179 pub source: SourceSpan,
180}
181
182#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
183pub struct DescriptionItem {
184 pub term: String,
185 pub description: String,
186}