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")