From 03b5360ec5c342784f0a2c783eb6699e9bd3c725 Mon Sep 17 00:00:00 2001 From: Kerdonov Date: Wed, 24 Dec 2025 23:25:47 +0200 Subject: [PATCH] fixed weird block parsing issues --- Cargo.lock | 2 +- Cargo.toml | 2 +- bacon.toml | 1 + src/parser/block.rs | 26 ++++++++++++++------------ src/parser/inline.rs | 4 ++-- src/parser/mod.rs | 3 +++ 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 33f2ea2..1873c34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "marginal" -version = "0.1.0" +version = "0.1.1" dependencies = [ "nom", ] diff --git a/Cargo.toml b/Cargo.toml index 5ebb963..9ee771e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "marginal" -version = "0.1.0" +version = "0.1.1" edition = "2024" publish = ["gitea"] diff --git a/bacon.toml b/bacon.toml index ec3d796..57b320e 100644 --- a/bacon.toml +++ b/bacon.toml @@ -66,6 +66,7 @@ command = [ "cargo", "nextest", "run", "--hide-progress-bar", "--failure-output", "final", + "--no-fail-fast", ] need_stdout = true analyzer = "nextest" diff --git a/src/parser/block.rs b/src/parser/block.rs index f1f96ad..07fd23c 100644 --- a/src/parser/block.rs +++ b/src/parser/block.rs @@ -3,6 +3,7 @@ use nom::{ IResult, Parser, branch::alt, bytes::complete::{tag, take_until}, + combinator::peek, multi::{many_m_n, many0, many1}, sequence::{delimited, terminated}, }; @@ -14,6 +15,7 @@ pub fn blocks(input: &str) -> IResult<&str, Vec, MarkdownParseError> { } pub fn block(input: &str) -> IResult<&str, Block, MarkdownParseError> { + //alt((heading_block, code_block, quote_block, paragraph_block)).parse(input) terminated( alt((heading_block, code_block, quote_block, paragraph_block)), tag("\n"), @@ -45,7 +47,7 @@ fn code_block(input: &str) -> IResult<&str, Block, MarkdownParseError> { delimited( tag("```"), (take_until("\n"), tag("\n"), take_until("```\n")), - tag("```\n"), + (tag("```"), peek(tag("\n"))), ) .parse(input) .map(|(rem, (lang, _, code))| { @@ -83,10 +85,10 @@ mod test { #[test] fn single_paragraph() { - let md = "Hello markdown!!"; + let md = "Hello markdown!!\n"; let (rem, block) = paragraph_block(md).unwrap(); - assert_eq!(rem, ""); + assert_eq!(rem, "\n"); assert_eq!( block, Block::Paragraph { @@ -107,7 +109,7 @@ fn main() { "; let (rem, block) = code_block(md).unwrap(); - assert_eq!(rem, ""); + assert_eq!(rem, "\n"); assert_eq!( block, Block::Code { @@ -125,7 +127,7 @@ echo \"hello world\" "; let (rem, block) = code_block(md).unwrap(); - assert_eq!(rem, ""); + assert_eq!(rem, "\n"); assert_eq!( block, Block::Code { @@ -145,11 +147,11 @@ echo hello } #[test] - fn level_1_heading() { - let md = "## Heading2"; + fn level_2_heading() { + let md = "## Heading2\n"; let (rem, block) = heading_block(md).unwrap(); - assert_eq!(rem, ""); + assert_eq!(rem, "\n"); assert_eq!( block, Block::Heading { @@ -163,16 +165,16 @@ echo hello #[test] fn heading_no_space() { - let md = "#heading"; + let md = "#heading\n"; assert!(heading_block(md).is_err()); } #[test] fn level_6_heading() { - let md = "###### Heading6"; + let md = "###### Heading6\n"; let (rem, block) = heading_block(md).unwrap(); - assert_eq!(rem, ""); + assert_eq!(rem, "\n"); assert_eq!( block, Block::Heading { @@ -186,7 +188,7 @@ echo hello #[test] fn no_level_7_heading() { - let md = "####### Heading7"; + let md = "####### Heading7\n"; assert!(heading_block(md).is_err()); } diff --git a/src/parser/inline.rs b/src/parser/inline.rs index 1c4941f..16c68b7 100644 --- a/src/parser/inline.rs +++ b/src/parser/inline.rs @@ -85,10 +85,10 @@ mod test { #[test] fn single_text() { - let md = "hello normal inline"; + let md = "hello normal inline\n"; let (rem, parsed) = text_inline(md).unwrap(); - assert_eq!(rem, ""); + assert_eq!(rem, "\n"); assert_eq!( parsed, Inline::Text { diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 1706e49..e4adcc9 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -1,3 +1,6 @@ +//! A weird markdown parser. Please don't forget to add a newline in the end of a file or it won't +//! work :) + use std::fmt::{Debug, Display}; pub mod block;