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>
|
<head>
|
||||||
<meta name="referrer" content="no-referrer">
|
<meta name="referrer" content="no-referrer">
|
||||||
<link rel="stylesheet" href="/styles/index.css">
|
<link rel="stylesheet" href="/styles/index.css">
|
||||||
|
{{{head}}}
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
29
src/blog.rs
29
src/blog.rs
|
@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize};
|
||||||
use crate::{
|
use crate::{
|
||||||
builder::SiteBuilder,
|
builder::SiteBuilder,
|
||||||
resource::{ResourceBuilder, ResourceBuilderConfig, ResourceMetadata, ResourceMethods},
|
resource::{ResourceBuilder, ResourceBuilderConfig, ResourceMetadata, ResourceMethods},
|
||||||
|
SiteConfig,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const BLOG_PATH: &str = "blog";
|
pub const BLOG_PATH: &str = "blog";
|
||||||
|
@ -46,6 +47,13 @@ pub struct BlogPostMetadata {
|
||||||
pub image_center: Option<String>,
|
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.
|
/// Template data for a blog post.
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
pub struct BlogPostTemplateData {
|
pub struct BlogPostTemplateData {
|
||||||
|
@ -64,13 +72,11 @@ impl ResourceMethods<BlogPostTemplateData> for ResourceMetadata<BlogPostMetadata
|
||||||
|
|
||||||
fn get_extra_resource_template_data(
|
fn get_extra_resource_template_data(
|
||||||
&self,
|
&self,
|
||||||
site_config: &crate::SiteConfig,
|
site_config: &SiteConfig,
|
||||||
) -> anyhow::Result<BlogPostTemplateData> {
|
) -> anyhow::Result<BlogPostTemplateData> {
|
||||||
// TODO: render markdown
|
// TODO: render markdown
|
||||||
Ok(BlogPostTemplateData {
|
Ok(BlogPostTemplateData {
|
||||||
header_image: site_config
|
header_image: self.inner.get_header_image(site_config)?,
|
||||||
.cdn_url(&self.inner.header_image_file)?
|
|
||||||
.to_string(),
|
|
||||||
object_fit: self
|
object_fit: self
|
||||||
.inner
|
.inner
|
||||||
.image_fit
|
.image_fit
|
||||||
|
@ -83,4 +89,19 @@ impl ResourceMethods<BlogPostTemplateData> for ResourceMetadata<BlogPostMetadata
|
||||||
.unwrap_or_else(|| "50% 50%".to_string()),
|
.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.
|
/// Struct containing data to be sent to templates when rendering them.
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
struct TemplateData<'a> {
|
struct TemplateData<'a, T> {
|
||||||
/// The rendered page.
|
/// The rendered page.
|
||||||
pub page: &'a str,
|
pub page: &'a str,
|
||||||
|
/// Custom template data.
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub extra: T,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Struct used to build the site.
|
/// Struct used to build the site.
|
||||||
|
@ -97,15 +100,30 @@ impl<'a> SiteBuilder<'a> {
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Helper to build a page without writing it to disk.
|
|
||||||
pub fn build_page_raw(
|
pub fn build_page_raw(
|
||||||
&self,
|
&self,
|
||||||
page_metadata: PageMetadata,
|
page_metadata: PageMetadata,
|
||||||
page_html: &str,
|
page_html: &str,
|
||||||
) -> anyhow::Result<String> {
|
) -> 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(
|
let out = self.reg.render(
|
||||||
&page_metadata.template.unwrap_or_else(|| "base".to_string()),
|
&page_metadata.template.unwrap_or_else(|| "base".to_string()),
|
||||||
&TemplateData { page: page_html },
|
&TemplateData {
|
||||||
|
page: page_html,
|
||||||
|
extra,
|
||||||
|
},
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let title = match &page_metadata.title {
|
let title = match &page_metadata.title {
|
||||||
|
|
|
@ -72,6 +72,10 @@ where
|
||||||
fn get_short_desc(&self) -> String;
|
fn get_short_desc(&self) -> String;
|
||||||
|
|
||||||
fn get_extra_resource_template_data(&self, site_config: &SiteConfig) -> anyhow::Result<E>;
|
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)]
|
#[derive(Debug, Serialize)]
|
||||||
|
@ -84,6 +88,11 @@ struct ResourceListTemplateData<'r, M, E> {
|
||||||
next: Option<usize>,
|
next: Option<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize)]
|
||||||
|
struct ExtraResourceRenderData {
|
||||||
|
head: String,
|
||||||
|
}
|
||||||
|
|
||||||
/// Config for the resource builder.
|
/// Config for the resource builder.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ResourceBuilderConfig {
|
pub struct ResourceBuilderConfig {
|
||||||
|
@ -215,12 +224,15 @@ where
|
||||||
builder.reg.render(&self.config.resource_template, &data)?
|
builder.reg.render(&self.config.resource_template, &data)?
|
||||||
};
|
};
|
||||||
|
|
||||||
let out = builder.build_page_raw(
|
let out = builder.build_page_raw_extra(
|
||||||
PageMetadata {
|
PageMetadata {
|
||||||
title: Some(resource.title.clone()),
|
title: Some(resource.title.clone()),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
&out,
|
&out,
|
||||||
|
ExtraResourceRenderData {
|
||||||
|
head: resource.get_head_data(&builder.site.config)?,
|
||||||
|
},
|
||||||
)?;
|
)?;
|
||||||
std::fs::write(out_path, out)?;
|
std::fs::write(out_path, out)?;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue