// 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();
(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");
}
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(),
</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,
);