diff options
| author | SavagePeanut <sourcehut@lazytapir.com> | 2023-08-15 00:16:12 -0500 |
|---|---|---|
| committer | SavagePeanut <sourcehut@lazytapir.com> | 2023-08-15 00:22:28 -0500 |
| commit | 0f370ea91d78c7a0394417edbd9b0ea80ffed1c9 (patch) | |
| tree | 65e597a8af59ddb8e4e57ba621dfb66ee56ca66b | |
| parent | 3f98cd1eb7c1c4df0c9515902a31a614d4d7fcf7 (diff) | |
fix quoted code blocks
| -rw-r--r-- | src/lib.rs | 30 | ||||
| -rw-r--r-- | tests/test_style_parser.py | 28 |
2 files changed, 44 insertions, 14 deletions
@@ -86,13 +86,14 @@ fn parse_with_limits(chars: &Vec<char>, start: usize, end: usize, depth: usize) } match seek_end_block(chars, c, end_of_line, end, depth) { Some(to) => { + println!("to {}", to); if to != index + 3 && is_quote_start(chars, index, depth) { let keyword = if end_of_line == index + 3 { "```".to_string() } else { "```language".to_string() }; - let remove_end = if depth > 0 && to == end { + let remove_end = if depth > 0 && (to == end || to == chars.len()) { to } else { to + 4 + depth @@ -242,7 +243,6 @@ fn seek_higher_order_end(chars: &Vec<char>, keyword: char, start: usize, repetit if c == keyword && chars[i - 1].is_whitespace() && !followed_by_whitespace(chars, i, end) - && !preceeded_by_backslash(chars, i, start) && is_char_repeating(chars, keyword, repetitions, i + 1, end) { return None; // "*bold* *<--- beginning of new bold>*" @@ -283,17 +283,27 @@ fn seek_end_of_quote(chars: &Vec<char>, start: usize, end: usize, depth: usize) fn seek_end_block(chars: &Vec<char>, keyword: char, start: usize, end: usize, depth: usize) -> Option<usize> { for i in start..=end { - if chars[i] == '\n' - && i + 4 + depth > end - && (depth == 0 || chars[i + 1..i + 1 + depth].iter().all(|&c| QUOTE_KEYWORDS.contains(&c))) - && chars[i + 1 + depth] == keyword - && is_char_repeating(chars, keyword, 2, i + 1 + depth, end) - { - return Some(i); + if chars[i] == '\n' { + if i + depth == end && chars[i + 1..i + 1 + depth].iter().all(|&c| QUOTE_KEYWORDS.contains(&c)) { + continue; + } + if i + 1 + depth > end { + return Some(i); + } + if i + 4 + depth > end + && chars[i + 1..i + 1 + depth].iter().all(|&c| QUOTE_KEYWORDS.contains(&c)) + && chars[i + 1 + depth] == keyword + && is_char_repeating(chars, keyword, 2, i + 1 + depth, end) + { + return Some(i); + } } } if end == chars.len() - 1 { - return None; + if depth == 0 { + return None; + } + return Some(chars.len()); } Some(end) } diff --git a/tests/test_style_parser.py b/tests/test_style_parser.py index d873644..673b63c 100644 --- a/tests/test_style_parser.py +++ b/tests/test_style_parser.py @@ -98,14 +98,14 @@ def test_code_blocks(): formatted_body = "<blockquote><pre><code class=\"language-java\">why are you quoting a code block</code></pre></blockquote>" assert(format_body(test, MATRIX_FORMATS) == formatted_body) - test = ">```\n>please stop trying to break my parser ;-;\n>```" - formatted_body = "<blockquote><pre><code>please stop trying to break my parser ;-;</code></pre></blockquote>" - assert(format_body(test, MATRIX_FORMATS) == formatted_body) - test = ">>```\n>>double quote code block\n>single quote not in code block\nnormal text" formatted_body = "<blockquote><blockquote><pre><code>double quote code block</code></pre></blockquote>\nsingle quote not in code block</blockquote>\nnormal text" assert(format_body(test, MATRIX_FORMATS) == formatted_body) + test = ">```\n>please stop trying to break my parser ;-;" + formatted_body = "<blockquote><pre><code>please stop trying to break my parser ;-;</code></pre></blockquote>" + assert(format_body(test, MATRIX_FORMATS) == formatted_body) + test = ">>```\n>>>>double quote code block\n>single quote not in code block\nnormal text" formatted_body = "<blockquote><blockquote><pre><code>>>double quote code block</code></pre></blockquote>\nsingle quote not in code block</blockquote>\nnormal text" assert(format_body(test, MATRIX_FORMATS) == formatted_body) @@ -203,6 +203,10 @@ def test_no_changes(): assert(format_body(test, MATRIX_FORMATS) == formatted_body) def test_assorted(): + test = "\n" + formatted_body = "\n" + assert(format_body(test, MATRIX_FORMATS) == formatted_body) + test = "at the ||end||" formatted_body = "at the <span data-mx-spoiler>end</span>" assert(format_body(test, MATRIX_FORMATS) == formatted_body) @@ -215,6 +219,22 @@ def test_assorted(): formatted_body = "<em>underline</em> <strong>bold</strong> <strike>strikethrough</strike> >not quote <span data-mx-spoiler>spoiler</span>\n<blockquote>quote</blockquote>\nnothing\nnothing\n<blockquote><blockquote><blockquote><blockquote>another quote with <span data-mx-spoiler><strike><em><strong>```four```</strong></em></strike></span></blockquote></blockquote></blockquote></blockquote>" assert(format_body(test, MATRIX_FORMATS) == formatted_body) + test = ">```\n>do be do be dooo ba do be do be do ba\n>>>" + formatted_body = "<blockquote><pre><code>do be do be dooo ba do be do be do ba\n>></code></pre></blockquote>" + assert(format_body(test, MATRIX_FORMATS) == formatted_body) + + test = "\n\n>```\n>do be do be dooo ba do be do be do ba\na\n\n\naoeu\n" + formatted_body = "\n\n<blockquote><pre><code>do be do be dooo ba do be do be do ba</code></pre></blockquote>\na\n\n\naoeu\n" + assert(format_body(test, MATRIX_FORMATS) == formatted_body) + + test = ">```\n>do be do be dooo ba do be do be do ba\n>\n>\n>aoeu" + formatted_body = "<blockquote><pre><code>do be do be dooo ba do be do be do ba\n\n\naoeu</code></pre></blockquote>" + assert(format_body(test, MATRIX_FORMATS) == formatted_body) + + test = ">```\n>code block\n>```invalid\n" + formatted_body = "<blockquote><pre><code>code block\n```invalid</code></pre></blockquote>\n" + assert(format_body(test, MATRIX_FORMATS) == formatted_body) + def test_weird_utf8(): test = "❤️💓💕💖💗 ||💙💚💛💜🖤|| 💝💞💟❣️" formatted_body = "❤️💓💕💖💗 <span data-mx-spoiler>💙💚💛💜🖤</span> 💝💞💟❣️" |
