Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve loading of crates.js and sidebar-items.js #98124

Merged
merged 1 commit into from
Jun 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions src/librustdoc/html/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ pub(crate) struct Page<'a> {
pub(crate) description: &'a str,
pub(crate) keywords: &'a str,
pub(crate) resource_suffix: &'a str,
pub(crate) extra_scripts: &'a [&'a str],
pub(crate) static_extra_scripts: &'a [&'a str],
}

impl<'a> Page<'a> {
Expand Down
6 changes: 1 addition & 5 deletions src/librustdoc/html/render/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,6 @@ impl<'tcx> Context<'tcx> {
description: &desc,
keywords: &keywords,
resource_suffix: &clone_shared.resource_suffix,
extra_scripts: &[],
static_extra_scripts: &[],
};
let mut page_buffer = Buffer::html();
print_item(self, it, &mut page_buffer, &page);
Expand Down Expand Up @@ -568,8 +566,6 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
description: "List of all items in this crate",
keywords: BASIC_KEYWORDS,
resource_suffix: &shared.resource_suffix,
extra_scripts: &[],
static_extra_scripts: &[],
};
let sidebar = if shared.cache.crate_version.is_some() {
format!("<h2 class=\"location\">Crate {}</h2>", crate_name)
Expand Down Expand Up @@ -693,7 +689,7 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
else { unreachable!() };
let items = self.build_sidebar_items(module);
let js_dst = self.dst.join(&format!("sidebar-items{}.js", self.shared.resource_suffix));
let v = format!("initSidebarItems({});", serde_json::to_string(&items).unwrap());
let v = format!("window.SIDEBAR_ITEMS = {};", serde_json::to_string(&items).unwrap());
self.shared.fs.write(js_dst, v)?;
}
Ok(())
Expand Down
19 changes: 1 addition & 18 deletions src/librustdoc/html/render/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ use rustc_middle::middle::stability;
use rustc_middle::ty;
use rustc_middle::ty::TyCtxt;
use rustc_span::{
symbol::{kw, sym, Symbol},
symbol::{sym, Symbol},
BytePos, FileName, RealFileName,
};
use serde::ser::SerializeSeq;
Expand Down Expand Up @@ -1738,8 +1738,6 @@ pub(crate) fn render_impl_summary(
}

fn print_sidebar(cx: &Context<'_>, it: &clean::Item, buffer: &mut Buffer) {
let parentlen = cx.current.len() - if it.is_mod() { 1 } else { 0 };

if it.is_struct()
|| it.is_trait()
|| it.is_primitive()
Expand Down Expand Up @@ -1800,21 +1798,6 @@ fn print_sidebar(cx: &Context<'_>, it: &clean::Item, buffer: &mut Buffer) {
write!(buffer, "<h2 class=\"location\"><a href=\"index.html\">In {}</a></h2>", path);
}

// Sidebar refers to the enclosing module, not this module.
let relpath = if it.is_mod() && parentlen != 0 { "./" } else { "" };
write!(
buffer,
"<div id=\"sidebar-vars\" data-name=\"{name}\" data-ty=\"{ty}\" data-relpath=\"{path}\">\
</div>",
name = it.name.unwrap_or(kw::Empty),
ty = it.type_(),
path = relpath
);
write!(
buffer,
"<script defer src=\"{}sidebar-items{}.js\"></script>",
relpath, cx.shared.resource_suffix
);
// Closes sidebar-elems div.
buffer.write_str("</div>");
}
Expand Down
2 changes: 0 additions & 2 deletions src/librustdoc/html/render/write_shared.rs
Original file line number Diff line number Diff line change
Expand Up @@ -475,8 +475,6 @@ if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
description: "List of crates",
keywords: BASIC_KEYWORDS,
resource_suffix: &shared.resource_suffix,
extra_scripts: &[],
static_extra_scripts: &[],
};

