diff --git a/src/rustbook/build.rs b/src/rustbook/build.rs index a7a6ed3bfe7..3ac71c167cd 100644 --- a/src/rustbook/build.rs +++ b/src/rustbook/build.rs @@ -22,7 +22,7 @@ use term::Term; use error::{err, CliResult, CommandResult}; use book; use book::{Book, BookItem}; -use css; + use javascript; use rustdoc; @@ -195,9 +195,16 @@ impl Subcommand for Build { } try!(fs::create_dir(&tgt)); - try!(File::create(&tgt.join("rust-book.css")).and_then(|mut f| { - f.write_all(css::STYLE.as_bytes()) - })); + // Copy static files + let css = include_bytes!("static/rustbook.css"); + let js = include_bytes!("static/rustbook.js"); + + let mut css_file = try!(File::create(tgt.join("rust-book.css"))); + try!(css_file.write_all(css)); + + let mut js_file = try!(File::create(tgt.join("rust-book.js"))); + try!(js_file.write_all(js)); + let mut summary = try!(File::open(&src.join("SUMMARY.md"))); match book::parse_summary(&mut summary, &src) { diff --git a/src/rustbook/javascript.rs b/src/rustbook/javascript.rs index 8e530bee39a..beddc23fe2b 100644 --- a/src/rustbook/javascript.rs +++ b/src/rustbook/javascript.rs @@ -11,67 +11,6 @@ // The rust-book JavaScript in string form. pub static JAVASCRIPT: &'static str = r#" - + "#; diff --git a/src/rustbook/main.rs b/src/rustbook/main.rs index acb1c5cbd90..81f8c8c40fd 100644 --- a/src/rustbook/main.rs +++ b/src/rustbook/main.rs @@ -35,7 +35,6 @@ mod build; mod serve; mod test; -mod css; mod javascript; static EXIT_STATUS: AtomicIsize = ATOMIC_ISIZE_INIT; diff --git a/src/rustbook/css.rs b/src/rustbook/static/rustbook.css similarity index 62% rename from src/rustbook/css.rs rename to src/rustbook/static/rustbook.css index aae5f21a73d..3e0537c5551 100644 --- a/src/rustbook/css.rs +++ b/src/rustbook/static/rustbook.css @@ -1,20 +1,28 @@ -// Copyright 2014 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. +/** + * Copyright 2013 The Rust Project Developers. See the COPYRIGHT + * file at the top-level directory of this distribution and at + * http://rust-lang.org/COPYRIGHT. + * + * Licensed under the Apache License, Version 2.0 or the MIT license + * , at your + * option. This file may not be copied, modified, or distributed + * except according to those terms. + */ -// The rust-book CSS in string form. - -pub static STYLE: &'static str = r#" @import url("../rust.css"); body { max-width:none; + font: 16px/1.4 'Source Serif Pro', Georgia, Times, 'Times New Roman', serif; + line-height: 1.6; + color: #333; +} + +h1, h2, h3, h4, h5, h6 { + font-family: 'Open Sans', 'Fira Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: bold; + color: #333; } @media only screen { @@ -23,20 +31,21 @@ body { left: 0px; top: 0px; bottom: 0px; - width: 250px; + width: 300px; overflow-y: auto; border-right: 1px solid rgba(0, 0, 0, 0.07); padding: 10px 10px; - font-size: 16px; - background: none repeat scroll 0% 0% #FFF; + font-size: 14px; box-sizing: border-box; -webkit-overflow-scrolling: touch; + background-color: #fafafa; + color: #364149; } #page-wrapper { position: absolute; overflow-y: auto; - left: 260px; + left: 310px; right: 0px; top: 0px; bottom: 0px; @@ -47,7 +56,7 @@ body { } @media only print { - #toc, #nav { + #toc, #nav, #menu-bar { display: none; } } @@ -84,7 +93,7 @@ body { .section { list-style: none outside none; padding-left: 20px; - line-height: 30px; + line-height: 40px; } .section li { @@ -94,12 +103,17 @@ body { } .chapter li a { - color: #000000; + color: #333; + padding: 5px 0; } .chapter li a.active { - text-decoration: underline; - font-weight: bold; + color: #008cff; +} + +.chapter li a:hover { + color: #008cff; + text-decoration: none; } #toggle-nav { @@ -138,6 +152,20 @@ body { padding: 0; } +pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: #f7f7f7; + border: 0; + border-radius: 3px; +} + +.nav-previous-next { + margin-top: 60px; +} + .left { float: left; } @@ -145,4 +173,3 @@ body { .right { float: right; } -"#; diff --git a/src/rustbook/static/rustbook.js b/src/rustbook/static/rustbook.js new file mode 100644 index 00000000000..fdefab28759 --- /dev/null +++ b/src/rustbook/static/rustbook.js @@ -0,0 +1,73 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +document.addEventListener("DOMContentLoaded", function(event) { + + document.getElementById("toggle-nav").onclick = toggleNav; + + function toggleNav() { + var toc = document.getElementById("toc"); + var pagewrapper = document.getElementById("page-wrapper"); + toggleClass(toc, "mobile-hidden"); + toggleClass(pagewrapper, "mobile-hidden"); + } + + function toggleClass(el, className) { + // from http://youmightnotneedjquery.com/ + if (el.classList) { + el.classList.toggle(className); + } else { + var classes = el.className.split(' '); + var existingIndex = classes.indexOf(className); + + if (existingIndex >= 0) { + classes.splice(existingIndex, 1); + } else { + classes.push(className); + } + + el.className = classes.join(' '); + } + } + + // The below code is used to add prev and next navigation links to the bottom + // of each of the sections. + // It works by extracting the current page based on the url and iterates over + // the menu links until it finds the menu item for the current page. We then + // create a copy of the preceding and following menu links and add the + // correct css class and insert them into the bottom of the page. + var toc = document.getElementById('toc').getElementsByTagName('a'); + var href = document.location.pathname.split('/').pop(); + if (href === 'index.html' || href === '') { + href = 'README.html'; + } + + for (var i = 0; i < toc.length; i++) { + if (toc[i].attributes.href.value.split('/').pop() === href) { + var nav = document.createElement('p'); + if (i > 0) { + var prevNode = toc[i-1].cloneNode(true); + prevNode.className = 'left'; + prevNode.setAttribute('rel', 'prev'); + nav.appendChild(prevNode); + } + if (i < toc.length - 1) { + var nextNode = toc[i+1].cloneNode(true); + nextNode.className = 'right'; + nextNode.setAttribute('rel', 'next'); + nav.appendChild(nextNode); + } + document.getElementById('page').appendChild(nav); + break; + } + } + +});