#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Document {
pub blocks: Vec<Block>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Block {
Heading {
level: u8,
content: Vec<Inline>,
},
Paragraph(Vec<Inline>),
CodeBlock {
language: Option<String>,
code: String,
},
List {
ordered: bool,
items: Vec<Vec<Block>>,
},
TaskList(Vec<Task>),
BlockQuote(Vec<Block>),
Table(Table),
ThematicBreak,
Macro(Macro),
RawConfluence(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Inline {
Text(String),
Strong(Vec<Inline>),
Emphasis(Vec<Inline>),
Strikethrough(Vec<Inline>),
Code(String),
Link {
target: LinkTarget,
title: Option<String>,
content: Vec<Inline>,
},
Image {
source: ImageSource,
alt: String,
},
SoftBreak,
HardBreak,
Macro(Macro),
RawConfluence(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum LinkTarget {
External(String),
Page { space: Option<String>, title: String },
Attachment(String),
Anchor(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ImageSource {
External(String),
Attachment(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Task {
pub checked: bool,
pub content: Vec<Inline>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Table {
pub align: Vec<Alignment>,
pub head: Vec<Vec<Inline>>,
pub rows: Vec<Vec<Vec<Inline>>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Alignment {
#[default]
None,
Left,
Center,
Right,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Macro {
pub name: String,
pub params: Vec<(String, String)>,
pub body: MacroBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MacroBody {
Empty,
PlainText(String),
RichText(Vec<Block>),
}
impl Macro {
pub(crate) fn param(&self, key: &str) -> Option<&str> {
self.params
.iter()
.find(|(k, _)| k == key)
.map(|(_, v)| v.as_str())
}
}