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):
|
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] == ">>" and self.lookahead(8) in "0123456789":
|
if self.matches(">>") and self.lookahead(8) in "0123456789":
|
||||||
self.do_reply()
|
self.do_reply()
|
||||||
elif self.remain[:4] == ">":
|
elif self.matches(">"):
|
||||||
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">>'
|
self.final += '<span class="quote">>'
|
||||||
while self.c and self.c != "\n":
|
while self.c and self.c != "\n":
|
||||||
if self.remain[:8] == ">>":
|
if self.matches(">>"):
|
||||||
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")
|
||||||
|
|||||||
Reference in New Issue
Block a user