Switch over to using the render context in render calls.

This commit is contained in:
Tom Alexander
2023-12-19 15:42:37 -05:00
parent cb3278aba5
commit add267d616
67 changed files with 699 additions and 1197 deletions

View File

@@ -1,8 +1,7 @@
use std::path::Path;
use serde::Serialize;
use crate::config::Config;
use super::macros::render;
use super::render_context::RenderContext;
use crate::context::RenderDocumentElement;
use crate::context::RenderRealFootnoteDefinition;
use crate::error::CustomError;
@@ -12,6 +11,27 @@ use crate::intermediate::BlogPost;
use super::GlobalSettings;
use super::PageHeader;
#[derive(Debug)]
pub(crate) struct RenderBlogStreamInput<'a, 'b> {
original: &'a [&'b BlogPost],
older_link: Option<String>,
newer_link: Option<String>,
}
impl<'a, 'b> RenderBlogStreamInput<'a, 'b> {
pub(crate) fn new(
original: &'a [&'b BlogPost],
older_link: Option<String>,
newer_link: Option<String>,
) -> RenderBlogStreamInput<'a, 'b> {
RenderBlogStreamInput {
original,
older_link,
newer_link,
}
}
}
#[derive(Debug, Serialize)]
#[serde(tag = "type")]
#[serde(rename = "blog_stream")]
@@ -22,15 +42,12 @@ pub(crate) struct RenderBlogStream {
stream_pagination: Option<RenderBlogStreamPagination>,
}
impl RenderBlogStream {
pub(crate) fn new(
config: &Config,
output_directory: &Path,
output_file: &Path,
original: &[&BlogPost],
older_link: Option<String>,
newer_link: Option<String>,
) -> Result<RenderBlogStream, CustomError> {
render!(
RenderBlogStream,
RenderBlogStreamInput,
original,
render_context,
{
let css_files = vec![
// get_web_path(
// config,
@@ -38,33 +55,45 @@ impl RenderBlogStream {
// output_file,
// "stylesheet/reset.css",
// )?,
get_web_path(config, output_directory, output_file, "stylesheet/main.css")?,
get_web_path(
render_context.config,
render_context.output_directory,
render_context.output_file,
"stylesheet/main.css",
)?,
];
let js_files = vec![get_web_path(
config,
output_directory,
output_file,
render_context.config,
render_context.output_directory,
render_context.output_file,
"blog_post.js",
)?];
let global_settings = GlobalSettings::new(
config.get_site_title().map(str::to_string),
render_context.config.get_site_title().map(str::to_string),
css_files,
js_files,
);
let page_header = PageHeader::new(
config.get_site_title().map(str::to_string),
Some(get_web_path(config, output_directory, output_file, "")?),
render_context.config.get_site_title().map(str::to_string),
Some(get_web_path(
render_context.config,
render_context.output_directory,
render_context.output_file,
"",
)?),
);
let children = original
.original
.into_iter()
.map(|blog_post| {
RenderBlogStreamEntry::new(config, output_directory, output_file, blog_post)
})
.map(|blog_post| RenderBlogStreamEntry::new(render_context.clone(), blog_post))
.collect::<Result<Vec<_>, _>>()?;
let stream_pagination = if older_link.is_some() || newer_link.is_some() {
Some(RenderBlogStreamPagination::new(older_link, newer_link)?)
let stream_pagination = if original.older_link.is_some() || original.newer_link.is_some() {
Some(RenderBlogStreamPagination::new(
original.older_link.clone(),
original.newer_link.clone(),
)?)
} else {
None
};
@@ -76,7 +105,7 @@ impl RenderBlogStream {
stream_pagination,
})
}
}
);
#[derive(Debug, Serialize)]
pub(crate) struct RenderBlogStreamEntry {
@@ -90,43 +119,38 @@ pub(crate) struct RenderBlogStreamEntry {
footnotes: Vec<RenderRealFootnoteDefinition>,
}
impl RenderBlogStreamEntry {
fn new(
config: &Config,
output_directory: &Path,
output_file: &Path,
original: &BlogPost,
) -> Result<RenderBlogStreamEntry, CustomError> {
// TODO: This link is probably wrong.
let link_to_blog_post = get_web_path(
config,
output_directory,
output_file,
output_file.strip_prefix(output_directory)?,
)?;
render!(RenderBlogStreamEntry, BlogPost, original, render_context, {
// TODO: This link is probably wrong.
let link_to_blog_post = get_web_path(
render_context.config,
render_context.output_directory,
render_context.output_file,
render_context
.output_file
.strip_prefix(render_context.output_directory)?,
)?;
// TODO: Should I guess an index page instead of erroring out?
let index_page = original
.get_index_page()
.ok_or_else(|| format!("Blog post {} needs an index page.", original.id))?;
// TODO: Should I guess an index page instead of erroring out?
let index_page = original
.get_index_page()
.ok_or_else(|| format!("Blog post {} needs an index page.", original.id))?;
let title = index_page.title.clone();
let title = index_page.title.clone();
// TODO: Handle footnotes.
let children = index_page
.children
.iter()
.map(|child| RenderDocumentElement::new(config, output_directory, output_file, child))
.collect::<Result<Vec<_>, _>>()?;
// TODO: Handle footnotes.
let children = index_page
.children
.iter()
.map(|child| RenderDocumentElement::new(render_context.clone(), child))
.collect::<Result<Vec<_>, _>>()?;
Ok(RenderBlogStreamEntry {
title,
self_link: Some(link_to_blog_post),
children,
footnotes: Vec::new(),
})
}
}
Ok(RenderBlogStreamEntry {
title,
self_link: Some(link_to_blog_post),
children,
footnotes: Vec::new(),
})
});
#[derive(Debug, Serialize)]
pub(crate) struct RenderBlogStreamPagination {