1
Fork 0

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 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.
This commit is contained in:
Vitaly _Vi Shukela 2018-01-31 03:48:16 +03:00
parent 21882aad72
commit 73f52d3d8f
No known key found for this signature in database
GPG key ID: C097221D6E03DF68
3 changed files with 115 additions and 51 deletions

View file

@ -296,9 +296,9 @@
document.onkeydown = handleShortcut; document.onkeydown = handleShortcut;
document.onclick = function(ev) { document.onclick = function(ev) {
if (hasClass(ev.target, 'collapse-toggle')) { if (hasClass(ev.target, 'collapse-toggle')) {
collapseDocs(ev.target); collapseDocs(ev.target, "toggle");
} else if (hasClass(ev.target.parentNode, 'collapse-toggle')) { } else if (hasClass(ev.target.parentNode, 'collapse-toggle')) {
collapseDocs(ev.target.parentNode); collapseDocs(ev.target.parentNode, "toggle");
} else if (ev.target.tagName === 'SPAN' && hasClass(ev.target.parentNode, 'line-numbers')) { } else if (ev.target.tagName === 'SPAN' && hasClass(ev.target.parentNode, 'line-numbers')) {
var prev_id = 0; var prev_id = 0;
@ -1618,19 +1618,8 @@
e.innerHTML = labelForToggleButton(false); e.innerHTML = labelForToggleButton(false);
}); });
toggle.title = "collapse all docs"; toggle.title = "collapse all docs";
onEach(document.getElementsByClassName("docblock"), function(e) {
e.style.display = 'block';
});
onEach(document.getElementsByClassName("toggle-label"), function(e) {
e.style.display = 'none';
});
onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
removeClass(e, "collapsed");
});
onEach(document.getElementsByClassName("collapse-toggle"), function(e) { onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
onEveryMatchingChild(e, "inner", function(i_e) { collapseDocs(e, "show");
i_e.innerHTML = labelForToggleButton(false);
});
}); });
} else { } else {
addClass(toggle, "will-expand"); addClass(toggle, "will-expand");
@ -1638,54 +1627,115 @@
e.innerHTML = labelForToggleButton(true); e.innerHTML = labelForToggleButton(true);
}); });
toggle.title = "expand all docs"; toggle.title = "expand all docs";
onEach(document.getElementsByClassName("docblock"), function(e) {
e.style.display = 'none';
});
onEach(document.getElementsByClassName("toggle-label"), function(e) {
e.style.display = 'inline-block';
});
onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
addClass(e, "collapsed");
});
onEach(document.getElementsByClassName("collapse-toggle"), function(e) { onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
onEveryMatchingChild(e, "inner", function(i_e) { collapseDocs(e, "hide");
i_e.innerHTML = labelForToggleButton(true);
});
}); });
} }
} }
function collapseDocs(toggle) { function collapseDocs(toggle, mode) {
if (!toggle || !toggle.parentNode) { if (!toggle || !toggle.parentNode) {
return; return;
} }
var relatedDoc = toggle.parentNode.nextElementSibling;
if (hasClass(relatedDoc, "stability")) { function adjustToggle(arg) {
relatedDoc = relatedDoc.nextElementSibling; return function(e) {
} if (hasClass(e, 'toggle-label')) {
if (hasClass(relatedDoc, "docblock")) { if (arg) {
if (!isHidden(relatedDoc)) {
relatedDoc.style.display = 'none';
onEach(toggle.childNodes, function(e) {
if (hasClass(e, 'toggle-label')) {
e.style.display = 'inline-block'; e.style.display = 'inline-block';
} } else {
if (hasClass(e, 'inner')) {
e.innerHTML = labelForToggleButton(true);
}
});
addClass(toggle.parentNode, 'collapsed');
} else {
relatedDoc.style.display = 'block';
removeClass(toggle.parentNode, 'collapsed');
onEach(toggle.childNodes, function(e) {
if (hasClass(e, 'toggle-label')) {
e.style.display = 'none'; e.style.display = 'none';
} }
if (hasClass(e, 'inner')) { }
e.innerHTML = labelForToggleButton(false); if (hasClass(e, 'inner')) {
e.innerHTML = labelForToggleButton(arg);
}
};
};
if (!hasClass(toggle.parentNode, "impl")) {
var relatedDoc = toggle.parentNode.nextElementSibling;
if (hasClass(relatedDoc, "stability")) {
relatedDoc = relatedDoc.nextElementSibling;
}
if (hasClass(relatedDoc, "docblock")) {
var action = mode;
if (action == "toggle") {
if(hasClass(relatedDoc, "hidden-by-usual-hider")) {
action="show";
} else {
action="hide";
} }
}); }
if (action == "hide") {
addClass(relatedDoc, "hidden-by-usual-hider");
onEach(toggle.childNodes, adjustToggle(true));
addClass(toggle.parentNode, 'collapsed');
} else if (action == "show") {
removeClass(relatedDoc, "hidden-by-usual-hider");
removeClass(toggle.parentNode, 'collapsed');
onEach(toggle.childNodes, adjustToggle(false));
}
}
} else {
// we are collapsing the impl block
function implHider(addOrRemove) {
return function(n) {
if(hasClass(n, "method")) {
if (addOrRemove) {
addClass(n, "hidden-by-impl-hider");
} else {
removeClass(n, "hidden-by-impl-hider");
}
var ns = n.nextElementSibling;
while(true) {
if (ns && (
hasClass(ns, "docblock") ||
hasClass(ns, "stability") ||
false
)) {
if (addOrRemove) {
addClass(ns, "hidden-by-impl-hider");
} else {
removeClass(ns, "hidden-by-impl-hider");
}
ns = ns.nextElementSibling;
continue;
}
break;
}
}
}
}
var relatedDoc = toggle.parentNode;
while (!hasClass(relatedDoc, "impl-items")) {
relatedDoc = relatedDoc.nextElementSibling;
}
if (!relatedDoc) return;
// Hide all functions, but not associated types/consts
var action = mode;
if (action == "toggle") {
if(hasClass(relatedDoc, "fns-now-collapsed")) {
action="show";
} else {
action="hide";
}
}
if(action == "show") {
removeClass(relatedDoc, "fns-now-collapsed");
onEach(toggle.childNodes, adjustToggle(false));
onEach(relatedDoc.childNodes, implHider(false));
} else if (action == "hide") {
addClass(relatedDoc, "fns-now-collapsed");
onEach(toggle.childNodes, adjustToggle(true));
onEach(relatedDoc.childNodes, implHider(true));
} }
} }
} }
@ -1714,8 +1764,12 @@
hasClass(next.nextElementSibling, 'docblock'))) { hasClass(next.nextElementSibling, 'docblock'))) {
insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]); insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
} }
if (hasClass(e, 'impl')) {
insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
}
} }
onEach(document.getElementsByClassName('method'), func); onEach(document.getElementsByClassName('method'), func);
onEach(document.getElementsByClassName('impl'), func);
onEach(document.getElementsByClassName('impl-items'), function(e) { onEach(document.getElementsByClassName('impl-items'), function(e) {
onEach(e.getElementsByClassName('associatedconstant'), func); onEach(e.getElementsByClassName('associatedconstant'), func);
}); });
@ -1803,7 +1857,7 @@
onEach(document.getElementById('main').getElementsByTagName('pre'), function(e) { onEach(document.getElementById('main').getElementsByTagName('pre'), function(e) {
onEach(e.getElementsByClassName('attributes'), function(i_e) { onEach(e.getElementsByClassName('attributes'), function(i_e) {
i_e.parentNode.insertBefore(createToggleWrapper(), i_e); i_e.parentNode.insertBefore(createToggleWrapper(), i_e);
collapseDocs(i_e.previousSibling.childNodes[0]); collapseDocs(i_e.previousSibling.childNodes[0], "toggle");
}); });
}); });

View file

@ -386,3 +386,8 @@ kbd {
background: #353535; background: #353535;
} }
} }
.hidden-by-impl-hider,
.hidden-by-usual-hider {
display: none;
}

View file

@ -383,3 +383,8 @@ kbd {
background: #fff; background: #fff;
} }
} }
.hidden-by-impl-hider,
.hidden-by-usual-hider {
display: none;
}