Now that the "All Crates" dropdown is only rendered on the search results page, there is no need to load crates.js on most pages. Load it only on crate pages. Also, add the `defer` attribute so it does not block page rendering. For sidebar-items.js, move the script tag to `<head>`. Since it already has the defer attribute it won't block loading. The defer attribute does preserve ordering between scripts, so instead of the callback on load, it can set a global variable on load, which is slightly simpler. Also, since it is required to finish rendering the page, beginning its load earlier is better. Remove generation and handling of sidebar-vars. Everything there can be computed with information available in JS via other means. Remove the "other" wrapper in the sidebar. It was unnecessary. Remove excess script fields
103 lines
2.9 KiB
Rust
103 lines
2.9 KiB
Rust
use std::path::PathBuf;
|
|
|
|
use rustc_data_structures::fx::FxHashMap;
|
|
|
|
use crate::error::Error;
|
|
use crate::externalfiles::ExternalHtml;
|
|
use crate::html::format::{Buffer, Print};
|
|
use crate::html::render::{ensure_trailing_slash, StylePath};
|
|
|
|
use askama::Template;
|
|
|
|
#[derive(Clone)]
|
|
pub(crate) struct Layout {
|
|
pub(crate) logo: String,
|
|
pub(crate) favicon: String,
|
|
pub(crate) external_html: ExternalHtml,
|
|
pub(crate) default_settings: FxHashMap<String, String>,
|
|
pub(crate) krate: String,
|
|
/// The given user css file which allow to customize the generated
|
|
/// documentation theme.
|
|
pub(crate) css_file_extension: Option<PathBuf>,
|
|
/// If true, then scrape-examples.js will be included in the output HTML file
|
|
pub(crate) scrape_examples_extension: bool,
|
|
}
|
|
|
|
pub(crate) struct Page<'a> {
|
|
pub(crate) title: &'a str,
|
|
pub(crate) css_class: &'a str,
|
|
pub(crate) root_path: &'a str,
|
|
pub(crate) static_root_path: Option<&'a str>,
|
|
pub(crate) description: &'a str,
|
|
pub(crate) keywords: &'a str,
|
|
pub(crate) resource_suffix: &'a str,
|
|
}
|
|
|
|
impl<'a> Page<'a> {
|
|
pub(crate) fn get_static_root_path(&self) -> &str {
|
|
self.static_root_path.unwrap_or(self.root_path)
|
|
}
|
|
}
|
|
|
|
#[derive(Template)]
|
|
#[template(path = "page.html")]
|
|
struct PageLayout<'a> {
|
|
static_root_path: &'a str,
|
|
page: &'a Page<'a>,
|
|
layout: &'a Layout,
|
|
themes: Vec<String>,
|
|
sidebar: String,
|
|
content: String,
|
|
krate_with_trailing_slash: String,
|
|
pub(crate) rustdoc_version: &'a str,
|
|
}
|
|
|
|
pub(crate) fn render<T: Print, S: Print>(
|
|
layout: &Layout,
|
|
page: &Page<'_>,
|
|
sidebar: S,
|
|
t: T,
|
|
style_files: &[StylePath],
|
|
) -> String {
|
|
let static_root_path = page.get_static_root_path();
|
|
let krate_with_trailing_slash = ensure_trailing_slash(&layout.krate).to_string();
|
|
let mut themes: Vec<String> = style_files
|
|
.iter()
|
|
.map(StylePath::basename)
|
|
.collect::<Result<_, Error>>()
|
|
.unwrap_or_default();
|
|
themes.sort();
|
|
let rustdoc_version = rustc_interface::util::version_str().unwrap_or("unknown version");
|
|
let content = Buffer::html().to_display(t); // Note: This must happen before making the sidebar.
|
|
let sidebar = Buffer::html().to_display(sidebar);
|
|
PageLayout {
|
|
static_root_path,
|
|
page,
|
|
layout,
|
|
themes,
|
|
sidebar,
|
|
content,
|
|
krate_with_trailing_slash,
|
|
rustdoc_version,
|
|
}
|
|
.render()
|
|
.unwrap()
|
|
}
|
|
|
|
pub(crate) fn redirect(url: &str) -> String {
|
|
// <script> triggers a redirect before refresh, so this is fine.
|
|
format!(
|
|
r##"<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta http-equiv="refresh" content="0;URL={url}">
|
|
<title>Redirection</title>
|
|
</head>
|
|
<body>
|
|
<p>Redirecting to <a href="{url}">{url}</a>...</p>
|
|
<script>location.replace("{url}" + location.search + location.hash);</script>
|
|
</body>
|
|
</html>"##,
|
|
url = url,
|
|
)
|
|
}
|