diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c80e46a0..768a75f49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ SPDX-License-Identifier: GPL-3.0-or-later ## Version 4.7.0 (under dev) +### Added + +- irc: add support strikethrough text in IRC messages ([#2248](https://github.com/weechat/weechat/issues/2248)) + ### Fixed - core: fix write of weechat.log to stdout with `weechat-headless --stdout` ([#2247](https://github.com/weechat/weechat/issues/2247)) diff --git a/doc/de/weechat_user.de.adoc b/doc/de/weechat_user.de.adoc index 857f2c0a6..a8c1f617e 100644 --- a/doc/de/weechat_user.de.adoc +++ b/doc/de/weechat_user.de.adoc @@ -1068,6 +1068,8 @@ Zeichen, genutzt werden: kbd:[yyyyyy] | Textfarbe `xxxxxx` und Hintergrundfarbe `yyyyyy` (RGB als hexadezimale Zahl). | kbd:[Ctrl+c], kbd:[i] | Text wird kursiv dargestellt. | kbd:[Ctrl+c], kbd:[o] | deaktiviert Farben und Attribute. +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[s] | Strikethrough text (displayed as half bright in ncurses interface because strikethrough is not supported). | kbd:[Ctrl+c], kbd:[v] | Farben umkehren (kehrt Textfarbe und Hintergrundfarbe um). | kbd:[Ctrl+c], kbd:[_] | Text wird mit Unterstrich dargestellt. |=== @@ -1640,6 +1642,8 @@ Sie können mit dem Befehl <> geändert und neue hinzu | kbd:[Ctrl+c], kbd:[d] | fügt Steuerzeichen für Textfarbe ein (RGB Farbe, als hexadezimale Zahl). | `+/input insert \x04+` | kbd:[Ctrl+c], kbd:[i] | fügt Steuerzeichen für kursiven Text ein. | `+/input insert \x1D+` | kbd:[Ctrl+c], kbd:[o] | fügt Steuerzeichen für Standardfarbe ein. | `+/input insert \x0F+` +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[s] | Insert code for strikethrough text. | `+/input insert \x1E+` | kbd:[Ctrl+c], kbd:[v] | fügt Steuerzeichen für Hintergrundfarbe ein. | `+/input insert \x16+` | kbd:[Ctrl+c], kbd:[_] | fügt Steuerzeichen für unterstrichenen Text ein. | `+/input insert \x1F+` |=== diff --git a/doc/en/weechat_user.en.adoc b/doc/en/weechat_user.en.adoc index 9855e5d7b..7168b5b6a 100644 --- a/doc/en/weechat_user.en.adoc +++ b/doc/en/weechat_user.en.adoc @@ -1063,6 +1063,7 @@ follow (press kbd:[Ctrl+c] then following letter, with optional value): kbd:[yyyyyy] | Text color `xxxxxx` and background `yyyyyy` (RGB as hexadecimal). | kbd:[Ctrl+c], kbd:[i] | Italic text. | kbd:[Ctrl+c], kbd:[o] | Disable color and attributes. +| kbd:[Ctrl+c], kbd:[s] | Strikethrough text (displayed as half bright in ncurses interface because strikethrough is not supported). | kbd:[Ctrl+c], kbd:[v] | Reverse video (revert text color with background). | kbd:[Ctrl+c], kbd:[_] | Underlined text. |=== @@ -1632,6 +1633,7 @@ They can be changed and new ones can be added with the <bold = 0; ansi_state->underline = 0; ansi_state->italic = 0; + ansi_state->strikethrough = 0; break; case 1: /* bold */ if (!ansi_state->bold) @@ -771,6 +789,13 @@ irc_color_decode_ansi_cb (void *data, const char *text) ansi_state->underline = 1; } break; + case 9: /* strikethrough */ + if (!ansi_state->strikethrough) + { + strcat (output, IRC_COLOR_STRIKETHROUGH_STR); + ansi_state->strikethrough = 1; + } + break; case 23: /* remove italic */ if (ansi_state->italic) { @@ -785,6 +810,13 @@ irc_color_decode_ansi_cb (void *data, const char *text) ansi_state->underline = 0; } break; + case 29: /* remove strikethrough */ + if (ansi_state->strikethrough) + { + strcat (output, IRC_COLOR_STRIKETHROUGH_STR); + ansi_state->strikethrough = 0; + } + break; case 30: /* text color */ case 31: case 32: @@ -987,6 +1019,7 @@ irc_color_decode_ansi (const char *string, int keep_colors) ansi_state.bold = 0; ansi_state.underline = 0; ansi_state.italic = 0; + ansi_state.strikethrough = 0; return weechat_string_replace_regex (string, irc_color_regex_ansi, "$0", '$', diff --git a/src/plugins/irc/irc-color.h b/src/plugins/irc/irc-color.h index ac675692b..6557dc392 100644 --- a/src/plugins/irc/irc-color.h +++ b/src/plugins/irc/irc-color.h @@ -40,26 +40,29 @@ /* attributes in IRC messages for color & style (bold, ..) */ -#define IRC_COLOR_BOLD_CHAR '\x02' /* bold text */ -#define IRC_COLOR_BOLD_STR "\x02" /* [02]...[02] */ +#define IRC_COLOR_BOLD_CHAR '\x02' /* bold text */ +#define IRC_COLOR_BOLD_STR "\x02" /* [02]...[02] */ -#define IRC_COLOR_COLOR_CHAR '\x03' /* text color: fg/fg,bg/,bg */ -#define IRC_COLOR_COLOR_STR "\x03" /* [03]15,05...[03] */ +#define IRC_COLOR_COLOR_CHAR '\x03' /* text color: fg/fg,bg/,bg */ +#define IRC_COLOR_COLOR_STR "\x03" /* [03]15,05...[03] */ -#define IRC_COLOR_HEX_COLOR_CHAR '\x04' /* text color (hex): fg/fg,bg/,bg */ -#define IRC_COLOR_HEX_COLOR_STR "\x04" /* [04]FFFF00,8B008B...[04] */ +#define IRC_COLOR_HEX_COLOR_CHAR '\x04' /* hex text col.: fg/fg,bg/,bg */ +#define IRC_COLOR_HEX_COLOR_STR "\x04" /* [04]FFFF00,8B008B...[04] */ -#define IRC_COLOR_RESET_CHAR '\x0F' /* reset color/attributes */ -#define IRC_COLOR_RESET_STR "\x0F" /* [0F]... */ +#define IRC_COLOR_RESET_CHAR '\x0F' /* reset color/attributes */ +#define IRC_COLOR_RESET_STR "\x0F" /* [0F]... */ -#define IRC_COLOR_REVERSE_CHAR '\x16' /* reverse video (fg <--> bg) */ -#define IRC_COLOR_REVERSE_STR "\x16" /* [16]...[16] */ +#define IRC_COLOR_REVERSE_CHAR '\x16' /* reverse video (fg <--> bg) */ +#define IRC_COLOR_REVERSE_STR "\x16" /* [16]...[16] */ -#define IRC_COLOR_ITALIC_CHAR '\x1D' /* italic text */ -#define IRC_COLOR_ITALIC_STR "\x1D" /* [1D]...[1D] */ +#define IRC_COLOR_ITALIC_CHAR '\x1D' /* italic text */ +#define IRC_COLOR_ITALIC_STR "\x1D" /* [1D]...[1D] */ -#define IRC_COLOR_UNDERLINE_CHAR '\x1F' /* underlined text */ -#define IRC_COLOR_UNDERLINE_STR "\x1F" /* [1F]...[1F] */ +#define IRC_COLOR_STRIKETHROUGH_CHAR '\x1E' /* strikethrough text */ +#define IRC_COLOR_STRIKETHROUGH_STR "\x1E" /* [1E]...[1E] */ + +#define IRC_COLOR_UNDERLINE_CHAR '\x1F' /* underlined text */ +#define IRC_COLOR_UNDERLINE_STR "\x1F" /* [1F]...[1F] */ #define IRC_COLOR_TERM2IRC_NUM_COLORS 16 @@ -117,6 +120,7 @@ struct t_irc_color_ansi_state char bold; char underline; char italic; + char strikethrough; }; extern char *irc_color_decode (const char *string, int keep_colors); diff --git a/tests/unit/plugins/irc/test-irc-color.cpp b/tests/unit/plugins/irc/test-irc-color.cpp index b32483952..0ef411075 100644 --- a/tests/unit/plugins/irc/test-irc-color.cpp +++ b/tests/unit/plugins/irc/test-irc-color.cpp @@ -47,6 +47,8 @@ extern int irc_color_convert_term2irc (int color); "test_" IRC_COLOR_REVERSE_STR "reverse" IRC_COLOR_REVERSE_STR "_end" #define STRING_IRC_ITALIC \ "test_" IRC_COLOR_ITALIC_STR "italic" IRC_COLOR_ITALIC_STR "_end" +#define STRING_IRC_STRIKETHROUGH \ + "test_" IRC_COLOR_STRIKETHROUGH_STR "strikethrough" IRC_COLOR_STRIKETHROUGH_STR "_end" #define STRING_IRC_UNDERLINE \ "test_" IRC_COLOR_UNDERLINE_STR "underline" IRC_COLOR_UNDERLINE_STR "_end" #define STRING_IRC_COLOR_RESET \ @@ -62,8 +64,10 @@ extern int irc_color_convert_term2irc (int color); IRC_COLOR_BOLD_STR \ IRC_COLOR_REVERSE_STR \ IRC_COLOR_ITALIC_STR \ + IRC_COLOR_STRIKETHROUGH_STR \ IRC_COLOR_UNDERLINE_STR \ IRC_COLOR_UNDERLINE_STR \ + IRC_COLOR_STRIKETHROUGH_STR \ IRC_COLOR_ITALIC_STR \ IRC_COLOR_REVERSE_STR \ IRC_COLOR_BOLD_STR @@ -96,6 +100,8 @@ extern int irc_color_convert_term2irc (int color); "test_" "\x16" "reverse" "\x16" "_end" #define STRING_USER_ITALIC \ "test_" "\x1D" "italic" "\x1D" "_end" +#define STRING_USER_STRIKETHROUGH \ + "test_" "\x1E" "strikethrough" "\x1E" "_end" #define STRING_USER_UNDERLINE \ "test_" "\x1F" "underline" "\x1F" "_end" #define STRING_USER_FG_LIGHTCYAN \ @@ -103,8 +109,8 @@ extern int irc_color_convert_term2irc (int color); #define STRING_USER_FG_LIGHTCYAN_BG_RED \ "test_" "\x03" "11,05" "lightcyan/red" "\x03" "_end" #define STRING_USER_ONLY_ATTRS_AND_COLORS \ - "\x03" "\x0F" "\x02" "\x16" "\x1D" "\x1F" \ - "\x1F" "\x1D" "\x16" "\x02" + "\x03" "\x0F" "\x02" "\x16" "\x1D" "\x1E" "\x1F" "\x1F" "\x1E" \ + "\x1D" "\x16" "\x02" #define STRING_USER_ATTRS_AND_COLORS \ "test_" "\x02" "\x1F" "\x03" "08,02" "bold_underline_yellow/blue" \ "\x02" "\x1F" "_normal_yellow/blue" @@ -122,6 +128,8 @@ extern int irc_color_convert_term2irc (int color); "\x1B[1mbold3\x1B[22m_normal" #define STRING_ANSI_ITALIC \ "test_\x1B[3mitalic\x1B[23m_normal" +#define STRING_ANSI_STRIKETHROUGH \ + "test_\x1B[9mstrikethrough\x1B[29m_normal" #define STRING_ANSI_UNDERLINE \ "test_\x1B[4munderline\x1B[24m_normal" #define STRING_ANSI_FG_BLUE \ @@ -258,6 +266,14 @@ TEST(IrcColor, Decode) gui_color_get_custom ("-italic")); WEE_CHECK_DECODE(string, STRING_IRC_ITALIC, 1); + /* strikethrough */ + WEE_CHECK_DECODE("test_strikethrough_end", STRING_IRC_STRIKETHROUGH, 0); + snprintf (string, sizeof (string), + "test_%sstrikethrough%s_end", + gui_color_get_custom ("dim"), + gui_color_get_custom ("-dim")); + WEE_CHECK_DECODE(string, STRING_IRC_STRIKETHROUGH, 1); + /* underline */ WEE_CHECK_DECODE("test_underline_end", STRING_IRC_UNDERLINE, 0); snprintf (string, sizeof (string), @@ -297,14 +313,14 @@ TEST(IrcColor, Decode) gui_color_get_custom ("resetcolor"), gui_color_get_custom ("reset"), gui_color_get_custom ("bold"), - "", /* fixed */ gui_color_get_custom ("reverse"), gui_color_get_custom ("italic"), + gui_color_get_custom ("dim"), gui_color_get_custom ("underline"), gui_color_get_custom ("-underline"), + gui_color_get_custom ("-dim"), gui_color_get_custom ("-italic"), gui_color_get_custom ("-reverse"), - "", /* fixed */ gui_color_get_custom ("-bold")); WEE_CHECK_DECODE(string, STRING_IRC_ONLY_ATTRS_AND_COLORS, 1); @@ -411,6 +427,14 @@ TEST(IrcColor, Encode) IRC_COLOR_ITALIC_STR); WEE_CHECK_ENCODE(string, STRING_USER_ITALIC, 1); + /* strikethrough */ + WEE_CHECK_ENCODE("test_strikethrough_end", STRING_USER_STRIKETHROUGH, 0); + snprintf (string, sizeof (string), + "test_%sstrikethrough%s_end", + IRC_COLOR_STRIKETHROUGH_STR, + IRC_COLOR_STRIKETHROUGH_STR); + WEE_CHECK_ENCODE(string, STRING_USER_STRIKETHROUGH, 1); + /* underline */ WEE_CHECK_ENCODE("test_underline_end", STRING_USER_UNDERLINE, 0); snprintf (string, sizeof (string), @@ -439,14 +463,16 @@ TEST(IrcColor, Encode) /* color: only attributes and colors */ WEE_CHECK_ENCODE("", STRING_USER_ONLY_ATTRS_AND_COLORS, 0); snprintf (string, sizeof (string), - "%s%s%s%s%s%s%s%s%s%s", + "%s%s%s%s%s%s%s%s%s%s%s%s", IRC_COLOR_COLOR_STR, IRC_COLOR_RESET_STR, IRC_COLOR_BOLD_STR, IRC_COLOR_REVERSE_STR, IRC_COLOR_ITALIC_STR, + IRC_COLOR_STRIKETHROUGH_STR, IRC_COLOR_UNDERLINE_STR, IRC_COLOR_UNDERLINE_STR, + IRC_COLOR_STRIKETHROUGH_STR, IRC_COLOR_ITALIC_STR, IRC_COLOR_REVERSE_STR, IRC_COLOR_BOLD_STR); @@ -543,6 +569,14 @@ TEST(IrcColor, DecodeAnsi) IRC_COLOR_ITALIC_STR); WEE_CHECK_DECODE_ANSI(string, STRING_ANSI_ITALIC, 1); + /* strikethrough */ + WEE_CHECK_DECODE_ANSI("test_strikethrough_normal", STRING_ANSI_STRIKETHROUGH, 0); + snprintf (string, sizeof (string), + "test_%sstrikethrough%s_normal", + IRC_COLOR_STRIKETHROUGH_STR, + IRC_COLOR_STRIKETHROUGH_STR); + WEE_CHECK_DECODE_ANSI(string, STRING_ANSI_STRIKETHROUGH, 1); + /* underline */ WEE_CHECK_DECODE_ANSI("test_underline_normal", STRING_ANSI_UNDERLINE, 0); snprintf (string, sizeof (string),