From 5f2864e6b67bc7c62696137533cdb5af44152247 Mon Sep 17 00:00:00 2001 From: trisua Date: Sat, 26 Jul 2025 00:05:13 -0400 Subject: [PATCH] add: multiline parsers --- src/markdown.rs | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/markdown.rs b/src/markdown.rs index fd97113..6911dbe 100644 --- a/src/markdown.rs +++ b/src/markdown.rs @@ -94,6 +94,7 @@ fn parse_text_color_line(output: &mut String, buffer: &mut String, line: &str) { let ahead = slice(line, i..); if !ahead.contains("%%") { // no closing sequence, we're done + buffer.push(char); continue; } @@ -625,18 +626,45 @@ macro_rules! parser_ignores_pre { output }}; + + ($body:ident, $input:ident, ..) => {{ + let mut in_pre_block = false; + let mut output = String::new(); + let mut buffer = String::new(); + let mut proc_str = String::new(); + + for line in $input.split("\n") { + if line.starts_with("```") | (line == "") { + in_pre_block = !in_pre_block; + output.push_str(&format!("{line}\n")); + continue; + } + + if in_pre_block { + output.push_str(&format!("{line}\n")); + continue; + } + + proc_str += &(line.to_string() + "\n"); + } + + $body(&mut output, &mut buffer, &proc_str); + output.push_str(&format!("{buffer}\n")); + buffer.clear(); + output + }}; } pub fn parse_text_color(input: &str) -> String { - parser_ignores_pre!(parse_text_color_line, input) + parser_ignores_pre!(parse_text_color_line, input, ..) } pub fn parse_highlight(input: &str) -> String { - parser_ignores_pre!(parse_highlight_line, input) + parser_ignores_pre!(parse_highlight_line, input, ..) } pub fn parse_underline(input: &str) -> String { - parser_ignores_pre!(parse_underline_line, input) + parser_ignores_pre!(parse_underline_line, input, ..) } pub fn parse_comment(input: &str) -> String {