diff options
| -rw-r--r-- | bot/exts/utils/snekbox.py | 52 | 
1 files changed, 17 insertions, 35 deletions
| diff --git a/bot/exts/utils/snekbox.py b/bot/exts/utils/snekbox.py index e782ed745..77830209e 100644 --- a/bot/exts/utils/snekbox.py +++ b/bot/exts/utils/snekbox.py @@ -21,23 +21,12 @@ log = logging.getLogger(__name__)  ESCAPE_REGEX = re.compile("[`\u202E\u200B]{3,}")  FORMATTED_CODE_REGEX = re.compile( -    r"^\s*"                                 # any leading whitespace from the beginning of the string      r"(?P<delim>(?P<block>```)|``?)"        # code delimiter: 1-3 backticks; (?P=block) only matches if it's a block      r"(?(block)(?:(?P<lang>[a-z]+)\n)?)"    # if we're in a block, match optional language (only letters plus newline)      r"(?:[ \t]*\n)*"                        # any blank (empty or tabs/spaces only) lines before the code      r"(?P<code>.*?)"                        # extract all code inside the markup      r"\s*"                                  # any more whitespace before the end of the code markup -    r"(?P=delim)"                           # match the exact same delimiter from the start again -    r"\s*$",                                # any trailing whitespace until the end of the string -    re.DOTALL | re.IGNORECASE               # "." also matches newlines, case insensitive -) -CODE_BLOCK_REGEX = re.compile( -    r"```"                                  # code block delimiter: 3 batckticks -    r"([a-z]+\n)?"                          # match optional language (only letters plus newline) -    r"(?:[ \t]*\n)*"                        # any blank (empty or tabs/spaces only) lines before the code -    r"(?P<code>.*?)"                        # extract all code inside the markup -    r"\s*"                                  # any more whitespace before the end of the code markup -    r"```",                                 # code block end +    r"(?P=delim)",                          # match the exact same delimiter from the start again      re.DOTALL | re.IGNORECASE               # "." also matches newlines, case insensitive  )  RAW_CODE_REGEX = re.compile( @@ -86,32 +75,25 @@ class Snekbox(Cog):      @staticmethod      def prepare_input(code: str) -> str:          """Extract code from the Markdown, format it, and insert it into the code template.""" -        match = FORMATTED_CODE_REGEX.fullmatch(code) - -        # Despite the wildcard being lazy, the pattern is from start to end and will eat any delimiters in the middle. -        if match and match.group("delim") not in match.group("code"): -            code, block, lang, delim = match.group("code", "block", "lang", "delim") -            code = textwrap.dedent(code) -            if block: -                info = (f"'{lang}' highlighted" if lang else "plain") + " code block" -            else: -                info = f"{delim}-enclosed inline code" -            log.trace(f"Extracted {info} for evaluation:\n{code}") - -        else: -            code_parts = CODE_BLOCK_REGEX.finditer(code) -            merge = '\n'.join(part.group("code") for part in code_parts) -            if merge: -                code = textwrap.dedent(merge) -                log.trace(f"Merged one or more code blocks from text combined with code:\n{code}") +        if match := list(FORMATTED_CODE_REGEX.finditer(code)): +            blocks = [block for block in match if block.group("block")] +            if len(blocks) > 1: +                code = '\n'.join(block.group("code") for block in blocks) +                info = "several code blocks"              else: -                code = textwrap.dedent(RAW_CODE_REGEX.fullmatch(code).group("code")) -                log.trace( -                    f"Eval message contains unformatted or badly formatted code, " -                    f"stripping whitespace only:\n{code}" -                ) +                match = match[0] if len(blocks) == 0 else blocks[0] +                code, block, lang, delim = match.group("code", "block", "lang", "delim") +                if block: +                    info = (f"'{lang}' highlighted" if lang else "plain") + " code block" +                else: +                    info = f"{delim}-enclosed inline code" +        else: +            code = RAW_CODE_REGEX.fullmatch(code).group("code") +            info = "unformatted or badly formatted code" +        code = textwrap.dedent(code) +        log.trace(f"Extracted {info} for evaluation:\n{code}")          return code      @staticmethod | 
