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", "
")