let content = format!(
Expand Down
2 changes: 0 additions & 2 deletions src/librustdoc/html/sources.rs
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,6 @@ impl SourceCollector<'_, '_> {
description: &desc,
keywords: BASIC_KEYWORDS,
resource_suffix: &shared.resource_suffix,
extra_scripts: &[&format!("source-files{}", shared.resource_suffix)],
static_extra_scripts: &[&format!("source-script{}", shared.resource_suffix)],
};
let v = layout::render(
&shared.layout,
Expand Down
130 changes: 61 additions & 69 deletions src/librustdoc/html/static/js/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,26 +66,18 @@ function showMain() {
(function() {
window.rootPath = getVar("root-path");
window.currentCrate = getVar("current-crate");
window.searchJS = resourcePath("search", ".js");
window.searchIndexJS = resourcePath("search-index", ".js");
window.settingsJS = resourcePath("settings", ".js");
const sidebarVars = document.getElementById("sidebar-vars");
if (sidebarVars) {
window.sidebarCurrent = {
name: sidebarVars.attributes["data-name"].value,
ty: sidebarVars.attributes["data-ty"].value,
relpath: sidebarVars.attributes["data-relpath"].value,
};
// FIXME: It would be nicer to generate this text content directly in HTML,
// but with the current code it's hard to get the right information in the right place.
const mobileLocationTitle = document.querySelector(".mobile-topbar h2.location");
const locationTitle = document.querySelector(".sidebar h2.location");
if (mobileLocationTitle && locationTitle) {
mobileLocationTitle.innerHTML = locationTitle.innerHTML;
}
}
}());

function setMobileTopbar() {
// FIXME: It would be nicer to generate this text content directly in HTML,
// but with the current code it's hard to get the right information in the right place.
const mobileLocationTitle = document.querySelector(".mobile-topbar h2.location");
const locationTitle = document.querySelector(".sidebar h2.location");
if (mobileLocationTitle && locationTitle) {
mobileLocationTitle.innerHTML = locationTitle.innerHTML;
}
}

// Gets the human-readable string for the virtual-key code of the
// given KeyboardEvent, ev.
//
Expand Down Expand Up @@ -227,7 +219,7 @@ function loadCss(cssFileName) {
// Sending request for the CSS and the JS files at the same time so it will
// hopefully be loaded when the JS will generate the settings content.
loadCss("settings");
loadScript(window.settingsJS);
loadScript(resourcePath("settings", ".js"));
};

window.searchState = {
Expand Down Expand Up @@ -304,8 +296,8 @@ function loadCss(cssFileName) {
function loadSearch() {
if (!searchLoaded) {
searchLoaded = true;
loadScript(window.searchJS);
loadScript(window.searchIndexJS);
loadScript(resourcePath("search", ".js"));
loadScript(resourcePath("search-index", ".js"));
}
}

Expand Down Expand Up @@ -485,40 +477,11 @@ function loadCss(cssFileName) {
document.addEventListener("keypress", handleShortcut);
document.addEventListener("keydown", handleShortcut);

// delayed sidebar rendering.
window.initSidebarItems = items => {
const sidebar = document.getElementsByClassName("sidebar-elems")[0];
let others;
const current = window.sidebarCurrent;

function addSidebarCrates(crates) {
if (!hasClass(document.body, "crate")) {
// We only want to list crates on the crate page.
return;
}
// Draw a convenient sidebar of known crates if we have a listing
const div = document.createElement("div");
div.className = "block crate";
div.innerHTML = "<h3>Crates</h3>";
const ul = document.createElement("ul");
div.appendChild(ul);

for (const crate of crates) {
let klass = "crate";
if (window.rootPath !== "./" && crate === window.currentCrate) {
klass += " current";
}
const link = document.createElement("a");
link.href = window.rootPath + crate + "/index.html";
link.className = klass;
link.textContent = crate;

const li = document.createElement("li");
li.appendChild(link);
ul.appendChild(li);
}
others.appendChild(div);
function addSidebarItems() {
if (!window.SIDEBAR_ITEMS) {
return;
}
const sidebar = document.getElementsByClassName("sidebar-elems")[0];

/**
* Append to the sidebar a "block" of links - a heading along with a list (`<ul>`) of items.
Expand All @@ -529,7 +492,7 @@ function loadCss(cssFileName) {
* "Modules", or "Macros".
*/
function block(shortty, id, longty) {
const filtered = items[shortty];
const filtered = window.SIDEBAR_ITEMS[shortty];
if (!filtered) {
return;
}
Expand All @@ -546,17 +509,18 @@ function loadCss(cssFileName) {
const desc = item[1]; // can be null

let klass = shortty;
if (name === current.name && shortty === current.ty) {
klass += " current";
}
let path;
if (shortty === "mod") {
path = name + "/index.html";
} else {
path = shortty + "." + name + ".html";
}
const current_page = document.location.href.split("/").pop();
if (path === current_page) {
klass += " current";
}
const link = document.createElement("a");
link.href = current.relpath + path;
link.href = path;
link.title = desc;
link.className = klass;
link.textContent = name;
Expand All @@ -565,14 +529,10 @@ function loadCss(cssFileName) {
ul.appendChild(li);
}
div.appendChild(ul);
others.appendChild(div);
sidebar.appendChild(div);
}

if (sidebar) {
others = document.createElement("div");
others.className = "others";
sidebar.appendChild(others);

const isModule = hasClass(document.body, "mod");
if (!isModule) {
block("primitive", "primitives", "Primitive Types");
Expand All @@ -590,12 +550,8 @@ function loadCss(cssFileName) {
block("keyword", "keywords", "Keywords");
block("traitalias", "trait-aliases", "Trait Aliases");
}

// `crates{version}.js` should always be loaded before this script, so we can use
// it safely.
addSidebarCrates(window.ALL_CRATES);
}
};
}

window.register_implementors = imp => {
const implementors = document.getElementById("implementors-list");
Expand Down Expand Up @@ -680,6 +636,39 @@ function loadCss(cssFileName) {
window.register_implementors(window.pending_implementors);
}

function addSidebarCrates() {
if (!window.ALL_CRATES) {
return;
}
const sidebarElems = document.getElementsByClassName("sidebar-elems")[0];
if (!sidebarElems) {
return;
}
// Draw a convenient sidebar of known crates if we have a listing
const div = document.createElement("div");
div.className = "block crate";
div.innerHTML = "<h3>Crates</h3>";
const ul = document.createElement("ul");
div.appendChild(ul);

for (const crate of window.ALL_CRATES) {
let klass = "crate";
if (window.rootPath !== "./" && crate === window.currentCrate) {
klass += " current";
}
const link = document.createElement("a");
link.href = window.rootPath + crate + "/index.html";
link.className = klass;
link.textContent = crate;

const li = document.createElement("li");
li.appendChild(link);
ul.appendChild(li);
}
sidebarElems.appendChild(div);
}


function labelForToggleButton(sectionIsCollapsed) {
if (sectionIsCollapsed) {
// button will expand the section
Expand Down Expand Up @@ -924,6 +913,9 @@ function loadCss(cssFileName) {
buildHelperPopup = () => {};
};

setMobileTopbar();
addSidebarItems();
addSidebarCrates();
onHashChange(null);
window.addEventListener("hashchange", onHashChange);
searchState.setup();
Expand Down
5 changes: 3 additions & 2 deletions src/librustdoc/html/static/js/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -1719,10 +1719,11 @@ function initSearch(rawSearchIndex) {
}

let crates = "";
if (window.ALL_CRATES.length > 1) {
const crates_list = Object.keys(rawSearchIndex);
if (crates_list.length > 1) {
crates = " in <select id=\"crate-search\"><option value=\"All crates\">" +
"All crates</option>";
for (const c of window.ALL_CRATES) {
for (const c of crates_list) {
crates += `<option value="${c}" ${c === filterCrates && "selected"}>${c}</option>`;
}
crates += "</select>";
Expand Down
Loading