Use Markdown with MiniJinja Templates in Rust

September 2025
---
[dependencies]
anyhow = "1.0.98"
markdown = "1.0.0"
minijinja = { version = "2.9.0", features = ["custom_syntax", "loader", "builtins", "json"] }
---

#![allow(warnings)]
use anyhow::Result;
use minijinja::context;
use minijinja::Environment;
use minijinja::syntax::SyntaxConfig;

fn main() -> Result<()> {
  let mut env = get_env();
  let example = r#"
[! filter markdown|safe !]
# Hello, markdown

this is some markdown
[! endfilter !]
  "#;
  env.add_template("example", example).unwrap();
  let tmpl = env.get_template("example").unwrap();
  let output = tmpl.render(context!()).unwrap();
  println!("{}", output);
  Ok(())
}

pub fn mj_markdown(value: String) -> String {
  markdown::to_html(&value)
}

pub fn get_env() -> Environment<'static> {
    let mut env = Environment::new();
    env.set_syntax(
        SyntaxConfig::builder()
            .block_delimiters("[!", "!]")
            .variable_delimiters("[@", "@]")
            .comment_delimiters("[#", "#]")
            .build()
            .unwrap(),
    );
    env.add_filter("markdown", mj_markdown);
    env
}
Output:
<h1>Hello, markdown</h1>
<p>this is some markdown</p>
end of line