Skip to content

Instantly share code, notes, and snippets.

@BurntSushi
Created August 14, 2019 11:46
Show Gist options
  • Save BurntSushi/6bc3fd4dd79a0148b385abfa9d865ec4 to your computer and use it in GitHub Desktop.
Save BurntSushi/6bc3fd4dd79a0148b385abfa9d865ec4 to your computer and use it in GitHub Desktop.
(function() {
// This function forces rustdoc to collapse documentation for all items,
// except for the methods defined in an impl block and the primary type's
// declaration. This is the most natural view IMO, since it provides the
// primary type along with an easy to scan overview of available methods.
//
// rustdoc does seemingly have user settings that purport to make this the
// default, but I could never cause them to work in a reliably consistent
// way. This is especially useful when writing documents, where you commonly
// want to refresh and look at the docs for the specific item you're working
// on. This mini-script will automatically scroll to and expand the currently
// selected method.
//
// I used the tridactyl Firefox extension to bind this script to `,z` with
// the following in my tridactylrc:
//
// bind ,z composite jsb tri.native.run('cat path/to/rustdoc-condensed.js') | js -p eval(JS_ARG.content)
// get the currently selected doc item from URL's hash fragment
// e.g., in `struct.BStr.html#method.words`, this returns `method.words`.
function getPageId() {
var id = document.location.href.split("#")[1];
if (id) {
return id.split("?")[0].split("&")[0];
}
return null;
}
// collapse everything, with an extra click in case things are partially
// collapased already
const toggleAll = document.getElementById('toggle-all-docs');
if (toggleAll.className.indexOf('will-expand') > -1) {
toggleAll.click();
}
toggleAll.click();
// re-expand primary impls
const impls = document.getElementsByClassName('impl');
for (let i = 0; i < impls.length; i++) {
// but don't expand every impl, just the ones on this type
if (!/^impl(-\d+)?$/.test(impls[i].id)) {
continue;
}
const toggles = impls[i].getElementsByClassName('collapse-toggle');
for (let j = 0; j < toggles.length; j++) {
// If it's already expanded, then let it be. In newer versions of
// rustdoc, collapsing everything doesn't collapse the methods, so we
// don't need to do anything.
if (toggles[j].innerText == '[−]') {
continue;
}
toggles[j].click();
}
}
// expand type declaration docs
const main = document.getElementById('main');
const wrapper = document.getElementsByClassName('toggle-wrapper')[0];
wrapper.getElementsByTagName('a')[0].click();
// re-expand specific method declaration, and scroll to it
const pageId = getPageId();
if (pageId !== null) {
const method = document.getElementById(pageId);
method.getElementsByClassName('collapse-toggle')[0].click();
method.scrollIntoView();
}
})()
@rofrol
Copy link

rofrol commented Feb 10, 2020

Is this still needed? I have tested it on couple of crates and it does nothing.

@BurntSushi
Copy link
Author

Yes? Works fine for me:

  1. Go to https://doc.rust-lang.org/std/string/struct.String.html
  2. Open Javascript console (F12 in Firefox).
  3. Copy above code into console.
  4. Hit enter.
  5. Watch all items individually collapse.

@rofrol
Copy link

rofrol commented Feb 10, 2020

Thanks. Consider changing comments from // to /* */ so that it is easy to paste in bookmarklet with javascript: <Ctrl+V>

https://gist.github.com/rofrol/c3a3e6395c74326ce075c7f815823a45

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment