Skip to main content

katana_markdown_model/document/
types.rs

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}