diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index a4d377432c914..04a18e16edb93 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -111,7 +111,11 @@ pub(crate) struct MarkdownWithToc<'a> { } /// A tuple struct like `Markdown` that renders the markdown escaping HTML tags /// and includes no paragraph tags. -pub(crate) struct MarkdownItemInfo<'a>(pub(crate) &'a str, pub(crate) &'a mut IdMap); +pub(crate) struct MarkdownItemInfo<'a>( + pub(crate) &'a str, + pub(crate) &'a mut IdMap, + pub(crate) Edition, +); /// A tuple struct like `Markdown` that renders only the first paragraph. pub(crate) struct MarkdownSummaryLine<'a>(pub &'a str, pub &'a [RenderedLink]); @@ -1461,7 +1465,8 @@ impl MarkdownWithToc<'_> { impl MarkdownItemInfo<'_> { pub(crate) fn write_into(self, mut f: impl fmt::Write) -> fmt::Result { - let MarkdownItemInfo(md, ids) = self; + let MarkdownItemInfo(md, ids, edition) = self; + let legacy_wrap = edition != Edition::EditionFuture; // This is actually common enough to special-case if md.is_empty() { @@ -1479,10 +1484,23 @@ impl MarkdownItemInfo<'_> { let p = HeadingLinks::new(p, None, ids, HeadingOffset::H1); let p = footnotes::Footnotes::new(p, existing_footnotes); let p = TableWrapper::new(p.map(|(ev, _)| ev)); + // in legacy wrap mode, strip
elements to avoid them inserting newlines
let p = p.filter(|event| {
- !matches!(event, Event::Start(Tag::Paragraph) | Event::End(TagEnd::Paragraph))
+ !legacy_wrap
+ || !matches!(
+ event,
+ Event::Start(Tag::Paragraph) | Event::End(TagEnd::Paragraph)
+ )
});
- html::write_html_fmt(&mut f, p)
+ if legacy_wrap {
+ f.write_str("")?;
+ }
+ html::write_html_fmt(&mut f, p)?;
+ if legacy_wrap {
+ f.write_str("")?;
+ }
+
+ Ok(())
})
}
}
diff --git a/src/librustdoc/html/markdown/tests.rs b/src/librustdoc/html/markdown/tests.rs
index 61fd428746332..f80ee7730b2db 100644
--- a/src/librustdoc/html/markdown/tests.rs
+++ b/src/librustdoc/html/markdown/tests.rs
@@ -467,12 +467,31 @@ fn test_plain_text_summary() {
}
#[test]
-fn test_markdown_html_escape() {
+fn test_markdown_html_escape_legacy() {
fn t(input: &str, expect: &str) {
let mut idmap = IdMap::new();
let mut output = String::new();
- MarkdownItemInfo(input, &mut idmap).write_into(&mut output).unwrap();
- assert_eq!(output, expect, "original: {}", input);
+ MarkdownItemInfo(input, &mut idmap, Edition::Edition2015).write_into(&mut output).unwrap();
+ assert_eq!(
+ output,
+ format!("{}", expect),
+ "original: {}",
+ input
+ );
+ }
+
+ t("`Struct<'a, T>`", "Struct<'a, T>");
+ t("Struct<'a, T>", "Struct<’a, T>");
+ t("Struct
", "Struct<br>");
+}
+
+#[test]
+fn test_markdown_html_escape_new() {
+ fn t(input: &str, expect: &str) {
+ let mut idmap = IdMap::new();
+ let mut output = String::new();
+ MarkdownItemInfo(input, &mut idmap, Edition::Edition2015).write_into(&mut output).unwrap();
+ assert_eq!(output, format!("
{}
", expect), "original: {}", input); } t("`Struct<'a, T>`", "Struct<'a, T>");
diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs
index 8740b5935973c..659a84427ff82 100644
--- a/src/librustdoc/html/render/mod.rs
+++ b/src/librustdoc/html/render/mod.rs
@@ -855,6 +855,7 @@ fn short_item_info(
parent: Option<&clean::Item>,
) -> Vec