about summary refs log tree commit diff
path: root/src/rustdoc_ng/html/markdown.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/rustdoc_ng/html/markdown.rs')
-rw-r--r--src/rustdoc_ng/html/markdown.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/rustdoc_ng/html/markdown.rs b/src/rustdoc_ng/html/markdown.rs
new file mode 100644
index 00000000000..14e2327550b
--- /dev/null
+++ b/src/rustdoc_ng/html/markdown.rs
@@ -0,0 +1,54 @@
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::fmt;
+use std::rt::io::Reader;
+use std::rt::io::pipe::PipeStream;
+use std::rt::io::process::{ProcessConfig, Process, CreatePipe};
+use std::rt::io;
+
+pub struct Markdown<'self>(&'self str);
+
+impl<'self> fmt::Default for Markdown<'self> {
+    fn fmt(md: &Markdown<'self>, fmt: &mut fmt::Formatter) {
+        if md.len() == 0 { return; }
+
+        // Create the pandoc process
+        do io::io_error::cond.trap(|err| {
+            fail2!("Error executing `pandoc`: {}", err.desc);
+        }).inside {
+            let io = ~[CreatePipe(PipeStream::new().unwrap(), true, false),
+                       CreatePipe(PipeStream::new().unwrap(), false, true)];
+            let args = ProcessConfig {
+                program: "pandoc",
+                args: [],
+                env: None,
+                cwd: None,
+                io: io,
+            };
+            let mut p = Process::new(args).expect("couldn't fork for pandoc");
+
+            // Write the markdown to stdin and close it.
+            p.io[0].get_mut_ref().write(md.as_bytes());
+            p.io[0] = None;
+
+            // Ferry the output from pandoc over to the destination buffer.
+            let mut buf = [0, ..1024];
+            loop {
+                match p.io[1].get_mut_ref().read(buf) {
+                    None | Some(0) => { break }
+                    Some(n) => {
+                        fmt.buf.write(buf.slice_to(n));
+                    }
+                }
+            }
+        }
+    }
+}