diff --git a/matrix/colors.py b/matrix/colors.py index 231531e..6a79b3c 100644 --- a/matrix/colors.py +++ b/matrix/colors.py @@ -288,6 +288,14 @@ class Formatted(): text = formatted_string.text attributes = formatted_string.attributes + # We need to handle strikethrough first, since doing + # a strikethrough followed by other attributes succeeds in the + # terminal, but doing it the other way around results in garbage. + if 'strikethrough' in attributes: + text = add_attribute(text, 'strikethrough', + attributes['strikethrough']) + attributes.pop('strikethrough') + for key, value in attributes.items(): text = add_attribute(text, key, value) return text diff --git a/matrix/rooms.py b/matrix/rooms.py index 11bfefb..b0dc06f 100644 --- a/matrix/rooms.py +++ b/matrix/rooms.py @@ -815,7 +815,8 @@ class RoomRedactionEvent(RoomEvent): new_message = "" if OPTIONS.redaction_type == RedactType.STRIKETHROUGH: - new_message = string_strikethrough(message) + plaintext_msg = W.string_remove_color(message, '') + new_message = string_strikethrough(plaintext_msg) elif OPTIONS.redaction_type == RedactType.NOTICE: new_message = message elif OPTIONS.redaction_type == RedactType.DELETE: diff --git a/tests/color_test.py b/tests/color_test.py index 749f855..6b290ff 100644 --- a/tests/color_test.py +++ b/tests/color_test.py @@ -1,11 +1,14 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals import webcolors +from collections import OrderedDict from hypothesis import given from hypothesis.strategies import sampled_from -from matrix.colors import (Formatted, color_html_to_weechat, - color_weechat_to_html) +from matrix.colors import (Formatted, FormattedString, + color_html_to_weechat, color_weechat_to_html) html_prism = ("Test") @@ -27,3 +30,15 @@ def test_color_conversion(color_name): hex_color = color_weechat_to_html(color_html_to_weechat(color_name)) new_color_name = webcolors.hex_to_name(hex_color, spec='html4') assert new_color_name == color_name + + +def test_handle_strikethrough_first(): + valid_result = '\x1b[038;5;1mf̶o̶o̶\x1b[039m' + + d1 = OrderedDict([('fgcolor', 'red'), ('strikethrough', True)]) + d2 = OrderedDict([('strikethrough', True), ('fgcolor', 'red'), ]) + f1 = Formatted([FormattedString('foo', d1)]) + f2 = Formatted([FormattedString('foo', d2)]) + + assert f1.to_weechat() == valid_result + assert f2.to_weechat() == valid_result