diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs
index 7061a9674e4fb..4aa3ed232bec2 100644
--- a/src/librustdoc/html/markdown.rs
+++ b/src/librustdoc/html/markdown.rs
@@ -541,7 +541,6 @@ impl<'a, 'b, 'ids, I: Iterator- >> Iterator
for event in &mut self.inner {
match &event.0 {
Event::End(Tag::Heading(..)) => break,
- Event::Start(Tag::Link(_, _, _)) | Event::End(Tag::Link(..)) => {}
Event::Text(text) | Event::Code(text) => {
id.extend(text.chars().filter_map(slugify));
self.buf.push_back(event);
@@ -560,14 +559,10 @@ impl<'a, 'b, 'ids, I: Iterator
- >> Iterator
let level =
std::cmp::min(level as u32 + (self.heading_offset as u32), MAX_HEADER_LEVEL);
- self.buf.push_back((Event::Html(format!("", level).into()), 0..0));
-
- let start_tags = format!(
- "\
- ",
- id = id,
- level = level
- );
+ self.buf.push_back((Event::Html(format!("").into()), 0..0));
+
+ let start_tags =
+ format!("§");
return Some((Event::Html(start_tags.into()), 0..0));
}
event
diff --git a/src/librustdoc/html/markdown/tests.rs b/src/librustdoc/html/markdown/tests.rs
index 5c0bf0ed942f4..6338484b3742a 100644
--- a/src/librustdoc/html/markdown/tests.rs
+++ b/src/librustdoc/html/markdown/tests.rs
@@ -159,26 +159,38 @@ fn test_header() {
assert_eq!(output, expect, "original: {}", input);
}
- t("# Foo bar", "");
+ t(
+ "# Foo bar",
+ "
§Foo bar
",
+ );
t(
"## Foo-bar_baz qux",
"",
+ §\
+ Foo-bar_baz qux\
+ ",
);
t(
"### **Foo** *bar* baz!?!& -_qux_-%",
"",
);
t(
"#### **Foo?** & \\*bar?!* _`baz`_ ❤ #qux",
"",
);
+ t(
+ "# Foo [bar](https://hello.yo)",
+ "\
+ §\
+ Foo bar\
+
",
+ );
}
#[test]
@@ -198,12 +210,36 @@ fn test_header_ids_multiple_blocks() {
assert_eq!(output, expect, "original: {}", input);
}
- t(&mut map, "# Example", "");
- t(&mut map, "# Panics", "");
- t(&mut map, "# Example", "");
- t(&mut map, "# Search", "");
- t(&mut map, "# Example", "");
- t(&mut map, "# Panics", "");
+ t(
+ &mut map,
+ "# Example",
+ "§Example
",
+ );
+ t(
+ &mut map,
+ "# Panics",
+ "§Panics
",
+ );
+ t(
+ &mut map,
+ "# Example",
+ "§Example
",
+ );
+ t(
+ &mut map,
+ "# Search",
+ "§Search
",
+ );
+ t(
+ &mut map,
+ "# Example",
+ "§Example
",
+ );
+ t(
+ &mut map,
+ "# Panics",
+ "§Panics
",
+ );
}
#[test]
diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css
index f1e0a89883ab8..1b3e2a94652bb 100644
--- a/src/librustdoc/html/static/css/rustdoc.css
+++ b/src/librustdoc/html/static/css/rustdoc.css
@@ -833,6 +833,9 @@ h2.small-section-header > .anchor {
.anchor::before {
content: '§';
}
+.doc-anchor {
+ margin-right: 6px;
+}
.docblock a:not(.srclink):not(.test-arrow):hover,
.docblock-short a:not(.srclink):not(.test-arrow):hover, .item-info a {
diff --git a/src/test/rustdoc/issue-29449.rs b/src/test/rustdoc/issue-29449.rs
index 0d829cf6fcffe..86199baee6a83 100644
--- a/src/test/rustdoc/issue-29449.rs
+++ b/src/test/rustdoc/issue-29449.rs
@@ -2,18 +2,23 @@
pub struct Foo;
impl Foo {
- // @has - '//*[@id="examples"]//a' 'Examples'
- // @has - '//*[@id="panics"]//a' 'Panics'
+ // @has - '//*[@id="examples"]' 'Examples'
+ // @has - '//*[@id="examples"]/a[@href="#examples"]' '§'
+ // @has - '//*[@id="panics"]' 'Panics'
+ // @has - '//*[@id="panics"]/a[@href="#panics"]' '§'
/// # Examples
/// # Panics
pub fn bar() {}
- // @has - '//*[@id="examples-1"]//a' 'Examples'
+ // @has - '//*[@id="examples-1"]' 'Examples'
+ // @has - '//*[@id="examples-1"]/a[@href="#examples-1"]' '§'
/// # Examples
pub fn bar_1() {}
- // @has - '//*[@id="examples-2"]//a' 'Examples'
- // @has - '//*[@id="panics-1"]//a' 'Panics'
+ // @has - '//*[@id="examples-2"]' 'Examples'
+ // @has - '//*[@id="examples-2"]/a[@href="#examples-2"]' '§'
+ // @has - '//*[@id="panics-1"]' 'Panics'
+ // @has - '//*[@id="panics-1"]/a[@href="#panics-1"]' '§'
/// # Examples
/// # Panics
pub fn bar_2() {}
diff --git a/src/test/rustdoc/remove-url-from-headings.rs b/src/test/rustdoc/remove-url-from-headings.rs
index e2b232a6efb93..8f4770286192e 100644
--- a/src/test/rustdoc/remove-url-from-headings.rs
+++ b/src/test/rustdoc/remove-url-from-headings.rs
@@ -1,9 +1,12 @@
+// It actually checks that the link is kept in the headings as expected now.
+
#![crate_name = "foo"]
// @has foo/fn.foo.html
-// @!has - '//a[@href="http://a.a"]'
-// @has - '//a[@href="#implementing-stuff-somewhere"]' 'Implementing stuff somewhere'
-// @has - '//a[@href="#another-one-urg"]' 'Another one urg'
+// @has - '//a[@href="http://a.a"]' 'stuff'
+// @has - '//*[@id="implementing-stuff-somewhere"]' 'Implementing stuff somewhere'
+// @has - '//a[@href="http://b.b"]' 'one'
+// @has - '//*[@id="another-one-urg"]' 'Another one urg'
/// fooo
///
@@ -13,5 +16,5 @@
///
/// # Another [one][two] urg
///
-/// [two]: http://a.a
+/// [two]: http://b.b
pub fn foo() {}
diff --git a/src/test/rustdoc/short-docblock.rs b/src/test/rustdoc/short-docblock.rs
index 17c44eab091a6..f42d59d385b66 100644
--- a/src/test/rustdoc/short-docblock.rs
+++ b/src/test/rustdoc/short-docblock.rs
@@ -2,8 +2,9 @@
// @has foo/index.html '//*[@class="item-right docblock-short"]/p' 'fooo'
// @!has foo/index.html '//*[@class="item-right docblock-short"]/p/h1' 'fooo'
-// @has foo/fn.foo.html '//h2[@id="fooo"]/a[@href="#fooo"]' 'fooo'
+// @has foo/fn.foo.html '//h2[@id="fooo"]' 'fooo'
+// @has foo/fn.foo.html '//h2[@id="fooo"]/a[@href="#fooo"]' '§'
/// # fooo
///
/// foo
@@ -11,8 +12,9 @@ pub fn foo() {}
// @has foo/index.html '//*[@class="item-right docblock-short"]/p' 'mooood'
// @!has foo/index.html '//*[@class="item-right docblock-short"]/p/h2' 'mooood'
-// @has foo/foo/index.html '//h3[@id="mooood"]/a[@href="#mooood"]' 'mooood'
+// @has foo/foo/index.html '//h3[@id="mooood"]' 'mooood'
+// @has foo/foo/index.html '//h3[@id="mooood"]/a[@href="#mooood"]' '§'
/// ## mooood
///
/// foo mod