Make relative link work with anchors
This commit is contained in:
parent
b794a44a7f
commit
22392ff9ed
|
@ -234,14 +234,25 @@ pub fn markdown_to_html(content: &str, permalinks: &HashMap<String, String>, ter
|
||||||
// Need to handle relative links
|
// Need to handle relative links
|
||||||
Event::Start(Tag::Link(ref link, ref title)) => {
|
Event::Start(Tag::Link(ref link, ref title)) => {
|
||||||
if link.starts_with("./") {
|
if link.starts_with("./") {
|
||||||
let permalink = match permalinks.get(&link.replacen("./", "", 1)) {
|
// First we remove the ./ since that's gutenberg specific
|
||||||
Some(p) => p,
|
let clean_link = link.replacen("./", "", 1);
|
||||||
|
// Then we remove any potential anchor
|
||||||
|
// parts[0] will be the file path and parts[1] the anchor if present
|
||||||
|
let parts = clean_link.split('#').collect::<Vec<_>>();
|
||||||
|
match permalinks.get(parts[0]) {
|
||||||
|
Some(p) => {
|
||||||
|
let url = if parts.len() > 1 {
|
||||||
|
format!("{}#{}", p, parts[1])
|
||||||
|
} else {
|
||||||
|
p.to_string()
|
||||||
|
};
|
||||||
|
return Event::Start(Tag::Link(Owned(url), title.clone()));
|
||||||
|
},
|
||||||
None => {
|
None => {
|
||||||
error = Some(format!("Relative link {} not found.", link).into());
|
error = Some(format!("Relative link {} not found.", link).into());
|
||||||
return Event::Html(Owned("".to_string()));
|
return Event::Html(Owned("".to_string()));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return Event::Start(Tag::Link(Owned(permalink.clone()), title.clone()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Event::Start(Tag::Link(link.clone(), title.clone()));
|
return Event::Start(Tag::Link(link.clone(), title.clone()));
|
||||||
|
@ -330,8 +341,8 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_markdown_to_html_simple() {
|
fn test_markdown_to_html_simple() {
|
||||||
let res = markdown_to_html("# hello", &HashMap::new(), &Tera::default(), &Config::default()).unwrap();
|
let res = markdown_to_html("hello", &HashMap::new(), &Tera::default(), &Config::default()).unwrap();
|
||||||
assert_eq!(res, "<h1>hello</h1>\n");
|
assert_eq!(res, "<p>hello</p>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -446,6 +457,22 @@ A quote
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_markdown_to_html_relative_links_with_anchors() {
|
||||||
|
let mut permalinks = HashMap::new();
|
||||||
|
permalinks.insert("pages/about.md".to_string(), "https://vincent.is/about".to_string());
|
||||||
|
let res = markdown_to_html(
|
||||||
|
r#"[rel link](./pages/about.md#cv)"#,
|
||||||
|
&permalinks,
|
||||||
|
&GUTENBERG_TERA,
|
||||||
|
&Config::default()
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
res.contains(r#"<p><a href="https://vincent.is/about#cv">rel link</a></p>"#)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_markdown_to_html_relative_link_inexistant() {
|
fn test_markdown_to_html_relative_link_inexistant() {
|
||||||
let res = markdown_to_html("[rel link](./pages/about.md)", &HashMap::new(), &Tera::default(), &Config::default());
|
let res = markdown_to_html("[rel link](./pages/about.md)", &HashMap::new(), &Tera::default(), &Config::default());
|
||||||
|
|
Loading…
Reference in a new issue