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): def adv(self, n=1):
self.index += n self.index += n
def matches(self, prefix: str) -> bool:
return self.remain[: len(prefix)] == prefix
def build(self) -> str: def build(self) -> str:
while self.c: 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() self.do_reply()
elif self.remain[:4] == "&gt;": elif self.matches("&gt;"):
self.do_quote() self.do_quote()
elif self.remain[:2] == r"\[" and self.remain[:9] == r"\[spoiler": elif self.matches(r"\[spoiler"):
self.final += "[spoiler" self.final += "[spoiler"
self.adv(9) self.adv(9)
elif self.parse_spoilers and self.remain[:9] == "[spoiler]": elif self.parse_spoilers and self.matches("[spoiler]"):
self.do_spoiler() self.do_spoiler()
else: else:
self.final += self.c self.final += self.c
self.adv() self.adv()
# Finally, replace linebreaks
self.final = self.final.replace("\n", "<br/>")
return self.final return self.final
def do_quote(self): def do_quote(self):
self.adv(4) self.adv(4)
self.final += '<span class="quote">&gt;' self.final += '<span class="quote">&gt;'
while self.c and self.c != "\n": while self.c and self.c != "\n":
if self.remain[:8] == "&gt;&gt;": if self.matches("&gt;&gt;"):
self.do_reply() self.do_reply()
else: else:
self.final += self.c self.final += self.c
@@ -90,10 +95,10 @@ class ReplyBuilder:
def do_spoiler(self): def do_spoiler(self):
self.adv(9) self.adv(9)
spoiled = "" spoiled = ""
while self.c and self.remain[:10] != "[/spoiler]": while self.c and not self.matches("[/spoiler]"):
spoiled += self.c spoiled += self.c
self.adv() self.adv()
if self.remain[:10] == "[/spoiler]": if self.matches("[/spoiler]"):
self.adv(10) self.adv(10)
self.final += f'<span class="spoiler">{spoiled}</span>' self.final += f'<span class="spoiler">{spoiled}</span>'
@@ -101,12 +106,7 @@ class ReplyBuilder:
@register.filter(name="post_body") @register.filter(name="post_body")
def post_body(post: Post) -> str: def post_body(post: Post) -> str:
text = htmlspecialchars(post.text) text = htmlspecialchars(post.text)
return ReplyBuilder(text, parse_spoilers=post.board.spoilers).build()
text = ReplyBuilder(text, parse_spoilers=post.board.spoilers).build()
# Finally, replace linebreaks
text = text.replace("\n", "<br/>")
return text
@register.filter(name="measure_bytes") @register.filter(name="measure_bytes")