askama_markdown_cmark/
lib.rs

1pub mod filters {
2    use std::fmt;
3
4    use pulldown_cmark;
5
6    /// Renders text to HTML from Markdown.
7    pub fn markdown_cmark<T: fmt::Display>(
8        s: T,
9        _: &dyn askama::Values,
10    ) -> ::askama::Result<String> {
11        let text = &s.to_string();
12        let parser = pulldown_cmark::Parser::new_ext(text, pulldown_cmark::Options::all());
13
14        let mut buf = String::new();
15        pulldown_cmark::html::push_html(&mut buf, parser);
16
17        Ok(buf)
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use super::filters;
24    use askama::Template;
25
26    #[derive(Template)]
27    #[template(source = "{{ s | markdown_cmark }}", ext = "md")]
28    struct ExampleCmark<'a> {
29        s: &'a str,
30    }
31
32    #[test]
33    fn markdown() {
34        let t = ExampleCmark {
35            s: "*Simple* ipsum",
36        };
37
38        assert_eq!(t.render().unwrap(), "<p><em>Simple</em> ipsum</p>\n");
39    }
40}