Skip to content

Show a consistent navbar across docs.rs and rustdoc pages #1089

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

Merged
merged 7 commits into from
Oct 13, 2020
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
10 changes: 5 additions & 5 deletions src/utils/html.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::web::page::TemplateData;
use lol_html::errors::RewritingError;
use tera::Context;

/// Rewrite a rustdoc page to have the docs.rs header
/// Rewrite a rustdoc page to have the docs.rs topbar
///
/// Given a rustdoc HTML page and a context to serialize it with,
/// render the `rustdoc/` templates with the `html`.
Expand All @@ -21,7 +21,7 @@ pub(crate) fn rewrite_lol(
let tera_head = templates.render("rustdoc/head.html", &ctx).unwrap();
let tera_vendored_css = templates.render("rustdoc/vendored.html", &ctx).unwrap();
let tera_body = templates.render("rustdoc/body.html", &ctx).unwrap();
let tera_rustdoc_header = templates.render("rustdoc/header.html", &ctx).unwrap();
let tera_rustdoc_topbar = templates.render("rustdoc/topbar.html", &ctx).unwrap();

// Append `style.css` stylesheet after all head elements.
let head_handler = |head: &mut Element| {
Expand Down Expand Up @@ -54,10 +54,10 @@ pub(crate) fn rewrite_lol(
rustdoc_body_class.set_tag_name("div")?;
// Prepend the tera content
rustdoc_body_class.prepend(&tera_body, ContentType::Html);
// Wrap the tranformed body and rustdoc header into a <body> element
// Wrap the tranformed body and topbar into a <body> element
rustdoc_body_class.before("<body>", ContentType::Html);
// Insert the header outside of the rustdoc div
rustdoc_body_class.before(&tera_rustdoc_header, ContentType::Html);
// Insert the topbar outside of the rustdoc div
rustdoc_body_class.before(&tera_rustdoc_topbar, ContentType::Html);
// Finalize body with </body>
rustdoc_body_class.after("</body>", ContentType::Html);

Expand Down
18 changes: 2 additions & 16 deletions src/web/crate_details.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@ pub struct CrateDetails {
github_issues: Option<i32>,
pub(crate) metadata: MetaData,
is_library: bool,
yanked: bool,
pub(crate) doc_targets: Vec<String>,
license: Option<String>,
documentation_url: Option<String>,
total_items: Option<f32>,
Expand Down Expand Up @@ -144,18 +142,8 @@ impl CrateDetails {
rustdoc_status: krate.get("rustdoc_status"),
target_name: krate.get("target_name"),
default_target: krate.get("default_target"),
};

let doc_targets = {
let data: Value = krate.get("doc_targets");
data.as_array()
.map(|array| {
array
.iter()
.filter_map(|item| item.as_str().map(|s| s.to_owned()))
.collect()
})
.unwrap_or_else(Vec::new)
doc_targets: MetaData::parse_doc_targets(krate.get("doc_targets")),
yanked: krate.get("yanked"),
};

let documented_items: Option<i32> = krate.get("documented_items");
Expand Down Expand Up @@ -189,8 +177,6 @@ impl CrateDetails {
github_issues: krate.get("github_issues"),
metadata,
is_library: krate.get("is_library"),
yanked: krate.get("yanked"),
doc_targets,
license: krate.get("license"),
documentation_url: krate.get("documentation_url"),
documented_items: documented_items.map(|v| v as f32),
Expand Down
53 changes: 46 additions & 7 deletions src/web/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
pub(crate) mod page;

use log::{debug, info};
use serde_json::Value;

/// ctry! (cratesfyitry) is extremely similar to try! and itry!
/// except it returns an error page response instead of plain Err.
Expand Down Expand Up @@ -542,6 +543,8 @@ pub(crate) struct MetaData {
pub(crate) target_name: Option<String>,
pub(crate) rustdoc_status: bool,
pub(crate) default_target: String,
pub(crate) doc_targets: Vec<String>,
pub(crate) yanked: bool,
}

impl MetaData {
Expand All @@ -553,7 +556,9 @@ impl MetaData {
releases.description,
releases.target_name,
releases.rustdoc_status,
releases.default_target
releases.default_target,
releases.doc_targets,
releases.yanked
FROM releases
INNER JOIN crates ON crates.id = releases.crate_id
WHERE crates.name = $1 AND releases.version = $2",
Expand All @@ -570,8 +575,22 @@ impl MetaData {
target_name: row.get(3),
rustdoc_status: row.get(4),
default_target: row.get(5),
doc_targets: MetaData::parse_doc_targets(row.get(6)),
yanked: row.get(7),
})
}

fn parse_doc_targets(targets: Value) -> Vec<String> {
targets
.as_array()
.map(|array| {
array
.iter()
.filter_map(|item| item.as_str().map(|s| s.to_owned()))
.collect()
})
.unwrap_or_else(Vec::new)
}
}

#[derive(Debug, Clone, PartialEq, Serialize)]
Expand Down Expand Up @@ -840,6 +859,11 @@ mod test {
target_name: None,
rustdoc_status: true,
default_target: "x86_64-unknown-linux-gnu".to_string(),
doc_targets: vec![
"x86_64-unknown-linux-gnu".to_string(),
"arm64-unknown-linux-gnu".to_string(),
],
yanked: false,
};

let correct_json = json!({
Expand All @@ -848,19 +872,29 @@ mod test {
"description": "serde does stuff",
"target_name": null,
"rustdoc_status": true,
"default_target": "x86_64-unknown-linux-gnu"
"default_target": "x86_64-unknown-linux-gnu",
"doc_targets": [
"x86_64-unknown-linux-gnu",
"arm64-unknown-linux-gnu",
],
"yanked": false,
});

assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap());

metadata.target_name = Some("x86_64-apple-darwin".to_string());
metadata.target_name = Some("serde_lib_name".to_string());
let correct_json = json!({
"name": "serde",
"version": "1.0.0",
"description": "serde does stuff",
"target_name": "x86_64-apple-darwin",
"target_name": "serde_lib_name",
"rustdoc_status": true,
"default_target": "x86_64-unknown-linux-gnu"
"default_target": "x86_64-unknown-linux-gnu",
"doc_targets": [
"x86_64-unknown-linux-gnu",
"arm64-unknown-linux-gnu",
],
"yanked": false,
});

assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap());
Expand All @@ -870,9 +904,14 @@ mod test {
"name": "serde",
"version": "1.0.0",
"description": null,
"target_name": "x86_64-apple-darwin",
"target_name": "serde_lib_name",
"rustdoc_status": true,
"default_target": "x86_64-unknown-linux-gnu"
"default_target": "x86_64-unknown-linux-gnu",
"doc_targets": [
"x86_64-unknown-linux-gnu",
"arm64-unknown-linux-gnu",
],
"yanked": false,
});

assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap());
Expand Down
20 changes: 16 additions & 4 deletions src/web/rustdoc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use crate::{
utils,
web::{
crate_details::CrateDetails, error::Nope, file::File, match_version,
metrics::RenderingTimesRecorder, redirect_base, MatchSemver,
metrics::RenderingTimesRecorder, redirect_base, MatchSemver, MetaData,
},
Config, Metrics, Storage,
};
Expand Down Expand Up @@ -186,6 +186,7 @@ struct RustdocPage {
is_latest_version: bool,
is_prerelease: bool,
krate: CrateDetails,
metadata: MetaData,
}

impl RustdocPage {
Expand Down Expand Up @@ -390,7 +391,7 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
"/{}/{}/{}",
name,
latest_version,
path_for_version(&latest_path, &krate.doc_targets, &storage, &config)
path_for_version(&latest_path, &krate.metadata.doc_targets, &storage, &config)
)
} else {
format!("/crate/{}/{}", name, latest_version)
Expand All @@ -407,7 +408,12 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
// Drop the `rustdoc/:crate/:version[/:platform]` prefix
inner_path.drain(..3).for_each(drop);

let target = if inner_path.len() > 1 && krate.doc_targets.iter().any(|s| s == inner_path[0])
let target = if inner_path.len() > 1
&& krate
.metadata
.doc_targets
.iter()
.any(|s| s == inner_path[0])
{
let mut target = inner_path.remove(0).to_string();
target.push('/');
Expand All @@ -427,6 +433,7 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
inner_path,
is_latest_version,
is_prerelease,
metadata: krate.metadata.clone(),
krate,
}
.into_response(&file.0.content, config.max_parse_memory, req, &path)
Expand Down Expand Up @@ -513,7 +520,12 @@ pub fn target_redirect_handler(req: &mut Request) -> IronResult<Response> {
file_path
};

let path = path_for_version(&file_path, &crate_details.doc_targets, &storage, &config);
let path = path_for_version(
&file_path,
&crate_details.metadata.doc_targets,
&storage,
&config,
);
let url = format!(
"{base}/{name}/{version}/{path}",
base = base,
Expand Down
6 changes: 5 additions & 1 deletion src/web/source.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ impl FileList {
releases.target_name,
releases.rustdoc_status,
releases.files,
releases.default_target
releases.default_target,
releases.doc_targets,
releases.yanked
FROM releases
LEFT OUTER JOIN crates ON crates.id = releases.crate_id
WHERE crates.name = $1 AND releases.version = $2",
Expand Down Expand Up @@ -133,6 +135,8 @@ impl FileList {
target_name: rows[0].get(3),
rustdoc_status: rows[0].get(4),
default_target: rows[0].get(6),
doc_targets: MetaData::parse_doc_targets(rows[0].get(7)),
yanked: rows[0].get(8),
},
files: file_list,
})
Expand Down
4 changes: 3 additions & 1 deletion templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
</head>

<body>
{%- include "header/topbar.html" -%}
{%- block topbar -%}
{%- include "header/topbar.html" -%}
{%- endblock topbar -%}

{%- block header %}{% endblock header -%}

Expand Down
10 changes: 10 additions & 0 deletions templates/crate/builds.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@
{{ macros::doc_title(name=metadata.name, version=metadata.version) }}
{%- endblock title -%}

{%- block topbar -%}
{%- set latest_version = "" -%}
{%- set latest_path = "" -%}
{%- set target = "" -%}
{%- set inner_path = metadata.target_name ~ "/index.html" -%}
{%- set is_latest_version = true -%}
{%- set is_prerelease = false -%}
{%- include "rustdoc/topbar.html" -%}
{%- endblock topbar -%}

{%- block header -%}
{{ navigation::package_navigation(metadata=metadata, active_tab="builds") }}
{%- endblock header -%}
Expand Down
11 changes: 11 additions & 0 deletions templates/crate/details.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,17 @@
{{ macros::doc_title(name=details.name, version=details.version) }}
{%- endblock title -%}

{%- block topbar -%}
{%- set metadata = details.metadata -%}
{%- set latest_version = "" -%}
{%- set latest_path = "" -%}
{%- set target = "" -%}
{%- set inner_path = details.metadata.target_name ~ "/index.html" -%}
{%- set is_latest_version = true -%}
{%- set is_prerelease = false -%}
{%- include "rustdoc/topbar.html" -%}
{%- endblock topbar -%}

{%- block header -%}
{# Set the active tab to the `crate` tab #}
{{ navigation::package_navigation(metadata=details.metadata, active_tab="crate") }}
Expand Down
11 changes: 11 additions & 0 deletions templates/crate/source.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,17 @@
{{ macros::doc_title(name=file_list.metadata.name, version=file_list.metadata.version) }}
{%- endblock title -%}

{%- block topbar -%}
{%- set metadata = file_list.metadata -%}
{%- set latest_version = "" -%}
{%- set latest_path = "" -%}
{%- set target = "" -%}
{%- set inner_path = metadata.target_name ~ "/index.html" -%}
{%- set is_latest_version = true -%}
{%- set is_prerelease = false -%}
{%- include "rustdoc/topbar.html" -%}
{%- endblock topbar -%}

{%- block header -%}
{# Set the active tab to the `source` tab #}
{{ navigation::package_navigation(metadata=file_list.metadata, active_tab="source") }}
Expand Down
Loading