Add ReplyBuilder.matches method to check if the current remaining string starts with the given prefix

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2022-07-23 18:14:01 -07:00
parent 939227e1f0
commit 000efdaec6

View File

@@ -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] == "&gt;&gt;" and self.lookahead(8) in "0123456789":
if self.matches("&gt;&gt;") and self.lookahead(8) in "0123456789":
self.do_reply()
elif self.remain[:4] == "&gt;":
elif self.matches("&gt;"):
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", "<br/>")
return self.final
def do_quote(self):
self.adv(4)
self.final += '<span class="quote">&gt;'
while self.c and self.c != "\n":
if self.remain[:8] == "&gt;&gt;":
if self.matches("&gt;&gt;"):
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'<span class="spoiler">{spoiled}</span>'
@@ -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", "<br/>")
return text
return ReplyBuilder(text, parse_spoilers=post.board.spoilers).build()
@register.filter(name="measure_bytes")