about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/rustdoc/markdown_writer.rs98
1 files changed, 75 insertions, 23 deletions
diff --git a/src/rustdoc/markdown_writer.rs b/src/rustdoc/markdown_writer.rs
index 6df7356a9f5..aa74ab0396b 100644
--- a/src/rustdoc/markdown_writer.rs
+++ b/src/rustdoc/markdown_writer.rs
@@ -54,7 +54,7 @@ fn markdown_writer(
     config: config::config,
     page: doc::page
 ) -> writer {
-    let filename = make_filename(config, "md", page);
+    let filename = make_filename(config, page);
     generic_writer {|markdown|
         write_file(filename, markdown);
     }
@@ -66,7 +66,7 @@ fn pandoc_writer(
 ) -> writer {
     assert option::is_some(config.pandoc_cmd);
     let pandoc_cmd = option::get(config.pandoc_cmd);
-    let filename = make_filename(config, "html", page);
+    let filename = make_filename(config, page);
 
     let pandoc_args = [
         "--standalone",
@@ -131,47 +131,99 @@ fn generic_writer(process: fn~(markdown: str)) -> writer {
 
 fn make_filename(
     config: config::config,
-    ext: str,
-    _page: doc::page
+    page: doc::page
 ) -> str {
     import std::fs;
-    let cratefile = fs::basename(config.input_crate);
-    let cratename = tuple::first(fs::splitext(cratefile));
-    fs::connect(config.output_dir, cratename + "." + ext)
-}
-
-fn write_file(path: str, s: str) {
-    import std::io;
-    import std::io::writer_util;
 
-    alt io::file_writer(path, [io::create, io::truncate]) {
-      result::ok(writer) {
-        writer.write_str(s);
-      }
-      result::err(e) { fail e }
-    }
+    let filename = {
+        alt page {
+          doc::cratepage(doc) {
+            if config.output_format == config::pandoc_html &&
+                config.output_style == config::doc_per_mod {
+                "index"
+            } else {
+                assert doc.topmod.name() != "";
+                doc.topmod.name()
+            }
+          }
+          doc::itempage(doc) {
+            str::connect(doc.path() + [doc.name()], "_")
+          }
+        }
+    };
+    let ext = alt config.output_format {
+      config::markdown { "md" }
+      config::pandoc_html { "html" }
+    };
+    fs::connect(config.output_dir, filename + "." + ext)
 }
 
 #[test]
 fn should_use_markdown_file_name_based_off_crate() {
     let config = {
-        output_dir: "output/dir"
+        output_dir: "output/dir",
+        output_format: config::markdown,
+        output_style: config::doc_per_crate
         with config::default_config("input/test.rc")
     };
-    let doc = test::mk_doc("");
+    let doc = test::mk_doc("test", "");
     let page = doc::cratepage(doc.cratedoc());
-    assert make_filename(config, "md", page) == "output/dir/test.md";
+    let filename = make_filename(config, page);
+    assert filename == "output/dir/test.md";
+}
+
+#[test]
+fn should_name_html_crate_file_name_index_html_when_doc_per_mod() {
+    let config = {
+        output_dir: "output/dir",
+        output_format: config::pandoc_html,
+        output_style: config::doc_per_mod
+        with config::default_config("input/test.rc")
+    };
+    let doc = test::mk_doc("", "");
+    let page = doc::cratepage(doc.cratedoc());
+    let filename = make_filename(config, page);
+    assert filename == "output/dir/index.html";
+}
+
+#[test]
+fn should_name_mod_file_names_by_path() {
+    let config = {
+        output_dir: "output/dir",
+        output_format: config::pandoc_html,
+        output_style: config::doc_per_mod
+        with config::default_config("input/test.rc")
+    };
+    let doc = test::mk_doc("", "mod a { mod b { } }");
+    let modb = doc.cratemod().mods()[0].mods()[0];
+    let page = doc::itempage(doc::modtag(modb));
+    let filename = make_filename(config, page);
+    assert  filename == "output/dir/a_b.html";
 }
 
 #[cfg(test)]
 mod test {
-    fn mk_doc(source: str) -> doc::doc {
+    fn mk_doc(name: str, source: str) -> doc::doc {
         astsrv::from_str(source) {|srv|
-            extract::from_srv(srv, "")
+            let doc = extract::from_srv(srv, name);
+            let doc = path_pass::mk_pass().f(srv, doc);
+            doc
         }
     }
 }
 
+fn write_file(path: str, s: str) {
+    import std::io;
+    import std::io::writer_util;
+
+    alt io::file_writer(path, [io::create, io::truncate]) {
+      result::ok(writer) {
+        writer.write_str(s);
+      }
+      result::err(e) { fail e }
+    }
+}
+
 fn future_writer_factory(
 ) -> (writer_factory, comm::port<(doc::page, str)>) {
     let markdown_po = comm::port();