mirror of
https://github.com/zyllian/webdog.git
synced 2025-05-10 02:26:42 -07:00
add embed info to blog posts?
This commit is contained in:
parent
1ef077d6dd
commit
5c93449e58
4 changed files with 60 additions and 8 deletions
|
@ -4,6 +4,7 @@
|
|||
<head>
|
||||
<meta name="referrer" content="no-referrer">
|
||||
<link rel="stylesheet" href="/styles/index.css">
|
||||
{{{head}}}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
|
29
src/blog.rs
29
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<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)?,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)?;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue