Something went wrong. Try again.
Markdown parser fork with extended syntax for personal use.
Something went wrong. Try again.
6.6 kB · 223 lines
Rust
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224use markdown::{ mdast::{Code, Node, Root}, message, to_html, to_html_with_options, to_mdast, unist::Position, CompileOptions, Constructs, Options, ParseOptions,};use pretty_assertions::assert_eq;
#[test]fn code_indented() -> Result<(), message::Message> { assert_eq!( to_html(" a simple\n indented code block"), "<pre><code>a simple\n indented code block\n</code></pre>", "should support indented code" );
assert_eq!( to_html(" - foo\n\n bar"), "<ul>\n<li>\n<p>foo</p>\n<p>bar</p>\n</li>\n</ul>", "should prefer list item content over indented code (1)" );
assert_eq!( to_html("1. foo\n\n - bar"), "<ol>\n<li>\n<p>foo</p>\n<ul>\n<li>bar</li>\n</ul>\n</li>\n</ol>", "should prefer list item content over indented code (2)" );
assert_eq!( to_html(" <a/>\n *hi*\n\n - one"), "<pre><code><a/>\n*hi*\n\n- one\n</code></pre>", "should support blank lines in indented code (1)" );
assert_eq!( to_html(" chunk1\n\n chunk2\n \n \n \n chunk3"), "<pre><code>chunk1\n\nchunk2\n\n\n\nchunk3\n</code></pre>", "should support blank lines in indented code (2)" );
assert_eq!( to_html(" chunk1\n \n chunk2"), "<pre><code>chunk1\n \n chunk2\n</code></pre>", "should support blank lines in indented code (3)" );
assert_eq!( to_html("Foo\n bar"), "<p>Foo\nbar</p>", "should not support interrupting paragraphs" );
assert_eq!( to_html(" foo\nbar"), "<pre><code>foo\n</code></pre>\n<p>bar</p>", "should support paragraphs directly after indented code" );
assert_eq!( to_html("# Heading\n foo\nHeading\n------\n foo\n----"), "<h1>Heading</h1>\n<pre><code>foo\n</code></pre>\n<h2>Heading</h2>\n<pre><code>foo\n</code></pre>\n<hr />", "should mix w/ other content" );
assert_eq!( to_html(" foo\n bar"), "<pre><code> foo\nbar\n</code></pre>", "should support extra whitespace on the first line" );
assert_eq!( to_html("\n \n foo\n "), "<pre><code>foo\n</code></pre>", "should not support initial blank lines" );
assert_eq!( to_html(" foo "), "<pre><code>foo \n</code></pre>", "should support trailing whitespace" );
assert_eq!( to_html("> a\nb"), "<blockquote>\n<pre><code>a\n</code></pre>\n</blockquote>\n<p>b</p>", "should not support lazyness (1)" );
assert_eq!( to_html("> a\n b"), "<blockquote>\n<p>a\nb</p>\n</blockquote>", "should not support lazyness (2)" );
assert_eq!( to_html("> a\n b"), "<blockquote>\n<p>a\nb</p>\n</blockquote>", "should not support lazyness (3)" );
assert_eq!( to_html("> a\n b"), "<blockquote>\n<p>a\nb</p>\n</blockquote>", "should not support lazyness (4)" );
assert_eq!( to_html("> a\n b"), "<blockquote>\n<pre><code>a\n</code></pre>\n</blockquote>\n<pre><code>b\n</code></pre>", "should not support lazyness (5)" );
assert_eq!( to_html("> a\n b"), "<blockquote>\n<pre><code>a\n</code></pre>\n</blockquote>\n<pre><code> b\n</code></pre>", "should not support lazyness (6)" );
assert_eq!( to_html("> a\n b"), "<blockquote>\n<pre><code>a\n</code></pre>\n</blockquote>\n<pre><code> b\n</code></pre>", "should not support lazyness (7)" );
let off = Options { parse: ParseOptions { constructs: Constructs { code_indented: false, ..Default::default() }, ..Default::default() }, ..Default::default() };
assert_eq!( to_html_with_options(" a", &off)?, "<p>a</p>", "should support turning off code (indented, 1)" );
assert_eq!( to_html_with_options("> a\n b", &off)?, "<blockquote>\n<p>a\nb</p>\n</blockquote>", "should support turning off code (indented, 2)" );
assert_eq!( to_html_with_options("- a\n b", &off)?, "<ul>\n<li>a\nb</li>\n</ul>", "should support turning off code (indented, 3)" );
assert_eq!( to_html_with_options("- a\n - b", &off)?, "<ul>\n<li>a\n<ul>\n<li>b</li>\n</ul>\n</li>\n</ul>", "should support turning off code (indented, 4)" );
assert_eq!( to_html_with_options("- a\n - b", &off)?, "<ul>\n<li>a\n<ul>\n<li>b</li>\n</ul>\n</li>\n</ul>", "should support turning off code (indented, 5)" );
assert_eq!( to_html_with_options("```\na\n ```", &off)?, "<pre><code>a\n</code></pre>", "should support turning off code (indented, 6)" );
assert_eq!( to_html_with_options( "a <?\n ?>", &Options { parse: ParseOptions { constructs: Constructs { code_indented: false, ..Default::default() }, ..Default::default() }, compile: CompileOptions { allow_dangerous_html: true, ..Default::default() } } )?, "<p>a <?\n?></p>", "should support turning off code (indented, 7)" );
assert_eq!( to_html_with_options("- Foo\n---", &off)?, "<ul>\n<li>Foo</li>\n</ul>\n<hr />", "should support turning off code (indented, 8)" );
assert_eq!( to_html_with_options("- Foo\n ---", &off)?, "<ul>\n<li>\n<h2>Foo</h2>\n</li>\n</ul>", "should support turning off code (indented, 9)" );
assert_eq!( to_mdast( "\tconsole.log(1)\n console.log(2)\n", &Default::default() )?, Node::Root(Root { children: vec![Node::Code(Code { lang: None, meta: None, value: "console.log(1)\nconsole.log(2)".into(), position: Some(Position::new(1, 1, 0, 2, 19, 34)) })], position: Some(Position::new(1, 1, 0, 3, 1, 35)) }), "should support code (indented) as `Code`s in mdast" );
Ok(())}