diff --git a/board/migrations/0004_board_spoilers.py b/board/migrations/0004_board_spoilers.py
new file mode 100644
index 0000000..9cd2a83
--- /dev/null
+++ b/board/migrations/0004_board_spoilers.py
@@ -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),
+ ),
+ ]
diff --git a/board/models.py b/board/models.py
index d1bb2df..14ec7e0 100644
--- a/board/models.py
+++ b/board/models.py
@@ -65,6 +65,8 @@ class Board(models.Model):
readonly = models.BooleanField(default=False)
# Whether this board appears in the board listing or not
hidden = models.BooleanField(default=False)
+ # Whether to allow users to use spoiler tags on this board
+ spoilers = models.BooleanField(default=False)
@property
def threads(self):
diff --git a/board/static/board/style.css b/board/static/board/style.css
index 8293e8b..96162e9 100644
--- a/board/static/board/style.css
+++ b/board/static/board/style.css
@@ -169,6 +169,17 @@ th {
right: 0px;
}
+/* Spoilers */
+
+.spoiler {
+ color: #000;
+ background-color: #000;
+}
+
+.spoiler:hover {
+ background-color: rgb(0, 0, 0, 0);
+}
+
/* News */
.news_header {
font-size: small;
diff --git a/board/templatetags/post_body.py b/board/templatetags/post_body.py
index 7438cfa..79bb1ee 100644
--- a/board/templatetags/post_body.py
+++ b/board/templatetags/post_body.py
@@ -19,8 +19,9 @@ def htmlspecialchars(t: str):
class ReplyBuilder:
- def __init__(self, text: str):
+ def __init__(self, text: str, parse_spoilers: bool = False):
self.text = text
+ self.parse_spoilers = parse_spoilers
self.index = 0
self.final = ""
@@ -51,6 +52,8 @@ class ReplyBuilder:
self.do_reply()
elif self.remain[:4] == ">":
self.do_quote()
+ elif self.parse_spoilers and self.remain[:9] == "[spoiler]":
+ self.do_spoiler()
else:
self.final += self.c
self.adv()
@@ -81,12 +84,22 @@ class ReplyBuilder:
else:
self.final += f'>>{post_id}'
+ 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'{spoiled}'
+
@register.filter(name="post_body")
def post_body(post: Post) -> str:
text = htmlspecialchars(post.text)
- text = ReplyBuilder(text).build()
+ text = ReplyBuilder(text, parse_spoilers=post.board.spoilers).build()
# Finally, replace linebreaks
text = text.replace("\n", "
")