diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-09-02 04:19:27 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-02 04:19:27 +0200 |
| commit | c90991db1759d0da7034146755c048d8e581d73c (patch) | |
| tree | 4e776e0a435b54665413dccb6e1e45c1faffd89c /src/librustdoc/html | |
| parent | 94885bc699512cfee8560e73c2a01ee6b4b76563 (diff) | |
| parent | 9855a3844bbe96d03f18541bdee3e325c35c8a34 (diff) | |
| download | rust-c90991db1759d0da7034146755c048d8e581d73c.tar.gz rust-c90991db1759d0da7034146755c048d8e581d73c.zip | |
Rollup merge of #127474 - tesuji:foldable-inline-derefs, r=t-rustdoc
doc: Make block of inline Deref methods foldable
After:

Before:

Fix #127470.
Current status:
- [x] Bug when hovering over title "Methods from ...": The anchor sign $ overlaps with `[-]`: https://github.com/rust-lang/rust/pull/127474#issuecomment-2222930038
=> Fixed by https://github.com/rust-lang/rust/pull/127474#issuecomment-2228886292
Diffstat (limited to 'src/librustdoc/html')
| -rw-r--r-- | src/librustdoc/html/render/mod.rs | 17 | ||||
| -rw-r--r-- | src/librustdoc/html/static/css/rustdoc.css | 10 |
2 files changed, 23 insertions, 4 deletions
diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index fc4033f8320..dc34c7844bf 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -1250,6 +1250,7 @@ fn render_assoc_items_inner( let Some(v) = cache.impls.get(&it) else { return }; let (non_trait, traits): (Vec<_>, _) = v.iter().partition(|i| i.inner_impl().trait_.is_none()); if !non_trait.is_empty() { + let mut close_tags = <Vec<&str>>::with_capacity(1); let mut tmp_buf = Buffer::html(); let (render_mode, id, class_html) = match what { AssocItemRender::All => { @@ -1260,6 +1261,8 @@ fn render_assoc_items_inner( let id = cx.derive_id(small_url_encode(format!("deref-methods-{:#}", type_.print(cx)))); let derived_id = cx.derive_id(&id); + tmp_buf.write_str("<details class=\"toggle big-toggle\" open><summary>"); + close_tags.push("</details>"); write_impl_section_heading( &mut tmp_buf, &format!( @@ -1269,6 +1272,7 @@ fn render_assoc_items_inner( ), &id, ); + tmp_buf.write_str("</summary>"); if let Some(def_id) = type_.def_id(cx.cache()) { cx.deref_id_map.insert(def_id, id); } @@ -1302,6 +1306,9 @@ fn render_assoc_items_inner( impls_buf.into_inner() ) .unwrap(); + for tag in close_tags.into_iter().rev() { + w.write_str(tag).unwrap(); + } } } @@ -1558,7 +1565,7 @@ fn render_impl( let cache = &shared.cache; let traits = &cache.traits; let trait_ = i.trait_did().map(|did| &traits[&did]); - let mut close_tags = String::new(); + let mut close_tags = <Vec<&str>>::with_capacity(2); // For trait implementations, the `interesting` output contains all methods that have doc // comments, and the `boring` output contains all methods that do not. The distinction is @@ -1870,7 +1877,7 @@ fn render_impl( if render_mode == RenderMode::Normal { let toggled = !(impl_items.is_empty() && default_impl_items.is_empty()); if toggled { - close_tags.insert_str(0, "</details>"); + close_tags.push("</details>"); write!( w, "<details class=\"toggle implementors-toggle\"{}>\ @@ -1916,14 +1923,16 @@ fn render_impl( } if !default_impl_items.is_empty() || !impl_items.is_empty() { w.write_str("<div class=\"impl-items\">"); - close_tags.insert_str(0, "</div>"); + close_tags.push("</div>"); } } if !default_impl_items.is_empty() || !impl_items.is_empty() { w.push_buffer(default_impl_items); w.push_buffer(impl_items); } - w.write_str(&close_tags); + for tag in close_tags.into_iter().rev() { + w.write_str(tag); + } } // Render the items that appear on the right side of methods, impls, and diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css index 28df8d3f011..1e483062289 100644 --- a/src/librustdoc/html/static/css/rustdoc.css +++ b/src/librustdoc/html/static/css/rustdoc.css @@ -1852,6 +1852,11 @@ details.toggle { position: relative; } +details.big-toggle { + /* This makes [-] on the same line as <summary>. */ + contain: inline-size; +} + /* The hideme class is used on summary tags that contain a span with placeholder text shown only when the toggle is closed. For instance, "Expand description" or "Show methods". */ @@ -1942,6 +1947,11 @@ details.toggle > summary:not(.hideme)::before { left: -24px; } +details.big-toggle > summary:not(.hideme)::before { + left: -34px; + top: 9px; +} + /* When a "hideme" summary is open and the "Expand description" or "Show methods" text is hidden, we want the [-] toggle that remains to not affect the layout of the items to its right. To do that, we use |
