diff --git a/src/blog_post/convert.rs b/src/blog_post/convert.rs index 7d2dcaa..baed94d 100644 --- a/src/blog_post/convert.rs +++ b/src/blog_post/convert.rs @@ -1,12 +1,75 @@ +use std::path::Path; +use std::path::PathBuf; + +use crate::config::Config; +use crate::error::CustomError; + use super::render_context::GlobalSettings; use super::render_context::RenderBlogPostPage; use super::BlogPost; use super::BlogPostPage; -pub(crate) fn convert_blog_post_page_to_render_context( +pub(crate) fn convert_blog_post_page_to_render_context, F: AsRef>( + config: &Config, + output_directory: D, + output_file: F, _post: &BlogPost, page: &BlogPostPage, - global_settings: GlobalSettings, -) -> RenderBlogPostPage { - RenderBlogPostPage::new(global_settings, page.title.clone()) +) -> Result { + let output_directory = output_directory.as_ref(); + let output_file = output_file.as_ref(); + let css_files = vec![get_web_path( + config, + output_directory, + output_file, + "main.css", + )?]; + let js_files = vec![get_web_path( + config, + output_directory, + output_file, + "blog_post.js", + )?]; + let global_settings = GlobalSettings::new(page.title.clone(), css_files, js_files); + + let ret = RenderBlogPostPage::new(global_settings, page.title.clone()); + Ok(ret) +} + +fn get_web_path, F: AsRef, P: AsRef>( + config: &Config, + output_directory: D, + containing_file: F, + path_from_web_root: P, +) -> Result { + let path_from_web_root = path_from_web_root.as_ref(); + if config.use_relative_paths() { + let output_directory = output_directory.as_ref(); + let containing_file = containing_file.as_ref(); + // Subtracting 1 from the depth to "remove" the file name. + let depth_from_web_root = containing_file + .strip_prefix(output_directory)? + .components() + .count() + - 1; + let prefix = "../".repeat(depth_from_web_root); + let final_path = PathBuf::from(prefix).join(path_from_web_root); + let final_string = final_path + .as_path() + .to_str() + .map(str::to_string) + .ok_or("Path should be valid utf-8.")?; + Ok(final_string) + } else { + let web_root = config + .get_web_root() + .ok_or("Must either use_relative_paths or set the web_root in the config.")?; + let final_path = PathBuf::from(web_root).join(path_from_web_root); + let final_string = final_path + .as_path() + .to_str() + .map(str::to_string) + .ok_or("Path should be valid utf-8.")?; + Ok(final_string) + } } diff --git a/src/blog_post/definition.rs b/src/blog_post/definition.rs index 277c439..96a3c7a 100644 --- a/src/blog_post/definition.rs +++ b/src/blog_post/definition.rs @@ -19,7 +19,7 @@ impl BlogPost { root_dir: R, post_dir: P, ) -> Result { - async fn inner(root_dir: &Path, post_dir: &Path) -> Result { + async fn inner(_root_dir: &Path, post_dir: &Path) -> Result { let post_id = post_dir .file_name() .expect("The post directory should have a name."); diff --git a/src/blog_post/mod.rs b/src/blog_post/mod.rs index 2b6790c..bd4e010 100644 --- a/src/blog_post/mod.rs +++ b/src/blog_post/mod.rs @@ -5,4 +5,3 @@ mod render_context; pub(crate) use convert::convert_blog_post_page_to_render_context; pub(crate) use definition::BlogPost; pub(crate) use page::BlogPostPage; -pub(crate) use render_context::GlobalSettings; diff --git a/src/command/build/render.rs b/src/command/build/render.rs index 1acd6af..808d5b3 100644 --- a/src/command/build/render.rs +++ b/src/command/build/render.rs @@ -1,5 +1,4 @@ use std::ffi::OsStr; -use std::path::Path; use std::path::PathBuf; use include_dir::include_dir; @@ -7,7 +6,6 @@ use include_dir::Dir; use crate::blog_post::convert_blog_post_page_to_render_context; use crate::blog_post::BlogPost; -use crate::blog_post::GlobalSettings; use crate::config::Config; use crate::error::CustomError; use crate::render::DusterRenderer; @@ -65,25 +63,14 @@ impl SiteRenderer { .join("posts") .join(&blog_post.id) .join(blog_post_page.get_output_path()); - let css_files = vec![get_web_path( - config, - &self.output_directory, - &output_path, - "main.css", - )?]; - let js_files = vec![get_web_path( - config, - &self.output_directory, - &output_path, - "blog_post.js", - )?]; - let global_settings = - GlobalSettings::new(blog_post_page.title.clone(), css_files, js_files); + let render_context = convert_blog_post_page_to_render_context( + config, + &self.output_directory, + &output_path, blog_post, blog_post_page, - global_settings, - ); + )?; let rendered_output = renderer_integration.render(render_context)?; println!("Rendered: {}", rendered_output); let parent_directory = output_path @@ -110,41 +97,3 @@ fn build_name_contents_pairs<'a>( let contents = std::str::from_utf8(entry.contents())?; Ok((name, contents)) } - -fn get_web_path, F: AsRef, P: AsRef>( - config: &Config, - output_directory: D, - containing_file: F, - path_from_web_root: P, -) -> Result { - let path_from_web_root = path_from_web_root.as_ref(); - if config.use_relative_paths() { - let output_directory = output_directory.as_ref(); - let containing_file = containing_file.as_ref(); - // Subtracting 1 from the depth to "remove" the file name. - let depth_from_web_root = containing_file - .strip_prefix(output_directory)? - .components() - .count() - - 1; - let prefix = "../".repeat(depth_from_web_root); - let final_path = PathBuf::from(prefix).join(path_from_web_root); - let final_string = final_path - .as_path() - .to_str() - .map(str::to_string) - .ok_or("Path should be valid utf-8.")?; - Ok(final_string) - } else { - let web_root = config - .get_web_root() - .ok_or("Must either use_relative_paths or set the web_root in the config.")?; - let final_path = PathBuf::from(web_root).join(path_from_web_root); - let final_string = final_path - .as_path() - .to_str() - .map(str::to_string) - .ok_or("Path should be valid utf-8.")?; - Ok(final_string) - } -}