@@ -97,8 +97,9 @@ impl Renderer for HtmlHandlebars {
97
97
98
98
let filename = Path :: new ( & ch. path ) . with_extension ( "html" ) ;
99
99
100
- // create links for headers
100
+ // create links for headers and fix anchors
101
101
let rendered = build_header_links ( rendered, filename. to_str ( ) . unwrap_or ( "" ) ) ;
102
+ let rendered = fix_anchor_links ( rendered, filename. to_str ( ) . unwrap_or ( "" ) ) ;
102
103
103
104
// fix code blocks
104
105
let rendered = fix_code_blocks ( rendered) ;
@@ -146,6 +147,7 @@ impl Renderer for HtmlHandlebars {
146
147
147
148
let rendered = try!( handlebars. render ( "index" , & data) ) ;
148
149
let rendered = build_header_links ( rendered, "print.html" ) ;
150
+ let rendered = fix_anchor_links ( rendered, "print.html" ) ;
149
151
150
152
// fix code blocks
151
153
let rendered = fix_code_blocks ( rendered) ;
@@ -257,6 +259,22 @@ fn build_header_links(html: String, filename: &str) -> String {
257
259
} ) . into_owned ( )
258
260
}
259
261
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
+
260
278
// The rust book uses annotations for rustdoc to test code snippets, like the following:
261
279
// ```rust,should_panic
262
280
// fn main() {
0 commit comments