rustdoc: Teach rustdoc to run pandoc
This commit is contained in:
parent
42799a5faf
commit
3cec2d6954
|
@ -26,11 +26,79 @@ impl writer_util for writer {
|
|||
}
|
||||
|
||||
fn make_writer(config: config::config) -> writer {
|
||||
markdown_writer(config)
|
||||
alt config.output_format {
|
||||
config::markdown {
|
||||
markdown_writer(config)
|
||||
}
|
||||
config::pandoc_html {
|
||||
pandoc_writer(config)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn markdown_writer(config: config::config) -> writer {
|
||||
let filename = make_filename(config);
|
||||
let filename = make_filename(config, "md");
|
||||
generic_writer {|markdown|
|
||||
write_file(filename, markdown);
|
||||
}
|
||||
}
|
||||
|
||||
fn pandoc_writer(config: config::config) -> writer {
|
||||
assert option::is_some(config.pandoc_cmd);
|
||||
let pandoc_cmd = option::get(config.pandoc_cmd);
|
||||
let filename = make_filename(config, "html");
|
||||
|
||||
let pandoc_args = [
|
||||
"--standalone",
|
||||
"--toc",
|
||||
"--section-divs",
|
||||
"--from=markdown",
|
||||
"--to=html",
|
||||
"--css=rust.css",
|
||||
"--output=" + filename
|
||||
];
|
||||
|
||||
generic_writer {|markdown|
|
||||
import std::run;
|
||||
import std::os;
|
||||
import std::io;
|
||||
import std::io::writer_util;
|
||||
|
||||
#debug("pandoc cmd: %s", pandoc_cmd);
|
||||
#debug("pandoc args: %s", str::connect(pandoc_args, " "));
|
||||
|
||||
let pipe_in = os::pipe();
|
||||
let pipe_out = os::pipe();
|
||||
let pipe_err = os::pipe();
|
||||
let pid = run::spawn_process(
|
||||
pandoc_cmd, pandoc_args, none, none,
|
||||
pipe_in.in, pipe_out.out, pipe_err.out);
|
||||
|
||||
if pid != -1 as ctypes::pid_t {
|
||||
let writer = io::fd_writer(pipe_in.out, false);
|
||||
writer.write_str(markdown);
|
||||
}
|
||||
|
||||
os::close(pipe_in.in);
|
||||
os::close(pipe_out.out);
|
||||
os::close(pipe_err.out);
|
||||
os::close(pipe_in.out);
|
||||
os::close(pipe_out.in);
|
||||
os::close(pipe_err.in);
|
||||
|
||||
if pid == -1 as ctypes::pid_t {
|
||||
fail "failed to run pandoc";
|
||||
}
|
||||
|
||||
let status = run::waitpid(pid);
|
||||
#debug("pandoc result: %i", status);
|
||||
if status != 0 {
|
||||
fail "pandoc failed";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn generic_writer(process: fn~(markdown: str)) -> writer {
|
||||
let ch = task::spawn_listener {|po: comm::port<writeinstr>|
|
||||
let markdown = "";
|
||||
let keep_going = true;
|
||||
|
@ -40,7 +108,7 @@ fn markdown_writer(config: config::config) -> writer {
|
|||
done { keep_going = false; }
|
||||
}
|
||||
}
|
||||
write_file(filename, markdown);
|
||||
process(markdown);
|
||||
};
|
||||
|
||||
fn~(+instr: writeinstr) {
|
||||
|
@ -48,11 +116,11 @@ fn markdown_writer(config: config::config) -> writer {
|
|||
}
|
||||
}
|
||||
|
||||
fn make_filename(config: config::config) -> str {
|
||||
fn make_filename(config: config::config, ext: str) -> str {
|
||||
import std::fs;
|
||||
let cratefile = fs::basename(config.input_crate);
|
||||
let cratename = tuple::first(fs::splitext(cratefile));
|
||||
fs::connect(config.output_dir, cratename + ".md")
|
||||
fs::connect(config.output_dir, cratename + "." + ext)
|
||||
}
|
||||
|
||||
fn write_file(path: str, s: str) {
|
||||
|
@ -73,7 +141,7 @@ fn should_use_markdown_file_name_based_off_crate() {
|
|||
output_dir: "output/dir"
|
||||
with config::default_config("input/test.rc")
|
||||
};
|
||||
assert make_filename(config) == "output/dir/test.md";
|
||||
assert make_filename(config, "md") == "output/dir/test.md";
|
||||
}
|
||||
|
||||
fn future_writer() -> (writer, future::future<str>) {
|
||||
|
|
Loading…
Reference in New Issue