askama_markdown_cmark/
lib.rs

1pub mod filters {
2    use std::fmt;
3
4    use pulldown_cmark;
5
6    /// An `askama` filter to render `markdown` to html.
7    ///
8    /// ## Example:
9    ///
10    /// ```rust
11    /// use askama::Template;
12    /// use askama_markdown_cmark::filters;
13    ///
14    /// #[derive(Template)]
15    /// #[template(source = "{{ content|markdown_cmark|safe }}", ext="html")]
16    /// struct Example<'a> {
17    ///     content: &'a str,
18    /// }
19    ///
20    /// fn main() -> std::io::Result<()> {
21    ///     println!("{}", Example { content: "## Hello world\n\nTesting ~~x~~ **y** _z_\n" }.render().unwrap());
22    ///     Ok(())
23    /// }
24    /// ```
25    #[askama::filter_fn]
26    pub fn markdown_cmark<T: fmt::Display>(
27        s: T,
28        _: &dyn askama::Values,
29    ) -> ::askama::Result<String> {
30        let text = &s.to_string();
31        let parser = pulldown_cmark::Parser::new_ext(text, pulldown_cmark::Options::all());
32
33        let mut buf = String::new();
34        pulldown_cmark::html::push_html(&mut buf, parser);
35
36        Ok(buf)
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::filters;
43    use askama::Template;
44
45    #[derive(Template)]
46    #[template(source = "{{ s | markdown_cmark }}", ext = "md")]
47    struct ExampleCmark<'a> {
48        s: &'a str,
49    }
50
51    #[test]
52    fn markdown() {
53        let t = ExampleCmark {
54            s: "*Simple* ipsum",
55        };
56
57        assert_eq!(t.render().unwrap(), "<p><em>Simple</em> ipsum</p>\n");
58    }
59}