aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar MarkKoz <[email protected]>2020-06-27 20:05:20 -0700
committerGravatar MarkKoz <[email protected]>2020-06-27 20:05:58 -0700
commitde592dc5eb22d061c9b988844e8c7d695a37fa58 (patch)
treeee9fb985304c140cd663da539d62073693ab32ae
parentCode block: fix BadLanguage creation (diff)
Code block: support IPython REPL detection
-rw-r--r--LICENSE-THIRD-PARTY36
-rw-r--r--bot/cogs/codeblock/parsing.py23
2 files changed, 53 insertions, 6 deletions
diff --git a/LICENSE-THIRD-PARTY b/LICENSE-THIRD-PARTY
new file mode 100644
index 000000000..3349d7c05
--- /dev/null
+++ b/LICENSE-THIRD-PARTY
@@ -0,0 +1,36 @@
+BSD 3-Clause License
+
+Applies to:
+- _RE_PYTHON_REPL and portions of _RE_IPYTHON_REPL in bot/cogs/codeblock/parsing.py
+
+- Copyright (c) 2008-Present, IPython Development Team
+- Copyright (c) 2001-2007, Fernando Perez <[email protected]>
+- Copyright (c) 2001, Janko Hauser <[email protected]>
+- Copyright (c) 2001, Nathaniel Gray <[email protected]>
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/bot/cogs/codeblock/parsing.py b/bot/cogs/codeblock/parsing.py
index 112ca12b6..757acdd0f 100644
--- a/bot/cogs/codeblock/parsing.py
+++ b/bot/cogs/codeblock/parsing.py
@@ -26,6 +26,9 @@ _TICKS = {
"\u3003", # VERTICAL KANA REPEAT MARK UPPER HALF
}
+_RE_PYTHON_REPL = re.compile(r"^(>>>|\.\.\.)( |$)")
+_RE_IPYTHON_REPL = re.compile(r"^((In|Out) \[\d+\]: |\s*\.{3,}: ?)")
+
_RE_CODE_BLOCK = re.compile(
fr"""
(?P<ticks>
@@ -118,19 +121,27 @@ def is_python_code(content: str) -> bool:
def is_repl_code(content: str, threshold: int = 3) -> bool:
- """Return True if `content` has at least `threshold` number of Python REPL-like lines."""
- log.trace(f"Checking if content is Python REPL code using a threshold of {threshold}.")
+ """Return True if `content` has at least `threshold` number of (I)Python REPL-like lines."""
+ log.trace(f"Checking if content is (I)Python REPL code using a threshold of {threshold}.")
repl_lines = 0
+ patterns = (_RE_PYTHON_REPL, _RE_IPYTHON_REPL)
+
for line in content.splitlines():
- if line.startswith(">>> ") or line.startswith("... "):
- repl_lines += 1
+ # Check the line against all patterns.
+ for pattern in patterns:
+ if pattern.match(line):
+ repl_lines += 1
+
+ # Once a pattern is matched, only use that pattern for the remaining lines.
+ patterns = (pattern,)
+ break
if repl_lines == threshold:
- log.trace("Content is Python REPL code.")
+ log.trace("Content is (I)Python REPL code.")
return True
- log.trace("Content is not Python REPL code.")
+ log.trace("Content is not (I)Python REPL code.")
return False