diff options
| author | Jacob Hoffman-Andrews <github@hoffman-andrews.com> | 2021-03-27 12:50:09 -0700 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2021-04-12 08:48:01 -0700 |
| commit | def144c2e752cf2040d21fbd0cf04f5779cce898 (patch) | |
| tree | 45b7fb002bdff5cadfd1e85b57a754fddf960b53 /src/librustdoc/html/render | |
| parent | 846a4e9b5cc49ab42a62a15cd2813b0be34fb868 (diff) | |
| download | rust-def144c2e752cf2040d21fbd0cf04f5779cce898.tar.gz rust-def144c2e752cf2040d21fbd0cf04f5779cce898.zip | |
Improve CSS for "hide contents, not items"
Introduce a first use of the `<details>` and `<summary>` tags as replacements for the JS-built toggles. I think this has the potential to replace all the JS toggles and generally clean up the JS, CSS, and HTML. Split rendering of attributes into two cases: in the case where they are rendered as descendents of a `<pre>` tag, where they use indent spaces and newlines for formatting, matching their surrounding markup. In the case where they are rendered as descendants of a `<code>` tag, they are rendered as `<div>`. This let me clean up some fragile CSS that was adjusting the margin-left of attributes depending on context. Remove toggles for attributes. With the ALLOWED_ATTRIBUTES filter, it's rare for an item to have more than one attribute, so hiding attributes behind a toggle doesn't save any screen space in the common case. Fix a couple of invocations of `matches!` that didn't compile on my machine. Fix a boolean for the JS `createToggle` call that was causing "Expand description" to show up spuriously on already-expanded descriptions. Add JS for auto-hide settings and hide all / show all. Remove a z-index property and some font color tweaks made unnecessary by the <details> toggles. Add CSS for the <details> toggles.
Diffstat (limited to 'src/librustdoc/html/render')
| -rw-r--r-- | src/librustdoc/html/render/mod.rs | 52 | ||||
| -rw-r--r-- | src/librustdoc/html/render/print_item.rs | 46 |
2 files changed, 48 insertions, 50 deletions
diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 00a19006bb9..d0d9034f6e6 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -43,7 +43,6 @@ use std::path::PathBuf; use std::str; use std::string::ToString; -use itertools::Itertools; use rustc_ast_pretty::pprust; use rustc_attr::{Deprecation, StabilityLevel}; use rustc_data_structures::fx::FxHashSet; @@ -487,7 +486,6 @@ fn settings(root_path: &str, suffix: &str, themes: &[StylePath]) -> Result<Strin ) .into(), ("auto-hide-large-items", "Auto-hide item contents for large items.", true).into(), - ("auto-hide-attributes", "Auto-hide item attributes.", true).into(), ("auto-hide-method-docs", "Auto-hide item methods' documentation", false).into(), ("auto-hide-trait-implementations", "Auto-hide trait implementation documentation", true) .into(), @@ -936,19 +934,21 @@ fn render_assoc_item( + name.as_str().len() + generics_len; - let (indent, end_newline) = if parent == ItemType::Trait { + let (indent, indent_str, end_newline) = if parent == ItemType::Trait { header_len += 4; - (4, false) + let indent_str = " "; + render_attributes_in_pre(w, meth, indent_str); + (4, indent_str, false) } else { - (0, true) + render_attributes_in_code(w, meth); + (0, "", true) }; - render_attributes(w, meth, false); w.reserve(header_len + "<a href=\"\" class=\"fnname\">{".len() + "</a>".len()); write!( w, "{}{}{}{}{}{}{}fn <a href=\"{href}\" class=\"fnname\">{name}</a>\ {generics}{decl}{notable_traits}{where_clause}", - if parent == ItemType::Trait { " " } else { "" }, + indent_str, vis, constness, asyncness, @@ -1004,35 +1004,33 @@ const ALLOWED_ATTRIBUTES: &[Symbol] = &[ sym::non_exhaustive, ]; -// The `top` parameter is used when generating the item declaration to ensure it doesn't have a -// left padding. For example: -// -// #[foo] <----- "top" attribute -// struct Foo { -// #[bar] <---- not "top" attribute -// bar: usize, -// } -fn render_attributes(w: &mut Buffer, it: &clean::Item, top: bool) { - let attrs = it - .attrs +fn attributes(it: &clean::Item) -> Vec<String> { + it.attrs .other_attrs .iter() .filter_map(|attr| { if ALLOWED_ATTRIBUTES.contains(&attr.name_or_empty()) { - Some(pprust::attribute_to_string(&attr)) + Some(pprust::attribute_to_string(&attr).replace("\n", "").replace(" ", " ")) } else { None } }) - .join("\n"); + .collect() +} - if !attrs.is_empty() { - write!( - w, - "<span class=\"docblock attributes{}\">{}</span>", - if top { " top-attr" } else { "" }, - &attrs - ); +// When an attribute is rendered inside a `<pre>` tag, it is formatted using +// a whitespace prefix and newline. +fn render_attributes_in_pre(w: &mut Buffer, it: &clean::Item, prefix: &str) { + for a in attributes(it) { + write!(w, "{}{}\n", prefix, a); + } +} + +// When an attribute is rendered inside a <code> tag, it is formatted using +// a div to produce a newline after it. +fn render_attributes_in_code(w: &mut Buffer, it: &clean::Item) { + for a in attributes(it) { + write!(w, "<div>{}</div>", a); } } diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index d5a5ecd3e88..03c4bb837f5 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -11,8 +11,8 @@ use rustc_span::symbol::{kw, sym, Symbol}; use super::{ collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl, - render_assoc_item, render_assoc_items, render_attributes, render_impl, - render_stability_since_raw, write_srclink, AssocItemLink, Context, + render_assoc_item, render_assoc_items, render_attributes_in_code, render_attributes_in_pre, + render_impl, render_stability_since_raw, write_srclink, AssocItemLink, Context, }; use crate::clean::{self, GetDefId}; use crate::formats::cache::Cache; @@ -138,11 +138,15 @@ fn should_hide_fields(n_fields: usize) -> bool { } fn toggle_open(w: &mut Buffer, text: &str) { - write!(w, "<div class=\"docblock type-contents-toggle\" data-toggle-text=\"{}\">", text); + write!( + w, + "<details class=\"type-contents-toggle\"><summary class=\"hideme\"><span>Show {}</span></summary>", + text + ); } fn toggle_close(w: &mut Buffer) { - w.write_str("</div>"); + w.write_str("</details>"); } fn item_module(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, items: &[clean::Item]) { @@ -391,7 +395,7 @@ fn item_function(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, f: &clean:: ) .len(); w.write_str("<pre class=\"rust fn\">"); - render_attributes(w, it, false); + render_attributes_in_pre(w, it, ""); write!( w, "{vis}{constness}{asyncness}{unsafety}{abi}fn \ @@ -420,7 +424,7 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra // Output the trait definition wrap_into_docblock(w, |w| { w.write_str("<pre class=\"rust trait\">"); - render_attributes(w, it, true); + render_attributes_in_pre(w, it, ""); write!( w, "{}{}{}trait {}{}{}", @@ -729,7 +733,7 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra fn item_trait_alias(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::TraitAlias) { w.write_str("<pre class=\"rust trait-alias\">"); - render_attributes(w, it, false); + render_attributes_in_pre(w, it, ""); write!( w, "trait {}{}{} = {};</pre>", @@ -750,7 +754,7 @@ fn item_trait_alias(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clea fn item_opaque_ty(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::OpaqueTy) { w.write_str("<pre class=\"rust opaque\">"); - render_attributes(w, it, false); + render_attributes_in_pre(w, it, ""); write!( w, "type {}{}{where_clause} = impl {bounds};</pre>", @@ -771,7 +775,7 @@ fn item_opaque_ty(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean: fn item_typedef(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Typedef) { w.write_str("<pre class=\"rust typedef\">"); - render_attributes(w, it, false); + render_attributes_in_pre(w, it, ""); write!( w, "type {}{}{where_clause} = {type_};</pre>", @@ -793,7 +797,7 @@ fn item_typedef(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::T fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Union) { wrap_into_docblock(w, |w| { w.write_str("<pre class=\"rust union\">"); - render_attributes(w, it, true); + render_attributes_in_pre(w, it, ""); render_union(w, it, Some(&s.generics), &s.fields, "", true, cx); w.write_str("</pre>") }); @@ -839,7 +843,7 @@ fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Uni fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum) { wrap_into_docblock(w, |w| { w.write_str("<pre class=\"rust enum\">"); - render_attributes(w, it, true); + render_attributes_in_pre(w, it, ""); write!( w, "{}enum {}{}{}", @@ -1019,7 +1023,7 @@ fn item_primitive(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) { fn item_constant(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, c: &clean::Constant) { w.write_str("<pre class=\"rust const\">"); - render_attributes(w, it, false); + render_attributes_in_code(w, it); write!( w, @@ -1058,7 +1062,7 @@ fn item_constant(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, c: &clean:: fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Struct) { wrap_into_docblock(w, |w| { w.write_str("<pre class=\"rust struct\">"); - render_attributes(w, it, true); + render_attributes_in_code(w, it); render_struct(w, it, Some(&s.generics), s.struct_type, &s.fields, "", true, cx); w.write_str("</pre>") }); @@ -1107,7 +1111,7 @@ fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St fn item_static(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Static) { w.write_str("<pre class=\"rust static\">"); - render_attributes(w, it, false); + render_attributes_in_code(w, it); write!( w, "{vis}static {mutability}{name}: {typ}</pre>", @@ -1121,7 +1125,7 @@ fn item_static(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St fn item_foreign_type(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) { w.write_str("<pre class=\"rust foreigntype\">extern {\n"); - render_attributes(w, it, false); + render_attributes_in_code(w, it); write!( w, " {}type {};\n}}</pre>", @@ -1304,10 +1308,8 @@ fn render_union( } write!(w, " {{\n{}", tab); - let count_fields = fields - .iter() - .filter(|f| matches!(clean::StructFieldItem(..), *f.kind)) - .count(); + let count_fields = + fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count(); let toggle = should_hide_fields(count_fields); if toggle { toggle_open(w, "fields"); @@ -1361,10 +1363,8 @@ fn render_struct( write!(w, "{}", print_where_clause(g, cx.cache(), cx.tcx(), 0, true),) } w.write_str(" {"); - let count_fields = fields - .iter() - .filter(|f| matches!(clean::StructFieldItem(..) = *f.kind)) - .count(); + let count_fields = + fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count(); let has_visible_fields = count_fields > 0; let toggle = should_hide_fields(count_fields); if toggle { |
