Skip to content

Commit 73f52d3

Browse files
committed
rustdoc: Foldable impl blocks
Addresses rust-lang#40363, rust-lang#45720, rust-lang#24483, rust-lang#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 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.
1 parent 21882aa commit 73f52d3

File tree

3 files changed

+115
-51
lines changed

3 files changed

+115
-51
lines changed

src/librustdoc/html/static/main.js

Lines changed: 105 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -296,9 +296,9 @@
296296
document.onkeydown = handleShortcut;
297297
document.onclick = function(ev) {
298298
if (hasClass(ev.target, 'collapse-toggle')) {
299-
collapseDocs(ev.target);
299+
collapseDocs(ev.target, "toggle");
300300
} else if (hasClass(ev.target.parentNode, 'collapse-toggle')) {
301-
collapseDocs(ev.target.parentNode);
301+
collapseDocs(ev.target.parentNode, "toggle");
302302
} else if (ev.target.tagName === 'SPAN' && hasClass(ev.target.parentNode, 'line-numbers')) {
303303
var prev_id = 0;
304304

@@ -1618,74 +1618,124 @@
16181618
e.innerHTML = labelForToggleButton(false);
16191619
});
16201620
toggle.title = "collapse all docs";
1621-
onEach(document.getElementsByClassName("docblock"), function(e) {
1622-
e.style.display = 'block';
1623-
});
1624-
onEach(document.getElementsByClassName("toggle-label"), function(e) {
1625-
e.style.display = 'none';
1626-
});
1627-
onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
1628-
removeClass(e, "collapsed");
1629-
});
16301621
onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
1631-
onEveryMatchingChild(e, "inner", function(i_e) {
1632-
i_e.innerHTML = labelForToggleButton(false);
1633-
});
1622+
collapseDocs(e, "show");
16341623
});
16351624
} else {
16361625
addClass(toggle, "will-expand");
16371626
onEveryMatchingChild(toggle, "inner", function(e) {
16381627
e.innerHTML = labelForToggleButton(true);
16391628
});
16401629
toggle.title = "expand all docs";
1641-
onEach(document.getElementsByClassName("docblock"), function(e) {
1642-
e.style.display = 'none';
1643-
});
1644-
onEach(document.getElementsByClassName("toggle-label"), function(e) {
1645-
e.style.display = 'inline-block';
1646-
});
1647-
onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
1648-
addClass(e, "collapsed");
1649-
});
1630+
16501631
onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
1651-
onEveryMatchingChild(e, "inner", function(i_e) {
1652-
i_e.innerHTML = labelForToggleButton(true);
1653-
});
1632+
collapseDocs(e, "hide");
16541633
});
16551634
}
16561635
}
16571636

