]> git.lizzy.rs Git - rust.git/blobdiff - src/librustdoc/markdown.rs
Allow external html in rustdoc for crates.
[rust.git] / src / librustdoc / markdown.rs
index 76366240f1ac46eb199bc96ae3c519ff3987c57c..da271be4768e3de393d2a22389a4db620cd7a360 100644 (file)
@@ -9,43 +9,19 @@
 // except according to those terms.
 
 use std::collections::HashSet;
-use std::{str, io};
+use std::io;
 use std::string::String;
 
 use getopts;
 use testing;
 
+use externalfiles::ExternalHtml;
+
 use html::escape::Escape;
 use html::markdown;
 use html::markdown::{MarkdownWithToc, find_testable_code, reset_headers};
 use test::Collector;
 
-fn load_string(input: &Path) -> io::IoResult<Option<String>> {
-    let mut f = try!(io::File::open(input));
-    let d = try!(f.read_to_end());
-    Ok(str::from_utf8(d.as_slice()).map(|s| s.to_string()))
-}
-macro_rules! load_or_return {
-    ($input: expr, $cant_read: expr, $not_utf8: expr) => {
-        {
-            let input = Path::new($input);
-            match load_string(&input) {
-                Err(e) => {
-                    let _ = writeln!(&mut io::stderr(),
-                                     "error reading `{}`: {}", input.display(), e);
-                    return $cant_read;
-                }
-                Ok(None) => {
-                    let _ = writeln!(&mut io::stderr(),
-                                     "error reading `{}`: not UTF-8", input.display());
-                    return $not_utf8;
-                }
-                Ok(Some(s)) => s
-            }
-        }
-    }
-}
-
 /// Separate any lines at the start of the file that begin with `%`.
 fn extract_leading_metadata<'a>(s: &'a str) -> (Vec<&'a str>, &'a str) {
     let mut metadata = Vec::new();
@@ -62,18 +38,10 @@ fn extract_leading_metadata<'a>(s: &'a str) -> (Vec<&'a str>, &'a str) {
     (metadata, "")
 }
 
-fn load_external_files(names: &[String]) -> Option<String> {
-    let mut out = String::new();
-    for name in names.iter() {
-        out.push_str(load_or_return!(name.as_slice(), None, None).as_slice());
-        out.push_char('\n');
-    }
-    Some(out)
-}
-
 /// Render `input` (e.g. "foo.md") into an HTML file in `output`
 /// (e.g. output = "bar" => "bar/foo.html").
-pub fn render(input: &str, mut output: Path, matches: &getopts::Matches) -> int {
+pub fn render(input: &str, mut output: Path, matches: &getopts::Matches,
+              external_html: &ExternalHtml) -> int {
     let input_p = Path::new(input);
     output.push(input_p.filestem().unwrap());
     output.set_extension("html");
@@ -91,17 +59,6 @@ pub fn render(input: &str, mut output: Path, matches: &getopts::Matches) -> int
     }
     let playground = playground.unwrap_or("".to_string());
 
-    let (in_header, before_content, after_content) =
-        match (load_external_files(matches.opt_strs("markdown-in-header")
-                                          .as_slice()),
-               load_external_files(matches.opt_strs("markdown-before-content")
-                                          .as_slice()),
-               load_external_files(matches.opt_strs("markdown-after-content")
-                                          .as_slice())) {
-        (Some(a), Some(b), Some(c)) => (a,b,c),
-        _ => return 3
-    };
-
     let mut out = match io::File::create(&output) {
         Err(e) => {
             let _ = writeln!(&mut io::stderr(),
@@ -153,10 +110,10 @@ pub fn render(input: &str, mut output: Path, matches: &getopts::Matches) -> int
 </html>"#,
         title = Escape(title),
         css = css,
-        in_header = in_header,
-        before_content = before_content,
+        in_header = external_html.in_header,
+        before_content = external_html.before_content,
         text = MarkdownWithToc(text),
-        after_content = after_content,
+        after_content = external_html.after_content,
         playground = playground,
         );