From 24218f297965bd2b2b15a1974c7e4aa1cb13c554 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 23 Dec 2023 21:06:53 -0500 Subject: [PATCH] Generate post links, so far only top-level. --- .../templates/html/regular_link.dust | 2 +- src/context/regular_link.rs | 2 +- src/intermediate/regular_link.rs | 39 +++++++++++++++---- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/default_environment/templates/html/regular_link.dust b/default_environment/templates/html/regular_link.dust index 2566d30..5a0dcb7 100644 --- a/default_environment/templates/html/regular_link.dust +++ b/default_environment/templates/html/regular_link.dust @@ -1 +1 @@ -{#.children}{>object/}{/.children} +{#.children}{>object/}{/.children} diff --git a/src/context/regular_link.rs b/src/context/regular_link.rs index e247cb8..2fe5a82 100644 --- a/src/context/regular_link.rs +++ b/src/context/regular_link.rs @@ -28,7 +28,7 @@ render!(RenderRegularLink, IRegularLink, original, render_context, { let target = original .target - .generate_final_target()? + .generate_final_target(render_context.clone())? .unwrap_or_else(|| "".to_owned()); Ok(RenderRegularLink { diff --git a/src/intermediate/regular_link.rs b/src/intermediate/regular_link.rs index 7fb3d5a..dfed5c3 100644 --- a/src/intermediate/regular_link.rs +++ b/src/intermediate/regular_link.rs @@ -1,9 +1,11 @@ use organic::types::StandardProperties; use url::Url; +use super::get_web_path; use super::macros::intermediate; use super::IObject; +use crate::context::RenderContext; use crate::error::CustomError; #[derive(Debug, Clone)] @@ -47,14 +49,16 @@ pub(crate) enum LinkTarget { impl LinkTarget { pub(crate) fn from_string>(input: S) -> Result { fn impl_from_string(input: &str) -> Result { - let parsed = Url::parse(input)?; + let parsed = Url::parse(input); + if let Err(url::ParseError::RelativeUrlWithoutBase) = parsed { + // For URLs to targets. + // TODO: This shouldn't be raw but instead a variant for targets. + return Ok(LinkTarget::Raw(input.to_owned())); + } + let parsed = parsed?; match parsed.scheme() { "post" => { - let post_id = parsed - .path_segments() - .ok_or_else(|| "cannot be base")? - .next() - .map(str::to_owned); + let post_id = parsed.host_str().map(str::to_owned); Ok(LinkTarget::Post { post_id }) } _ => Ok(LinkTarget::Raw(input.to_owned())), @@ -63,7 +67,26 @@ impl LinkTarget { impl_from_string(input.as_ref()) } - pub(crate) fn generate_final_target(&self) -> Result, CustomError> { - todo!() + pub(crate) fn generate_final_target( + &self, + render_context: RenderContext<'_>, + ) -> Result, CustomError> { + match self { + LinkTarget::Raw(raw_link) => Ok(Some(raw_link.clone())), + LinkTarget::Post { post_id } => { + let path = post_id + .as_ref() + .map(|post_id| { + 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), + ) + }) + .map_or(Ok(None), |r| r.map(Some))?; + Ok(path) + } + } } }