2023-12-21 14:56:58 -05:00
|
|
|
use organic::types::StandardProperties;
|
2023-12-23 20:45:20 -05:00
|
|
|
use url::Url;
|
2023-12-21 14:56:58 -05:00
|
|
|
|
2023-12-23 21:06:53 -05:00
|
|
|
use super::get_web_path;
|
2023-10-29 17:29:16 -04:00
|
|
|
use super::macros::intermediate;
|
2023-12-23 22:12:05 -05:00
|
|
|
use super::IntermediateContext;
|
2023-10-29 22:31:29 -04:00
|
|
|
|
2023-10-27 20:43:57 -04:00
|
|
|
use super::IObject;
|
2023-12-23 21:06:53 -05:00
|
|
|
use crate::context::RenderContext;
|
2023-10-29 17:29:16 -04:00
|
|
|
use crate::error::CustomError;
|
2023-10-27 17:48:19 -04:00
|
|
|
|
2023-10-29 15:36:15 -04:00
|
|
|
#[derive(Debug, Clone)]
|
2023-10-27 20:43:57 -04:00
|
|
|
pub(crate) struct IRegularLink {
|
2023-10-29 09:31:00 -04:00
|
|
|
pub(crate) raw_link: String,
|
2023-10-27 20:43:57 -04:00
|
|
|
pub(crate) children: Vec<IObject>,
|
2023-12-23 20:35:27 -05:00
|
|
|
pub(crate) target: LinkTarget,
|
2023-12-21 14:56:58 -05:00
|
|
|
pub(crate) post_blank: organic::types::PostBlank,
|
2023-10-27 20:43:57 -04:00
|
|
|
}
|
2023-10-27 17:48:19 -04:00
|
|
|
|
2023-12-19 17:09:11 -05:00
|
|
|
intermediate!(
|
|
|
|
IRegularLink,
|
|
|
|
&'orig organic::types::RegularLink<'parse>,
|
|
|
|
original,
|
2023-12-21 13:53:56 -05:00
|
|
|
intermediate_context,
|
2023-12-19 17:09:11 -05:00
|
|
|
{
|
|
|
|
let children = {
|
|
|
|
let mut ret = Vec::new();
|
|
|
|
for obj in original.children.iter() {
|
2023-12-21 13:53:56 -05:00
|
|
|
ret.push(IObject::new(intermediate_context.clone(), obj).await?);
|
2023-12-19 17:09:11 -05:00
|
|
|
}
|
|
|
|
ret
|
|
|
|
};
|
2023-12-23 20:35:27 -05:00
|
|
|
let raw_link = original.get_raw_link();
|
2023-12-23 22:12:05 -05:00
|
|
|
let target =
|
|
|
|
LinkTarget::from_string(intermediate_context.clone(), raw_link.clone().into_owned())?;
|
2023-12-19 17:09:11 -05:00
|
|
|
Ok(IRegularLink {
|
2023-12-23 20:35:27 -05:00
|
|
|
raw_link: raw_link.into_owned(),
|
2023-12-19 17:09:11 -05:00
|
|
|
children,
|
2023-12-23 20:35:27 -05:00
|
|
|
target,
|
2023-12-21 14:56:58 -05:00
|
|
|
post_blank: original.get_post_blank(),
|
2023-12-19 17:09:11 -05:00
|
|
|
})
|
|
|
|
}
|
|
|
|
);
|
2023-12-23 20:35:27 -05:00
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub(crate) enum LinkTarget {
|
|
|
|
Raw(String),
|
2023-12-23 21:29:59 -05:00
|
|
|
Post {
|
|
|
|
post_id: Option<String>,
|
|
|
|
subpath: String,
|
|
|
|
},
|
2023-12-23 22:12:05 -05:00
|
|
|
Target {
|
|
|
|
target_id: String,
|
|
|
|
},
|
2023-12-23 20:35:27 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
impl LinkTarget {
|
2023-12-23 22:12:05 -05:00
|
|
|
pub(crate) fn from_string(
|
|
|
|
intermediate_context: IntermediateContext<'_, '_>,
|
|
|
|
input: String,
|
|
|
|
) -> Result<LinkTarget, CustomError> {
|
|
|
|
let parsed = Url::parse(&input);
|
|
|
|
if let Err(url::ParseError::RelativeUrlWithoutBase) = parsed {
|
|
|
|
let target_id = {
|
|
|
|
let mut registry = intermediate_context.registry.lock().unwrap();
|
|
|
|
let target_id = registry.get_target(input).to_owned();
|
|
|
|
target_id
|
|
|
|
};
|
|
|
|
return Ok(LinkTarget::Target { target_id });
|
|
|
|
}
|
|
|
|
let parsed = parsed?;
|
|
|
|
match parsed.scheme() {
|
|
|
|
"post" => {
|
|
|
|
let post_id = parsed.host_str().map(str::to_owned);
|
|
|
|
let subpath = {
|
|
|
|
let subpath = parsed.path();
|
|
|
|
if let Some(subpath) = subpath.strip_prefix('/') {
|
|
|
|
subpath
|
|
|
|
} else {
|
|
|
|
subpath
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Ok(LinkTarget::Post {
|
|
|
|
post_id,
|
|
|
|
subpath: subpath.to_owned(),
|
|
|
|
})
|
2023-12-23 20:55:32 -05:00
|
|
|
}
|
2023-12-23 22:12:05 -05:00
|
|
|
_ => Ok(LinkTarget::Raw(input.to_owned())),
|
2023-12-23 20:35:27 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-12-23 21:06:53 -05:00
|
|
|
pub(crate) fn generate_final_target(
|
|
|
|
&self,
|
|
|
|
render_context: RenderContext<'_>,
|
|
|
|
) -> Result<Option<String>, CustomError> {
|
|
|
|
match self {
|
|
|
|
LinkTarget::Raw(raw_link) => Ok(Some(raw_link.clone())),
|
2023-12-23 21:29:59 -05:00
|
|
|
LinkTarget::Post { post_id, subpath } => {
|
2023-12-23 21:06:53 -05:00
|
|
|
let path = post_id
|
|
|
|
.as_ref()
|
|
|
|
.map(|post_id| {
|
2023-12-23 21:29:59 -05:00
|
|
|
let path_to_post = render_context
|
|
|
|
.config
|
|
|
|
.get_relative_path_to_post(post_id)
|
|
|
|
.join(subpath);
|
2023-12-23 21:06:53 -05:00
|
|
|
get_web_path(
|
|
|
|
render_context.config,
|
|
|
|
render_context.output_root_directory,
|
|
|
|
render_context.output_file,
|
2023-12-23 21:29:59 -05:00
|
|
|
path_to_post,
|
2023-12-23 21:06:53 -05:00
|
|
|
)
|
|
|
|
})
|
|
|
|
.map_or(Ok(None), |r| r.map(Some))?;
|
|
|
|
Ok(path)
|
|
|
|
}
|
2023-12-23 22:12:05 -05:00
|
|
|
LinkTarget::Target { target_id } => Ok(Some(format!(
|
|
|
|
"#{}{}",
|
|
|
|
render_context
|
|
|
|
.id_addition
|
|
|
|
.map(|id_addition| format!("sec{}.", id_addition))
|
|
|
|
.unwrap_or_default(),
|
|
|
|
target_id
|
|
|
|
))),
|
2023-12-23 21:06:53 -05:00
|
|
|
}
|
2023-12-23 20:35:27 -05:00
|
|
|
}
|
|
|
|
}
|