use markdown_it::MarkdownIt; use once_cell::sync::Lazy; mod spoiler_rule; static MARKDOWN_PARSER: Lazy = Lazy::new(|| { let mut parser = MarkdownIt::new(); markdown_it::plugins::cmark::add(&mut parser); markdown_it::plugins::extra::add(&mut parser); spoiler_rule::add(&mut parser); parser }); pub fn markdown_to_html(text: &str) -> String { MARKDOWN_PARSER.parse(text).xrender() } #[cfg(test)] mod tests { use crate::utils::markdown::markdown_to_html; #[test] fn test_basic_markdown() { let tests: Vec<_> = vec![ ( "headings", "# h1\n## h2\n### h3\n#### h4\n##### h5\n###### h6", "

h1

\n

h2

\n

h3

\n

h4

\n
h5
\n
h6
\n" ), ( "line breaks", "First\rSecond", "

First\nSecond

\n"), ( "emphasis", "__bold__ **bold** *italic* ***bold+italic***", "

bold bold italic bold+italic

\n" ), ( "blockquotes", "> #### Hello\n > \n > - Hola\n > - 안영 \n>> Goodbye\n", "
\n

Hello

\n\n
\n

Goodbye

\n
\n
\n" ), ( "lists (ordered, unordered)", "1. pen\n2. apple\n3. apple pen\n- pen\n- pineapple\n- pineapple pen", "
    \n
  1. pen
  2. \n
  3. apple
  4. \n
  5. apple pen
  6. \n
\n\n" ), ( "code and code blocks", "this is my amazing `code snippet` and my amazing ```code block```", "

this is my amazing code snippet and my amazing code block

\n" ), ( "links", "[Lemmy](https://join-lemmy.org/ \"Join Lemmy!\")", "

Lemmy

\n" ), ( "images", "![My linked image](https://image.com \"image alt text\")", "

\"My

\n" ), // Ensure any custom plugins are added to 'MARKDOWN_PARSER' implementation. ( "basic spoiler", "::: spoiler click to see more\nhow spicy!\n:::\n", "
click to see more

how spicy!\n

\n" ), ]; tests.iter().for_each(|&(msg, input, expected)| { let result = markdown_to_html(input); assert_eq!( result, expected, "Testing {}, with original input '{}'", msg, input ); }); } }