Skip to content

Commit e218257

Browse files
committed
fix anchor links
1 parent 1345c05 commit e218257

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

src/renderer/html_handlebars/hbs_renderer.rs

+19-1
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,9 @@ impl Renderer for HtmlHandlebars {
9797

9898
let filename = Path::new(&ch.path).with_extension("html");
9999

100-
// create links for headers
100+
// create links for headers and fix anchors
101101
let rendered = build_header_links(rendered, filename.to_str().unwrap_or(""));
102+
let rendered = fix_anchor_links(rendered, filename.to_str().unwrap_or(""));
102103

103104
// fix code blocks
104105
let rendered = fix_code_blocks(rendered);
@@ -146,6 +147,7 @@ impl Renderer for HtmlHandlebars {
146147

147148
let rendered = try!(handlebars.render("index", &data));
148149
let rendered = build_header_links(rendered, "print.html");
150+
let rendered = fix_anchor_links(rendered, "print.html");
149151

150152
// fix code blocks
151153
let rendered = fix_code_blocks(rendered);
@@ -257,6 +259,22 @@ fn build_header_links(html: String, filename: &str) -> String {
257259
}).into_owned()
258260
}
259261

262+
// anchors to the same page (href="#anchor") do not work because of
263+
// <base href="../"> pointing to the root folder. This function *fixes*
264+
// that in a very inelegant way
265+
fn fix_anchor_links(html: String, filename: &str) -> String {
266+
let regex = Regex::new(r##"<a([^>]+)href="#([^"]+)"([^>]*)>"##).unwrap();
267+
regex.replace_all(&html, |caps: &Captures| {
268+
let before = &caps[1];
269+
let anchor = &caps[2];
270+
let after = &caps[3];
271+
272+
format!("<a{before}href=\"{filename}#{anchor}\"{after}>",
273+
before=before, filename=filename, anchor=anchor, after=after)
274+
}).into_owned()
275+
}
276+
277+
260278
// The rust book uses annotations for rustdoc to test code snippets, like the following:
261279
// ```rust,should_panic
262280
// fn main() {

0 commit comments

Comments
 (0)