| // 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 <LICENSE-APACHE or |
| // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
| // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your |
| // option. This file may not be copied, modified, or distributed |
| // except according to those terms. |
| |
| use std::fmt; |
| use std::rt::io; |
| |
| #[deriving(Clone)] |
| pub struct Layout { |
| logo: ~str, |
| favicon: ~str, |
| crate: ~str, |
| } |
| |
| pub struct Page<'self> { |
| title: &'self str, |
| ty: &'self str, |
| root_path: &'self str, |
| } |
| |
| pub fn render<T: fmt::Default, S: fmt::Default>( |
| dst: &mut io::Writer, layout: &Layout, page: &Page, sidebar: &S, t: &T) |
| { |
| write!(dst, " |
| <!DOCTYPE html> |
| <html lang=\"en\"> |
| <head> |
| <meta charset=\"utf-8\" /> |
| <title>{title}</title> |
| |
| <link href='http://fonts.googleapis.com/css?family=Oswald:700|Inconsolata:400' |
| rel='stylesheet' type='text/css'> |
| <link rel=\"stylesheet\" type=\"text/css\" href=\"{root_path}{crate}/main.css\"> |
| |
| {favicon, select, none{} other{ |
| <link rel=\"icon\" href=\"#\" sizes=\"16x16\" |
| type=\"image/vnd.microsoft.icon\" />}} |
| </head> |
| <body> |
| <!--[if lte IE 8]> |
| <div class=\"warning\"> |
| This old browser is unsupported and will most likely display funky |
| things |
| </div> |
| <![endif]--> |
| |
| <section class=\"sidebar\"> |
| {logo, select, none{} other{ |
| <a href='{root_path}{crate}/index.html'><img src='#' alt=''/></a> |
| }} |
| |
| {sidebar} |
| </section> |
| |
| <nav class=\"sub\"> |
| <form class=\"search-form js-only\"> |
| <input class=\"search-input\" name=\"search\" |
| autocomplete=\"off\" /> |
| <button class=\"do-search\">Search</button> |
| </form> |
| </nav> |
| |
| <section class=\"content {ty}\">{content}</section> |
| |
| <section class=\"footer\"></section> |
| |
| <script> |
| var rootPath = \"{root_path}\"; |
| </script> |
| <script src=\"{root_path}{crate}/jquery.js\"></script> |
| <script src=\"{root_path}{crate}/search-index.js\"></script> |
| <script src=\"{root_path}{crate}/main.js\"></script> |
| |
| <div id=\"help\" class=\"hidden\"> |
| <div class=\"shortcuts\"> |
| <h1>Keyboard shortcuts</h1> |
| <dl> |
| <dt>?</dt> |
| <dd>Show this help dialog</dd> |
| <dt>S</dt> |
| <dd>Focus the search field</dd> |
| <dt>↑</dt> |
| <dd>Move up in search results</dd> |
| <dt>↓</dt> |
| <dd>Move down in search results</dd> |
| <dt>&\\#9166;</dt> |
| <dd>Go to active search result</dd> |
| </dl> |
| </div> |
| <div class=\"infos\"> |
| <h1>Search tricks</h1> |
| <p> |
| Prefix searches with a type followed by a colon (e.g. |
| <code>fn:</code>) to restrict the search to a given type. |
| </p> |
| <p> |
| Accepted types are: <code>fn</code>, <code>mod</code>, |
| <code>struct</code> (or <code>str</code>), <code>enum</code>, |
| <code>trait</code>, <code>typedef</code> (or |
| <code>tdef</code>). |
| </p> |
| </div> |
| </div> |
| </body> |
| </html> |
| ", |
| content = *t, |
| root_path = page.root_path, |
| ty = page.ty, |
| logo = nonestr(layout.logo), |
| title = page.title, |
| favicon = nonestr(layout.favicon), |
| sidebar = *sidebar, |
| crate = layout.crate, |
| ); |
| } |
| |
| fn boolstr(b: bool) -> &'static str { |
| if b { "true" } else { "false" } |
| } |
| |
| fn nonestr<'a>(s: &'a str) -> &'a str { |
| if s == "" { "none" } else { s } |
| } |