summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib.rs30
-rw-r--r--tests/test_style_parser.py28
2 files changed, 44 insertions, 14 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 88b040d..ceca3a1 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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> 💝💞💟❣️"