From 3b63bbdfde35c2a1d5bad739eaf68ff632aecf1a Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 23 Dec 2023 21:29:59 -0500 Subject: [PATCH] Add support for subpaths. --- src/intermediate/regular_link.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/intermediate/regular_link.rs b/src/intermediate/regular_link.rs index dfed5c3..50a52a7 100644 --- a/src/intermediate/regular_link.rs +++ b/src/intermediate/regular_link.rs @@ -43,7 +43,10 @@ intermediate!( #[derive(Debug, Clone)] pub(crate) enum LinkTarget { Raw(String), - Post { post_id: Option }, + Post { + post_id: Option, + subpath: String, + }, } impl LinkTarget { @@ -59,7 +62,18 @@ impl LinkTarget { match parsed.scheme() { "post" => { let post_id = parsed.host_str().map(str::to_owned); - Ok(LinkTarget::Post { post_id }) + let subpath = { + let subpath = parsed.path(); + if subpath.starts_with('/') { + &subpath[1..] + } else { + subpath + } + }; + Ok(LinkTarget::Post { + post_id, + subpath: subpath.to_owned(), + }) } _ => Ok(LinkTarget::Raw(input.to_owned())), } @@ -73,15 +87,19 @@ impl LinkTarget { ) -> Result, CustomError> { match self { LinkTarget::Raw(raw_link) => Ok(Some(raw_link.clone())), - LinkTarget::Post { post_id } => { + LinkTarget::Post { post_id, subpath } => { let path = post_id .as_ref() .map(|post_id| { + let path_to_post = render_context + .config + .get_relative_path_to_post(post_id) + .join(subpath); get_web_path( render_context.config, render_context.output_root_directory, render_context.output_file, - render_context.config.get_relative_path_to_post(post_id), + path_to_post, ) }) .map_or(Ok(None), |r| r.map(Some))?;