website/src/html/slideshow.rs

86 lines
1.6 KiB
Rust
Raw Normal View History

2024-09-16 23:20:08 +02:00
use std::fmt::Write;
2024-09-16 23:01:38 +02:00
use camino::Utf8Path;
2024-07-03 23:34:31 +02:00
use chrono::{DateTime, Utc};
2024-09-16 23:01:38 +02:00
use hauchiwa::{Bibliography, Outline, Sack};
2024-07-03 23:34:31 +02:00
use hayagriva::Library;
2024-07-22 23:08:11 +02:00
use hypertext::{html_elements, maud, GlobalAttributes, Raw, Renderable};
2024-07-03 23:34:31 +02:00
use serde::Deserialize;
2024-07-05 13:59:07 +02:00
const CSS: &str = r#"
.slides img {
margin-left: auto;
margin-right: auto;
max-height: 60vh;
}
"#;
2024-07-03 23:34:31 +02:00
/// Represents a slideshow
#[derive(Deserialize, Debug, Clone)]
pub(crate) struct Slideshow {
2024-09-16 23:01:38 +02:00
pub title: String,
#[serde(with = "super::isodate")]
pub date: DateTime<Utc>,
pub desc: Option<String>,
2024-07-03 23:34:31 +02:00
}
2024-09-15 01:44:37 +02:00
pub fn parse_content(
2024-09-16 23:01:38 +02:00
content: &str,
sack: &Sack,
path: &Utf8Path,
library: Option<&Library>,
2024-09-15 01:44:37 +02:00
) -> (String, Outline, Bibliography) {
2024-09-16 23:01:38 +02:00
let parsed = content
.split("\n-----\n")
.map(|chunk| {
chunk
.split("\n---\n")
.map(|slide| crate::text::md::parse(slide, sack, path, library).0)
.collect::<Vec<_>>()
})
.map(|stack| match stack.len() > 1 {
2024-09-16 23:20:08 +02:00
true => {
let mut buffer = String::from("<section>");
for slide in stack {
write!(buffer, "<section>{}</section>", slide).unwrap();
}
buffer
}
2024-09-16 23:01:38 +02:00
false => format!("<section>{}</section>", stack[0]),
})
.collect::<String>();
(parsed, Outline(vec![]), Bibliography(None))
2024-09-15 01:44:37 +02:00
}
2024-07-03 23:34:31 +02:00
2024-09-15 01:44:37 +02:00
pub fn as_html(
2024-09-16 23:01:38 +02:00
slides: &Slideshow,
parsed: &str,
sack: &Sack,
_: Outline,
_: Bibliography,
2024-09-15 01:44:37 +02:00
) -> String {
2024-09-16 23:01:38 +02:00
show(slides, sack, parsed)
2024-07-03 23:34:31 +02:00
}
2024-07-22 23:08:11 +02:00
pub fn show(fm: &Slideshow, sack: &Sack, slides: &str) -> String {
2024-09-16 23:01:38 +02:00
crate::html::bare(
sack,
maud!(
div .reveal {
div .slides {
(Raw(slides))
}
}
2024-07-03 23:34:31 +02:00
2024-09-16 23:01:38 +02:00
style { (Raw(CSS)) }
),
fm.title.clone(),
Some(&["reveal".into()]),
)
.unwrap()
.render()
.into()
2024-07-03 23:34:31 +02:00
}