Skip to content

Commit 89e5a07

Browse files
committed
Auto merge of #47894 - vi:rustdoc_foldable_impls, r=GuillaumeGomez,QuietMisdreavus
rustdoc: Foldable impl blocks Addresses #40363, #45720, #24483, #23986 and so on * Expands and refactors collapseDocs and toggleAllDocs * Adds [-] toggle to all impls (including inherent impl) * Makes it hiding though main css file, not though element inline style May need to be addressed: * "[-]" and anchor link copier are overlaid a bit * Inherent methods are also hidden by the global [-] toggle. * Auto-collapsing "Iterator" and so on by default is not implemented yet * Tested only shallowly and only in Chromiuim * No tests. Are there tests for css/js part here? * The new implementation may be a bit slower. What next steps are need to be done before the integration?
2 parents affe297 + df1b9a8 commit 89e5a07

File tree

2 files changed

+144
-52
lines changed

2 files changed

+144
-52
lines changed

src/librustdoc/html/static/main.js

+123-50
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,9 @@
297297
document.onkeydown = handleShortcut;
298298
document.onclick = function(ev) {
299299
if (hasClass(ev.target, 'collapse-toggle')) {
300-
collapseDocs(ev.target);
300+
collapseDocs(ev.target, "toggle");
301301
} else if (hasClass(ev.target.parentNode, 'collapse-toggle')) {
302-
collapseDocs(ev.target.parentNode);
302+
collapseDocs(ev.target.parentNode, "toggle");
303303
} else if (ev.target.tagName === 'SPAN' && hasClass(ev.target.parentNode, 'line-numbers')) {
304304
var prev_id = 0;
305305

@@ -1636,76 +1636,143 @@
16361636
e.innerHTML = labelForToggleButton(false);
16371637
});
16381638
toggle.title = "collapse all docs";
1639-
onEach(document.getElementsByClassName("docblock"), function(e) {
1640-
e.style.display = 'block';
1641-
});
1642-
onEach(document.getElementsByClassName("toggle-label"), function(e) {
1643-
e.style.display = 'none';
1644-
});
1645-
onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
1646-
removeClass(e, "collapsed");
1647-
});
16481639
onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
1649-
onEveryMatchingChild(e, "inner", function(i_e) {
1650-
i_e.innerHTML = labelForToggleButton(false);
1651-
});
1640+
collapseDocs(e, "show");
16521641
});
16531642
} else {
16541643
addClass(toggle, "will-expand");
16551644
onEveryMatchingChild(toggle, "inner", function(e) {
16561645
e.innerHTML = labelForToggleButton(true);
16571646
});
16581647
toggle.title = "expand all docs";
1659-
onEach(document.getElementsByClassName("docblock"), function(e) {
1660-
e.style.display = 'none';
1661-
});
1662-
onEach(document.getElementsByClassName("toggle-label"), function(e) {
1663-
e.style.display = 'inline-block';
1664-
});
1665-
onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
1666-
addClass(e, "collapsed");
1667-
});
1648+
16681649
onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
1669-
onEveryMatchingChild(e, "inner", function(i_e) {
1670-
i_e.innerHTML = labelForToggleButton(true);
1671-
});
1650+
collapseDocs(e, "hide");
16721651
});
16731652
}
16741653
}
16751654

