From ff478253c3de90a2692f247baab74ae9a41db45d Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 8 Feb 2025 18:59:45 -0500 Subject: [PATCH] Generate render link based on path to file. --- src/context/blog_stream.rs | 45 +++++------ src/context/dependency_manager.rs | 10 +++ src/context/page.rs | 119 +++++++++++++++--------------- src/intermediate/regular_link.rs | 24 +++++- 4 files changed, 118 insertions(+), 80 deletions(-) diff --git a/src/context/blog_stream.rs b/src/context/blog_stream.rs index 342fdde..fac3606 100644 --- a/src/context/blog_stream.rs +++ b/src/context/blog_stream.rs @@ -2,6 +2,7 @@ use serde::Serialize; use super::macros::render; use super::render_context::RenderContext; +use crate::context::macros::push_file; use crate::context::RenderDocumentElement; use crate::context::RenderRealFootnoteDefinition; use crate::error::CustomError; @@ -164,32 +165,34 @@ render!( .get_index_page() .ok_or_else(|| format!("Blog post {} needs an index page.", original.original.id))?; - let title = index_page.title.clone(); + push_file!(render_context, &index_page.src, { + let title = index_page.title.clone(); - let children = index_page - .children - .iter() - .map(|child| RenderDocumentElement::new(render_context.clone(), child)) - .collect::, _>>()?; + let children = index_page + .children + .iter() + .map(|child| RenderDocumentElement::new(render_context.clone(), child)) + .collect::, _>>()?; - let footnotes = { - let mut ret = Vec::new(); + let footnotes = { + let mut ret = Vec::new(); - for footnote in index_page.footnotes.iter() { - ret.push(RenderRealFootnoteDefinition::new( - render_context.clone(), - footnote, - )?); - } + for footnote in index_page.footnotes.iter() { + ret.push(RenderRealFootnoteDefinition::new( + render_context.clone(), + footnote, + )?); + } - ret - }; + ret + }; - Ok(RenderBlogStreamEntry { - title, - self_link: Some(link_to_blog_post), - children, - footnotes, + Ok(RenderBlogStreamEntry { + title, + self_link: Some(link_to_blog_post), + children, + footnotes, + }) }) } ); diff --git a/src/context/dependency_manager.rs b/src/context/dependency_manager.rs index b685668..6553129 100644 --- a/src/context/dependency_manager.rs +++ b/src/context/dependency_manager.rs @@ -1,3 +1,4 @@ +use std::path::Path; use std::path::PathBuf; use crate::error::CustomError; @@ -33,4 +34,13 @@ impl DependencyManager { .expect("Popped more files off the dependency manager file stack than exist."); Ok(()) } + + pub(crate) fn get_current_folder(&self) -> Result<&Path, CustomError> { + Ok(self + .file_stack + .last() + .ok_or("No current file")? + .parent() + .ok_or("Current file was not in a directory")?) + } } diff --git a/src/context/page.rs b/src/context/page.rs index d87d91e..cd8e5f0 100644 --- a/src/context/page.rs +++ b/src/context/page.rs @@ -4,6 +4,7 @@ use super::render_context::RenderContext; use super::GlobalSettings; use super::PageHeader; use super::RenderDocumentElement; +use crate::context::macros::push_file; use crate::error::CustomError; use crate::intermediate::get_web_path; use crate::intermediate::IPage; @@ -28,75 +29,77 @@ pub(crate) struct RenderPage { } render!(RenderPage, IPage, original, render_context, { - let css_files = vec![ - get_web_path( + push_file!(render_context, &original.src, { + let css_files = vec![ + get_web_path( + render_context.config, + render_context.output_root_directory, + render_context.output_file, + "stylesheet/reset.css", + )?, + get_web_path( + render_context.config, + render_context.output_root_directory, + render_context.output_file, + "stylesheet/main.css", + )?, + ]; + let js_files = vec![get_web_path( render_context.config, render_context.output_root_directory, render_context.output_file, - "stylesheet/reset.css", - )?, - get_web_path( + "blog_post.js", + )?]; + let global_settings = GlobalSettings::new(original.title.clone(), css_files, js_files); + let page_header = PageHeader::new( + render_context.config.get_site_title().map(str::to_string), + Some(get_web_path( + render_context.config, + render_context.output_root_directory, + render_context.output_file, + "", + )?), + ); + let link_to_blog_post = get_web_path( render_context.config, render_context.output_root_directory, render_context.output_file, - "stylesheet/main.css", - )?, - ]; - let js_files = vec![get_web_path( - render_context.config, - render_context.output_root_directory, - render_context.output_file, - "blog_post.js", - )?]; - let global_settings = GlobalSettings::new(original.title.clone(), css_files, js_files); - let page_header = PageHeader::new( - render_context.config.get_site_title().map(str::to_string), - Some(get_web_path( - render_context.config, - render_context.output_root_directory, - render_context.output_file, - "", - )?), - ); - let link_to_blog_post = get_web_path( - render_context.config, - render_context.output_root_directory, - render_context.output_file, - render_context - .output_file - .strip_prefix(render_context.output_root_directory)?, - )?; + render_context + .output_file + .strip_prefix(render_context.output_root_directory)?, + )?; - let children = { - let mut children = Vec::new(); + let children = { + let mut children = Vec::new(); - for child in original.children.iter() { - children.push(RenderDocumentElement::new(render_context.clone(), child)?); - } + for child in original.children.iter() { + children.push(RenderDocumentElement::new(render_context.clone(), child)?); + } - children - }; + children + }; - let footnotes = { - let mut ret = Vec::new(); + let footnotes = { + let mut ret = Vec::new(); - for footnote in original.footnotes.iter() { - ret.push(RenderRealFootnoteDefinition::new( - render_context.clone(), - footnote, - )?); - } + for footnote in original.footnotes.iter() { + ret.push(RenderRealFootnoteDefinition::new( + render_context.clone(), + footnote, + )?); + } - ret - }; + ret + }; - let ret = RenderPage { - global_settings, - page_header: Some(page_header), - title: original.title.clone(), - self_link: Some(link_to_blog_post), - children, - footnotes, - }; - Ok(ret) + let ret = RenderPage { + global_settings, + page_header: Some(page_header), + title: original.title.clone(), + self_link: Some(link_to_blog_post), + children, + footnotes, + }; + Ok(ret) + }) }); diff --git a/src/intermediate/regular_link.rs b/src/intermediate/regular_link.rs index b9fce81..e36577a 100644 --- a/src/intermediate/regular_link.rs +++ b/src/intermediate/regular_link.rs @@ -143,7 +143,29 @@ impl LinkTarget { .unwrap_or_default(), target_id ))), - LinkTarget::Image { src, .. } => Ok(Some(src.clone())), + LinkTarget::Image { src, .. } => { + let path_to_file = render_context + .dependency_manager + .lock() + .unwrap() + .get_current_folder()? + .join(src) + .canonicalize()?; + let input_root_directory = render_context.config.get_root_directory(); + let relative_path_to_file = path_to_file.strip_prefix(input_root_directory)?; + dbg!(input_root_directory); + dbg!(&path_to_file); + dbg!(relative_path_to_file); + let web_path = get_web_path( + render_context.config, + render_context.output_root_directory, + render_context.output_file, + relative_path_to_file, + )?; + dbg!(&web_path); + // TODO: Record interest in copying the file to output. + Ok(Some(web_path)) + } } }