use regex::Regex;
fn ref_link(ref_id: &str) -> String {
ref_link_with_base(ref_id, "..")
}
pub fn ref_link_from_root(ref_id: &str, docs_output: &str) -> String {
ref_link_with_base(ref_id, docs_output)
}
fn ref_link_with_base(ref_id: &str, base: &str) -> String {
if ref_id.starts_with("RFC-") {
if ref_id.contains(':') {
let rfc_id = ref_id.split(':').next().unwrap_or(ref_id);
let anchor = ref_id.to_lowercase().replace(':', "");
format!("[{}]({}/rfc/{}.md#{})", ref_id, base, rfc_id, anchor)
} else {
format!("[{}]({}/rfc/{}.md)", ref_id, base, ref_id)
}
} else if ref_id.starts_with("ADR-") {
format!("[{}]({}/adr/{}.md)", ref_id, base, ref_id)
} else if ref_id.starts_with("WI-") {
format!("[{}]({}/work/{}.md)", ref_id, base, ref_id)
} else {
ref_id.to_string()
}
}
pub(super) fn render_refs(refs: &[String]) -> String {
refs.iter()
.map(|r| ref_link(r))
.collect::<Vec<_>>()
.join(", ")
}
pub fn expand_inline_refs(text: &str, pattern: &str) -> String {
expand_inline_refs_with_linker(text, pattern, ref_link)
}
pub(super) fn expand_inline_refs_with_linker<F>(text: &str, pattern: &str, linker: F) -> String
where
F: Fn(&str) -> String,
{
let Ok(re) = Regex::new(pattern) else {
return text.to_string();
};
re.replace_all(text, |caps: ®ex::Captures| {
if let Some(artifact_id) = caps.get(1) {
linker(artifact_id.as_str())
} else {
caps.get(0).map_or("", |m| m.as_str()).to_string()
}
})
.to_string()
}