From cbe2010407becc0615e28ac9ae32424a2c3d537f Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 17 Dec 2023 17:26:15 -0500 Subject: [PATCH] Invoke dust to render the stream pages. At this point the render_blog_stream function is done, but RenderBlogStream::new needs to be implemented to actually generate the render context. The body of this function should be similar to convert_blog_post_page_to_render_context. --- src/command/build/render.rs | 36 ++++++++++++++++++++++++++---------- src/context/blog_stream.rs | 2 ++ src/context/mod.rs | 1 + 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/command/build/render.rs b/src/command/build/render.rs index a40f158..06eddb3 100644 --- a/src/command/build/render.rs +++ b/src/command/build/render.rs @@ -5,6 +5,7 @@ use include_dir::include_dir; use include_dir::Dir; use crate::config::Config; +use crate::context::RenderBlogStream; use crate::error::CustomError; use crate::intermediate::convert_blog_post_page_to_render_context; use crate::intermediate::get_web_path; @@ -35,7 +36,7 @@ impl SiteRenderer { } } - pub(crate) async fn render_blog_posts(&self, config: &Config) -> Result<(), CustomError> { + fn init_renderer_integration(&self) -> Result, CustomError> { let mut renderer_integration = DusterRenderer::new(); let sources: Vec<_> = MAIN_TEMPLATES @@ -63,6 +64,12 @@ impl SiteRenderer { renderer_integration.load_template(name, contents)?; } + Ok(renderer_integration) + } + + pub(crate) async fn render_blog_posts(&self, config: &Config) -> Result<(), CustomError> { + let renderer_integration = self.init_renderer_integration()?; + for blog_post in &self.blog_posts { for blog_post_page in &blog_post.pages { let output_path = self @@ -91,15 +98,7 @@ impl SiteRenderer { } pub(crate) async fn render_blog_stream(&self, config: &Config) -> Result<(), CustomError> { - // TODO: Actually render a blog stream to index.html - - // Steps: sort blog posts by date, newest first - // - // Steps: group blog posts based on # of posts per page - // - // Steps: for each group, create a RenderBlogStream - // - // Steps: pass each RenderBlogStream to dust as the context to render index.html and any additional stream pages. + let renderer_integration = self.init_renderer_integration()?; // Sort blog posts by date, newest first. let sorted_blog_posts = { @@ -158,6 +157,23 @@ impl SiteRenderer { format!("stream/{}.html", page_num + 1), )?) }; + + let blog_stream = RenderBlogStream::new( + config, + self.output_directory.as_path(), + output_file.as_path(), + chunk, + older_link, + newer_link, + )?; + + // Pass each RenderBlogStream to dust as the context to render index.html and any additional stream pages. + let rendered_output = renderer_integration.render(blog_stream)?; + let parent_directory = output_file + .parent() + .ok_or("Output file should have a containing directory.")?; + tokio::fs::create_dir_all(parent_directory).await?; + tokio::fs::write(output_file, rendered_output).await?; } Ok(()) } diff --git a/src/context/blog_stream.rs b/src/context/blog_stream.rs index f0b2846..f476f43 100644 --- a/src/context/blog_stream.rs +++ b/src/context/blog_stream.rs @@ -28,6 +28,8 @@ impl RenderBlogStream { output_directory: &Path, output_file: &Path, original: &[&BlogPost], + older_link: Option, + newer_link: Option, ) -> Result { todo!() } diff --git a/src/context/mod.rs b/src/context/mod.rs index f39cf34..76a0921 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -65,6 +65,7 @@ mod verbatim; mod verse_block; pub(crate) use blog_post_page::RenderBlogPostPage; +pub(crate) use blog_stream::RenderBlogStream; pub(crate) use document_element::RenderDocumentElement; pub(crate) use element::RenderElement; pub(crate) use footnote_definition::RenderRealFootnoteDefinition;