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.
This commit is contained in:
committed by
Manish Goregaokar
parent
846a4e9b5c
commit
def144c2e7
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user