rustdoc: Convert markdown writer to a writer_factory
This commit is contained in:
parent
0b2ffa854f
commit
0e3cee747a
@ -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]
|
||||
|
@ -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<str>) {
|
||||
|
@ -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)
|
||||
)
|
||||
]);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user