update templates to inherit themselves instead of manually doing it

This commit is contained in:
zyl 2024-11-05 13:54:04 -08:00
parent 32965f0cff
commit b1e7529efc
Signed by: zyl
SSH key fingerprint: SHA256:uxxbSXbdroP/OnKBGnEDk5q7EKB2razvstC/KmzdXXs
6 changed files with 37 additions and 55 deletions

View file

@ -1,3 +1,5 @@
{% extends "base.tera" %}
{% block content %}
<h1>{{ title }}</h1> <h1>{{ title }}</h1>
<div class="link-list"> <div class="link-list">
<ul> <ul>
@ -6,3 +8,4 @@
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>
{% endblock content %}

View file

@ -1,3 +1,5 @@
{% extends "base.tera" %}
{% block content %}
{% if tag %} {% if tag %}
<h1>blog posts tagged {{tag}}</h1> <h1>blog posts tagged {{tag}}</h1>
<p><a href="/blog/">View all blog posts</a></p> <p><a href="/blog/">View all blog posts</a></p>
@ -22,3 +24,4 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
{% endblock content %}

View file

@ -1,3 +1,5 @@
{% extends "base.tera" %}
{% block content %}
<div class="blog-post"> <div class="blog-post">
<h1 class="title">{{title}}</h1> <h1 class="title">{{title}}</h1>
<span class="timestamp">published {{timestamp}}</span> <span class="timestamp">published {{timestamp}}</span>
@ -20,3 +22,4 @@
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
{% endblock content %}

View file

@ -246,16 +246,8 @@ impl SiteBuilder {
Ok(String::from_utf8(output)?) Ok(String::from_utf8(output)?)
} }
pub fn build_page_raw(
&self,
page_metadata: PageMetadata,
page_html: &str,
) -> eyre::Result<String> {
self.build_page_raw_with_extra_data(page_metadata, page_html, ())
}
/// Helper to build a page without writing it to disk. /// Helper to build a page without writing it to disk.
pub fn build_page_raw_with_extra_data<T>( pub fn build_page_raw<T>(
&self, &self,
mut page_metadata: PageMetadata, mut page_metadata: PageMetadata,
page_html: &str, page_html: &str,
@ -318,7 +310,7 @@ impl SiteBuilder {
let mut page_html = String::new(); let mut page_html = String::new();
pulldown_cmark::html::push_html(&mut page_html, parser); pulldown_cmark::html::push_html(&mut page_html, parser);
let out = self.build_page_raw(page.data.unwrap_or_default(), &page_html)?; let out = self.build_page_raw(page.data.unwrap_or_default(), &page_html, ())?;
let out_path = self.build_path.join(page_name).with_extension("html"); let out_path = self.build_path.join(page_name).with_extension("html");
std::fs::create_dir_all(out_path.parent().unwrap()) std::fs::create_dir_all(out_path.parent().unwrap())

View file

@ -29,18 +29,15 @@ pub fn render_basic_link_list(
links: Vec<Link>, links: Vec<Link>,
title: &str, title: &str,
) -> eyre::Result<String> { ) -> eyre::Result<String> {
let data = LinkTemplateData { links, title }; builder.build_page_raw(
let out = builder
.tera
.render(template, &tera::Context::from_serialize(data)?)?;
let out = builder.build_page_raw(
PageMetadata { PageMetadata {
template: Some(template.to_owned()),
title: Some(title.to_owned()), title: Some(title.to_owned()),
..Default::default() ..Default::default()
}, },
&out, "",
)?; LinkTemplateData { links, title },
Ok(out) )
} }
/// Template data for a list of links. /// Template data for a list of links.

View file

@ -128,11 +128,6 @@ struct ResourceListTemplateData<'r> {
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, Clone, Default, Deserialize)] #[derive(Debug, Clone, Default, Deserialize)]
pub struct ResourceBuilderConfig { pub struct ResourceBuilderConfig {
@ -254,26 +249,12 @@ impl ResourceBuilder {
resource: &ResourceMetadata, resource: &ResourceMetadata,
) -> eyre::Result<()> { ) -> eyre::Result<()> {
let out_path = self.build_path(&builder.build_path, &id); let out_path = self.build_path(&builder.build_path, &id);
let out = {
let data = ResourceTemplateData {
resource,
id,
timestamp: resource.timestamp,
};
builder.tera.render(
&self.config.resource_template,
&tera::Context::from_serialize(data)?,
)?
};
let out = builder.build_page_raw_with_extra_data( let out = builder.build_page_raw(
PageMetadata { PageMetadata {
template: Some(self.config.resource_template.clone()),
title: Some(resource.title.clone()), title: Some(resource.title.clone()),
..Default::default() embed: Some(EmbedMetadata {
},
&out,
ExtraResourceRenderData {
head: EmbedMetadata {
title: resource.title.clone(), title: resource.title.clone(),
site_name: builder.site.config.title.clone(), site_name: builder.site.config.title.clone(),
description: resource.desc.clone(), description: resource.desc.clone(),
@ -285,8 +266,14 @@ impl ResourceBuilder {
url: None, url: None,
theme_color: EmbedMetadata::default_theme_color(), theme_color: EmbedMetadata::default_theme_color(),
large_image: true, large_image: true,
} }),
.build(), ..Default::default()
},
"",
ResourceTemplateData {
resource,
id,
timestamp: resource.timestamp,
}, },
)?; )?;
std::fs::write(out_path, out)?; std::fs::write(out_path, out)?;
@ -338,24 +325,21 @@ impl ResourceBuilder {
let mut next; let mut next;
for (page, iter) in list.iter().chunks(items_per_page).into_iter().enumerate() { for (page, iter) in list.iter().chunks(items_per_page).into_iter().enumerate() {
next = (page + 1 != page_max).then_some(page + 2); next = (page + 1 != page_max).then_some(page + 2);
let data = ResourceListTemplateData {
resources: iter.copied().collect(),
tag,
page: page + 1,
page_max,
previous,
next,
};
let out = builder.tera.render(
&config.resource_list_template,
&tera::Context::from_serialize(data)?,
)?;
let out = builder.build_page_raw( let out = builder.build_page_raw(
PageMetadata { PageMetadata {
template: Some(config.resource_list_template.clone()),
title: Some(title.to_owned()), title: Some(title.to_owned()),
..Default::default() ..Default::default()
}, },
&out, "",
ResourceListTemplateData {
resources: iter.copied().collect(),
tag,
page: page + 1,
page_max,
previous,
next,
},
)?; )?;
if page == 0 { if page == 0 {
std::fs::write(out_path.join("index.html"), &out)?; std::fs::write(out_path.join("index.html"), &out)?;