Render the head for the page.

This commit is contained in:
Tom Alexander
2023-10-23 21:51:15 -04:00
parent 2b6f86d4e9
commit 178ce877bc
9 changed files with 126 additions and 9 deletions

View File

@@ -1,4 +1,5 @@
use std::ffi::OsStr;
use std::path::Path;
use std::path::PathBuf;
use include_dir::include_dir;
@@ -6,6 +7,8 @@ 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;
use crate::render::RendererIntegration;
@@ -27,7 +30,7 @@ impl SiteRenderer {
blog_posts,
}
}
pub(crate) async fn render_blog_posts(&self) -> Result<(), CustomError> {
pub(crate) async fn render_blog_posts(&self, config: &Config) -> Result<(), CustomError> {
let mut renderer_integration = DusterRenderer::new();
let sources: Vec<_> = MAIN_TEMPLATES
@@ -62,9 +65,25 @@ impl SiteRenderer {
.join("posts")
.join(&blog_post.id)
.join(blog_post_page.get_output_path());
println!("Output path: {:?}", output_path);
let render_context =
convert_blog_post_page_to_render_context(blog_post, blog_post_page);
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(
blog_post,
blog_post_page,
global_settings,
);
let rendered_output = renderer_integration.render(render_context)?;
println!("Rendered: {}", rendered_output);
let parent_directory = output_path
@@ -91,3 +110,41 @@ fn build_name_contents_pairs<'a>(
let contents = std::str::from_utf8(entry.contents())?;
Ok((name, contents))
}
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)
}
}

View File

@@ -10,7 +10,7 @@ pub(crate) async fn build_site(args: BuildArgs) -> Result<(), CustomError> {
let config = Config::load_from_file(args.config).await?;
let blog_posts = load_blog_posts(&config).await?;
let renderer = SiteRenderer::new(get_output_directory(&config).await?, blog_posts);
renderer.render_blog_posts().await?;
renderer.render_blog_posts(&config).await?;
Ok(())
}