Skip to content

Commit 88e2435

Browse files
Fix new sidebar changes
1 parent 6e354ec commit 88e2435

12 files changed

+255
-129
lines changed

build.rs

+1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ fn compile_sass() -> Result<(), Box<dyn Error>> {
7777

7878
// Compile rustdoc.scss -> rustdoc.css
7979
compile_sass_file("rustdoc", "rustdoc", &[])?;
80+
compile_sass_file("rustdoc-2021-12-06", "rustdoc-2021-12-06", &[])?;
8081

8182
// Compile vendored.scss -> vendored.css
8283
compile_sass_file(

src/utils/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ pub use self::daemon::start_daemon;
66
pub(crate) use self::html::rewrite_lol;
77
pub use self::queue::{get_crate_priority, remove_crate_priority, set_crate_priority};
88
pub use self::queue_builder::queue_builder;
9-
pub(crate) use self::rustc_version::parse_rustc_version;
9+
pub(crate) use self::rustc_version::{get_correct_docsrs_style_file, parse_rustc_version};
1010

1111
#[cfg(test)]
1212
pub(crate) use self::cargo_metadata::{Dependency, Target};

src/utils/rustc_version.rs

+47
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use crate::error::Result;
22
use anyhow::{anyhow, Context};
3+
use chrono::prelude::*;
4+
use once_cell::sync::Lazy;
35
use regex::Regex;
46

57
/// Parses rustc commit hash from rustc version string
@@ -19,6 +21,38 @@ pub fn parse_rustc_version<S: AsRef<str>>(version: S) -> Result<String> {
1921
))
2022
}
2123