1676-
function collapseDocs(toggle) {
1655+
function collapseDocs(toggle, mode) {
16771656
if (!toggle || !toggle.parentNode) {
16781657
return;
16791658
}
1680-
var relatedDoc = toggle.parentNode.nextElementSibling;
1681-
if (hasClass(relatedDoc, "stability")) {
1682-
relatedDoc = relatedDoc.nextElementSibling;
1683-
}
1684-
if (hasClass(relatedDoc, "docblock")) {
1685-
if (!isHidden(relatedDoc)) {
1686-
relatedDoc.style.display = 'none';
1687-
onEach(toggle.childNodes, function(e) {
1688-
if (hasClass(e, 'toggle-label')) {
1659+
1660+
function adjustToggle(arg) {
1661+
return function(e) {
1662+
if (hasClass(e, 'toggle-label')) {
1663+
if (arg) {
16891664
e.style.display = 'inline-block';
1665+
} else {
1666+
e.style.display = 'none';
16901667
}
1691-
if (hasClass(e, 'inner')) {
1692-
e.innerHTML = labelForToggleButton(true);
1668+
}
1669+
if (hasClass(e, 'inner')) {
1670+
e.innerHTML = labelForToggleButton(arg);
1671+
}
1672+
};
1673+
};
1674+
1675+
if (!hasClass(toggle.parentNode, "impl")) {
1676+
var relatedDoc = toggle.parentNode.nextElementSibling;
1677+
if (hasClass(relatedDoc, "stability")) {
1678+
relatedDoc = relatedDoc.nextElementSibling;
1679+
}
1680+
if (hasClass(relatedDoc, "docblock")) {
1681+
var action = mode;
1682+
if (action === "toggle") {
1683+
if (hasClass(relatedDoc, "hidden-by-usual-hider")) {
1684+
action = "show";
1685+
} else {
1686+
action = "hide";
16931687
}
1694-
});
1695-
addClass(toggle.parentNode, 'collapsed');
1696-
} else {
1697-
relatedDoc.style.display = 'block';
1698-
removeClass(toggle.parentNode, 'collapsed');
1699-
onEach(toggle.childNodes, function(e) {
1700-
if (hasClass(e, 'toggle-label')) {
1701-
e.style.display = 'none';
1688+
}
1689+
if (action === "hide") {
1690+
addClass(relatedDoc, "hidden-by-usual-hider");
1691+
onEach(toggle.childNodes, adjustToggle(true));
1692+
addClass(toggle.parentNode, 'collapsed');
1693+
} else if (action === "show") {
1694+
removeClass(relatedDoc, "hidden-by-usual-hider");
1695+
removeClass(toggle.parentNode, 'collapsed');
1696+
onEach(toggle.childNodes, adjustToggle(false));
1697+
}
1698+
}
1699+
} else {
1700+
// we are collapsing the impl block
1701+
function implHider(addOrRemove) {
1702+
return function(n) {
1703+
if (hasClass(n, "method")) {
1704+
if (addOrRemove) {
1705+
addClass(n, "hidden-by-impl-hider");
1706+
} else {
1707+
removeClass(n, "hidden-by-impl-hider");
1708+
}
1709+
var ns = n.nextElementSibling;
1710+
while (true) {
1711+
if (ns && (
1712+
hasClass(ns, "docblock") ||
1713+
hasClass(ns, "stability") ||
1714+
false
1715+
)) {
1716+
if (addOrRemove) {
1717+
addClass(ns, "hidden-by-impl-hider");
1718+
} else {
1719+
removeClass(ns, "hidden-by-impl-hider");
1720+
}
1721+
ns = ns.nextElementSibling;
1722+
continue;
1723+
}
1724+
break;
1725+
}
17021726
}
1703-
if (hasClass(e, 'inner')) {
1704-
e.innerHTML = labelForToggleButton(false);
1727+
}
1728+
}
1729+
1730+
var relatedDoc = toggle.parentNode;
1731+
1732+
while (!hasClass(relatedDoc, "impl-items")) {
1733+
relatedDoc = relatedDoc.nextElementSibling;
1734+
}
1735+
1736+
if (!relatedDoc) {
1737+
return;
1738+
}
1739+
1740+
// Hide all functions, but not associated types/consts
1741+
1742+
var action = mode;
1743+
if (action === "toggle") {
1744+
if (hasClass(relatedDoc, "fns-now-collapsed")) {
1745+
action = "show";
1746+
} else {
1747+
action = "hide";
1748+
}
1749+
}
1750+
1751+
if (action === "show") {
1752+
removeClass(relatedDoc, "fns-now-collapsed");
1753+
onEach(toggle.childNodes, adjustToggle(false));
1754+
onEach(relatedDoc.childNodes, implHider(false));
1755+
} else if (action === "hide") {
1756+
addClass(relatedDoc, "fns-now-collapsed");
1757+
onEach(toggle.childNodes, adjustToggle(true));
1758+
onEach(relatedDoc.childNodes, implHider(true));
1759+
}
1760+
}
1761+
}
1762+
1763+
function autoCollapseAllImpls() {
1764+
// Automatically minimize all non-inherent impls
1765+
onEach(document.getElementsByClassName('impl'), function(n) {
1766+
// inherent impl ids are like 'impl' or impl-<number>'
1767+
var inherent = (n.id.match(/^impl(?:-\d+)?$/) !== null);
1768+
if (!inherent) {
1769+
onEach(n.childNodes, function(m) {
1770+
if (hasClass(m, "collapse-toggle")) {
1771+
collapseDocs(m, "hide");
17051772
}
17061773
});
17071774
}
1708-
}
1775+
});
17091776
}
17101777

17111778
var x = document.getElementById('toggle-all-docs');
@@ -1732,8 +1799,12 @@
17321799
hasClass(next.nextElementSibling, 'docblock'))) {
17331800
insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
17341801
}
1802+
if (hasClass(e, 'impl')) {
1803+
insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
1804+
}
17351805
}
17361806
onEach(document.getElementsByClassName('method'), func);
1807+
onEach(document.getElementsByClassName('impl'), func);
17371808
onEach(document.getElementsByClassName('impl-items'), function(e) {
17381809
onEach(e.getElementsByClassName('associatedconstant'), func);
17391810
});
@@ -1781,6 +1852,8 @@
17811852
}
17821853
})
17831854

1855+
autoCollapseAllImpls();
1856+
17841857
function createToggleWrapper() {
17851858
var span = document.createElement('span');
17861859
span.className = 'toggle-label';
@@ -1821,7 +1894,7 @@
18211894
onEach(document.getElementById('main').getElementsByTagName('pre'), function(e) {
18221895
onEach(e.getElementsByClassName('attributes'), function(i_e) {
18231896
i_e.parentNode.insertBefore(createToggleWrapper(), i_e);
1824-
collapseDocs(i_e.previousSibling.childNodes[0]);
1897+
collapseDocs(i_e.previousSibling.childNodes[0], "toggle");
18251898
});
18261899
});
18271900

src/librustdoc/html/static/rustdoc.css

+21-2
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ h3.impl, h3.method, h4.method, h3.type, h4.type, h4.associatedconstant {
110110
}
111111
h3.impl, h3.method, h3.type {
112112
margin-top: 15px;
113+
padding-left: 15px;
113114
}
114115

115116
h1, h2, h3, h4,
@@ -522,10 +523,10 @@ a {
522523
.anchor {
523524
display: none;
524525
position: absolute;
525-
left: -25px;
526+
left: -7px;
526527
}
527528
.anchor.field {
528-
left: -20px;
529+
left: -5px;
529530
}
530531
.anchor:before {
531532
content: '\2002\00a7\2002';
@@ -926,6 +927,10 @@ span.since {
926927
.content .impl-items .method, .content .impl-items > .type, .impl-items > .associatedconstant {
927928
display: flex;
928929
}
930+
931+
.anchor {
932+
display: none !important;
933+
}
929934
}
930935

931936
@media print {
@@ -1083,6 +1088,14 @@ h4 > .important-traits {
10831088
z-index: -1;
10841089
border-bottom: 1px solid;
10851090
}
1091+
1092+
.collapse-toggle {
1093+
left: -20px;
1094+
}
1095+
1096+
.impl > .collapse-toggle {
1097+
left: -10px;
1098+
}
10861099
}
10871100

10881101

@@ -1228,3 +1241,9 @@ kbd {
12281241
z-index: 1;
12291242
}
12301243
}
1244+
1245+
.hidden-by-impl-hider,
1246+
.hidden-by-usual-hider {
1247+
/* important because of conflicting rule for small screens */
1248+
display: none !important;
1249+
}

0 commit comments

Comments
 (0)