Generate render link based on path to file.

This commit is contained in:
Tom Alexander 2025-02-08 18:59:45 -05:00
parent 3e952ef0f4
commit ff478253c3
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
4 changed files with 118 additions and 80 deletions

View File

@ -2,6 +2,7 @@ use serde::Serialize;
use super::macros::render; use super::macros::render;
use super::render_context::RenderContext; use super::render_context::RenderContext;
use crate::context::macros::push_file;
use crate::context::RenderDocumentElement; use crate::context::RenderDocumentElement;
use crate::context::RenderRealFootnoteDefinition; use crate::context::RenderRealFootnoteDefinition;
use crate::error::CustomError; use crate::error::CustomError;
@ -164,32 +165,34 @@ render!(
.get_index_page() .get_index_page()
.ok_or_else(|| format!("Blog post {} needs an index page.", original.original.id))?; .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 let children = index_page
.children .children
.iter() .iter()
.map(|child| RenderDocumentElement::new(render_context.clone(), child)) .map(|child| RenderDocumentElement::new(render_context.clone(), child))
.collect::<Result<Vec<_>, _>>()?; .collect::<Result<Vec<_>, _>>()?;
let footnotes = { let footnotes = {
let mut ret = Vec::new(); let mut ret = Vec::new();
for footnote in index_page.footnotes.iter() { for footnote in index_page.footnotes.iter() {
ret.push(RenderRealFootnoteDefinition::new( ret.push(RenderRealFootnoteDefinition::new(
render_context.clone(), render_context.clone(),
footnote, footnote,
)?); )?);
} }
ret ret
}; };
Ok(RenderBlogStreamEntry { Ok(RenderBlogStreamEntry {
title, title,
self_link: Some(link_to_blog_post), self_link: Some(link_to_blog_post),
children, children,
footnotes, footnotes,
})
}) })
} }
); );

View File

@ -1,3 +1,4 @@
use std::path::Path;
use std::path::PathBuf; use std::path::PathBuf;
use crate::error::CustomError; use crate::error::CustomError;
@ -33,4 +34,13 @@ impl DependencyManager {
.expect("Popped more files off the dependency manager file stack than exist."); .expect("Popped more files off the dependency manager file stack than exist.");
Ok(()) 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")?)
}
} }

View File

@ -4,6 +4,7 @@ use super::render_context::RenderContext;
use super::GlobalSettings; use super::GlobalSettings;
use super::PageHeader; use super::PageHeader;
use super::RenderDocumentElement; use super::RenderDocumentElement;
use crate::context::macros::push_file;
use crate::error::CustomError; use crate::error::CustomError;
use crate::intermediate::get_web_path; use crate::intermediate::get_web_path;
use crate::intermediate::IPage; use crate::intermediate::IPage;
@ -28,75 +29,77 @@ pub(crate) struct RenderPage {
} }
render!(RenderPage, IPage, original, render_context, { render!(RenderPage, IPage, original, render_context, {
let css_files = vec![ push_file!(render_context, &original.src, {
get_web_path( 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.config,
render_context.output_root_directory, render_context.output_root_directory,
render_context.output_file, render_context.output_file,
"stylesheet/reset.css", "blog_post.js",
)?, )?];
get_web_path( 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.config,
render_context.output_root_directory, render_context.output_root_directory,
render_context.output_file, render_context.output_file,
"stylesheet/main.css", render_context
)?, .output_file
]; .strip_prefix(render_context.output_root_directory)?,
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)?,
)?;
let children = { let children = {
let mut children = Vec::new(); let mut children = Vec::new();
for child in original.children.iter() { for child in original.children.iter() {
children.push(RenderDocumentElement::new(render_context.clone(), child)?); children.push(RenderDocumentElement::new(render_context.clone(), child)?);
} }
children children
}; };
let footnotes = { let footnotes = {
let mut ret = Vec::new(); let mut ret = Vec::new();
for footnote in original.footnotes.iter() { for footnote in original.footnotes.iter() {
ret.push(RenderRealFootnoteDefinition::new( ret.push(RenderRealFootnoteDefinition::new(
render_context.clone(), render_context.clone(),
footnote, footnote,
)?); )?);
} }
ret ret
}; };
let ret = RenderPage { let ret = RenderPage {
global_settings, global_settings,
page_header: Some(page_header), page_header: Some(page_header),
title: original.title.clone(), title: original.title.clone(),
self_link: Some(link_to_blog_post), self_link: Some(link_to_blog_post),
children, children,
footnotes, footnotes,
}; };
Ok(ret) Ok(ret)
})
}); });

View File

@ -143,7 +143,29 @@ impl LinkTarget {
.unwrap_or_default(), .unwrap_or_default(),
target_id 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))
}
} }
} }