diff --git a/site/templates/base.hbs b/site/templates/base.hbs index 63d6c30..6893632 100644 --- a/site/templates/base.hbs +++ b/site/templates/base.hbs @@ -4,6 +4,7 @@ + {{{head}}} diff --git a/src/blog.rs b/src/blog.rs index cd272c8..66364d7 100644 --- a/src/blog.rs +++ b/src/blog.rs @@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::{ builder::SiteBuilder, resource::{ResourceBuilder, ResourceBuilderConfig, ResourceMetadata, ResourceMethods}, + SiteConfig, }; pub const BLOG_PATH: &str = "blog"; @@ -46,6 +47,13 @@ pub struct BlogPostMetadata { pub image_center: Option, } +impl BlogPostMetadata { + /// Helper to get the CDN URL to the blog post's header image. + fn get_header_image(&self, site_config: &SiteConfig) -> anyhow::Result { + Ok(site_config.cdn_url(&self.header_image_file)?.to_string()) + } +} + /// Template data for a blog post. #[derive(Debug, Serialize)] pub struct BlogPostTemplateData { @@ -64,13 +72,11 @@ impl ResourceMethods for ResourceMetadata anyhow::Result { // TODO: render markdown Ok(BlogPostTemplateData { - header_image: site_config - .cdn_url(&self.inner.header_image_file)? - .to_string(), + header_image: self.inner.get_header_image(site_config)?, object_fit: self .inner .image_fit @@ -83,4 +89,19 @@ impl ResourceMethods for ResourceMetadata anyhow::Result { + // TODO: update this so we're not just doing raw html injection lmao + Ok(format!( + r#" + + + + + "#, + site_config.title, + self.title, + self.inner.get_header_image(site_config)?, + )) + } } diff --git a/src/builder.rs b/src/builder.rs index e84aa24..db1ec68 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -17,9 +17,12 @@ const ME_URLS: &[&str] = &["https://mas.to/@zyl"]; /// Struct containing data to be sent to templates when rendering them. #[derive(Debug, Serialize)] -struct TemplateData<'a> { +struct TemplateData<'a, T> { /// The rendered page. pub page: &'a str, + /// Custom template data. + #[serde(flatten)] + pub extra: T, } /// Struct used to build the site. @@ -97,15 +100,30 @@ impl<'a> SiteBuilder<'a> { Ok(self) } - /// Helper to build a page without writing it to disk. pub fn build_page_raw( &self, page_metadata: PageMetadata, page_html: &str, ) -> anyhow::Result { + self.build_page_raw_extra(page_metadata, page_html, ()) + } + + /// Helper to build a page without writing it to disk. + pub fn build_page_raw_extra( + &self, + page_metadata: PageMetadata, + page_html: &str, + extra: T, + ) -> anyhow::Result + where + T: Serialize, + { let out = self.reg.render( &page_metadata.template.unwrap_or_else(|| "base".to_string()), - &TemplateData { page: page_html }, + &TemplateData { + page: page_html, + extra, + }, )?; let title = match &page_metadata.title { diff --git a/src/resource.rs b/src/resource.rs index 028e0a6..d708108 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -72,6 +72,10 @@ where fn get_short_desc(&self) -> String; fn get_extra_resource_template_data(&self, site_config: &SiteConfig) -> anyhow::Result; + + fn get_head_data(&self, _site_config: &SiteConfig) -> anyhow::Result { + Ok(String::new()) + } } #[derive(Debug, Serialize)] @@ -84,6 +88,11 @@ struct ResourceListTemplateData<'r, M, E> { next: Option, } +#[derive(Debug, Serialize)] +struct ExtraResourceRenderData { + head: String, +} + /// Config for the resource builder. #[derive(Debug)] pub struct ResourceBuilderConfig { @@ -215,12 +224,15 @@ where builder.reg.render(&self.config.resource_template, &data)? }; - let out = builder.build_page_raw( + let out = builder.build_page_raw_extra( PageMetadata { title: Some(resource.title.clone()), ..Default::default() }, &out, + ExtraResourceRenderData { + head: resource.get_head_data(&builder.site.config)?, + }, )?; std::fs::write(out_path, out)?;