2023-10-24 02:10:26 +00:00
|
|
|
use std::path::Path;
|
|
|
|
use std::path::PathBuf;
|
|
|
|
|
|
|
|
use crate::config::Config;
|
|
|
|
use crate::error::CustomError;
|
|
|
|
|
2023-10-24 01:51:15 +00:00
|
|
|
use super::render_context::GlobalSettings;
|
2023-10-24 00:30:43 +00:00
|
|
|
use super::render_context::RenderBlogPostPage;
|
2023-10-22 20:01:42 +00:00
|
|
|
use super::BlogPost;
|
2023-10-24 00:30:43 +00:00
|
|
|
use super::BlogPostPage;
|
2023-10-22 20:01:42 +00:00
|
|
|
|
2023-10-24 02:10:26 +00:00
|
|
|
pub(crate) fn convert_blog_post_page_to_render_context<D: AsRef<Path>, F: AsRef<Path>>(
|
|
|
|
config: &Config,
|
|
|
|
output_directory: D,
|
|
|
|
output_file: F,
|
2023-10-24 00:30:43 +00:00
|
|
|
_post: &BlogPost,
|
|
|
|
page: &BlogPostPage,
|
2023-10-24 02:10:26 +00:00
|
|
|
) -> Result<RenderBlogPostPage, CustomError> {
|
|
|
|
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<D: AsRef<Path>, F: AsRef<Path>, P: AsRef<Path>>(
|
|
|
|
config: &Config,
|
|
|
|
output_directory: D,
|
|
|
|
containing_file: F,
|
|
|
|
path_from_web_root: P,
|
|
|
|
) -> Result<String, CustomError> {
|
|
|
|
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)
|
|
|
|
}
|
2023-10-22 20:01:42 +00:00
|
|
|
}
|