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)?;