Skip to content

Commit 0ba3c94

Browse files
committed
boxes/themes: Add support for spoiler header markup in MessageBox.
1 parent e5e9010 commit 0ba3c94

File tree

8 files changed

+96
-1
lines changed

8 files changed

+96
-1
lines changed

tests/ui_tools/test_messages.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,52 @@ def test_private_message_to_self(self, mocker):
669669
[("msg_emoji", ":github:")],
670670
id="custom_emoji",
671671
),
672+
case(
673+
'<div class="spoiler-block"><div class="spoiler-header"></div>'
674+
'<div aria-hidden="true" class="spoiler-content">'
675+
"<p>Test</p></div></div>",
676+
[
677+
"┌─",
678+
"────────",
679+
"─┬─",
680+
"───────",
681+
"─┐\n",
682+
"│ ",
683+
("msg_spoiler", "Spoiler:"),
684+
" │ ",
685+
"Spoiler",
686+
" │\n",
687+
"└─",
688+
"────────",
689+
"─┴─",
690+
"───────",
691+
"─┘",
692+
],
693+
id="spoiler_no_header",
694+
),
695+
case(
696+
'<div class="spoiler-block"><div class="spoiler-header">'
697+
'<p>Header</p></div><div aria-hidden="true" class="spoiler-content">'
698+
"<p>Test</p></div></div>",
699+
[
700+
"┌─",
701+
"────────",
702+
"─┬─",
703+
"──────",
704+
"─┐\n",
705+
"│ ",
706+
("msg_spoiler", "Spoiler:"),
707+
" │ ",
708+
"Header",
709+
" │\n",
710+
"└─",
711+
"────────",
712+
"─┴─",
713+
"──────",
714+
"─┘",
715+
],
716+
id="spoiler_with_header",
717+
),
672718
],
673719
)
674720
def test_soup2markup(self, content, expected_markup, mocker):

zulipterminal/config/themes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
'msg_quote' : 'underline',
5151
'msg_bold' : 'bold',
5252
'msg_time' : 'bold',
53+
'msg_spoiler' : 'bold',
5354
'footer' : 'standout',
5455
'footer_contrast' : 'standout',
5556
'starred' : 'bold',

zulipterminal/themes/gruvbox_dark.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
'msg_quote' : (Color.NEUTRAL_YELLOW, Color.DARK0_HARD),
4747
'msg_bold' : (Color.LIGHT2__BOLD, Color.DARK0_HARD),
4848
'msg_time' : (Color.DARK0_HARD, Color.LIGHT2),
49+
'msg_spoiler' : (Color.BRIGHT_GREEN__BOLD, Color.DARK0_HARD),
4950
'footer' : (Color.DARK0_HARD, Color.LIGHT4),
5051
'footer_contrast' : (Color.LIGHT2, Color.DARK0_HARD),
5152
'starred' : (Color.BRIGHT_RED__BOLD, Color.DARK0_HARD),

zulipterminal/themes/gruvbox_light.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
'msg_quote' : (Color.NEUTRAL_YELLOW, Color.LIGHT0_HARD),
4646
'msg_bold' : (Color.DARK2__BOLD, Color.LIGHT0_HARD),
4747
'msg_time' : (Color.LIGHT0_HARD, Color.DARK2),
48+
'msg_spoiler' : (Color.FADED_GREEN__BOLD, Color.LIGHT0_HARD),
4849
'footer' : (Color.LIGHT0_HARD, Color.DARK4),
4950
'footer_contrast' : (Color.DARK2, Color.LIGHT0_HARD),
5051
'starred' : (Color.FADED_RED__BOLD, Color.LIGHT0_HARD),

zulipterminal/themes/zt_blue.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
'msg_quote' : (Color.BROWN, Color.DARK_BLUE),
4141
'msg_bold' : (Color.WHITE__BOLD, Color.DARK_BLUE),
4242
'msg_time' : (Color.DARK_BLUE, Color.WHITE),
43+
'msg_spoiler' : (Color.LIGHT_GREEN__BOLD, Color.LIGHT_BLUE),
4344
'footer' : (Color.WHITE, Color.DARK_GRAY),
4445
'footer_contrast' : (Color.BLACK, Color.WHITE),
4546
'starred' : (Color.LIGHT_RED__BOLD, Color.LIGHT_BLUE),

