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