aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Numerlor <[email protected]>2021-03-07 05:18:02 +0100
committerGravatar Numerlor <[email protected]>2021-03-07 05:18:02 +0100
commitdc7eef432189aaaf0ea8b0d16588852306104957 (patch)
treeba9da1c377ea704c1a55d14d9dd79963aa2dc2be
parentRemove superfluous comment (diff)
Handle arbitrary amount of backslashes preceding the quote char
Tests for this were added additionally
-rw-r--r--bot/exts/info/doc/_parsing.py19
-rw-r--r--tests/bot/exts/info/doc/test_parsing.py7
2 files changed, 15 insertions, 11 deletions
diff --git a/bot/exts/info/doc/_parsing.py b/bot/exts/info/doc/_parsing.py
index fc38ff82a..57c991ae0 100644
--- a/bot/exts/info/doc/_parsing.py
+++ b/bot/exts/info/doc/_parsing.py
@@ -46,15 +46,6 @@ _BRACKET_PAIRS = {
}
-def _is_closing_quote(search_string: str, index: int) -> bool:
- """Check whether the quote at `index` inside `search_string` can be a closing quote."""
- if search_string[index - 1] != "\\":
- return True # The quote is not escaped.
- elif search_string[index - 2] == "\\":
- return True
- return False
-
-
def _split_parameters(parameters_string: str) -> Iterator[str]:
"""
Split parameters of a signature into individual parameter strings on commas.
@@ -70,9 +61,15 @@ def _split_parameters(parameters_string: str) -> Iterator[str]:
if character in {"'", '"'}:
# Skip everything inside of strings, regardless of the depth.
quote_character = character # The closing quote must equal the opening quote.
- for index, character in enumerated_string:
- if character == quote_character and _is_closing_quote(parameters_string, index):
+ preceding_backslashes = 0
+ for _, character in enumerated_string:
+ # If an odd number of backslashes precedes the quote, it was escaped.
+ if character == quote_character and not preceding_backslashes % 2:
break
+ if character == "\\":
+ preceding_backslashes += 1
+ else:
+ preceding_backslashes = 0
elif current_search is None:
if (current_search := _BRACKET_PAIRS.get(character)) is not None:
diff --git a/tests/bot/exts/info/doc/test_parsing.py b/tests/bot/exts/info/doc/test_parsing.py
index f302b38fc..1663d8491 100644
--- a/tests/bot/exts/info/doc/test_parsing.py
+++ b/tests/bot/exts/info/doc/test_parsing.py
@@ -42,6 +42,13 @@ class SignatureSplitter(TestCase):
)
self._run_tests(test_cases)
+ def test_quote_escaped(self):
+ test_cases = (
+ (r"'\',','\\',0", [r"'\','", r"'\\'", "0"]),
+ (r"'0\',0\\\'\\',0", [r"'0\',0\\\'\\'", "0"]),
+ )
+ self._run_tests(test_cases)
+
def test_real_signatures(self):
test_cases = (
("start, stop[, step]", ["start", " stop[, step]"]),