use std::path::{Path, PathBuf};
pub fn resolve_image_path(dest: &str, doc_dir: Option<&Path>) -> Option<PathBuf> {
let dest = dest.trim();
if dest.is_empty() {
return None;
}
let lower = dest.to_ascii_lowercase();
if lower.starts_with("http://")
|| lower.starts_with("https://")
|| lower.starts_with("data:")
|| dest.starts_with("//")
{
return None;
}
let raw = dest.strip_prefix("file://").unwrap_or(dest);
let path = Path::new(raw);
if path.is_absolute() {
Some(path.to_path_buf())
} else {
doc_dir.map(|d| d.join(path))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolve_rejects_remote_and_anchors_relative() {
let dir = Path::new("/docs");
assert_eq!(
resolve_image_path("pics/cat.png", Some(dir)),
Some(PathBuf::from("/docs/pics/cat.png"))
);
assert_eq!(
resolve_image_path("/abs/cat.png", Some(dir)),
Some(PathBuf::from("/abs/cat.png"))
);
assert_eq!(resolve_image_path("https://x.dev/a.png", Some(dir)), None);
assert_eq!(
resolve_image_path("data:image/png;base64,AAAA", Some(dir)),
None
);
assert_eq!(resolve_image_path("cat.png", None), None);
}
}