1
Fork 0

rustdoc: Convert markdown writer to a writer_factory

This commit is contained in:
Brian Anderson 2012-03-03 23:56:38 -08:00
parent 0b2ffa854f
commit 0e3cee747a
3 changed files with 79 additions and 28 deletions

View file

@ -2,13 +2,14 @@
import markdown_writer::writer; import markdown_writer::writer;
import markdown_writer::writer_util; import markdown_writer::writer_util;
import markdown_writer::writer_factory;
export mk_pass; export mk_pass;
export header_kind, header_name, header_text; export header_kind, header_name, header_text;
fn mk_pass(writer: writer) -> pass { fn mk_pass(writer_factory: writer_factory) -> pass {
let f = fn~(srv: astsrv::srv, doc: doc::doc) -> doc::doc { let f = fn~(srv: astsrv::srv, doc: doc::doc) -> doc::doc {
run(srv, doc, writer) run(srv, doc, writer_factory)
}; };
{ {
@ -20,7 +21,7 @@ fn mk_pass(writer: writer) -> pass {
fn run( fn run(
srv: astsrv::srv, srv: astsrv::srv,
doc: doc::doc, doc: doc::doc,
writer: writer writer_factory: writer_factory
) -> doc::doc { ) -> doc::doc {
fn mods_last(item1: doc::itemtag, item2: doc::itemtag) -> bool { fn mods_last(item1: doc::itemtag, item2: doc::itemtag) -> bool {
@ -42,7 +43,7 @@ fn run(
"mods last", mods_last "mods last", mods_last
).f(srv, doc); ).f(srv, doc);
write_markdown(sorted_doc, writer); write_markdown(sorted_doc, writer_factory);
ret doc; ret doc;
} }
@ -79,10 +80,10 @@ type ctxt = {
fn write_markdown( fn write_markdown(
doc: doc::doc, doc: doc::doc,
writer: writer writer_factory: writer_factory
) { ) {
let ctxt = { let ctxt = {
w: writer w: writer_factory(doc::cratepage(doc.cratedoc()))
}; };
write_crate(ctxt, doc.cratedoc()); write_crate(ctxt, doc.cratedoc());
@ -944,23 +945,19 @@ mod test {
fn write_markdown_str( fn write_markdown_str(
doc: doc::doc doc: doc::doc
) -> str { ) -> str {
let (writer, future) = markdown_writer::future_writer(); let (writer_factory, po) = markdown_writer::future_writer_factory();
write_markdown(doc, writer); write_markdown(doc, writer_factory);
ret future::get(future); ret tuple::second(comm::recv(po));
} }
fn write_markdown_str_srv( fn write_markdown_str_srv(
srv: astsrv::srv, srv: astsrv::srv,
doc: doc::doc doc: doc::doc
) -> str { ) -> str {
let config = { let (writer_factory, po) = markdown_writer::future_writer_factory();
output_style: config::doc_per_crate let pass = mk_pass(writer_factory);
with config::default_config("")
};
let (writer, future) = markdown_writer::future_writer();
let pass = mk_pass(writer);
pass.f(srv, doc); pass.f(srv, doc);
ret future::get(future); ret tuple::second(comm::recv(po));
} }
#[test] #[test]

View file

@ -1,8 +1,9 @@
export writeinstr; export writeinstr;
export writer; export writer;
export writer_factory;
export writer_util; export writer_util;
export make_writer; export make_writer_factory;
export future_writer; export future_writer_factory;
enum writeinstr { enum writeinstr {
write(str), write(str),
@ -10,6 +11,7 @@ enum writeinstr {
} }
type writer = fn~(+writeinstr); type writer = fn~(+writeinstr);
type writer_factory = fn~(page: doc::page) -> writer;
impl writer_util for writer { impl writer_util for writer {
fn write_str(str: str) { fn write_str(str: str) {
@ -25,28 +27,46 @@ impl writer_util for writer {
} }
} }
fn make_writer(config: config::config) -> writer { fn make_writer_factory(config: config::config) -> writer_factory {
alt config.output_format { alt config.output_format {
config::markdown { config::markdown {
markdown_writer(config) markdown_writer_factory(config)
} }
config::pandoc_html { config::pandoc_html {
pandoc_writer(config) pandoc_writer_factory(config)
} }
} }
} }
fn markdown_writer(config: config::config) -> writer { fn markdown_writer_factory(config: config::config) -> writer_factory {
let filename = make_filename(config, "md"); fn~(page: doc::page) -> writer {
markdown_writer(config, page)
}
}
fn pandoc_writer_factory(config: config::config) -> writer_factory {
fn~(page: doc::page) -> writer {
pandoc_writer(config, page)
}
}
fn markdown_writer(
config: config::config,
page: doc::page
) -> writer {
let filename = make_filename(config, "md", page);
generic_writer {|markdown| generic_writer {|markdown|
write_file(filename, markdown); write_file(filename, markdown);
} }
} }
fn pandoc_writer(config: config::config) -> writer { fn pandoc_writer(
config: config::config,
page: doc::page
) -> writer {
assert option::is_some(config.pandoc_cmd); assert option::is_some(config.pandoc_cmd);
let pandoc_cmd = option::get(config.pandoc_cmd); let pandoc_cmd = option::get(config.pandoc_cmd);
let filename = make_filename(config, "html"); let filename = make_filename(config, "html", page);
let pandoc_args = [ let pandoc_args = [
"--standalone", "--standalone",
@ -109,7 +129,11 @@ fn generic_writer(process: fn~(markdown: str)) -> writer {
} }
} }
fn make_filename(config: config::config, ext: str) -> str { fn make_filename(
config: config::config,
ext: str,
_page: doc::page
) -> str {
import std::fs; import std::fs;
let cratefile = fs::basename(config.input_crate); let cratefile = fs::basename(config.input_crate);
let cratename = tuple::first(fs::splitext(cratefile)); let cratename = tuple::first(fs::splitext(cratefile));
@ -134,7 +158,37 @@ fn should_use_markdown_file_name_based_off_crate() {
output_dir: "output/dir" output_dir: "output/dir"
with config::default_config("input/test.rc") with config::default_config("input/test.rc")
}; };
assert make_filename(config, "md") == "output/dir/test.md"; let doc = test::mk_doc("");
let page = doc::cratepage(doc.cratedoc());
assert make_filename(config, "md", page) == "output/dir/test.md";
}
#[cfg(test)]
mod test {
fn mk_doc(source: str) -> doc::doc {
astsrv::from_str(source) {|srv|
extract::from_srv(srv, "")
}
}
}
fn future_writer_factory(
) -> (writer_factory, comm::port<(doc::page, str)>) {
let markdown_po = comm::port();
let markdown_ch = comm::chan(markdown_po);
let writer_factory = fn~(page: doc::page) -> writer {
let writer_po = comm::port();
let writer_ch = comm::chan(writer_po);
task::spawn {||
let (writer, future) = future_writer();
comm::send(writer_ch, writer);
let s = future::get(future);
comm::send(markdown_ch, (page, s));
}
comm::recv(writer_po)
};
(writer_factory, markdown_po)
} }
fn future_writer() -> (writer, future::future<str>) { fn future_writer() -> (writer, future::future<str>) {

View file

@ -157,7 +157,7 @@ fn run(config: config::config) {
sort_item_type_pass::mk_pass(), sort_item_type_pass::mk_pass(),
markdown_index_pass::mk_pass(), markdown_index_pass::mk_pass(),
markdown_pass::mk_pass( markdown_pass::mk_pass(
markdown_writer::make_writer(config) markdown_writer::make_writer_factory(config)
) )
]); ]);
} }