diff --git a/src/bootstrap/doc.rs b/src/bootstrap/doc.rs index 660f9b9ef578a..557aac193a704 100644 --- a/src/bootstrap/doc.rs +++ b/src/bootstrap/doc.rs @@ -69,6 +69,27 @@ book!( RustdocBook, "src/doc/rustdoc", "rustdoc", RustbookVersion::MdBook1; ); +fn generate_jump_version_js(p: &Path) -> String { + let content = fs::read(p).expect("file not found"); + let s = String::from_utf8_lossy(&content); + let version_parts = crate::channel::CFG_RELEASE_NUM.split(".").collect::>(); + let mut versions = vec!["\"nightly\"".to_owned(), + "\"beta\"".to_owned(), + "\"stable\"".to_owned()]; + let mut middle_version = i32::from_str_radix(version_parts[1], 10).expect("unknown number"); + + while middle_version >= 0 { + versions.push(format!("\"1.{}.0\"", middle_version)); + middle_version -= 1; + } + s.replace("var VERSIONS = [];", &format!("var VERSIONS = [{}];", versions.join(","))) +} + +fn generate_jump_version_css(p: &Path) -> String { + let content = fs::read(p).expect("file not found"); + String::from_utf8(content).expect("invalid UTF8") +} + #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] enum RustbookVersion { MdBook1, @@ -329,21 +350,23 @@ fn invoke_rustdoc(builder: &Builder, compiler: Compiler, target: Interned 0; +})[0]; +if (version === "std") { + version = "stable"; +} +var s = document.createElement("select"); +for (var i = 0; i < VERSIONS.length; ++i) { + var entry = document.createElement("option"); + entry.innerText = VERSIONS[i]; + entry.value = VERSIONS[i]; + if (VERSIONS[i] === version) { + entry.selected = true; + } + s.append(entry); +} +s.id = "jump-version"; +s.onchange = function() { + var parts = window.location.pathname.split("/").filter(function(x) { + return x.length > 0; + }); + if (parts[0] !== "std") { + parts.shift(); + } + window.location.pathname = this.value + "/" + parts.join("/"); +}; +document.body.appendChild(s); +}()); diff --git a/src/librustdoc/config.rs b/src/librustdoc/config.rs index 91fbe877cb7d9..bf6e4d3f11ba9 100644 --- a/src/librustdoc/config.rs +++ b/src/librustdoc/config.rs @@ -194,6 +194,10 @@ pub struct RenderOptions { pub generate_search_filter: bool, /// Option (disabled by default) to generate files used by RLS and some other tools. pub generate_redirect_pages: bool, + /// Additional JS file (through "--additional-js" option). + pub additional_js: Option, + /// Additional JS file (through "--additional-css" option). + pub additional_css: Option, } impl Options { @@ -360,6 +364,8 @@ impl Options { } } + let resource_suffix = matches.opt_str("resource-suffix").unwrap_or_default(); + let mut id_map = html::markdown::IdMap::new(); id_map.populate(html::render::initial_ids()); let external_html = match ExternalHtml::load( @@ -367,7 +373,9 @@ impl Options { &matches.opt_strs("html-before-content"), &matches.opt_strs("html-after-content"), &matches.opt_strs("markdown-before-content"), - &matches.opt_strs("markdown-after-content"), &diag, &mut id_map) { + &matches.opt_strs("markdown-after-content"), + &diag, + &mut id_map) { Some(eh) => eh, None => return Err(3), }; @@ -428,7 +436,6 @@ impl Options { let display_warnings = matches.opt_present("display-warnings"); let linker = matches.opt_str("linker").map(PathBuf::from); let sort_modules_alphabetically = !matches.opt_present("sort-modules-by-appearance"); - let resource_suffix = matches.opt_str("resource-suffix").unwrap_or_default(); let enable_minification = !matches.opt_present("disable-minification"); let markdown_no_toc = matches.opt_present("markdown-no-toc"); let markdown_css = matches.opt_strs("markdown-css"); @@ -439,6 +446,8 @@ impl Options { let generate_search_filter = !matches.opt_present("disable-per-crate-search"); let persist_doctests = matches.opt_str("persist-doctests").map(PathBuf::from); let generate_redirect_pages = matches.opt_present("generate-redirect-pages"); + let additional_js = matches.opt_str("additional-js"); + let additional_css = matches.opt_str("additional-css"); let (lint_opts, describe_lints, lint_cap) = get_cmd_lint_options(matches, error_format); @@ -484,6 +493,8 @@ impl Options { markdown_playground_url, generate_search_filter, generate_redirect_pages, + additional_js, + additional_css, } }) } diff --git a/src/librustdoc/externalfiles.rs b/src/librustdoc/externalfiles.rs index 19d3f09af1aa5..ee8af8a398052 100644 --- a/src/librustdoc/externalfiles.rs +++ b/src/librustdoc/externalfiles.rs @@ -21,8 +21,8 @@ pub struct ExternalHtml { impl ExternalHtml { pub fn load(in_header: &[String], before_content: &[String], after_content: &[String], - md_before_content: &[String], md_after_content: &[String], diag: &errors::Handler, - id_map: &mut IdMap) + md_before_content: &[String], md_after_content: &[String], + diag: &errors::Handler, id_map: &mut IdMap) -> Option { let codes = ErrorCodes::from(UnstableFeatures::from_environment().is_nightly_build()); load_external_files(in_header, diag) diff --git a/src/librustdoc/html/layout.rs b/src/librustdoc/html/layout.rs index b444993c1b5ec..f4eedd947cf75 100644 --- a/src/librustdoc/html/layout.rs +++ b/src/librustdoc/html/layout.rs @@ -35,6 +35,8 @@ pub fn render( css_file_extension: bool, themes: &[PathBuf], generate_search_filter: bool, + additional_js: bool, + additional_css: bool, ) -> io::Result<()> { let static_root_path = page.static_root_path.unwrap_or(page.root_path); write!(dst, @@ -61,7 +63,7 @@ pub fn render( {in_header}\ \ + {additional_js}{additional_css}\ \ \