diff --git a/src/librustdoc/html/layout.rs b/src/librustdoc/html/layout.rs
index fd6bd83e29f..287e5a31888 100644
--- a/src/librustdoc/html/layout.rs
+++ b/src/librustdoc/html/layout.rs
@@ -194,9 +194,10 @@ pub fn render(
.collect::(),
suffix=page.resource_suffix,
extra_scripts=extra_scripts.iter().map(|e| {
- format!("",
+ format!("",
root_path=page.root_path,
- extra_script=e)
+ extra_script=e,
+ suffix=page.resource_suffix)
}).collect::(),
)
}
diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index a106a773571..7b020415af1 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -859,9 +859,11 @@ fn write_shared(
write_minify(cx.dst.join(&format!("settings{}.js", cx.shared.resource_suffix)),
static_files::SETTINGS_JS,
options.enable_minification)?;
- write_minify(cx.dst.join(&format!("source-script{}.js", cx.shared.resource_suffix)),
- include_str!("static/source-script.js"),
- options.enable_minification)?;
+ if cx.shared.include_sources {
+ write_minify(cx.dst.join(&format!("source-script{}.js", cx.shared.resource_suffix)),
+ static_files::sidebar::SOURCE_SCRIPT,
+ options.enable_minification)?;
+ }
{
let mut data = format!("var resourcesSuffix = \"{}\";\n",
@@ -990,8 +992,8 @@ fn new(elem: OsString) -> Hierarchy {
}
}
- fn to_string(&self) -> String {
- let mut subs: Vec<&Hierarchy> = self.children.iter().map(|(_, v)| v).collect();
+ fn to_json_string(&self) -> String {
+ let mut subs: Vec<&Hierarchy> = self.children.values().collect();
subs.sort_unstable_by(|a, b| a.elem.cmp(&b.elem));
let mut files = self.elems.iter()
.map(|s| format!("\"{}\"",
@@ -1002,46 +1004,52 @@ fn to_string(&self) -> String {
// FIXME(imperio): we could avoid to generate "dirs" and "files" if they're empty.
format!("{{\"name\":\"{name}\",\"dirs\":[{subs}],\"files\":[{files}]}}",
name=self.elem.to_str().expect("invalid osstring conversion"),
- subs=subs.iter().map(|s| s.to_string()).collect::>().join(","),
+ subs=subs.iter().map(|s| s.to_json_string()).collect::>().join(","),
files=files.join(","))
}
}
- use std::path::Component;
+ if cx.shared.include_sources {
+ use std::path::Component;
- let mut hierarchy = Hierarchy::new(OsString::new());
- for source in cx.shared.local_sources.iter()
- .filter_map(|p| p.0.strip_prefix(&cx.shared.src_root)
- .ok()) {
- let mut h = &mut hierarchy;
- let mut elems = source.components()
- .filter_map(|s| {
- match s {
- Component::Normal(s) => Some(s.to_owned()),
- _ => None,
- }
- })
- .peekable();
- loop {
- let cur_elem = elems.next().expect("empty file path");
- if elems.peek().is_none() {
- h.elems.insert(cur_elem);
- break;
- } else {
- let e = cur_elem.clone();
- h.children.entry(cur_elem.clone()).or_insert_with(|| Hierarchy::new(e));
- h = h.children.get_mut(&cur_elem).expect("not found child");
+ let mut hierarchy = Hierarchy::new(OsString::new());
+ for source in cx.shared.local_sources.iter()
+ .filter_map(|p| p.0.strip_prefix(&cx.shared.src_root)
+ .ok()) {
+ let mut h = &mut hierarchy;
+ let mut elems = source.components()
+ .filter_map(|s| {
+ match s {
+ Component::Normal(s) => Some(s.to_owned()),
+ _ => None,
+ }
+ })
+ .peekable();
+ loop {
+ let cur_elem = elems.next().expect("empty file path");
+ if elems.peek().is_none() {
+ h.elems.insert(cur_elem);
+ break;
+ } else {
+ let e = cur_elem.clone();
+ h.children.entry(cur_elem.clone()).or_insert_with(|| Hierarchy::new(e));
+ h = h.children.get_mut(&cur_elem).expect("not found child");
+ }
}
}
- }
- let dst = cx.dst.join("source-files.js");
- let (mut all_sources, _krates) = try_err!(collect(&dst, &krate.name, "sourcesIndex"), &dst);
- all_sources.push(format!("sourcesIndex['{}'] = {};", &krate.name, hierarchy.to_string()));
- all_sources.sort();
- let mut w = try_err!(File::create(&dst), &dst);
- try_err!(writeln!(&mut w, "var N = null;var sourcesIndex = {{}};\n{}", all_sources.join("\n")),
- &dst);
+ let dst = cx.dst.join("source-files.js");
+ let (mut all_sources, _krates) = try_err!(collect(&dst, &krate.name, "sourcesIndex"), &dst);
+ all_sources.push(format!("sourcesIndex['{}'] = {};",
+ &krate.name,
+ hierarchy.to_json_string()));
+ all_sources.sort();
+ let mut w = try_err!(File::create(&dst), &dst);
+ try_err!(writeln!(&mut w,
+ "var N = null;var sourcesIndex = {{}};\n{}",
+ all_sources.join("\n")),
+ &dst);
+ }
// Update the search index
let dst = cx.dst.join("search-index.js");
@@ -1367,7 +1375,7 @@ fn emit_source(&mut self, filename: &FileName) -> io::Result<()> {
layout::render(&mut w, &self.scx.layout,
&page, &(""), &Source(contents),
self.scx.css_file_extension.is_some(),
- &self.scx.themes, &["source-files.js", "source-script.js"])?;
+ &self.scx.themes, &["source-files", "source-script"])?;
w.flush()?;
self.scx.local_sources.insert(p.clone(), href);
Ok(())
diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css
index 5dbba3ebab5..902c492105f 100644
--- a/src/librustdoc/html/static/rustdoc.css
+++ b/src/librustdoc/html/static/rustdoc.css
@@ -1464,25 +1464,28 @@ kbd {
#sidebar-toggle {
position: fixed;
top: 30px;
- right: 300px;
+ left: 300px;
z-index: 10;
padding: 3px;
- border-top-left-radius: 3px;
- border-bottom-left-radius: 3px;
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
cursor: pointer;
font-weight: bold;
- transition: right 1s;
+ transition: left .5s;
font-size: 1.2em;
+ border: 1px solid;
+ border-left: 0;
}
#source-sidebar {
position: fixed;
top: 0;
bottom: 0;
- right: 0;
+ left: 0;
width: 300px;
z-index: 1;
overflow: auto;
- transition: right 1s;
+ transition: left .5s;
+ border-right: 1px solid;
}
#source-sidebar > .title {
font-size: 1.5em;
@@ -1495,6 +1498,11 @@ div.children {
padding-left: 27px;
display: none;
}
+div.name {
+ cursor: pointer;
+ position: relative;
+ margin-left: 16px;
+}
div.files > a {
display: block;
padding: 0 3px;
@@ -1507,10 +1515,13 @@ div.name.expand + .children {
}
div.name::before {
content: "\25B6";
- display: inline-block;
- padding-right: 4px;
+ padding-left: 4px;
font-size: 0.7em;
+ position: absolute;
+ left: -16px;
+ top: 4px;
}
div.name.expand::before {
transform: rotate(90deg);
+ left: -14px;
}
diff --git a/src/librustdoc/html/static/source-script.js b/src/librustdoc/html/static/source-script.js
index 59b82361c09..f8e0cf196fb 100644
--- a/src/librustdoc/html/static/source-script.js
+++ b/src/librustdoc/html/static/source-script.js
@@ -72,21 +72,21 @@ function createDirEntry(elem, parent, fullPath, currentFile, hasFoundFile) {
children.appendChild(files);
parent.appendChild(name);
parent.appendChild(children);
- return hasFoundFile === true && search.currentFile !== null;
+ return hasFoundFile === true && currentFile.startsWith(fullPath);
}
function toggleSidebar() {
var sidebar = document.getElementById("source-sidebar");
var child = this.children[0].children[0];
- if (child.innerText === "<") {
- sidebar.style.right = "";
- this.style.right = "";
- child.innerText = ">";
+ if (child.innerText === ">") {
+ sidebar.style.left = "";
+ this.style.left = "";
+ child.innerText = "<";
updateLocalStorage("rustdoc-source-sidebar-hidden", "false");
} else {
- sidebar.style.right = "-300px";
- this.style.right = "0";
- child.innerText = "<";
+ sidebar.style.left = "-300px";
+ this.style.left = "0";
+ child.innerText = ">";
updateLocalStorage("rustdoc-source-sidebar-hidden", "true");
}
}
@@ -102,10 +102,10 @@ function createSidebarToggle() {
var inner2 = document.createElement("div");
inner2.style.marginTop = "-2px";
if (getCurrentValue("rustdoc-source-sidebar-hidden") === "true") {
- inner2.innerText = "<";
- sidebarToggle.style.right = "0";
- } else {
inner2.innerText = ">";
+ sidebarToggle.style.left = "0";
+ } else {
+ inner2.innerText = "<";
}
inner1.appendChild(inner2);
@@ -125,7 +125,7 @@ function createSourceSidebar() {
var sidebar = document.createElement("div");
sidebar.id = "source-sidebar";
if (getCurrentValue("rustdoc-source-sidebar-hidden") === "true") {
- sidebar.style.right = "-300px";
+ sidebar.style.left = "-300px";
}
var currentFile = getCurrentFilePath();
diff --git a/src/librustdoc/html/static_files.rs b/src/librustdoc/html/static_files.rs
index 3baa082bd0e..ee29f15d686 100644
--- a/src/librustdoc/html/static_files.rs
+++ b/src/librustdoc/html/static_files.rs
@@ -109,3 +109,9 @@ pub mod source_code_pro {
/// The file `SourceCodePro-LICENSE.txt`, the license text of the Source Code Pro font.
pub static LICENSE: &'static [u8] = include_bytes!("static/SourceCodePro-LICENSE.txt");
}
+
+/// Files related to the sidebar in rustdoc sources.
+pub mod sidebar {
+ /// File script to handle sidebar.
+ pub static SOURCE_SCRIPT: &'static str = include_str!("static/source-script.js");
+}