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>
<div class="link-list">
<ul>
@ -6,3 +8,4 @@
{% endfor %}
</ul>
</div>
{% endblock content %}

View file

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

View file

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

View file

@ -246,16 +246,8 @@ impl SiteBuilder {
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.
pub fn build_page_raw_with_extra_data<T>(
pub fn build_page_raw<T>(
&self,
mut page_metadata: PageMetadata,
page_html: &str,
@ -318,7 +310,7 @@ impl SiteBuilder {
let mut page_html = String::new();
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");
std::fs::create_dir_all(out_path.parent().unwrap())

View file

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

View file

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