add embed info to blog posts?

This commit is contained in:
zyl 2023-11-12 20:55:19 -08:00
parent 1ef077d6dd
commit 5c93449e58
No known key found for this signature in database
GPG key ID: 8611B896D1AAFAF2
4 changed files with 60 additions and 8 deletions

View file

@ -4,6 +4,7 @@
<head>
<meta name="referrer" content="no-referrer">
<link rel="stylesheet" href="/styles/index.css">
{{{head}}}
</head>
<body>

View file

@ -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<String>,
}
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<String> {
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<BlogPostTemplateData> for ResourceMetadata<BlogPostMetadata
fn get_extra_resource_template_data(
&self,
site_config: &crate::SiteConfig,
site_config: &SiteConfig,
) -> anyhow::Result<BlogPostTemplateData> {
// 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<BlogPostTemplateData> for ResourceMetadata<BlogPostMetadata
.unwrap_or_else(|| "50% 50%".to_string()),
})
}
fn get_head_data(&self, site_config: &SiteConfig) -> anyhow::Result<String> {
// TODO: update this so we're not just doing raw html injection lmao
Ok(format!(
r#"
<meta property="og:site_name" content="{}">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{}">
<meta name="twitter:image" content="{}">
"#,
site_config.title,
self.title,
self.inner.get_header_image(site_config)?,
))
}
}

View file

@ -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<String> {
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<T>(
&self,
page_metadata: PageMetadata,
page_html: &str,
extra: T,
) -> anyhow::Result<String>
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 {

View file

@ -72,6 +72,10 @@ where
fn get_short_desc(&self) -> String;
fn get_extra_resource_template_data(&self, site_config: &SiteConfig) -> anyhow::Result<E>;
fn get_head_data(&self, _site_config: &SiteConfig) -> anyhow::Result<String> {
Ok(String::new())
}
}
#[derive(Debug, Serialize)]
@ -84,6 +88,11 @@ struct ResourceListTemplateData<'r, M, E> {
next: Option<usize>,
}
#[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)?;