From 000efdaec64c8cee83b63134e5185d3aa6b14fff Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Sat, 23 Jul 2022 18:14:01 -0700 Subject: [PATCH] Add ReplyBuilder.matches method to check if the current remaining string starts with the given prefix Signed-off-by: Alek Ratzloff --- board/templatetags/post_body.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/board/templatetags/post_body.py b/board/templatetags/post_body.py index 8358c6f..aa7b551 100644 --- a/board/templatetags/post_body.py +++ b/board/templatetags/post_body.py @@ -46,27 +46,32 @@ class ReplyBuilder: def adv(self, n=1): self.index += n + def matches(self, prefix: str) -> bool: + return self.remain[: len(prefix)] == prefix + def build(self) -> str: while self.c: - if self.remain[:8] == ">>" and self.lookahead(8) in "0123456789": + if self.matches(">>") and self.lookahead(8) in "0123456789": self.do_reply() - elif self.remain[:4] == ">": + elif self.matches(">"): self.do_quote() - elif self.remain[:2] == r"\[" and self.remain[:9] == r"\[spoiler": + elif self.matches(r"\[spoiler"): self.final += "[spoiler" self.adv(9) - elif self.parse_spoilers and self.remain[:9] == "[spoiler]": + elif self.parse_spoilers and self.matches("[spoiler]"): self.do_spoiler() else: self.final += self.c self.adv() + # Finally, replace linebreaks + self.final = self.final.replace("\n", "
") return self.final def do_quote(self): self.adv(4) self.final += '>' while self.c and self.c != "\n": - if self.remain[:8] == ">>": + if self.matches(">>"): self.do_reply() else: self.final += self.c @@ -90,10 +95,10 @@ class ReplyBuilder: def do_spoiler(self): self.adv(9) spoiled = "" - while self.c and self.remain[:10] != "[/spoiler]": + while self.c and not self.matches("[/spoiler]"): spoiled += self.c self.adv() - if self.remain[:10] == "[/spoiler]": + if self.matches("[/spoiler]"): self.adv(10) self.final += f'{spoiled}' @@ -101,12 +106,7 @@ class ReplyBuilder: @register.filter(name="post_body") def post_body(post: Post) -> str: text = htmlspecialchars(post.text) - - text = ReplyBuilder(text, parse_spoilers=post.board.spoilers).build() - - # Finally, replace linebreaks - text = text.replace("\n", "
") - return text + return ReplyBuilder(text, parse_spoilers=post.board.spoilers).build() @register.filter(name="measure_bytes")