zulipterminal/themes/zt_dark.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
'msg_quote' : (Color.BROWN, Color.BLACK),
4141
'msg_bold' : (Color.WHITE__BOLD, Color.BLACK),
4242
'msg_time' : (Color.BLACK, Color.WHITE),
43+
'msg_spoiler' : (Color.LIGHT_GREEN__BOLD, Color.BLACK),
4344
'footer' : (Color.BLACK, Color.LIGHT_GRAY),
4445
'footer_contrast' : (Color.WHITE, Color.BLACK),
4546
'starred' : (Color.LIGHT_RED__BOLD, Color.BLACK),

zulipterminal/themes/zt_light.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
'msg_quote' : (Color.BLACK, Color.BROWN),
4141
'msg_bold' : (Color.WHITE__BOLD, Color.DARK_GRAY),
4242
'msg_time' : (Color.WHITE, Color.DARK_GRAY),
43+
'msg_spoiler' : (Color.DARK_GREEN__BOLD, Color.WHITE),
4344
'footer' : (Color.WHITE, Color.DARK_GRAY),
4445
'footer_contrast' : (Color.BLACK, Color.WHITE),
4546
'starred' : (Color.LIGHT_RED__BOLD, Color.WHITE),

zulipterminal/ui_tools/messages.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
from zulipterminal.config.ui_mappings import STATE_ICON, STREAM_ACCESS_TYPE
3232
from zulipterminal.helper import get_unused_fence
3333
from zulipterminal.server_url import near_message_url
34-
from zulipterminal.ui_tools.tables import render_table
34+
from zulipterminal.ui_tools.tables import render_table, row_with_only_border
3535
from zulipterminal.urwid_types import urwid_MarkupTuple, urwid_Size
3636

3737

@@ -632,6 +632,49 @@ def soup2markup(
632632

633633
source_text = f"Original text was {tag_text.strip()}"
634634
metadata["time_mentions"].append((time_string, source_text))
635+
elif tag == "div" and "spoiler-block" in tag_classes:
636+
# SPOILERS
637+
header = element.find(class_="spoiler-header")
638+
header.contents = [part for part in header.contents if part != "\n"]
639+
640+
if not header.contents:
641+
default = BeautifulSoup("<p>Spoiler</p>", "html.parser")
642+
header.contents.append(default)
643+
644+
processed_header = cls.soup2markup(header, metadata)[0]
645+
646+
processed_header_text = "".join(
647+
part[1] if isinstance(part, tuple) else part
648+
for part in processed_header
649+
)
650+
header_len = sum(
651+
len(part[1]) if isinstance(part, tuple) else len(part)
652+
for part in processed_header
653+
)
654+
655+
# Limit to the first 10 characters and append "..."
656+
if len(processed_header_text) > 10:
657+
processed_header_text = processed_header_text[:10] + "..."
658+
659+
processed_header_len = len(processed_header_text)
660+
marker = "Spoiler:"
661+
662+
widths = [len(marker), processed_header_len]
663+
top_border = row_with_only_border("┌", "─", "┬", "┐", widths)
664+
bottom_border = row_with_only_border(
665+
"└", "─", "┴", "┘", widths, newline=False
666+
)
667+
markup.extend(top_border)
668+
markup.extend(
669+
[
670+
"│ ",
671+
("msg_spoiler", marker),
672+
" │ ",
673+
processed_header_text,
674+
" │\n",
675+
]
676+
)
677+
markup.extend(bottom_border)
635678
else:
636679
markup.extend(cls.soup2markup(element, metadata)[0])
637680
return markup, metadata["message_links"], metadata["time_mentions"]

0 commit comments

Comments
 (0)