Rollup merge of #89506 - yaymukund:docblock-headings, r=GuillaumeGomez
librustdoc: Use correct heading levels. Closes #89309 This fixes the `<h#>` header tags throughout the docs to reflect a semantic hierarchy. - I ran a script to manually check that we don't have any files with multiple `<h1>` tags. - Also checked that we never incorrectly nest e.g. a `<h2>` under an `<h3>`. - I also spot-checked a bunch of pages (`trait.Read`, `enum.Ordering`, `primitive.isize`, `trait.Iterator`).
This commit is contained in:
commit
7d6feb421e
17 changed files with 264 additions and 122 deletions
|
|
@ -67,7 +67,7 @@ use crate::html::format::{
|
|||
href, print_abi_with_space, print_constness_with_space, print_default_space,
|
||||
print_generic_bounds, print_where_clause, Buffer, HrefError, PrintWithSpace,
|
||||
};
|
||||
use crate::html::markdown::{Markdown, MarkdownHtml, MarkdownSummaryLine};
|
||||
use crate::html::markdown::{HeadingOffset, Markdown, MarkdownHtml, MarkdownSummaryLine};
|
||||
|
||||
/// A pair of name and its optional document.
|
||||
crate type NameDoc = (String, Option<String>);
|
||||
|
|
@ -470,32 +470,45 @@ fn settings(root_path: &str, suffix: &str, themes: &[StylePath]) -> Result<Strin
|
|||
))
|
||||
}
|
||||
|
||||
fn document(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, parent: Option<&clean::Item>) {
|
||||
fn document(
|
||||
w: &mut Buffer,
|
||||
cx: &Context<'_>,
|
||||
item: &clean::Item,
|
||||
parent: Option<&clean::Item>,
|
||||
heading_offset: HeadingOffset,
|
||||
) {
|
||||
if let Some(ref name) = item.name {
|
||||
info!("Documenting {}", name);
|
||||
}
|
||||
document_item_info(w, cx, item, parent);
|
||||
if parent.is_none() {
|
||||
document_full_collapsible(w, item, cx);
|
||||
document_full_collapsible(w, item, cx, heading_offset);
|
||||
} else {
|
||||
document_full(w, item, cx);
|
||||
document_full(w, item, cx, heading_offset);
|
||||
}
|
||||
}
|
||||
|
||||
/// Render md_text as markdown.
|
||||
fn render_markdown(w: &mut Buffer, cx: &Context<'_>, md_text: &str, links: Vec<RenderedLink>) {
|
||||
fn render_markdown(
|
||||
w: &mut Buffer,
|
||||
cx: &Context<'_>,
|
||||
md_text: &str,
|
||||
links: Vec<RenderedLink>,
|
||||
heading_offset: HeadingOffset,
|
||||
) {
|
||||
let mut ids = cx.id_map.borrow_mut();
|
||||
write!(
|
||||
w,
|
||||
"<div class=\"docblock\">{}</div>",
|
||||
Markdown(
|
||||
md_text,
|
||||
&links,
|
||||
&mut ids,
|
||||
cx.shared.codes,
|
||||
cx.shared.edition(),
|
||||
&cx.shared.playground
|
||||
)
|
||||
Markdown {
|
||||
content: md_text,
|
||||
links: &links,
|
||||
ids: &mut ids,
|
||||
error_codes: cx.shared.codes,
|
||||
edition: cx.shared.edition(),
|
||||
playground: &cx.shared.playground,
|
||||
heading_offset,
|
||||
}
|
||||
.into_string()
|
||||
)
|
||||
}
|
||||
|
|
@ -531,15 +544,31 @@ fn document_short(
|
|||
}
|
||||
}
|
||||
|
||||
fn document_full_collapsible(w: &mut Buffer, item: &clean::Item, cx: &Context<'_>) {
|
||||
document_full_inner(w, item, cx, true);
|
||||
fn document_full_collapsible(
|
||||
w: &mut Buffer,
|
||||
item: &clean::Item,
|
||||
cx: &Context<'_>,
|
||||
heading_offset: HeadingOffset,
|
||||
) {
|
||||
document_full_inner(w, item, cx, true, heading_offset);
|
||||
}
|
||||
|
||||
fn document_full(w: &mut Buffer, item: &clean::Item, cx: &Context<'_>) {
|
||||
document_full_inner(w, item, cx, false);
|
||||
fn document_full(
|
||||
w: &mut Buffer,
|
||||
item: &clean::Item,
|
||||
cx: &Context<'_>,
|
||||
heading_offset: HeadingOffset,
|
||||
) {
|
||||
document_full_inner(w, item, cx, false, heading_offset);
|
||||
}
|
||||
|
||||
fn document_full_inner(w: &mut Buffer, item: &clean::Item, cx: &Context<'_>, is_collapsible: bool) {
|
||||
fn document_full_inner(
|
||||
w: &mut Buffer,
|
||||
item: &clean::Item,
|
||||
cx: &Context<'_>,
|
||||
is_collapsible: bool,
|
||||
heading_offset: HeadingOffset,
|
||||
) {
|
||||
if let Some(s) = cx.shared.maybe_collapsed_doc_value(item) {
|
||||
debug!("Doc block: =====\n{}\n=====", s);
|
||||
if is_collapsible {
|
||||
|
|
@ -549,10 +578,10 @@ fn document_full_inner(w: &mut Buffer, item: &clean::Item, cx: &Context<'_>, is_
|
|||
<span>Expand description</span>\
|
||||
</summary>",
|
||||
);
|
||||
render_markdown(w, cx, &s, item.links(cx));
|
||||
render_markdown(w, cx, &s, item.links(cx), heading_offset);
|
||||
w.write_str("</details>");
|
||||
} else {
|
||||
render_markdown(w, cx, &s, item.links(cx));
|
||||
render_markdown(w, cx, &s, item.links(cx), heading_offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1321,7 +1350,7 @@ fn render_impl(
|
|||
// because impls can't have a stability.
|
||||
if item.doc_value().is_some() {
|
||||
document_item_info(&mut info_buffer, cx, it, Some(parent));
|
||||
document_full(&mut doc_buffer, item, cx);
|
||||
document_full(&mut doc_buffer, item, cx, HeadingOffset::H5);
|
||||
short_documented = false;
|
||||
} else {
|
||||
// In case the item isn't documented,
|
||||
|
|
@ -1339,7 +1368,7 @@ fn render_impl(
|
|||
} else {
|
||||
document_item_info(&mut info_buffer, cx, item, Some(parent));
|
||||
if rendering_params.show_def_docs {
|
||||
document_full(&mut doc_buffer, item, cx);
|
||||
document_full(&mut doc_buffer, item, cx, HeadingOffset::H5);
|
||||
short_documented = false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1573,14 +1602,15 @@ fn render_impl(
|
|||
write!(
|
||||
w,
|
||||
"<div class=\"docblock\">{}</div>",
|
||||
Markdown(
|
||||
&*dox,
|
||||
&i.impl_item.links(cx),
|
||||
&mut ids,
|
||||
cx.shared.codes,
|
||||
cx.shared.edition(),
|
||||
&cx.shared.playground
|
||||
)
|
||||
Markdown {
|
||||
content: &*dox,
|
||||
links: &i.impl_item.links(cx),
|
||||
ids: &mut ids,
|
||||
error_codes: cx.shared.codes,
|
||||
edition: cx.shared.edition(),
|
||||
playground: &cx.shared.playground,
|
||||
heading_offset: HeadingOffset::H2
|
||||
}
|
||||
.into_string()
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ use crate::html::format::{
|
|||
};
|
||||
use crate::html::highlight;
|
||||
use crate::html::layout::Page;
|
||||
use crate::html::markdown::MarkdownSummaryLine;
|
||||
use crate::html::markdown::{HeadingOffset, MarkdownSummaryLine};
|
||||
|
||||
const ITEM_TABLE_OPEN: &'static str = "<div class=\"item-table\">";
|
||||
const ITEM_TABLE_CLOSE: &'static str = "</div>";
|
||||
|
|
@ -175,7 +175,7 @@ fn toggle_close(w: &mut Buffer) {
|
|||
}
|
||||
|
||||
fn item_module(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, items: &[clean::Item]) {
|
||||
document(w, cx, item, None);
|
||||
document(w, cx, item, None, HeadingOffset::H2);
|
||||
|
||||
let mut indices = (0..items.len()).filter(|i| !items[*i].is_stripped()).collect::<Vec<usize>>();
|
||||
|
||||
|
|
@ -482,7 +482,7 @@ fn item_function(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, f: &clean::
|
|||
notable_traits = notable_traits_decl(&f.decl, cx),
|
||||
);
|
||||
});
|
||||
document(w, cx, it, None)
|
||||
document(w, cx, it, None, HeadingOffset::H2)
|
||||
}
|
||||
|
||||
fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Trait) {
|
||||
|
|
@ -605,7 +605,7 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
|
|||
});
|
||||
|
||||
// Trait documentation
|
||||
document(w, cx, it, None);
|
||||
document(w, cx, it, None, HeadingOffset::H2);
|
||||
|
||||
fn write_small_section_header(w: &mut Buffer, id: &str, title: &str, extra_content: &str) {
|
||||
write!(
|
||||
|
|
@ -623,7 +623,7 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
|
|||
let item_type = m.type_();
|
||||
let id = cx.derive_id(format!("{}.{}", item_type, name));
|
||||
let mut content = Buffer::empty_from(w);
|
||||
document(&mut content, cx, m, Some(t));
|
||||
document(&mut content, cx, m, Some(t), HeadingOffset::H5);
|
||||
let toggled = !content.is_empty();
|
||||
if toggled {
|
||||
write!(w, "<details class=\"rustdoc-toggle\" open><summary>");
|
||||
|
|
@ -837,7 +837,7 @@ fn item_trait_alias(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clea
|
|||
);
|
||||
});
|
||||
|
||||
document(w, cx, it, None);
|
||||
document(w, cx, it, None, HeadingOffset::H2);
|
||||
|
||||
// Render any items associated directly to this alias, as otherwise they
|
||||
// won't be visible anywhere in the docs. It would be nice to also show
|
||||
|
|
@ -859,7 +859,7 @@ fn item_opaque_ty(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean:
|
|||
);
|
||||
});
|
||||
|
||||
document(w, cx, it, None);
|
||||
document(w, cx, it, None, HeadingOffset::H2);
|
||||
|
||||
// Render any items associated directly to this alias, as otherwise they
|
||||
// won't be visible anywhere in the docs. It would be nice to also show
|
||||
|
|
@ -890,7 +890,7 @@ fn item_typedef(
|
|||
);
|
||||
});
|
||||
|
||||
document(w, cx, it, None);
|
||||
document(w, cx, it, None, HeadingOffset::H2);
|
||||
|
||||
let def_id = it.def_id.expect_def_id();
|
||||
// Render any items associated directly to this alias, as otherwise they
|
||||
|
|
@ -908,7 +908,7 @@ fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Uni
|
|||
});
|
||||
});
|
||||
|
||||
document(w, cx, it, None);
|
||||
document(w, cx, it, None, HeadingOffset::H2);
|
||||
|
||||
let mut fields = s
|
||||
.fields
|
||||
|
|
@ -941,7 +941,7 @@ fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Uni
|
|||
if let Some(stability_class) = field.stability_class(cx.tcx()) {
|
||||
write!(w, "<span class=\"stab {stab}\"></span>", stab = stability_class);
|
||||
}
|
||||
document(w, cx, field, Some(it));
|
||||
document(w, cx, field, Some(it), HeadingOffset::H2);
|
||||
}
|
||||
}
|
||||
let def_id = it.def_id.expect_def_id();
|
||||
|
|
@ -1023,7 +1023,7 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum
|
|||
});
|
||||
});
|
||||
|
||||
document(w, cx, it, None);
|
||||
document(w, cx, it, None, HeadingOffset::H2);
|
||||
|
||||
if !e.variants.is_empty() {
|
||||
write!(
|
||||
|
|
@ -1052,7 +1052,7 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum
|
|||
w.write_str("</code>");
|
||||
render_stability_since(w, variant, it, cx.tcx());
|
||||
w.write_str("</div>");
|
||||
document(w, cx, variant, Some(it));
|
||||
document(w, cx, variant, Some(it), HeadingOffset::H2);
|
||||
document_non_exhaustive(w, variant);
|
||||
|
||||
use crate::clean::Variant;
|
||||
|
|
@ -1092,7 +1092,7 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum
|
|||
f = field.name.as_ref().unwrap(),
|
||||
t = ty.print(cx)
|
||||
);
|
||||
document(w, cx, field, Some(variant));
|
||||
document(w, cx, field, Some(variant), HeadingOffset::H2);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
|
@ -1119,7 +1119,7 @@ fn item_macro(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Mac
|
|||
None,
|
||||
);
|
||||
});
|
||||
document(w, cx, it, None)
|
||||
document(w, cx, it, None, HeadingOffset::H2)
|
||||
}
|
||||
|
||||
fn item_proc_macro(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, m: &clean::ProcMacro) {
|
||||
|
|
@ -1149,11 +1149,11 @@ fn item_proc_macro(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, m: &clean
|
|||
});
|
||||
}
|
||||
}
|
||||
document(w, cx, it, None)
|
||||
document(w, cx, it, None, HeadingOffset::H2)
|
||||
}
|
||||
|
||||
fn item_primitive(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) {
|
||||
document(w, cx, it, None);
|
||||
document(w, cx, it, None, HeadingOffset::H2);
|
||||
render_assoc_items(w, cx, it, it.def_id.expect_def_id(), AssocItemRender::All)
|
||||
}
|
||||
|
||||
|
|
@ -1192,7 +1192,7 @@ fn item_constant(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, c: &clean::
|
|||
}
|
||||
});
|
||||
|
||||
document(w, cx, it, None)
|
||||
document(w, cx, it, None, HeadingOffset::H2)
|
||||
}
|
||||
|
||||
fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Struct) {
|
||||
|
|
@ -1203,7 +1203,7 @@ fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St
|
|||
});
|
||||
});
|
||||
|
||||
document(w, cx, it, None);
|
||||
document(w, cx, it, None, HeadingOffset::H2);
|
||||
|
||||
let mut fields = s
|
||||
.fields
|
||||
|
|
@ -1239,7 +1239,7 @@ fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St
|
|||
name = field_name,
|
||||
ty = ty.print(cx)
|
||||
);
|
||||
document(w, cx, field, Some(it));
|
||||
document(w, cx, field, Some(it), HeadingOffset::H2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1260,7 +1260,7 @@ fn item_static(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St
|
|||
typ = s.type_.print(cx)
|
||||
);
|
||||
});
|
||||
document(w, cx, it, None)
|
||||
document(w, cx, it, None, HeadingOffset::H2)
|
||||
}
|
||||
|
||||
fn item_foreign_type(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) {
|
||||
|
|
@ -1275,13 +1275,13 @@ fn item_foreign_type(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) {
|
|||
);
|
||||
});
|
||||
|
||||
document(w, cx, it, None);
|
||||
document(w, cx, it, None, HeadingOffset::H2);
|
||||
|
||||
render_assoc_items(w, cx, it, it.def_id.expect_def_id(), AssocItemRender::All)
|
||||
}
|
||||
|
||||
fn item_keyword(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) {
|
||||
document(w, cx, it, None)
|
||||
document(w, cx, it, None, HeadingOffset::H2)
|
||||
}
|
||||
|
||||
/// Compare two strings treating multi-digit numbers as single units (i.e. natural sort order).
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue