1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
extern crate handlebars; use handlebars::{ Context, Handlebars, JsonRender, RenderContext, RenderError, Helper }; extern crate pulldown_cmark; use self::pulldown_cmark::Parser; use self::pulldown_cmark::html; pub fn render_html(text: String) -> String { let mut s = String::with_capacity(text.len() * 3 / 2); let p = Parser::new(&*text); html::push_html(&mut s, p); s } pub fn markdown_helper(_: &Context, h: &Helper, _ : &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> { let markdown_text_var = try!(h.param(0).ok_or_else(|| RenderError::new("Param not found for helper \"markdown\""))); let markdown_text = markdown_text_var.value().render(); let html_string = render_html(markdown_text); try!(rc.writer.write(html_string.into_bytes().as_ref())); Ok(()) } #[cfg(test)] mod test { use handlebars::{Template, Handlebars}; use std::collections::BTreeMap; #[test] fn test_markdown() { let t0 = Template::compile("{{markdown x}}".to_string()).ok().unwrap(); let mut handlebars = Handlebars::new(); handlebars.register_helper("markdown", Box::new(::markdown_helper)); handlebars.register_template("t0", t0); let mut m :BTreeMap<String, String> = BTreeMap::new(); m.insert("x".into(), "# wow\n\n## second wow".into()); let r0 = handlebars.render("t0", &m); assert_eq!(r0.ok().unwrap(), "<h1>wow</h1>\n<h2>second wow</h2>\n".to_string()); } }