diff --git a/src/utils/mod.rs b/src/utils/mod.rs
index 8b113676..30c776fa 100644
--- a/src/utils/mod.rs
+++ b/src/utils/mod.rs
@@ -69,31 +69,40 @@ pub fn id_from_content(content: &str) -> String {
fn adjust_links<'a>(event: Event<'a>, with_base: &str) -> Event<'a> {
lazy_static! {
- static ref HTTP_LINK: Regex = Regex::new("^https?://").unwrap();
+ static ref SCHEME_LINK: Regex = Regex::new(r"^[a-z][a-z0-9+.-]*:").unwrap();
static ref MD_LINK: Regex = Regex::new(r"(?P.*)\.md(?P#.*)?").unwrap();
}
+ fn fix<'a>(dest: Cow<'a, str>, base: &str) -> Cow<'a, str> {
+ // Don't modify links with schemes like `https`.
+ if !SCHEME_LINK.is_match(&dest) {
+ // This is a relative link, adjust it as necessary.
+ let mut fixed_link = String::new();
+ if !base.is_empty() {
+ fixed_link.push_str(base);
+ fixed_link.push_str("/");
+ }
+
+ if let Some(caps) = MD_LINK.captures(&dest) {
+ fixed_link.push_str(&caps["link"]);
+ fixed_link.push_str(".html");
+ if let Some(anchor) = caps.name("anchor") {
+ fixed_link.push_str(anchor.as_str());
+ }
+ } else {
+ fixed_link.push_str(&dest);
+ };
+ return Cow::from(fixed_link);
+ }
+ dest
+ }
+
match event {
Event::Start(Tag::Link(dest, title)) => {
- if !HTTP_LINK.is_match(&dest) {
- let dest = if !with_base.is_empty() {
- format!("{}/{}", with_base, dest)
- } else {
- dest.clone().into_owned()
- };
-
- if let Some(caps) = MD_LINK.captures(&dest) {
- let mut html_link = [&caps["link"], ".html"].concat();
-
- if let Some(anchor) = caps.name("anchor") {
- html_link.push_str(anchor.as_str());
- }
-
- return Event::Start(Tag::Link(Cow::from(html_link), title));
- }
- }
-
- Event::Start(Tag::Link(dest, title))
+ Event::Start(Tag::Link(fix(dest, with_base), title))
+ }
+ Event::Start(Tag::Image(dest, title)) => {
+ Event::Start(Tag::Image(fix(dest, with_base), title))
}
_ => event,
}
diff --git a/tests/dummy_book/src/second/nested.md b/tests/dummy_book/src/second/nested.md
index c3eb3c8f..2fa98beb 100644
--- a/tests/dummy_book/src/second/nested.md
+++ b/tests/dummy_book/src/second/nested.md
@@ -1,4 +1,8 @@
# Testing relative links for the print page
When we link to [the first section](../first/nested.md), it should work on
-both the print page and the non-print page.
\ No newline at end of file
+both the print page and the non-print page.
+
+Link [outside](../../std/foo/bar.html).
+
+![Some image](../images/picture.png)
diff --git a/tests/rendered_output.rs b/tests/rendered_output.rs
index 2d679e4d..2aa7f93a 100644
--- a/tests/rendered_output.rs
+++ b/tests/rendered_output.rs
@@ -123,7 +123,11 @@ fn check_correct_relative_links_in_print_page() {
assert_contains_strings(
first.join("print.html"),
- &[r##"the first section,"##],
+ &[
+ r##"the first section,"##,
+ r##"outside"##,
+ r##""##,
+ ],
);
}
diff --git a/tests/searchindex_fixture.json b/tests/searchindex_fixture.json
index 78a39153..d1e20970 100644
--- a/tests/searchindex_fixture.json
+++ b/tests/searchindex_fixture.json
@@ -66,7 +66,7 @@
"title": 2
},
"9": {
- "body": 10,
+ "body": 13,
"breadcrumbs": 7,
"title": 5
}
@@ -133,7 +133,7 @@
"title": "Second Chapter"
},
"9": {
- "body": "When we link to the first section , it should work on both the print page and the non-print page.",
+ "body": "When we link to the first section , it should work on both the print page and the non-print page. Link outside . Some image",
"breadcrumbs": "Second Chapter ยป Testing relative links for the print page",
"id": "9",
"title": "Testing relative links for the print page"
@@ -555,6 +555,22 @@
"i": {
"df": 0,
"docs": {},
+ "m": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 1,
+ "docs": {
+ "9": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
"n": {
"c": {
"df": 0,
@@ -715,7 +731,7 @@
"df": 1,
"docs": {
"9": {
- "tf": 1.4142135623730951
+ "tf": 1.7320508075688772
}
}
}
@@ -845,6 +861,34 @@
}
}
},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "9": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ },
"p": {
"a": {
"df": 0,
@@ -1732,6 +1776,22 @@
"i": {
"df": 0,
"docs": {},
+ "m": {
+ "a": {
+ "df": 0,
+ "docs": {},
+ "g": {
+ "df": 1,
+ "docs": {
+ "9": {
+ "tf": 1.0
+ }
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ },
"n": {
"c": {
"df": 0,
@@ -1892,7 +1952,7 @@
"df": 1,
"docs": {
"9": {
- "tf": 1.7320508075688772
+ "tf": 2.0
}
}
}
@@ -2022,6 +2082,34 @@
}
}
},
+ "o": {
+ "df": 0,
+ "docs": {},
+ "u": {
+ "df": 0,
+ "docs": {},
+ "t": {
+ "df": 0,
+ "docs": {},
+ "s": {
+ "df": 0,
+ "docs": {},
+ "i": {
+ "d": {
+ "df": 1,
+ "docs": {
+ "9": {
+ "tf": 1.0
+ }
+ }
+ },
+ "df": 0,
+ "docs": {}
+ }
+ }
+ }
+ }
+ },
"p": {
"a": {
"df": 0,