Skip to content

Commit 1ee11ec

Browse files
Nemo157syphar
authored andcommitted
Generate url for ajax menu in html template
1 parent 588842e commit 1ee11ec

File tree

4 files changed

+44
-109
lines changed

4 files changed

+44
-109
lines changed

src/web/crate_details.rs

+23-43
Original file line numberDiff line numberDiff line change
@@ -1503,33 +1503,23 @@ mod tests {
15031503
platform_links
15041504
}
15051505

1506-
fn run_check_links_redir(
1507-
env: &TestEnvironment,
1508-
url_start: &str,
1509-
url_end: &str,
1510-
extra: &str,
1511-
should_contain_redirect: bool,
1512-
) {
1513-
let response = env
1514-
.frontend()
1515-
.get(&format!("{url_start}{url_end}"))
1516-
.send()
1517-
.unwrap();
1506+
fn run_check_links_redir(env: &TestEnvironment, url: &str, should_contain_redirect: bool) {
1507+
let response = env.frontend().get(url).send().unwrap();
15181508
assert!(response.status().is_success());
1519-
let list1 = check_links(response.text().unwrap(), false, should_contain_redirect);
1509+
let text = response.text().unwrap();
1510+
let list1 = check_links(text.clone(), false, should_contain_redirect);
1511+
15201512
// Same test with AJAX endpoint.
1521-
let (start, extra_name) = if url_start.starts_with("/crate/") {
1522-
("", "/crate")
1523-
} else {
1524-
("/crate", "")
1525-
};
1526-
let response = env
1527-
.frontend()
1528-
.get(&format!(
1529-
"{start}{url_start}/menus/platforms{extra_name}{url_end}{extra}"
1530-
))
1531-
.send()
1532-
.unwrap();
1513+
let platform_menu_url = kuchikiki::parse_html()
1514+
.one(text)
1515+
.select_first("#platforms")
1516+
.expect("invalid selector")
1517+
.attributes
1518+
.borrow()
1519+
.get("data-url")
1520+
.expect("data-url")
1521+
.to_string();
1522+
let response = env.frontend().get(&platform_menu_url).send().unwrap();
15331523
assert!(response.status().is_success());
15341524
assert_cache_control(&response, CachePolicy::ForeverInCdn, &env.config());
15351525
let list2 = check_links(response.text().unwrap(), true, should_contain_redirect);
@@ -1548,27 +1538,17 @@ mod tests {
15481538
.source_file("README.md", b"storage readme")
15491539
.create()?;
15501540

1551-
// FIXME: For some reason, there are target-redirects on non-AJAX lists on docs.rs
1552-
// crate pages other than the "default" one.
1553-
run_check_links_redir(env, "/crate/dummy/0.4.0", "/features", "", false);
1554-
run_check_links_redir(env, "/crate/dummy/0.4.0", "/builds", "", false);
1555-
run_check_links_redir(env, "/crate/dummy/0.4.0", "/source/", "", false);
1556-
run_check_links_redir(env, "/crate/dummy/0.4.0", "/source/README.md", "", false);
1541+
run_check_links_redir(env, "/crate/dummy/0.4.0/features", false);
1542+
run_check_links_redir(env, "/crate/dummy/0.4.0/builds", false);
1543+
run_check_links_redir(env, "/crate/dummy/0.4.0/source/", false);
1544+
run_check_links_redir(env, "/crate/dummy/0.4.0/source/README.md", false);
1545+
run_check_links_redir(env, "/crate/dummy/0.4.0", false);
15571546

1558-
run_check_links_redir(env, "/crate/dummy/0.4.0", "", "/", false);
1559-
run_check_links_redir(env, "/dummy/latest", "/dummy", "/", true);
1560-
run_check_links_redir(
1561-
env,
1562-
"/dummy/0.4.0",
1563-
"/x86_64-pc-windows-msvc/dummy",
1564-
"/",
1565-
true,
1566-
);
1547+
run_check_links_redir(env, "/dummy/latest/dummy", true);
1548+
run_check_links_redir(env, "/dummy/0.4.0/x86_64-pc-windows-msvc/dummy", true);
15671549
run_check_links_redir(
15681550
env,
1569-
"/dummy/0.4.0",
1570-
"/x86_64-pc-windows-msvc/dummy/struct.A.html",
1571-
"/",
1551+
"/dummy/0.4.0/x86_64-pc-windows-msvc/dummy/struct.A.html",
15721552
true,
15731553
);
15741554

src/web/routes.rs

+2-30
Original file line numberDiff line numberDiff line change
@@ -236,30 +236,6 @@ pub(super) fn build_axum_routes() -> AxumRouter {
236236
"/crate/:name/:version/source/*path",
237237
get_internal(super::source::source_browser_handler),
238238
)
239-
.route(
240-
"/crate/:name/:version/menus/platforms/crate/",
241-
get_internal(super::crate_details::get_all_platforms_root),
242-
)
243-
.route(
244-
"/crate/:name/:version/menus/platforms/crate/features",
245-
get_internal(super::crate_details::get_all_platforms_root),
246-
)
247-
.route(
248-
"/crate/:name/:version/menus/platforms/crate/builds",
249-
get_internal(super::crate_details::get_all_platforms_root),
250-
)
251-
.route(
252-
"/crate/:name/:version/menus/platforms/crate/builds/*path",
253-
get_internal(super::crate_details::get_all_platforms_root),
254-
)
255-
.route(
256-
"/crate/:name/:version/menus/platforms/crate/source/",
257-
get_internal(super::crate_details::get_all_platforms_root),
258-
)
259-
.route(
260-
"/crate/:name/:version/menus/platforms/crate/source/*path",
261-
get_internal(super::crate_details::get_all_platforms_root),
262-
)
263239
.route(
264240
"/crate/:name/:version/menus/platforms/:target",
265241
get_internal(super::crate_details::get_all_platforms),
@@ -269,12 +245,8 @@ pub(super) fn build_axum_routes() -> AxumRouter {
269245
get_internal(super::crate_details::get_all_platforms),
270246
)
271247
.route(
272-
"/crate/:name/:version/menus/platforms/",
273-
get_internal(super::crate_details::get_all_platforms),
274-
)
275-
.route(
276-
"/crate/:name/:version/menus/platforms/:target/",
277-
get_internal(super::crate_details::get_all_platforms),
248+
"/crate/:name/:version/menus/platforms",
249+
get_internal(super::crate_details::get_all_platforms_root),
278250
)
279251
.route(
280252
"/crate/:name/:version/menus/releases/:target",

static/menu.js

+10-34
Original file line numberDiff line numberDiff line change
@@ -7,42 +7,27 @@ const updateMenuPositionForSubMenu = (currentMenuSupplier) => {
77

88
const loadedMenus = new Set();
99

10-
function loadAjaxMenu(menu, id, msg, path, extra) {
10+
async function loadAjaxMenu(menu, id, msg) {
1111
if (loadedMenus.has(id)) {
1212
return;
1313
}
1414
loadedMenus.add(id);
1515
if (!menu.querySelector(".rotate")) {
1616
return;
1717
}
18-
const releaseListElem = document.getElementById(id);
19-
if (!releaseListElem) {
18+
const listElem = document.getElementById(id);
19+
if (!listElem) {
2020
// We're not in a documentation page, so no need to do anything.
2121
return;
2222
}
23-
const parts = window.location.pathname.split("/");
24-
let crateName = parts[1];
25-
let version = parts[2];
26-
if (crateName === "crate") {
27-
crateName = parts[2];
28-
version = parts[3];
29-
path += "/crate";
23+
const url = listElem.dataset.url;
24+
try {
25+
const response = await fetch(url);
26+
listElem.innerHTML = await response.text();
27+
} catch (ex) {
28+
console.error(`Failed to load ${msg}: ${ex}`)
29+
listElem.innerHTML = `Failed to load ${msg}`;
3030
}
31-
const xhttp = new XMLHttpRequest();
32-
xhttp.onreadystatechange = function() {
33-
if (xhttp.readyState !== XMLHttpRequest.DONE) {
34-
return;
35-
}
36-
if (xhttp.status === 200) {
37-
releaseListElem.innerHTML = xhttp.responseText;
38-
} else {
39-
console.error(`Failed to load ${msg}: [${xhttp.status}] ${xhttp.responseText}`);
40-
document.getElementById(id).innerHTML = `Failed to load ${msg}`;
41-
}
42-
};
43-
console.log(extra, path);
44-
xhttp.open("GET", `/crate/${crateName}/${version}/menus/${path}${extra}`, true);
45-
xhttp.send();
4631
};
4732

4833
// Allow menus to be open and used by keyboard.
@@ -94,27 +79,18 @@ function loadAjaxMenu(menu, id, msg, path, extra) {
9479
newMenu.className += " pure-menu-active";
9580
backdrop.style.display = "block";
9681

97-
const parts = window.location.pathname.split("/");
98-
const startFrom = parts[1] === "crate" ? 4 : 3;
99-
// We get everything except the first crate name and the version.
100-
const innerPath = "/" + parts.slice(startFrom).join("/")
101-
10282
if (newMenu.querySelector("#releases-list")) {
10383
loadAjaxMenu(
10484
newMenu,
10585
"releases-list",
10686
"release list",
107-
"releases",
108-
innerPath,
10987
);
11088

11189
} else if (newMenu.querySelector("#platforms")) {
11290
loadAjaxMenu(
11391
newMenu,
11492
"platforms",
11593
"platforms list",
116-
"platforms",
117-
innerPath,
11894
);
11995
}
12096
}

templates/rustdoc/topbar.html

+9-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
{# The url of the current release, `/crate/:name/:version` #}
44
{%- set crate_url = "/crate/" ~ metadata.name ~ "/" ~ metadata.req_version -%}
5+
{%- if current_target -%}
6+
{%- set rest_menu_url = "/" ~ current_target ~ "/" ~ inner_path -%}
7+
{%- else -%}
8+
{%- set rest_menu_url = "" -%}
9+
{%- endif -%}
10+
{%- set platform_menu_url = crate_url ~ "/menus/platforms" ~ rest_menu_url -%}
11+
{%- set releases_menu_url = crate_url ~ "/menus/releases" ~ rest_menu_url -%}
512

613
{%- include "header/topbar_begin.html" -%}{#
714
extra whitespace unremovable, need to use html tags unaffacted by whitespace T_T
@@ -137,7 +144,7 @@
137144
<li class="pure-menu-heading">Versions</li>
138145

139146
<li class="pure-menu-item">
140-
<div class="pure-menu pure-menu-scrollable sub-menu" id="releases-list" tabindex="-1">
147+
<div class="pure-menu pure-menu-scrollable sub-menu" id="releases-list" tabindex="-1" data-url="{{ releases_menu_url }}" >
141148
<span class="rotate">{{ "spinner" | fas }}</span>
142149
</div>
143150
</li>
@@ -211,7 +218,7 @@
211218
</a>
212219

213220
{# Build the dropdown list showing available targets #}
214-
<ul class="pure-menu-children" id="platforms">
221+
<ul class="pure-menu-children" id="platforms" data-url="{{ platform_menu_url }}" >
215222
{%- if metadata.doc_targets|length < DEFAULT_MAX_TARGETS -%}
216223
{%- include "rustdoc/platforms.html" -%}
217224
{%- else -%}

0 commit comments

Comments
 (0)