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:
@@ -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", "<br/>")
|
||||
return self.final
|
||||
|
||||
def do_quote(self):
|
||||
self.adv(4)
|
||||
self.final += '<span class="quote">>'
|
||||
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'<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")
|
||||
|
||||
Reference in New Issue
Block a user