Add spoiler tags
Boards can have spoiler processors enabled on them now. Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
18
board/migrations/0004_board_spoilers.py
Normal file
18
board/migrations/0004_board_spoilers.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.1b1 on 2022-07-20 07:57
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("board", "0003_board_hidden"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="board",
|
||||||
|
name="spoilers",
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -65,6 +65,8 @@ class Board(models.Model):
|
|||||||
readonly = models.BooleanField(default=False)
|
readonly = models.BooleanField(default=False)
|
||||||
# Whether this board appears in the board listing or not
|
# Whether this board appears in the board listing or not
|
||||||
hidden = models.BooleanField(default=False)
|
hidden = models.BooleanField(default=False)
|
||||||
|
# Whether to allow users to use spoiler tags on this board
|
||||||
|
spoilers = models.BooleanField(default=False)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def threads(self):
|
def threads(self):
|
||||||
|
|||||||
@@ -169,6 +169,17 @@ th {
|
|||||||
right: 0px;
|
right: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Spoilers */
|
||||||
|
|
||||||
|
.spoiler {
|
||||||
|
color: #000;
|
||||||
|
background-color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spoiler:hover {
|
||||||
|
background-color: rgb(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* News */
|
/* News */
|
||||||
.news_header {
|
.news_header {
|
||||||
font-size: small;
|
font-size: small;
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ def htmlspecialchars(t: str):
|
|||||||
|
|
||||||
|
|
||||||
class ReplyBuilder:
|
class ReplyBuilder:
|
||||||
def __init__(self, text: str):
|
def __init__(self, text: str, parse_spoilers: bool = False):
|
||||||
self.text = text
|
self.text = text
|
||||||
|
self.parse_spoilers = parse_spoilers
|
||||||
self.index = 0
|
self.index = 0
|
||||||
self.final = ""
|
self.final = ""
|
||||||
|
|
||||||
@@ -51,6 +52,8 @@ class ReplyBuilder:
|
|||||||
self.do_reply()
|
self.do_reply()
|
||||||
elif self.remain[:4] == ">":
|
elif self.remain[:4] == ">":
|
||||||
self.do_quote()
|
self.do_quote()
|
||||||
|
elif self.parse_spoilers and self.remain[:9] == "[spoiler]":
|
||||||
|
self.do_spoiler()
|
||||||
else:
|
else:
|
||||||
self.final += self.c
|
self.final += self.c
|
||||||
self.adv()
|
self.adv()
|
||||||
@@ -81,12 +84,22 @@ class ReplyBuilder:
|
|||||||
else:
|
else:
|
||||||
self.final += f'<span class="post_link_broken">>>{post_id}</span>'
|
self.final += f'<span class="post_link_broken">>>{post_id}</span>'
|
||||||
|
|
||||||
|
def do_spoiler(self):
|
||||||
|
self.adv(9)
|
||||||
|
spoiled = ""
|
||||||
|
while self.c and self.remain[:10] != "[/spoiler]":
|
||||||
|
spoiled += self.c
|
||||||
|
self.adv()
|
||||||
|
if self.remain[:10] == "[/spoiler]":
|
||||||
|
self.adv(10)
|
||||||
|
self.final += f'<span class="spoiler">{spoiled}</span>'
|
||||||
|
|
||||||
|
|
||||||
@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)
|
||||||
|
|
||||||
text = ReplyBuilder(text).build()
|
text = ReplyBuilder(text, parse_spoilers=post.board.spoilers).build()
|
||||||
|
|
||||||
# Finally, replace linebreaks
|
# Finally, replace linebreaks
|
||||||
text = text.replace("\n", "<br/>")
|
text = text.replace("\n", "<br/>")
|
||||||
|
|||||||
Reference in New Issue
Block a user