mirror of
https://github.com/zyllian/webdog.git
synced 2025-05-09 18:16:40 -07:00
45 lines
1.2 KiB
Rust
45 lines
1.2 KiB
Rust
use lol_html::{element, RewriteStrSettings};
|
|
use serde::Serialize;
|
|
|
|
use crate::{blog::BlogPostMetadata, builder::SiteBuilder, resource::ResourceMetadata};
|
|
|
|
#[derive(Debug)]
|
|
pub enum Extra {
|
|
HtmlModification(fn(page: String, builder: &SiteBuilder) -> anyhow::Result<String>),
|
|
}
|
|
|
|
/// Gets the extra for the given value.
|
|
pub fn get_extra(extra: &str) -> Option<Extra> {
|
|
match extra {
|
|
"index" => Some(Extra::HtmlModification(index)),
|
|
_ => None,
|
|
}
|
|
}
|
|
|
|
/// Extra to add a sidebar to the index page with recent blog posts on it.
|
|
fn index(page: String, builder: &SiteBuilder) -> anyhow::Result<String> {
|
|
#[derive(Debug, Serialize)]
|
|
struct SidebarTemplateData<'r> {
|
|
resources: Vec<&'r ResourceMetadata<BlogPostMetadata>>,
|
|
}
|
|
|
|
let lmd = builder.blog_builder.loaded_metadata.borrow();
|
|
|
|
let sidebar = builder.reg.render(
|
|
"extras/index-injection",
|
|
&SidebarTemplateData {
|
|
resources: lmd.iter().take(3).map(|(_, v)| v).collect(),
|
|
},
|
|
)?;
|
|
|
|
Ok(lol_html::rewrite_str(
|
|
&page,
|
|
RewriteStrSettings {
|
|
element_content_handlers: vec![element!("#content", |el| {
|
|
el.append(&sidebar, lol_html::html_content::ContentType::Html);
|
|
Ok(())
|
|
})],
|
|
..Default::default()
|
|
},
|
|
)?)
|
|
}
|