rustdoc: Convert markdown writer to a writer_factory
This commit is contained in:
parent
0b2ffa854f
commit
0e3cee747a
3 changed files with 79 additions and 28 deletions
|
@ -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]
|
||||||
|
|
|
@ -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>) {
|
||||||
|
|
|
@ -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)
|
||||||
)
|
)
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue