{
+ let md = &mut crate::MarkdownIt::new();
+ crate::plugins::cmark::block::fence::add(md);
+ crate::plugins::extra::syntect::add(md);
+ let node = md.try_parse(&(input.to_owned() + "\n"))?;
+ node.walk(|node, _| {
+ assert!(node.srcmap.is_some());
+ Ok(())
+ }).unwrap();
+ Ok(node.render())
+ }
+
+ #[test]
+ fn no_lang_prefix() {
+ let input = indoc!(r#"
+ ```
+ hello
+ ```
+ "#);
+
+ let output = indoc!(r#"
+
+ hello
+
+ "#);
+
+ assert_eq!(run(input), output);
+ assert_eq!(try_run(input).ok().unwrap(), output);
+ }
+
+ #[test]
+ fn rust_highlight() {
+ let input = indoc!(r#"
+ ```rust
+ let hello = "world";
+ ```
+ "#);
+
+ let output = indoc!(r#"
+
+ let
+ hello
+ =
+ "world"
+ ;
+
+ "#);
+
+ assert_eq!(run(input).replace('\n', ""), output.replace('\n', ""));
+ assert_eq!(try_run(input).ok().unwrap().replace('\n', ""), output.replace('\n', ""));
+ }
+
+ #[test]
+ fn rust_highlight_trim_spaces() {
+ let input = &formatdoc!(r#"
+ ``` rust{}
+ let hello = "world";
+ ```
+ "#, " ");
+
+ let output = indoc!(r#"
+
+ let
+ hello
+ =
+ "world"
+ ;
+
+ "#);
+
+ assert_eq!(run(input).replace('\n', ""), output.replace('\n', ""));
+ assert_eq!(try_run(input).ok().unwrap().replace('\n', ""), output.replace('\n', ""));
+ }
+
+ #[test]
+ fn unknown_lang() {
+ let input = indoc!(r#"
+ ```some-unknown-language
+ hello
+ ```
+ "#);
+
+ let output = indoc!(r#"
+
+ hello
+
+ "#);
+
+ assert_eq!(run(input), output);
+ assert!(
+ format!("{:?}", try_run(input).err().unwrap()).contains("syntax not found for language")
+ );
}
}
diff --git a/src/plugins/extra/typographer.rs b/src/plugins/extra/typographer.rs
index 47841df..bcab74f 100644
--- a/src/plugins/extra/typographer.rs
+++ b/src/plugins/extra/typographer.rs
@@ -82,7 +82,7 @@ pub struct TypographerRule;
impl CoreRule for TypographerRule {
fn run(root: &mut Node, _: &MarkdownIt) {
root.walk_mut(|node, _| {
- let Some(mut text_node) = node.cast_mut::() else { return; };
+ let Some(mut text_node) = node.cast_mut::() else { return Ok(()); };
if SCOPED_RE.is_match(&text_node.content) {
text_node.content = SCOPED_RE
@@ -119,6 +119,7 @@ impl CoreRule for TypographerRule {
text_node.content = s;
}
}
- });
+ Ok(())
+ }).unwrap();
}
}
diff --git a/src/plugins/sourcepos.rs b/src/plugins/sourcepos.rs
index 801a105..0f5cc1f 100644
--- a/src/plugins/sourcepos.rs
+++ b/src/plugins/sourcepos.rs
@@ -11,7 +11,8 @@ use crate::common::sourcemap::SourceWithLineStarts;
use crate::parser::block::builtin::BlockParserRule;
use crate::parser::core::{CoreRule, Root};
use crate::parser::inline::builtin::InlineParserRule;
-use crate::{MarkdownIt, Node};
+use crate::parser::main::RootNodeWrongType;
+use crate::{MarkdownIt, Node, Result};
pub fn add(md: &mut MarkdownIt) {
md.add_rule::()
@@ -22,8 +23,11 @@ pub fn add(md: &mut MarkdownIt) {
#[doc(hidden)]
pub struct SyntaxPosRule;
impl CoreRule for SyntaxPosRule {
- fn run(root: &mut Node, _: &MarkdownIt) {
- let source = root.cast::().unwrap().content.as_str();
+ fn try_run(root: &mut Node, _: &MarkdownIt) -> Result<()> {
+ let Some(data) = root.cast::() else {
+ return Err(RootNodeWrongType.into());
+ };
+ let source = data.content.as_str();
let mapping = SourceWithLineStarts::new(source);
root.walk_mut(|node, _| {
@@ -31,7 +35,13 @@ impl CoreRule for SyntaxPosRule {
let ((startline, startcol), (endline, endcol)) = map.get_positions(&mapping);
node.attrs.push(("data-sourcepos", format!("{}:{}-{}:{}", startline, startcol, endline, endcol)));
}
- });
+ Ok(())
+ }).unwrap();
+ Ok(())
+ }
+
+ fn run(root: &mut Node, md: &MarkdownIt) {
+ let _ = Self::try_run(root, md);
}
}
diff --git a/tests/commonmark.rs b/tests/commonmark.rs
index 0a55776..d2254e8 100644
--- a/tests/commonmark.rs
+++ b/tests/commonmark.rs
@@ -7,7 +7,10 @@ fn run(input: &str, output: &str) {
let node = md.parse(&(input.to_owned() + "\n"));
// make sure we have sourcemaps for everything
- node.walk(|node, _| assert!(node.srcmap.is_some()));
+ node.walk(|node, _| {
+ assert!(node.srcmap.is_some());
+ Ok(())
+ }).unwrap();
let result = node.xrender();
assert_eq!(result, output);
diff --git a/tests/extras.rs b/tests/extras.rs
index 32b0cd2..aaf779f 100644
--- a/tests/extras.rs
+++ b/tests/extras.rs
@@ -51,7 +51,10 @@ fn run(input: &str, output: &str) {
markdown_it::plugins::html::add(md);
markdown_it::plugins::extra::beautify_links::add(md);
let node = md.parse(&(input.to_owned() + "\n"));
- node.walk(|node, _| assert!(node.srcmap.is_some()));
+ node.walk(|node, _| {
+ assert!(node.srcmap.is_some());
+ Ok(())
+ }).unwrap();
let result = node.render();
assert_eq!(result, output);
}
@@ -111,10 +114,21 @@ r#"
}
mod examples {
- include!("../examples/ferris/main.rs");
+ mod ferris {
+ include!("../examples/ferris/main.rs");
- #[test]
- fn test_examples() {
- main();
+ #[test]
+ fn ferris() {
+ main();
+ }
+ }
+
+ mod error_handling {
+ include!("../examples/error_handling/main.rs");
+
+ #[test]
+ fn error_handling() {
+ main();
+ }
}
}
diff --git a/tests/linkify.rs b/tests/linkify.rs
index f520fbe..20af419 100644
--- a/tests/linkify.rs
+++ b/tests/linkify.rs
@@ -8,7 +8,10 @@ fn run(input: &str, output: &str) {
let node = md.parse(&(input.to_owned() + "\n"));
// make sure we have sourcemaps for everything
- node.walk(|node, _| assert!(node.srcmap.is_some()));
+ node.walk(|node, _| {
+ assert!(node.srcmap.is_some());
+ Ok(())
+ }).unwrap();
let result = node.render();
assert_eq!(result, output);
diff --git a/tests/markdown-it-smartquotes.rs b/tests/markdown-it-smartquotes.rs
index 76c5d14..13b771f 100644
--- a/tests/markdown-it-smartquotes.rs
+++ b/tests/markdown-it-smartquotes.rs
@@ -13,7 +13,10 @@ fn run(input: &str, output: &str) {
let node = md.parse(&(input.to_owned() + "\n"));
// make sure we have sourcemaps for everything
- node.walk(|node, _| assert!(node.srcmap.is_some()));
+ node.walk(|node, _| {
+ assert!(node.srcmap.is_some());
+ Ok(())
+ }).unwrap();
let result = node.render();
assert_eq!(result, output);
diff --git a/tests/markdown-it-typographer.rs b/tests/markdown-it-typographer.rs
index eff648b..2a5b2da 100644
--- a/tests/markdown-it-typographer.rs
+++ b/tests/markdown-it-typographer.rs
@@ -12,7 +12,10 @@ fn run(input: &str, output: &str) {
let node = md.parse(&(input.to_owned() + "\n"));
// make sure we have sourcemaps for everything
- node.walk(|node, _| assert!(node.srcmap.is_some()));
+ node.walk(|node, _| {
+ assert!(node.srcmap.is_some());
+ Ok(())
+ }).unwrap();
let result = node.render();
assert_eq!(result, output);
diff --git a/tests/markdown-it.rs b/tests/markdown-it.rs
index 81eeaab..2a5634a 100644
--- a/tests/markdown-it.rs
+++ b/tests/markdown-it.rs
@@ -8,7 +8,10 @@ fn run(input: &str, output: &str) {
let node = md.parse(&(input.to_owned() + "\n"));
// make sure we have sourcemaps for everything
- node.walk(|node, _| assert!(node.srcmap.is_some()));
+ node.walk(|node, _| {
+ assert!(node.srcmap.is_some());
+ Ok(())
+ }).unwrap();
let result = node.render();
assert_eq!(result, output);
diff --git a/tests/sourcemaps.rs b/tests/sourcemaps.rs
index 72451ff..a1dd675 100644
--- a/tests/sourcemaps.rs
+++ b/tests/sourcemaps.rs
@@ -6,7 +6,10 @@ fn run(input: &str, f: fn (&Node, SourceWithLineStarts)) {
markdown_it::plugins::cmark::add(md);
markdown_it::plugins::html::add(md);
let node = md.parse(input);
- node.walk(|node, _| assert!(node.srcmap.is_some()));
+ node.walk(|node, _| {
+ assert!(node.srcmap.is_some());
+ Ok(())
+ }).unwrap();
f(&node, SourceWithLineStarts::new(input));
}