diff --git a/src/rustdoc/markdown_pass.rs b/src/rustdoc/markdown_pass.rs index 3074d978e56..97697911ed1 100644 --- a/src/rustdoc/markdown_pass.rs +++ b/src/rustdoc/markdown_pass.rs @@ -2,13 +2,14 @@ import markdown_writer::writer; import markdown_writer::writer_util; +import markdown_writer::writer_factory; export mk_pass; 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 { - run(srv, doc, writer) + run(srv, doc, writer_factory) }; { @@ -20,7 +21,7 @@ fn mk_pass(writer: writer) -> pass { fn run( srv: astsrv::srv, doc: doc::doc, - writer: writer + writer_factory: writer_factory ) -> doc::doc { fn mods_last(item1: doc::itemtag, item2: doc::itemtag) -> bool { @@ -42,7 +43,7 @@ fn run( "mods last", mods_last ).f(srv, doc); - write_markdown(sorted_doc, writer); + write_markdown(sorted_doc, writer_factory); ret doc; } @@ -79,10 +80,10 @@ type ctxt = { fn write_markdown( doc: doc::doc, - writer: writer + writer_factory: writer_factory ) { let ctxt = { - w: writer + w: writer_factory(doc::cratepage(doc.cratedoc())) }; write_crate(ctxt, doc.cratedoc()); @@ -944,23 +945,19 @@ mod test { fn write_markdown_str( doc: doc::doc ) -> str { - let (writer, future) = markdown_writer::future_writer(); - write_markdown(doc, writer); - ret future::get(future); + let (writer_factory, po) = markdown_writer::future_writer_factory(); + write_markdown(doc, writer_factory); + ret tuple::second(comm::recv(po)); } fn write_markdown_str_srv( srv: astsrv::srv, doc: doc::doc ) -> str { - let config = { - output_style: config::doc_per_crate - with config::default_config("") - }; - let (writer, future) = markdown_writer::future_writer(); - let pass = mk_pass(writer); + let (writer_factory, po) = markdown_writer::future_writer_factory(); + let pass = mk_pass(writer_factory); pass.f(srv, doc); - ret future::get(future); + ret tuple::second(comm::recv(po)); } #[test] diff --git a/src/rustdoc/markdown_writer.rs b/src/rustdoc/markdown_writer.rs index eabca1ea0fd..6df7356a9f5 100644 --- a/src/rustdoc/markdown_writer.rs +++ b/src/rustdoc/markdown_writer.rs @@ -1,8 +1,9 @@ export writeinstr; export writer; +export writer_factory; export writer_util; -export make_writer; -export future_writer; +export make_writer_factory; +export future_writer_factory; enum writeinstr { write(str), @@ -10,6 +11,7 @@ enum writeinstr { } type writer = fn~(+writeinstr); +type writer_factory = fn~(page: doc::page) -> writer; impl writer_util for writer { 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 { config::markdown { - markdown_writer(config) + markdown_writer_factory(config) } config::pandoc_html { - pandoc_writer(config) + pandoc_writer_factory(config) } } } -fn markdown_writer(config: config::config) -> writer { - let filename = make_filename(config, "md"); +fn markdown_writer_factory(config: config::config) -> writer_factory { + 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| 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); let pandoc_cmd = option::get(config.pandoc_cmd); - let filename = make_filename(config, "html"); + let filename = make_filename(config, "html", page); let pandoc_args = [ "--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; let cratefile = fs::basename(config.input_crate); let cratename = tuple::first(fs::splitext(cratefile)); @@ -134,7 +158,37 @@ fn should_use_markdown_file_name_based_off_crate() { output_dir: "output/dir" 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) { diff --git a/src/rustdoc/rustdoc.rs b/src/rustdoc/rustdoc.rs index eff1e69b317..1b7b424de74 100755 --- a/src/rustdoc/rustdoc.rs +++ b/src/rustdoc/rustdoc.rs @@ -157,7 +157,7 @@ fn run(config: config::config) { sort_item_type_pass::mk_pass(), markdown_index_pass::mk_pass(), markdown_pass::mk_pass( - markdown_writer::make_writer(config) + markdown_writer::make_writer_factory(config) ) ]); }