diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2023-11-01 13:21:06 +0100 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2023-11-01 13:21:06 +0100 |
commit | 082cbe519bd14453fc4669758a81ff8d9ed6baca (patch) | |
tree | 41011b09c1b90f51cde5f51b074a9fc2ed5d26a5 | |
parent | 6d69cde18674105e63b2c85e9a3cd996c8a3a3ea (diff) | |
download | weechat-082cbe519bd14453fc4669758a81ff8d9ed6baca.zip |
irc: add support of RGB colors in messages (issue #2025)
This is made using standard color code '\x04' followed by text color (RGB as
hexadecimal) and optional background (RGB as hexadecimal).
-rw-r--r-- | ChangeLog.adoc | 1 | ||||
-rw-r--r-- | ReleaseNotes.adoc | 12 | ||||
-rw-r--r-- | doc/de/weechat_user.de.adoc | 14 | ||||
-rw-r--r-- | doc/en/weechat_user.en.adoc | 10 | ||||
-rw-r--r-- | doc/fr/weechat_user.fr.adoc | 10 | ||||
-rw-r--r-- | doc/it/weechat_user.it.adoc | 14 | ||||
-rw-r--r-- | doc/ja/weechat_user.ja.adoc | 14 | ||||
-rw-r--r-- | doc/pl/weechat_user.pl.adoc | 14 | ||||
-rw-r--r-- | doc/sr/weechat_user.sr.adoc | 15 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-key.c | 1 | ||||
-rw-r--r-- | src/plugins/irc/irc-color.c | 349 | ||||
-rw-r--r-- | src/plugins/irc/irc-color.h | 5 | ||||
-rw-r--r-- | tests/unit/plugins/irc/test-irc-color.cpp | 114 |
13 files changed, 448 insertions, 125 deletions
diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 9c9aae167..d127b7c90 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -18,6 +18,7 @@ New features:: * core: display only version with command `/version`, add options `-o` and `-ol` in command `/upgrade` * core: add number of processes in command `/sys waitpid` * core, alias, trigger: allow wildcard in commands `/bar`, `/item`, `/proxy`, `/alias` and `/trigger` (issue #1956) + * irc: add support of RGB colors in messages (issue #2025) * irc: add tags "nick_xxx" and "host_xxx" in all messages, including self and server messages * irc: add option irc.look.ignore_tag_messages (issue #989) * trigger: rename local variable "trigger_filter" to "filter" on monitor buffer (issue #2037) diff --git a/ReleaseNotes.adoc b/ReleaseNotes.adoc index 3acd0fdde..69f27a313 100644 --- a/ReleaseNotes.adoc +++ b/ReleaseNotes.adoc @@ -14,6 +14,18 @@ For a complete list of changes, please look at ChangeLog. [[v4.2.0]] == Version 4.2.0 (under dev) +[[4.2.0_irc_rgb_colors]] +=== RGB colors in IRC messages + +Support for RGB colors in IRC messages has been added and a new key +[Ctrl+c], kbd:[d] is available to insert this color code in command line. + +You can add this key with this command: + +---- +/key missing +---- + [[v4.2.0_custom_bar_items]] === Custom bar items diff --git a/doc/de/weechat_user.de.adoc b/doc/de/weechat_user.de.adoc index 10e11fd6e..a30396ac1 100644 --- a/doc/de/weechat_user.de.adoc +++ b/doc/de/weechat_user.de.adoc @@ -1016,6 +1016,13 @@ Zeichen, genutzt werden: | kbd:[Ctrl+c], kbd:[c], kbd:[xx], kbd:[,], kbd:[yy] | Textfarbe `xx` und Hintergrundfarbe `yy` (siehe Farbtabelle). +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx] | Text color `xxxxxx` (RGB as hexadecimal, for example `FF0000` for red). +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx], kbd:[,], + kbd:[yyyyyy] | Text color `xxxxxx` and background `yyyyyy` (RGB as hexadecimal). | kbd:[Ctrl+c], kbd:[i] | Text wird kursiv dargestellt. | kbd:[Ctrl+c], kbd:[o] | deaktiviert Farben und Attribute. | kbd:[Ctrl+c], kbd:[v] | Farben umkehren (kehrt Textfarbe und Hintergrundfarbe um). @@ -1023,8 +1030,9 @@ Zeichen, genutzt werden: |=== [NOTE] -Der selbe Befehl (ohne den Wert für kbd:[Ctrl+c], kbd:[c]) sollte genutzt werden -um die Farbkodierungen bzw. Attribute zu deaktivieren. +// TRANSLATION MISSING +The same code (without number for kbd:[Ctrl+c], kbd:[c] and kbd:[Ctrl+c], kbd:[d]) +can be used to stop the attribute. Farbtabelle für kbd:[Ctrl+c], kbd:[c]: @@ -1587,6 +1595,8 @@ Sie können mit dem Befehl <<command_weechat_key,/key>> geändert und neue hinzu | Taste | Beschreibung | Befehl | kbd:[Ctrl+c], kbd:[b] | fügt Steuerzeichen für fett geschrieben Text ein. | `+/input insert \x02+` | kbd:[Ctrl+c], kbd:[c] | fügt Steuerzeichen für Textfarbe ein. | `+/input insert \x03+` +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d] | Insert code for colored text (RGB color, as hexadecimal). | `+/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+` | kbd:[Ctrl+c], kbd:[v] | fügt Steuerzeichen für Hintergrundfarbe ein. | `+/input insert \x16+` diff --git a/doc/en/weechat_user.en.adoc b/doc/en/weechat_user.en.adoc index 61e0d69fe..41dc69b73 100644 --- a/doc/en/weechat_user.en.adoc +++ b/doc/en/weechat_user.en.adoc @@ -1007,6 +1007,11 @@ follow (press kbd:[Ctrl+c] then following letter, with optional value): | kbd:[Ctrl+c], kbd:[c], kbd:[xx], kbd:[,], kbd:[yy] | Text color `xx` and background `yy` (see list of colors below). +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx] | Text color `xxxxxx` (RGB as hexadecimal, for example `FF0000` for red). +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx], kbd:[,], + 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:[v] | Reverse video (revert text color with background). @@ -1014,8 +1019,8 @@ follow (press kbd:[Ctrl+c] then following letter, with optional value): |=== [NOTE] -The same code (without number for kbd:[Ctrl+c], kbd:[c]) can be used to stop the -attribute. +The same code (without number for kbd:[Ctrl+c], kbd:[c] and kbd:[Ctrl+c], kbd:[d]) +can be used to stop the attribute. Color codes for kbd:[Ctrl+c], kbd:[c] are: @@ -1574,6 +1579,7 @@ They can be changed and new ones can be added with the <<command_weechat_key,/ke | Key | Description | Command | kbd:[Ctrl+c], kbd:[b] | Insert code for bold text. | `+/input insert \x02+` | kbd:[Ctrl+c], kbd:[c] | Insert code for colored text. | `+/input insert \x03+` +| kbd:[Ctrl+c], kbd:[d] | Insert code for colored text (RGB color, as hexadecimal). | `+/input insert \x04+` | kbd:[Ctrl+c], kbd:[i] | Insert code for italic text. | `+/input insert \x1D+` | kbd:[Ctrl+c], kbd:[o] | Insert code for color reset. | `+/input insert \x0F+` | kbd:[Ctrl+c], kbd:[v] | Insert code for reverse color. | `+/input insert \x16+` diff --git a/doc/fr/weechat_user.fr.adoc b/doc/fr/weechat_user.fr.adoc index f741e18e3..65b386b86 100644 --- a/doc/fr/weechat_user.fr.adoc +++ b/doc/fr/weechat_user.fr.adoc @@ -1022,6 +1022,11 @@ suit et éventuellement une valeur) : | kbd:[Ctrl+c], kbd:[c], kbd:[xx], kbd:[,], kbd:[yy] | Couleur du texte `xx` et du fond `yy` (voir la liste des couleurs ci-dessous). +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx] | Couleur du texte `xxxxxx` (RGB en hexadécimal, par exemple `FF0000` pour du rouge). +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx], kbd:[,], + kbd:[yyyyyy] | Couleur du texte `xxxxxx` et du fond `yyyyyy` (RGB en hexadécimal). | kbd:[Ctrl+c], kbd:[i] | Texte en italique. | kbd:[Ctrl+c], kbd:[o] | Désactiver la couleur et tous les attributs. | kbd:[Ctrl+c], kbd:[v] | Vidéo inverse (inversion de la couleur d'écriture et du fond). @@ -1029,8 +1034,8 @@ suit et éventuellement une valeur) : |=== [NOTE] -Le même code (sans le numéro pour kbd:[Ctrl+c], kbd:[c]) peut être utilisé pour -stopper l'attribut défini. +Le même code (sans le numéro pour kbd:[Ctrl+c], kbd:[c] et kbd:[Ctrl+c], kbd:[d]) +peut être utilisé pour stopper l'attribut défini. Les codes couleur pour kbd:[Ctrl+c], kbd:[c] sont : @@ -1609,6 +1614,7 @@ Ils peuvent être modifiés et de nouveaux peuvent être ajoutés avec la comman | Touche | Description | Commande | kbd:[Ctrl+c], kbd:[b] | Insérer le code pour mettre le texte en gras. | `+/input insert \x02+` | kbd:[Ctrl+c], kbd:[c] | Insérer le code pour écrire en couleur. | `+/input insert \x03+` +| kbd:[Ctrl+c], kbd:[d] | Insérer le code pour écrire en couleur (couleur RGB, en hexadécimal). | `+/input insert \x04+` | kbd:[Ctrl+c], kbd:[i] | Insérer le code pour mettre le texte en italique. | `+/input insert \x1D+` | kbd:[Ctrl+c], kbd:[o] | Insérer le code pour réinitialiser la couleur. | `+/input insert \x0F+` | kbd:[Ctrl+c], kbd:[v] | Insérer le code pour écrire en couleur inversée. | `+/input insert \x16+` diff --git a/doc/it/weechat_user.it.adoc b/doc/it/weechat_user.it.adoc index 9e8eb09e5..5a0b426b5 100644 --- a/doc/it/weechat_user.it.adoc +++ b/doc/it/weechat_user.it.adoc @@ -1106,6 +1106,13 @@ opzionale): kbd:[xx], kbd:[,], kbd:[yy] | colore del testo `xx` e di sfondo `yy` (consultare la lista di colori che segue). // TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx] | Text color `xxxxxx` (RGB as hexadecimal, for example `FF0000` for red). +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx], kbd:[,], + kbd:[yyyyyy] | Text color `xxxxxx` and background `yyyyyy` (RGB as hexadecimal). +// TRANSLATION MISSING | kbd:[Ctrl+c], kbd:[i] | italic text. | kbd:[Ctrl+c], kbd:[o] | disabilita colori ed attributi. | kbd:[Ctrl+c], kbd:[v] | video inverso (inverte il colore del testo con quello di sfondo). @@ -1113,8 +1120,9 @@ opzionale): |=== [NOTE] -Lo stesso codice (senza numero per kbd:[Ctrl+c], kbd:[c]) può essere usato per -terminare l'attributo. +// TRANSLATION MISSING +The same code (without number for kbd:[Ctrl+c], kbd:[c] and kbd:[Ctrl+c], kbd:[d]) +can be used to stop the attribute. I codici colore per kbd:[Ctrl+c], kbd:[c] sono: @@ -1720,6 +1728,8 @@ They can be changed and new ones can be added with the <<command_weechat_key,/ke | Tasti | Descrizione | Comando | kbd:[Ctrl+c], kbd:[b] | Inserisce il codice per il testo in grassetto. | `+/input insert \x02+` | kbd:[Ctrl+c], kbd:[c] | Inserisce il codice per il testo colorato. | `+/input insert \x03+` +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d] | Insert code for colored text (RGB color, as hexadecimal). | `+/input insert \x04+` | kbd:[Ctrl+c], kbd:[i] | Inserisce il codice per il testo in corsivo. | `+/input insert \x1D+` | kbd:[Ctrl+c], kbd:[o] | Inserisce il codice per il reset dei colori. | `+/input insert \x0F+` | kbd:[Ctrl+c], kbd:[v] | Inserisce il codice per l'inversione dei colori. | `+/input insert \x16+` diff --git a/doc/ja/weechat_user.ja.adoc b/doc/ja/weechat_user.ja.adoc index c8f6b8149..d7276bc3a 100644 --- a/doc/ja/weechat_user.ja.adoc +++ b/doc/ja/weechat_user.ja.adoc @@ -1077,6 +1077,13 @@ IRC 等のプラグインでは、以下の色コードと属性を利用でき | kbd:[Ctrl+c], kbd:[c], kbd:[xx], kbd:[,], kbd:[yy] | テキスト表示色を `xx` に、背景色を `yy` に (以下の色リストを参照) +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx] | Text color `xxxxxx` (RGB as hexadecimal, for example `FF0000` for red). +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx], kbd:[,], + kbd:[yyyyyy] | Text color `xxxxxx` and background `yyyyyy` (RGB as hexadecimal). | kbd:[Ctrl+c], kbd:[i] | テキストをイタリック体に | kbd:[Ctrl+c], kbd:[o] | テキスト表示色と属性をリセット | kbd:[Ctrl+c], kbd:[v] | テキストを反転 (テキスト表示色と背景色の入れ替え) @@ -1084,8 +1091,9 @@ IRC 等のプラグインでは、以下の色コードと属性を利用でき |=== [NOTE] -同じコードで (色コードを入力せずに kbd:[Ctrl+c], kbd:[c] -を使うことで) 属性をキャンセルすることができます。 +// TRANSLATION MISSING +The same code (without number for kbd:[Ctrl+c], kbd:[c] and kbd:[Ctrl+c], kbd:[d]) +can be used to stop the attribute. kbd:[Ctrl+c], kbd:[c] 用の色コード: @@ -1681,6 +1689,8 @@ They can be changed and new ones can be added with the <<command_weechat_key,/ke | キー | 説明 | コマンド | kbd:[Ctrl+c], kbd:[b] | テキストを太字化するコードの挿入 | `+/input insert \x02+` | kbd:[Ctrl+c], kbd:[c] | テキストに色をつけるコードの挿入 | `+/input insert \x03+` +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d] | Insert code for colored text (RGB color, as hexadecimal). | `+/input insert \x04+` | kbd:[Ctrl+c], kbd:[i] | テキストをイタリック体にするコードの挿入 | `+/input insert \x1D+` | kbd:[Ctrl+c], kbd:[o] | テキスト色のリセットを行うコードの挿入 | `+/input insert \x0F+` | kbd:[Ctrl+c], kbd:[v] | テキスト色の反転を行うコードの挿入 | `+/input insert \x16+` diff --git a/doc/pl/weechat_user.pl.adoc b/doc/pl/weechat_user.pl.adoc index 1354d7182..47b85a246 100644 --- a/doc/pl/weechat_user.pl.adoc +++ b/doc/pl/weechat_user.pl.adoc @@ -1016,6 +1016,13 @@ Dla niektórych wtyczek jak IRC, można użyć kolorów i atrybutów w następuj | kbd:[Ctrl+c], kbd:[c], kbd:[xx], kbd:[,], kbd:[yy] | kolor tekstu `xx` i tła `yy` (zgodnie z poniższą listą kolorów) +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx] | Text color `xxxxxx` (RGB as hexadecimal, for example `FF0000` for red). +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx], kbd:[,], + kbd:[yyyyyy] | Text color `xxxxxx` and background `yyyyyy` (RGB as hexadecimal). | kbd:[Ctrl+c], kbd:[i] | pochyły tekst | kbd:[Ctrl+c], kbd:[o] | wyłącza kolory i atrybuty | kbd:[Ctrl+c], kbd:[v] | odwróć video (przywraca kolor tekstu i tła) @@ -1023,8 +1030,9 @@ Dla niektórych wtyczek jak IRC, można użyć kolorów i atrybutów w następuj |=== [NOTE] -Ten sam sktót (bez numeru dla kbd:[Ctrl+c], kbd:[c]) może zostać użyty do zatrzymania -atrybutu. +// TRANSLATION MISSING +The same code (without number for kbd:[Ctrl+c], kbd:[c] and kbd:[Ctrl+c], kbd:[d]) +can be used to stop the attribute. Kody kolorów dla kbd:[Ctrl+c], kbd:[c]: @@ -1590,6 +1598,8 @@ Można je zmienić oraz dodać nowe za pomocą komendy <<command_weechat_key,/ke | Skrót | Opis | Komenda | kbd:[Ctrl+c], kbd:[b] | Wstaw kod dla pogrubionego tekstu. | `+/input insert \x02+` | kbd:[Ctrl+c], kbd:[c] | Wstaw kod dla kolorowego tekstu. | `+/input insert \x03+` +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d] | Insert code for colored text (RGB color, as hexadecimal). | `+/input insert \x04+` | kbd:[Ctrl+c], kbd:[i] | Wstaw kod dla pochyłego tekstu. | `+/input insert \x1D+` | kbd:[Ctrl+c], kbd:[o] | Wstaw kod dla zresetowania koloru. | `+/input insert \x0F+` | kbd:[Ctrl+c], kbd:[v] | Wstaw kod dla odwrócenia koloru. | `+/input insert \x16+` diff --git a/doc/sr/weechat_user.sr.adoc b/doc/sr/weechat_user.sr.adoc index cff381ff3..1acb2ae4e 100644 --- a/doc/sr/weechat_user.sr.adoc +++ b/doc/sr/weechat_user.sr.adoc @@ -950,6 +950,13 @@ WeeChat командна линија (на дну прозора) вам омо | kbd:[Ctrl+c], kbd:[c], kbd:[xx], kbd:[,], kbd:[yy] | Текст у боји `xx` и позадина у `yy` (погледајте листу боја испод). +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx] | Text color `xxxxxx` (RGB as hexadecimal, for example `FF0000` for red). +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d], + kbd:[xxxxxx], kbd:[,], + kbd:[yyyyyy] | Text color `xxxxxx` and background `yyyyyy` (RGB as hexadecimal). | kbd:[Ctrl+c], kbd:[i] | Текст у курзиву. | kbd:[Ctrl+c], kbd:[o] | Искључивање боје и атрибута. | kbd:[Ctrl+c], kbd:[v] | Обрнути видео (боје текста и позадине се замењују једна са другом). @@ -957,7 +964,9 @@ WeeChat командна линија (на дну прозора) вам омо |=== [NOTE] -Исти кôд (без броја за kbd:[Ctrl+c], kbd:[c]) може да се употреби за заустављање атрибута. +// TRANSLATION MISSING +The same code (without number for kbd:[Ctrl+c], kbd:[c] and kbd:[Ctrl+c], kbd:[d]) +can be used to stop the attribute. Кодови боја за kbd:[Ctrl+c], kbd:[c] су: @@ -1494,7 +1503,9 @@ WeeChat нуди доста подразумеваних тастерских п |=== | Тастер | Опис | Команда | kbd:[Ctrl+c], kbd:[b] | Уметање кода за подебљани текст. | `+/input insert \x02+` -| kbd:[Ctrl+c], kbd:[c] | Уметање кода за обојени текст. | `+/input insert \x03+` +| kbd:[Ctrl+c +// TRANSLATION MISSING +| kbd:[Ctrl+c], kbd:[d] | Insert code for colored text (RGB color, as hexadecimal). | `+/input insert \x04+`], kbd:[c] | Уметање кода за обојени текст. | `+/input insert \x03+` | kbd:[Ctrl+c], kbd:[i] | Уметање кода за текст у курзиву. | `+/input insert \x1D+` | kbd:[Ctrl+c], kbd:[o] | Уметање кода за ресет боје. | `+/input insert \x0F+` | kbd:[Ctrl+c], kbd:[v] | Уметање кода за обрнуту боју. | `+/input insert \x16+` diff --git a/src/gui/curses/gui-curses-key.c b/src/gui/curses/gui-curses-key.c index 44444f3a8..cb5279ff0 100644 --- a/src/gui/curses/gui-curses-key.c +++ b/src/gui/curses/gui-curses-key.c @@ -140,6 +140,7 @@ gui_key_default_bindings (int context, int create_option) BIND("ctrl-s,ctrl-u", "/allbuf /buffer set unread"); BIND("ctrl-c,b", "/input insert \\x02"); BIND("ctrl-c,c", "/input insert \\x03"); + BIND("ctrl-c,d", "/input insert \\x04"); BIND("ctrl-c,i", "/input insert \\x1D"); BIND("ctrl-c,o", "/input insert \\x0F"); BIND("ctrl-c,v", "/input insert \\x16"); diff --git a/src/plugins/irc/irc-color.c b/src/plugins/irc/irc-color.c index 012cfa5cd..b110fcfbc 100644 --- a/src/plugins/irc/irc-color.c +++ b/src/plugins/irc/irc-color.c @@ -84,6 +84,121 @@ regex_t *irc_color_regex_ansi = NULL; /* + * Converts a RGB color to terminal color. + * + * Returns a terminal color (between 0 and 255), -1 if error. + */ + +int +irc_color_convert_rgb2term (long rgb) +{ + char str_color[64], *info_color, *error; + long number; + + if (rgb < 0) + return -1; + + snprintf (str_color, sizeof (str_color), "%ld", rgb); + + info_color = weechat_info_get ("color_rgb2term", str_color); + if (!info_color || !info_color[0]) + { + if (info_color) + free (info_color); + return -1; + } + + error = NULL; + number = strtol (info_color, &error, 10); + if (!error || error[0]) + { + free (info_color); + return -1; + } + + free (info_color); + + return (int)number; +} + +/* + * Converts a RGB color to IRC color. + * + * Returns a IRC color number (between 0 and 15), -1 if error. + */ + +int +irc_color_convert_rgb2irc (long rgb) +{ + char str_color[64], *error, *info_color; + long number; + + if (rgb < 0) + return -1; + + snprintf (str_color, sizeof (str_color), + "%ld,%d", + rgb, + IRC_COLOR_TERM2IRC_NUM_COLORS); + + info_color = weechat_info_get ("color_rgb2term", str_color); + if (!info_color || !info_color[0]) + { + if (info_color) + free (info_color); + return -1; + } + + error = NULL; + number = strtol (info_color, &error, 10); + if (!error || error[0] + || (number < 0) || (number >= IRC_COLOR_TERM2IRC_NUM_COLORS)) + { + free (info_color); + return -1; + } + + free (info_color); + + return irc_color_term2irc[number]; +} + +/* + * Converts a terminal color to IRC color. + * + * Returns a IRC color number (between 0 and 15), -1 if error. + */ + +int +irc_color_convert_term2irc (int color) +{ + char str_color[64], *error, *info_color; + long number; + + snprintf (str_color, sizeof (str_color), "%d", color); + + info_color = weechat_info_get ("color_term2rgb", str_color); + if (!info_color || !info_color[0]) + { + if (info_color) + free (info_color); + return -1; + } + + error = NULL; + number = strtol (info_color, &error, 10); + if (!error || error[0] || (number < 0) || (number > 0xFFFFFF)) + { + free (info_color); + return -1; + } + + free (info_color); + + return irc_color_convert_rgb2irc (number); +} + +/* * Replaces IRC colors by WeeChat colors. * * If keep_colors == 0: removes any color/style in message otherwise keeps @@ -95,11 +210,12 @@ regex_t *irc_color_regex_ansi = NULL; char * irc_color_decode (const char *string, int keep_colors) { - char **out; - char str_fg[3], str_bg[3], str_color[128], str_key[128], str_to_add[128]; + char **out, *error; + char str_fg[16], str_bg[16], str_color[128], str_key[128], str_to_add[128]; const char *remapped_color; unsigned char *ptr_string; - int length, fg, bg, bold, reverse, italic, underline, rc; + int length, fg, bg, bold, reverse, italic, underline, color_number; + long fg_rgb, bg_rgb; if (!string) return NULL; @@ -211,19 +327,21 @@ irc_color_decode (const char *string, int keep_colors) bg = -1; if (str_fg[0]) { - rc = sscanf (str_fg, "%d", &fg); - if ((rc != EOF) && (rc >= 1)) - { + error = NULL; + fg = (int)strtol (str_fg, &error, 10); + if (error && !error[0]) fg %= IRC_NUM_COLORS; - } + else + fg = -1; } if (str_bg[0]) { - rc = sscanf (str_bg, "%d", &bg); - if ((rc != EOF) && (rc >= 1)) - { + error = NULL; + bg = (int)strtol (str_bg, &error, 10); + if (error && !error[0]) bg %= IRC_NUM_COLORS; - } + else + bg = -1; } /* search "fg,bg" in hashtable of remapped colors */ snprintf (str_key, sizeof (str_key), "%d,%d", fg, bg); @@ -253,6 +371,94 @@ irc_color_decode (const char *string, int keep_colors) } } break; + case IRC_COLOR_HEX_COLOR_CHAR: + ptr_string++; + str_fg[0] = '\0'; + str_bg[0] = '\0'; + if (isxdigit (ptr_string[0])) + { + /* foreground */ + length = 1; + while (isxdigit (ptr_string[length])) + { + length++; + if (length == 6) + break; + } + memcpy (str_fg, ptr_string, length); + str_fg[length] = '\0'; + ptr_string += length; + } + if ((ptr_string[0] == ',') && (isxdigit (ptr_string[1]))) + { + /* background */ + ptr_string++; + length = 1; + while (isxdigit (ptr_string[length])) + { + length++; + if (length == 6) + break; + } + memcpy (str_bg, ptr_string, length); + str_bg[length] = '\0'; + ptr_string += length; + } + if (keep_colors) + { + if (str_fg[0] || str_bg[0]) + { + fg_rgb = -1; + bg_rgb = -1; + if (str_fg[0]) + { + error = NULL; + fg_rgb = strtol (str_fg, &error, 16); + if (!error || error[0]) + fg_rgb = -1; + } + if (str_bg[0]) + { + error = NULL; + bg_rgb = strtol (str_bg, &error, 16); + if (!error || error[0]) + bg_rgb = -1; + } + str_fg[0] = '\0'; + str_bg[0] = '\0'; + if (fg_rgb >= 0) + { + color_number = irc_color_convert_rgb2term (fg_rgb); + if (color_number >= 0) + { + snprintf (str_fg, sizeof (str_fg), + "%d", color_number); + } + } + if (bg_rgb >= 0) + { + color_number = irc_color_convert_rgb2term (bg_rgb); + if (color_number >= 0) + { + snprintf (str_bg, sizeof (str_bg), + "%d", color_number); + } + } + snprintf (str_color, sizeof (str_color), + "|%s%s%s", + str_fg, + (str_bg[0]) ? "," : "", + str_bg); + snprintf (str_to_add, sizeof (str_to_add), "%s", + weechat_color (str_color)); + } + else + { + snprintf (str_to_add, sizeof (str_to_add), "%s", + weechat_color ("resetcolor")); + } + } + break; default: /* * we are not on an IRC color code, just copy the UTF-8 char @@ -364,6 +570,53 @@ irc_color_encode (const char *string, int keep_colors) } } break; + case 0x04: /* ^D */ + if (keep_colors) + weechat_string_dyn_concat (out, IRC_COLOR_HEX_COLOR_STR, -1); + ptr_string++; + if (isxdigit (ptr_string[0])) + { + /* foreground */ + length = 1; + while (isxdigit (ptr_string[length])) + { + length++; + if (length == 6) + break; + } + if (keep_colors) + { + weechat_string_dyn_concat (out, + (const char *)ptr_string, + length); + } + ptr_string += length; + } + if (ptr_string[0] == ',') + { + /* background */ + if (keep_colors) + weechat_string_dyn_concat (out, ",", -1); + ptr_string++; + if (isxdigit (ptr_string[0])) + { + length = 1; + while (isxdigit (ptr_string[length])) + { + length++; + if (length == 6) + break; + } + if (keep_colors) + { + weechat_string_dyn_concat (out, + (const char *)ptr_string, + length); + } + ptr_string += length; + } + } + break; case 0x0F: /* ^O */ if (keep_colors) weechat_string_dyn_concat (out, IRC_COLOR_RESET_STR, -1); @@ -399,80 +652,6 @@ irc_color_encode (const char *string, int keep_colors) } /* - * Converts a RGB color to IRC color. - * - * Returns a IRC color number (between 0 and 15), -1 if error. - */ - -int -irc_color_convert_rgb2irc (int rgb) -{ - char str_color[64], *error, *info_color; - long number; - - snprintf (str_color, sizeof (str_color), - "%d,%d", - rgb, - IRC_COLOR_TERM2IRC_NUM_COLORS); - - info_color = weechat_info_get ("color_rgb2term", str_color); - if (!info_color || !info_color[0]) - { - if (info_color) - free (info_color); - return -1; - } - - error = NULL; - number = strtol (info_color, &error, 10); - if (!error || error[0] - || (number < 0) || (number >= IRC_COLOR_TERM2IRC_NUM_COLORS)) - { - free (info_color); - return -1; - } - - free (info_color); - - return irc_color_term2irc[number]; -} - -/* - * Converts a terminal color to IRC color. - * - * Returns a IRC color number (between 0 and 15), -1 if error. - */ - -int -irc_color_convert_term2irc (int color) -{ - char str_color[64], *error, *info_color; - long number; - - snprintf (str_color, sizeof (str_color), "%d", color); - - info_color = weechat_info_get ("color_term2rgb", str_color); - if (!info_color || !info_color[0]) - { - if (info_color) - free (info_color); - return -1; - } - - error = NULL; - number = strtol (info_color, &error, 10); - if (!error || error[0] || (number < 0) || (number > 0xFFFFFF)) - { - free (info_color); - return -1; - } - - free (info_color); - - return irc_color_convert_rgb2irc (number); -} - -/* * Replaces ANSI colors by IRC colors (or removes them). * * This callback is called by irc_color_decode_ansi, it must not be called diff --git a/src/plugins/irc/irc-color.h b/src/plugins/irc/irc-color.h index 6e576c050..9f937c85f 100644 --- a/src/plugins/irc/irc-color.h +++ b/src/plugins/irc/irc-color.h @@ -41,9 +41,12 @@ #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_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_RESET_CHAR '\x0F' /* reset color/attributes */ #define IRC_COLOR_RESET_STR "\x0F" /* [0F]... */ diff --git a/tests/unit/plugins/irc/test-irc-color.cpp b/tests/unit/plugins/irc/test-irc-color.cpp index 3ed977364..e6065fdcc 100644 --- a/tests/unit/plugins/irc/test-irc-color.cpp +++ b/tests/unit/plugins/irc/test-irc-color.cpp @@ -31,7 +31,8 @@ extern "C" #include "src/plugins/irc/irc-color.h" #include "src/plugins/irc/irc-config.h" -extern int irc_color_convert_rgb2irc (int rgb); +extern int irc_color_convert_rgb2term (long rgb); +extern int irc_color_convert_rgb2irc (long rgb); extern int irc_color_convert_term2irc (int color); } @@ -70,6 +71,13 @@ extern int irc_color_convert_term2irc (int color); #define STRING_IRC_COLOR_REMAPPED \ "test_" \ IRC_COLOR_COLOR_STR "03,02" "remapped" +#define STRING_IRC_COLOR_FG_ORANGE \ + "test_" IRC_COLOR_HEX_COLOR_STR "FF7F00" "orange" \ + IRC_COLOR_HEX_COLOR_STR "_end" +#define STRING_IRC_COLOR_FG_YELLOW_BG_DARKMAGENTA \ + "test_" IRC_COLOR_HEX_COLOR_STR "FFFF00,8B008B" \ + "yellow/darkmagenta" \ + IRC_COLOR_HEX_COLOR_STR "_end" /* tests on irc_color_encode(): command line -> IRC color */ #define STRING_USER_BOLD \ @@ -92,6 +100,10 @@ extern int irc_color_convert_term2irc (int color); #define STRING_USER_ATTRS_AND_COLORS \ "test_" "\x02" "\x1F" "\x03" "08,02" "bold_underline_yellow/blue" \ "\x02" "\x1F" "_normal_yellow/blue" +#define STRING_USER_FG_ORANGE \ + "test_" "\x04" "FF7F00" "orange" "\x04" "_end" +#define STRING_USER_FG_YELLOW_BG_DARKMAGENTA \ + "test_" "\x04" "FFFF00,8B008B" "yellow/darkmagenta" "\x04" "_end" /* tests on irc_color_decode_ansi(): ANSI color -> IRC color */ #define STRING_ANSI_RESET "test_\x1B[mreset" @@ -146,6 +158,49 @@ TEST_GROUP(IrcColor) /* * Tests functions: + * irc_color_convert_rgb2term + */ + +TEST(IrcColor, ConvertRgb2Term) +{ + LONGS_EQUAL(-1, irc_color_convert_rgb2term (-1)); + LONGS_EQUAL(0, irc_color_convert_rgb2term (0)); + LONGS_EQUAL(9, irc_color_convert_rgb2term (0xFF0000)); /* red */ + LONGS_EQUAL(10, irc_color_convert_rgb2term (0x00FF00)); /* green */ + LONGS_EQUAL(12, irc_color_convert_rgb2term (0x0000FF)); /* blue */ + LONGS_EQUAL(11, irc_color_convert_rgb2term (0xFFFF00)); /* yellow */ + LONGS_EQUAL(208, irc_color_convert_rgb2term (0xFF7F00)); /* orange */ + LONGS_EQUAL(90, irc_color_convert_rgb2term (0x8B008B)); /* dark magenta */ +} + +/* + * Tests functions: + * irc_color_convert_rgb2irc + */ + +TEST(IrcColor, ConvertRgb2Irc) +{ + LONGS_EQUAL(1, irc_color_convert_rgb2irc (0x000000)); + LONGS_EQUAL(1, irc_color_convert_rgb2irc (0x010203)); + LONGS_EQUAL(4, irc_color_convert_rgb2irc (0xFF0033)); + LONGS_EQUAL(15, irc_color_convert_rgb2irc (0xAABBCC)); +} + +/* + * Tests functions: + * irc_color_convert_term2irc + */ + +TEST(IrcColor, ConvertTerm2Irc) +{ + LONGS_EQUAL(1, irc_color_convert_term2irc (0)); + LONGS_EQUAL(15, irc_color_convert_term2irc (123)); + LONGS_EQUAL(13, irc_color_convert_term2irc (200)); + LONGS_EQUAL(0, irc_color_convert_term2irc (255)); +} + +/* + * Tests functions: * irc_color_decode */ @@ -269,6 +324,24 @@ TEST(IrcColor, Decode) gui_color_get_custom ("|green")); WEE_CHECK_DECODE(string, STRING_IRC_COLOR_REMAPPED, 1); config_file_option_unset (irc_config_color_mirc_remap); + + /* color: hex 0xFF7F00 (orange / 208) */ + WEE_CHECK_DECODE("test_orange_end", + STRING_IRC_COLOR_FG_ORANGE, 0); + snprintf (string, sizeof (string), + "test_%sorange%s_end", + gui_color_get_custom ("|208"), + gui_color_get_custom ("resetcolor")); + WEE_CHECK_DECODE(string, STRING_IRC_COLOR_FG_ORANGE, 1); + + /* color: hex 0xFFFF00 (yellow / 11) on 0x8B008B (dark magenta / 90) */ + WEE_CHECK_DECODE("test_yellow/darkmagenta_end", + STRING_IRC_COLOR_FG_YELLOW_BG_DARKMAGENTA, 0); + snprintf (string, sizeof (string), + "test_%syellow/darkmagenta%s_end", + gui_color_get_custom ("|11,90"), + gui_color_get_custom ("resetcolor")); + WEE_CHECK_DECODE(string, STRING_IRC_COLOR_FG_YELLOW_BG_DARKMAGENTA, 1); } /* @@ -375,32 +448,23 @@ TEST(IrcColor, Encode) IRC_COLOR_BOLD_STR, IRC_COLOR_UNDERLINE_STR); WEE_CHECK_ENCODE(string, STRING_USER_ATTRS_AND_COLORS, 1); -} - -/* - * Tests functions: - * irc_color_convert_rgb2irc - */ - -TEST(IrcColor, ConvertRgb2Irc) -{ - LONGS_EQUAL(1, irc_color_convert_rgb2irc (0x000000)); - LONGS_EQUAL(1, irc_color_convert_rgb2irc (0x010203)); - LONGS_EQUAL(4, irc_color_convert_rgb2irc (0xFF0033)); - LONGS_EQUAL(15, irc_color_convert_rgb2irc (0xAABBCC)); -} -/* - * Tests functions: - * irc_color_convert_term2irc - */ + /* color: hex 0xFF7F00 (orange / 208) */ + WEE_CHECK_ENCODE("test_orange_end", STRING_USER_FG_ORANGE, 0); + snprintf (string, sizeof (string), + "test_%sFF7F00orange%s_end", + IRC_COLOR_HEX_COLOR_STR, + IRC_COLOR_HEX_COLOR_STR); + WEE_CHECK_ENCODE(string, STRING_USER_FG_ORANGE, 1); -TEST(IrcColor, ConvertTerm2Irc) -{ - LONGS_EQUAL(1, irc_color_convert_term2irc (0)); - LONGS_EQUAL(15, irc_color_convert_term2irc (123)); - LONGS_EQUAL(13, irc_color_convert_term2irc (200)); - LONGS_EQUAL(0, irc_color_convert_term2irc (255)); + /* color: hex 0xFFFF00 (yellow / 11) on 0x8B008B (dark magenta / 90) */ + WEE_CHECK_ENCODE("test_yellow/darkmagenta_end", + STRING_USER_FG_YELLOW_BG_DARKMAGENTA, 0); + snprintf (string, sizeof (string), + "test_%sFFFF00,8B008Byellow/darkmagenta%s_end", + IRC_COLOR_HEX_COLOR_STR, + IRC_COLOR_HEX_COLOR_STR); + WEE_CHECK_ENCODE(string, STRING_USER_FG_YELLOW_BG_DARKMAGENTA, 1); } /* |