1658-
function collapseDocs(toggle) {
1637+
function collapseDocs(toggle, mode) {
16591638
if (!toggle || !toggle.parentNode) {
16601639
return;
16611640
}
1662-
var relatedDoc = toggle.parentNode.nextElementSibling;
1663-
if (hasClass(relatedDoc, "stability")) {
1664-
relatedDoc = relatedDoc.nextElementSibling;
1665-
}
1666-
if (hasClass(relatedDoc, "docblock")) {
1667-
if (!isHidden(relatedDoc)) {
1668-
relatedDoc.style.display = 'none';
1669-
onEach(toggle.childNodes, function(e) {
1670-
if (hasClass(e, 'toggle-label')) {
1641+
1642+
function adjustToggle(arg) {
1643+
return function(e) {
1644+
if (hasClass(e, 'toggle-label')) {
1645+
if (arg) {
16711646
e.style.display = 'inline-block';
1672-
}
1673-
if (hasClass(e, 'inner')) {
1674-
e.innerHTML = labelForToggleButton(true);
1675-
}
1676-
});
1677-
addClass(toggle.parentNode, 'collapsed');
1678-
} else {
1679-
relatedDoc.style.display = 'block';
1680-
removeClass(toggle.parentNode, 'collapsed');
1681-
onEach(toggle.childNodes, function(e) {
1682-
if (hasClass(e, 'toggle-label')) {
1647+
} else {
16831648
e.style.display = 'none';
16841649
}
1685-
if (hasClass(e, 'inner')) {
1686-
e.innerHTML = labelForToggleButton(false);
1650+
}
1651+
if (hasClass(e, 'inner')) {
1652+
e.innerHTML = labelForToggleButton(arg);
1653+
}
1654+
};
1655+
};
1656+
1657+
if (!hasClass(toggle.parentNode, "impl")) {
1658+
var relatedDoc = toggle.parentNode.nextElementSibling;
1659+
if (hasClass(relatedDoc, "stability")) {
1660+
relatedDoc = relatedDoc.nextElementSibling;
1661+
}
1662+
if (hasClass(relatedDoc, "docblock")) {
1663+
var action = mode;
1664+
if (action == "toggle") {
1665+
if(hasClass(relatedDoc, "hidden-by-usual-hider")) {
1666+
action="show";
1667+
} else {
1668+
action="hide";
1669+
}
1670+
}
1671+
if (action == "hide") {
1672+
addClass(relatedDoc, "hidden-by-usual-hider");
1673+
onEach(toggle.childNodes, adjustToggle(true));
1674+
addClass(toggle.parentNode, 'collapsed');
1675+
} else if (action == "show") {
1676+
removeClass(relatedDoc, "hidden-by-usual-hider");
1677+
removeClass(toggle.parentNode, 'collapsed');
1678+
onEach(toggle.childNodes, adjustToggle(false));
1679+
}
1680+
}
1681+
} else {
1682+
// we are collapsing the impl block
1683+
function implHider(addOrRemove) {
1684+
return function(n) {
1685+
if(hasClass(n, "method")) {
1686+
if (addOrRemove) {
1687+
addClass(n, "hidden-by-impl-hider");
1688+
} else {
1689+
removeClass(n, "hidden-by-impl-hider");
1690+
}
1691+
var ns = n.nextElementSibling;
1692+
while(true) {
1693+
if (ns && (
1694+
hasClass(ns, "docblock") ||
1695+
hasClass(ns, "stability") ||
1696+
false
1697+
)) {
1698+
if (addOrRemove) {
1699+
addClass(ns, "hidden-by-impl-hider");
1700+
} else {
1701+
removeClass(ns, "hidden-by-impl-hider");
1702+
}
1703+
ns = ns.nextElementSibling;
1704+
continue;
1705+
}
1706+
break;
1707+
}
16871708
}
1688-
});
1709+
}
1710+
}
1711+
1712+
var relatedDoc = toggle.parentNode;
1713+
1714+
while (!hasClass(relatedDoc, "impl-items")) {
1715+
relatedDoc = relatedDoc.nextElementSibling;
1716+
}
1717+
1718+
if (!relatedDoc) return;
1719+
1720+
// Hide all functions, but not associated types/consts
1721+
1722+
var action = mode;
1723+
if (action == "toggle") {
1724+
if(hasClass(relatedDoc, "fns-now-collapsed")) {
1725+
action="show";
1726+
} else {
1727+
action="hide";
1728+
}
1729+
}
1730+
1731+
if(action == "show") {
1732+
removeClass(relatedDoc, "fns-now-collapsed");
1733+
onEach(toggle.childNodes, adjustToggle(false));
1734+
onEach(relatedDoc.childNodes, implHider(false));
1735+
} else if (action == "hide") {
1736+
addClass(relatedDoc, "fns-now-collapsed");
1737+
onEach(toggle.childNodes, adjustToggle(true));
1738+
onEach(relatedDoc.childNodes, implHider(true));
16891739
}
16901740
}
16911741
}
@@ -1714,8 +1764,12 @@
17141764
hasClass(next.nextElementSibling, 'docblock'))) {
17151765
insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
17161766
}
1767+
if (hasClass(e, 'impl')) {
1768+
insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
1769+
}
17171770
}
17181771
onEach(document.getElementsByClassName('method'), func);
1772+
onEach(document.getElementsByClassName('impl'), func);
17191773
onEach(document.getElementsByClassName('impl-items'), function(e) {
17201774
onEach(e.getElementsByClassName('associatedconstant'), func);
17211775
});
@@ -1803,7 +1857,7 @@
18031857
onEach(document.getElementById('main').getElementsByTagName('pre'), function(e) {
18041858
onEach(e.getElementsByClassName('attributes'), function(i_e) {
18051859
i_e.parentNode.insertBefore(createToggleWrapper(), i_e);
1806-
collapseDocs(i_e.previousSibling.childNodes[0]);
1860+
collapseDocs(i_e.previousSibling.childNodes[0], "toggle");
18071861
});
18081862
});
18091863

src/librustdoc/html/static/themes/dark.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,3 +386,8 @@ kbd {
386386
background: #353535;
387387
}
388388
}
389+
390+
.hidden-by-impl-hider,
391+
.hidden-by-usual-hider {
392+
display: none;
393+
}

src/librustdoc/html/static/themes/main.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,3 +383,8 @@ kbd {
383383
background: #fff;
384384
}
385385
}
386+
387+
.hidden-by-impl-hider,
388+
.hidden-by-usual-hider {
389+
display: none;
390+
}

0 commit comments

Comments
 (0)