use serde::Deserialize;
#[derive(Debug, Default, Deserialize, Clone)]
pub struct FrontMatter {
pub title: Option<String>,
pub subtitle: Option<String>,
pub author: Option<String>,
pub date: Option<String>,
pub theme: Option<String>,
pub aspect: Option<String>,
pub font: Option<String>,
pub layout: Option<String>,
#[serde(default)]
pub toc: bool,
pub logo: Option<String>,
pub transition: Option<String>,
pub transition_duration: Option<f32>,
pub direction: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct Run {
pub text: String,
pub bold: bool,
pub italic: bool,
pub code: bool,
pub strike: bool,
pub link: Option<String>,
}
impl Run {
pub fn plain(s: impl Into<String>) -> Self {
Run {
text: s.into(),
..Default::default()
}
}
}
#[derive(Debug, Clone)]
pub struct ListItem {
pub runs: Vec<Run>,
pub level: u8,
pub ordered: bool,
}
#[derive(Debug, Clone)]
pub enum Block {
Paragraph(Vec<Run>),
Heading { level: u8, runs: Vec<Run> },
List(Vec<ListItem>),
CodeBlock {
lang: Option<String>,
title: Option<String>,
lines: Vec<String>,
line_numbers: bool,
},
Quote(Vec<Vec<Run>>),
Table {
headers: Vec<Vec<Run>>,
rows: Vec<Vec<Vec<Run>>>,
},
ColumnBreak,
Columns { left: Vec<Block>, right: Vec<Block> },
Image {
src: String,
alt: String,
width_pct: Option<u8>,
},
Footnotes(Vec<ListItem>),
}
#[derive(Debug, Clone)]
pub enum SlideKind {
Title {
subtitle: Option<String>,
author: Option<String>,
date: Option<String>,
},
Section,
Content,
}
#[derive(Debug, Clone)]
pub struct Slide {
pub kind: SlideKind,
pub title: String,
pub blocks: Vec<Block>,
pub notes: Option<String>,
pub bg_image: Option<String>,
pub layout_hint: Option<String>,
}
pub fn runs_text(runs: &[Run]) -> String {
let mut s = String::new();
for r in runs {
s.push_str(&r.text);
}
s
}