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:
2022-07-20 01:18:06 -07:00
parent b299f4f548
commit 83e0a5b84e
4 changed files with 46 additions and 2 deletions

View 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),
),
]

View File

@@ -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):

View File

@@ -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;

View File

@@ -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] == "&gt;": elif self.remain[:4] == "&gt;":
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">&gt;&gt;{post_id}</span>' self.final += f'<span class="post_link_broken">&gt;&gt;{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/>")