Switch over to using the render context in render calls.
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user