24+
fn parse_rustc_date<S: AsRef<str>>(version: S) -> Result<Date<Utc>> {
25+
static RE: Lazy<Regex> = Lazy::new(|| Regex::new(r" (\d+)-(\d+)-(\d+)\)$").unwrap());
26+
27+
let cap = RE
28+
.captures(version.as_ref())
29+
.with_context(|| anyhow!("Failed to parse rustc date"))?;
30+
31+
let year = cap.get(1).unwrap().as_str();
32+
let month = cap.get(2).unwrap().as_str();
33+
let day = cap.get(3).unwrap().as_str();
34+
35+
Ok(Utc.ymd(
36+
year.parse::<i32>().unwrap(),
37+
month.parse::<u32>().unwrap(),
38+
day.parse::<u32>().unwrap(),
39+
))
40+
}
41+
42+
/// Picks the correct "rustdoc.css" static file depending on which rustdoc version was used to
43+
/// generate this version of this crate.
44+
pub fn get_correct_docsrs_style_file(version: &str) -> Result<String> {
45+
let date = parse_rustc_date(version)?;
46+
// This is the date where https://github.com/rust-lang/rust/pull/91356 was merged.
47+
if Utc.ymd(2021, 12, 6) < date {
48+
// If this is the new rustdoc layout, we need the newer docs.rs CSS file.
49+
Ok("rustdoc-2021-12-06.css".to_owned())
50+
} else {
51+
// By default, we return the old docs.rs CSS file.
52+
Ok("rustdoc.css".to_owned())
53+
}
54+
}
55+
2256
#[test]
2357
fn test_parse_rustc_version() {
2458
assert_eq!(
@@ -30,3 +64,16 @@ fn test_parse_rustc_version() {
3064
"20160526-0.2.0-ba9ae23"
3165
);
3266
}
67+
68+
#[test]
69+
fn test_get_correct_docsrs_style_file() {
70+
assert_eq!(
71+
get_correct_docsrs_style_file("rustc 1.10.0-nightly (57ef01513 2016-05-23)").unwrap(),
72+
"rustdoc.css"
73+
);
74+
assert_eq!(
75+
get_correct_docsrs_style_file("docsrs 0.2.0 (ba9ae23 2022-05-26)").unwrap(),
76+
"rustdoc-2021-12-06.css"
77+
);
78+
assert!(get_correct_docsrs_style_file("docsrs 0.2.0").is_err(),);
79+
}

src/web/builds.rs

+16-16
Original file line numberDiff line numberDiff line change
@@ -144,14 +144,14 @@ mod tests {
144144
.version("0.1.0")
145145
.builds(vec![
146146
FakeBuild::default()
147-
.rustc_version("rustc 1.0.0")
147+
.rustc_version("rustc (blabla 2019-01-01)")
148148
.docsrs_version("docs.rs 1.0.0"),
149149
FakeBuild::default()
150150
.successful(false)
151-
.rustc_version("rustc 2.0.0")
151+
.rustc_version("rustc (blabla 2020-01-01)")
152152
.docsrs_version("docs.rs 2.0.0"),
153153
FakeBuild::default()
154-
.rustc_version("rustc 3.0.0")
154+
.rustc_version("rustc (blabla 2021-01-01)")
155155
.docsrs_version("docs.rs 3.0.0"),
156156
])
157157
.create()?;
@@ -169,11 +169,11 @@ mod tests {
169169
.map(|row| row.text_contents())
170170
.collect();
171171

172-
assert!(rows[0].contains("rustc 3.0.0"));
172+
assert!(rows[0].contains("rustc (blabla 2021-01-01)"));
173173
assert!(rows[0].contains("docs.rs 3.0.0"));
174-
assert!(rows[1].contains("rustc 2.0.0"));
174+
assert!(rows[1].contains("rustc (blabla 2020-01-01)"));
175175
assert!(rows[1].contains("docs.rs 2.0.0"));
176-
assert!(rows[2].contains("rustc 1.0.0"));
176+
assert!(rows[2].contains("rustc (blabla 2019-01-01)"));
177177
assert!(rows[2].contains("docs.rs 1.0.0"));
178178

179179
Ok(())
@@ -188,14 +188,14 @@ mod tests {
188188
.version("0.1.0")
189189
.builds(vec![
190190
FakeBuild::default()
191-
.rustc_version("rustc 1.0.0")
191+
.rustc_version("rustc (blabla 2019-01-01)")
192192
.docsrs_version("docs.rs 1.0.0"),
193193
FakeBuild::default()
194194
.successful(false)
195-
.rustc_version("rustc 2.0.0")
195+
.rustc_version("rustc (blabla 2020-01-01)")
196196
.docsrs_version("docs.rs 2.0.0"),
197197
FakeBuild::default()
198-
.rustc_version("rustc 3.0.0")
198+
.rustc_version("rustc (blabla 2021-01-01)")
199199
.docsrs_version("docs.rs 3.0.0"),
200200
])
201201
.create()?;
@@ -214,7 +214,7 @@ mod tests {
214214
);
215215
assert_eq!(
216216
value.pointer("/0/rustc_version"),
217-
Some(&"rustc 3.0.0".into())
217+
Some(&"rustc (blabla 2021-01-01)".into())
218218
);
219219
assert!(value.pointer("/0/id").unwrap().is_i64());
220220
assert!(serde_json::from_value::<DateTime<Utc>>(
@@ -229,7 +229,7 @@ mod tests {
229229
);
230230
assert_eq!(
231231
value.pointer("/1/rustc_version"),
232-
Some(&"rustc 2.0.0".into())
232+
Some(&"rustc (blabla 2020-01-01)".into())
233233
);
234234
assert!(value.pointer("/1/id").unwrap().is_i64());
235235
assert!(serde_json::from_value::<DateTime<Utc>>(
@@ -244,7 +244,7 @@ mod tests {
244244
);
245245
assert_eq!(
246246
value.pointer("/2/rustc_version"),
247-
Some(&"rustc 1.0.0".into())
247+
Some(&"rustc (blabla 2019-01-01)".into())
248248
);
249249
assert!(value.pointer("/2/id").unwrap().is_i64());
250250
assert!(serde_json::from_value::<DateTime<Utc>>(
@@ -317,15 +317,15 @@ mod tests {
317317
.name("aquarelle")
318318
.version("0.1.0")
319319
.builds(vec![FakeBuild::default()
320-
.rustc_version("rustc 1.0.0")
320+
.rustc_version("rustc (blabla 2019-01-01)")
321321
.docsrs_version("docs.rs 1.0.0")])
322322
.create()?;
323323

324324
env.fake_release()
325325
.name("aquarelle")
326326
.version("0.2.0")
327327
.builds(vec![FakeBuild::default()
328-
.rustc_version("rustc 1.0.0")
328+
.rustc_version("rustc (blabla 2019-01-01)")
329329
.docsrs_version("docs.rs 1.0.0")])
330330
.create()?;
331331

@@ -363,7 +363,7 @@ mod tests {
363363
.name("foo")
364364
.version("0.1.0")
365365
.builds(vec![FakeBuild::default()
366-
.rustc_version("rustc 1.0.0")
366+
.rustc_version("rustc (blabla 2019-01-01)")
367367
.docsrs_version("docs.rs 1.0.0")])
368368
.create()?;
369369

@@ -382,7 +382,7 @@ mod tests {
382382
.name("foo")
383383
.version("0.1.0")
384384
.builds(vec![FakeBuild::default()
385-
.rustc_version("rustc 1.0.0")
385+
.rustc_version("rustc (blabla 2019-01-01)")
386386
.docsrs_version("docs.rs 1.0.0")])
387387
.create()?;
388388

src/web/crate_details.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use super::{match_version, redirect_base, render_markdown, MatchSemver, MetaData};
2+
use crate::utils::get_correct_docsrs_style_file;
23
use crate::{db::Pool, impl_webpage, repositories::RepositoryStatsUpdater, web::page::WebPage};
34
use chrono::{DateTime, Utc};
45
use iron::prelude::*;
@@ -114,6 +115,7 @@ impl CrateDetails {
114115
releases.license,
115116
releases.documentation_url,
116117
releases.default_target,
118+
releases.doc_rustc_version,
117119
doc_coverage.total_items,
118120
doc_coverage.documented_items,
119121
doc_coverage.total_items_needing_examples,
@@ -159,6 +161,7 @@ impl CrateDetails {
159161
default_target: krate.get("default_target"),
160162
doc_targets: MetaData::parse_doc_targets(krate.get("doc_targets")),
161163
yanked: krate.get("yanked"),
164+
rustdoc_css_file: get_correct_docsrs_style_file(krate.get("doc_rustc_version"))?,
162165
};
163166

164167
let documented_items: Option<i32> = krate.get("documented_items");

src/web/mod.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
pub(crate) mod page;
44

5+
use crate::utils::get_correct_docsrs_style_file;
56
use crate::utils::report_error;
67
use anyhow::{anyhow, Context as _};
78
use log::info;
@@ -534,6 +535,9 @@ pub(crate) struct MetaData {
534535
pub(crate) default_target: String,
535536
pub(crate) doc_targets: Vec<String>,
536537
pub(crate) yanked: bool,
538+
/// CSS file to use depending on the rustdoc version used to generate this version of this
539+
/// crate.
540+
pub(crate) rustdoc_css_file: String,
537541
}
538542

539543
impl MetaData {
@@ -552,7 +556,8 @@ impl MetaData {
552556
releases.rustdoc_status,
553557
releases.default_target,
554558
releases.doc_targets,
555-
releases.yanked
559+
releases.yanked,
560+
releases.doc_rustc_version
556561
FROM releases
557562
INNER JOIN crates ON crates.id = releases.crate_id
558563
WHERE crates.name = $1 AND releases.version = $2",
@@ -572,6 +577,7 @@ impl MetaData {
572577
default_target: row.get(5),
573578
doc_targets: MetaData::parse_doc_targets(row.get(6)),
574579
yanked: row.get(7),
580+
rustdoc_css_file: get_correct_docsrs_style_file(row.get(8)).unwrap(),
575581
})
576582
}
577583

@@ -927,6 +933,7 @@ mod test {
927933
"arm64-unknown-linux-gnu".to_string(),
928934
],
929935
yanked: false,
936+
rustdoc_css_file: "rustdoc.css".to_string(),
930937
};
931938

932939
let correct_json = json!({
@@ -942,6 +949,7 @@ mod test {
942949
"arm64-unknown-linux-gnu",
943950
],
944951
"yanked": false,
952+
"rustdoc_css_file": "rustdoc.css",
945953
});
946954

947955
assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap());
@@ -960,6 +968,7 @@ mod test {
960968
"arm64-unknown-linux-gnu",
961969
],
962970
"yanked": false,
971+
"rustdoc_css_file": "rustdoc.css",
963972
});
964973

965974
assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap());
@@ -978,6 +987,7 @@ mod test {
978987
"arm64-unknown-linux-gnu",
979988
],
980989
"yanked": false,
990+
"rustdoc_css_file": "rustdoc.css",
981991
});
982992

983993
assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap());
@@ -1001,6 +1011,7 @@ mod test {
10011011
default_target: "x86_64-unknown-linux-gnu".to_string(),
10021012
doc_targets: vec![],
10031013
yanked: false,
1014+
rustdoc_css_file: "rustdoc.css".to_string(),
10041015
},
10051016
);
10061017
Ok(())

src/web/source.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use crate::{
44
db::Pool,
55
impl_webpage,
6+
utils::get_correct_docsrs_style_file,
67
web::{
78
error::Nope, file::File as DbFile, match_version, page::WebPage, redirect_base,
89
MatchSemver, MetaData, Url,
@@ -67,7 +68,8 @@ impl FileList {
6768
releases.files,
6869
releases.default_target,
6970
releases.doc_targets,
70-
releases.yanked
71+
releases.yanked,
72+
releases.doc_rustc_version
7173
FROM releases
7274
LEFT OUTER JOIN crates ON crates.id = releases.crate_id
7375
WHERE crates.name = $1 AND releases.version = $2",
@@ -147,6 +149,7 @@ impl FileList {
147149
default_target: rows[0].get(6),
148150
doc_targets: MetaData::parse_doc_targets(rows[0].get(7)),
149151
yanked: rows[0].get(8),
152+
rustdoc_css_file: get_correct_docsrs_style_file(rows[0].get(9)).unwrap(),
150153
},
151154
files: file_list,
152155
})

src/web/statics.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::{error::Nope, redirect, redirect_base, STATIC_FILE_CACHE_DURATION};
22
use crate::utils::report_error;
33
use anyhow::Context;
4-
use chrono::Utc;
4+
use chrono::prelude::*;
55
use iron::{
66
headers::CacheDirective,
77
headers::{CacheControl, ContentLength, ContentType, LastModified},
@@ -14,6 +14,8 @@ use std::{ffi::OsStr, fs, path::Path};
1414
const VENDORED_CSS: &str = include_str!(concat!(env!("OUT_DIR"), "/vendored.css"));
1515
const STYLE_CSS: &str = include_str!(concat!(env!("OUT_DIR"), "/style.css"));
1616
const RUSTDOC_CSS: &str = include_str!(concat!(env!("OUT_DIR"), "/rustdoc.css"));
17+
const RUSTDOC_2021_12_06_CSS: &str =
18+
include_str!(concat!(env!("OUT_DIR"), "/rustdoc-2021-12-06.css"));
1719
const STATIC_SEARCH_PATHS: &[&str] = &["static", "vendor"];
1820

1921
pub(crate) fn static_handler(req: &mut Request) -> IronResult<Response> {
@@ -25,6 +27,10 @@ pub(crate) fn static_handler(req: &mut Request) -> IronResult<Response> {
2527
"vendored.css" => serve_resource(VENDORED_CSS, ContentType("text/css".parse().unwrap())),
2628
"style.css" => serve_resource(STYLE_CSS, ContentType("text/css".parse().unwrap())),
2729
"rustdoc.css" => serve_resource(RUSTDOC_CSS, ContentType("text/css".parse().unwrap())),
30+
"rustdoc-2021-12-06.css" => serve_resource(
31+
RUSTDOC_2021_12_06_CSS,
32+
ContentType("text/css".parse().unwrap()),
33+
),
2834
file => serve_file(file)?,
2935
})
3036
}

templates/rustdoc/head.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{%- import "macros.html" as macros -%}
2-
<link rel="stylesheet" href="/-/static/rustdoc.css?{{ docsrs_version() | slugify }}" type="text/css" media="all" />
2+
<link rel="stylesheet" href="/-/static/{{metadata.rustdoc_css_file}}?{{ docsrs_version() | slugify }}" type="text/css" media="all" />
33

44
<link rel="search" href="/-/static/opensearch.xml" type="application/opensearchdescription+xml" title="Docs.rs" />
55

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// FIXME: Use modules
2+
@import "rustdoc-common";
3+
4+
// This file is needed to overload the previous docs.rs style. It is added into crates generated
5+
// using rustdoc after https://github.com/rust-lang/rust/pull/91356 has been merged.
6+
7+
#rustdoc_body_wrapper {
8+
padding: 0;
9+
10+
.sidebar {
11+
margin-top: 0;
12+
top: $top-navbar-height;
13+
14+
.sidebar-menu {
15+
top: $top-navbar-height;
16+
}
17+
}
18+
19+
main {
20+
padding-bottom: 50px;
21+
}
22+
}
23+
24+
div.container-rustdoc {
25+
> .docs-rs-footer {
26+
bottom: 0;
27+
right: 0;
28+
}
29+
}
30+
31+
div.container-rustdoc:not(.source) {
32+
> .docs-rs-footer {
33+
left: 200px;
34+
}
35+
}
36+
37+
div.rustdoc {
38+
#sidebar-toggle {
39+
top: 0;
40+
}
41+
}

0 commit comments

Comments
 (0)