From 513f5a1ee7ed88ee43b059827dca434edcc51e13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Sat, 12 Oct 2019 22:21:48 +0200 Subject: [PATCH] python: send "bytes" instead of "str" to callbacks in Python 3 when the string is not UTF-8 valid (issue #1220, closes #1389) --- ChangeLog.adoc | 1 + doc/de/weechat_scripting.de.adoc | 174 ++++++++++++++++++++++----- doc/en/weechat_plugin_api.en.adoc | 13 +- doc/en/weechat_scripting.en.adoc | 152 +++++++++++++++++++----- doc/fr/weechat_plugin_api.fr.adoc | 14 ++- doc/fr/weechat_scripting.fr.adoc | 160 ++++++++++++++++++++----- doc/it/weechat_plugin_api.it.adoc | 15 ++- doc/it/weechat_scripting.it.adoc | 175 ++++++++++++++++++++++----- doc/ja/weechat_plugin_api.ja.adoc | 16 ++- doc/ja/weechat_scripting.ja.adoc | 173 ++++++++++++++++++++++----- doc/pl/weechat_scripting.pl.adoc | 177 +++++++++++++++++++++++----- src/plugins/python/weechat-python.c | 31 ++++- src/plugins/python/weechat-python.h | 2 +- 13 files changed, 903 insertions(+), 200 deletions(-) diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 2d9e8500957..e355562402e 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -46,6 +46,7 @@ Bug fixes:: * irc: remove option irc.network.channel_encode, add server option "charset_message" to control which part of the IRC message is decoded/encoded to the target charset (issue #832) * irc: use path from option xfer.file.upload_path to complete filename in command "/dcc send" (issue #60) * logger: fix write in log file if it has been deleted or renamed (issue #123) + * python: send "bytes" instead of "str" to callbacks in Python 3 when the string is not UTF-8 valid (issue #1389) * xfer: fix memory leak when a xfer is freed and when the plugin is unloaded Tests:: diff --git a/doc/de/weechat_scripting.de.adoc b/doc/de/weechat_scripting.de.adoc index 6928d98d53b..40b70f0f0a9 100644 --- a/doc/de/weechat_scripting.de.adoc +++ b/doc/de/weechat_scripting.de.adoc @@ -3,9 +3,10 @@ :email: flashcode@flashtux.org :lang: de :toc: left -:toclevels: 3 +:toclevels: 4 :toc-title: Inhaltsverzeichnis :sectnums: +:sectnumlevels: 3 :docinfo1: @@ -73,22 +74,95 @@ und die Dokumentation für die Funktion `hook_process` in link:weechat_plugin_ap ==== Python -* WeeChat muss als Modul eingebunden werden: `import weechat` -* Um die WeeChat Funktion `+print*+` nutzen zu können muss `+prnt*+` genutzt - werden (_print_ ist ein reservierter Befehl von Python!) -* Funktionen werden im Format `weechat.xxx(arg1, arg2, ...)` ausgeführt +// TRANSLATION MISSING +===== Module + +WeeChat defines a `weechat` module which must be imported with `import weechat`. + +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...)`. + +Functions `+print*+` are called `+prnt*+` in python (because `print` was a +reserved keyword in Python 2). + +// TRANSLATION MISSING +===== Strings received in callbacks + +In Python 3 and with WeeChat ≥ 2.7, the strings received in callbacks have type +`str` if the string has valid UTF-8 data (which is the most common case), +or `bytes` if the string is not UTF-8 valid. So the callback should take care +about this type if some invalid UTF-8 content can be received. + +Some invalid UTF-8 data may be received in these cases, so the callback can +receive a string of type `str` or `bytes` (this list is not exhaustive): + +[width="100%",cols="3m,3m,3m,8",options="header"] +|=== +| API function | Arguments | Examples | Description + +| hook_modifier | + irc_in_yyy | + pass:[irc_in_privmsg] + + pass:[irc_in_notice] | + A message received in IRC plugin, before it is decoded to UTF-8 (used + internally). + + + + It is recommended to use modifier `irc_in2_yyy` instead, the string received + is always UTF-8 valid. + + See function `hook_modifier` in the + link:weechat_plugin_api.en.html#_hook_modifier[WeeChat plugin API reference]. + +| hook_signal | + xxx,irc_out_yyy + + xxx,irc_outtags_yyy | + pass:[*,irc_out_privmsg] + + pass:[*,irc_out_notice] + + pass:[*,irc_outtags_privmsg] + + pass:[*,irc_outtags_notice] | + A message sent by IRC plugin, after it is encoded to the `encode` charset + defined by the user (if different from the default `UTF-8`). + + + + It is recommended to use signal `xxx,irc_out1_yyy` instead, the string received + is always UTF-8 valid. + + See function `hook_signal` in the + link:weechat_plugin_api.en.html#_hook_signal[WeeChat plugin API reference]. + +| hook_process + + hook_process_hashtable | + - | + - | + Output of the command, sent to the callback, can contain invalid UTF-8 data. + +|=== + +In Python 2, which is now deprecated and should not be used any more, the +strings sent to callbacks were always of type `str`, and may contain invalid +UTF-8 data, in the cases mentioned above. ==== Perl -* Funktionen werden im Format `weechat::xxx(arg1, arg2, ...);` ausgeführt +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat::xxx(arg1, arg2, ...);`. ==== Ruby -* Es muss _weechat_init_ definiert und darin die Funktion _register_ ausgeführt werden -* Funktionen werden im Format `Weechat.xxx(arg1, arg2, ...)` ausgeführt -* Aufgrund einer Limitierung, seitens Ruby (maximal 15 Argumente pro Funktion), empfängt - die Funktion `Weechat.config_new_option` den Callback in einem Array von 6 Strings - (3 Callbacks + 3 Data Strings), somit sieht ein Aufruf der Funktion folgendermaßen aus: +// TRANSLATION MISSING +===== Initialization + +You have to define _weechat_init_ and call _register_ inside. + +// TRANSLATION MISSING +===== Functions + +Functions are called with `Weechat.xxx(arg1, arg2, ...)`. + +Due to a limitation of Ruby (15 arguments max by function), the function +`Weechat.config_new_option` receives the callbacks in an array of 6 strings +(3 callbacks + 3 data strings), so a call to this function looks like: [source,ruby] ---- @@ -98,29 +172,46 @@ Weechat.config_new_option(config, section, "name", "string", "description of opt ==== Lua -* Funktionen werden im Format `weechat.xxx(arg1, arg2, ...)` ausgeführt +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...)`. ==== Tcl -* Funktionen werden im Format `weechat::xxx arg1 arg2 ...` ausgeführt +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat::xxx arg1 arg2 ...`. ==== Guile (Scheme) -* Funktionen werden im Format `(weechat:xxx arg1 arg2 ...)` ausgeführt -* folgende Funktionen nutzen eine Liste von Argumente (anstelle von vielen - Argumenten für andere Funktionen), dies liegt daran das Guile die Anzahl - der Argumente eingeschränkt ist: -** config_new_section -** config_new_option -** bar_new +// TRANSLATION MISSING +===== Functions + +Functions are called with `(weechat:xxx arg1 arg2 ...)`. + +The following functions take one list of arguments (instead of many arguments +for other functions), because number of arguments exceed number of allowed +arguments in Guile: + +* config_new_section +* config_new_option +* bar_new ==== JavaScript -* Funktionen werden im Format `weechat.xxx(arg1, arg2, ...);` ausgeführt +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...);`. ==== PHP -* Funktionen werden im Format `weechat_xxx(arg1, arg2, ...);` ausgeführt +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat_xxx(arg1, arg2, ...);`. [[register_function]] === Die "Register" Funktion @@ -1103,15 +1194,25 @@ weechat.prnt("", "Wert der Option weechat.color.chat_delimiters ist: %s" [[irc_catch_messages]] ==== Nachrichten abfangen -Die IRC Erweiterung sendet zwei Signale wenn eine Nachricht empfangen wurde. -`xxx` ist der interne IRC Servername, `yyy` ist der IRC Befehl der empfangen -wurde (JOIN, QUIT, PRIVMSG, 301, ..): +// TRANSLATION MISSING +IRC plugin sends four signals for a message received (`xxx` is IRC internal +server name, `yyy` is IRC command name like JOIN, QUIT, PRIVMSG, 301, ..): -xxxx,irc_in_yyy:: - Signal wird gesendet bevor die Nachricht verarbeitet wurde. +// TRANSLATION MISSING +xxx,irc_in_yyy:: + signal sent before processing message, only if message is *not* ignored +// TRANSLATION MISSING xxx,irc_in2_yyy:: - Signal wird gesendet nachdem die Nachricht verarbeitet wurde. + signal sent after processing message, only if message is *not* ignored + +// TRANSLATION MISSING +xxx,irc_raw_in_yyy:: + signal sent before processing message, even if message is ignored + +// TRANSLATION MISSING +xxx,irc_raw_in2_yyy:: + signal sent after processing message, even if message is ignored [source,python] ---- @@ -1133,8 +1234,19 @@ weechat.hook_signal("*,irc_in2_join", "join_cb", "") [[irc_modify_messages]] ==== Nachrichten ändern -Die IRC Erweiterung verschickt einen "modifier" mit Namen "irc_in_xxx" ("xxx" steht für den -Namen des IRC Befehls) falls eine Nachricht empfangen wurde die dann modifiziert werden kann. +// TRANSLATION MISSING +IRC plugin sends two "modifiers" for a message received ("xxx" is IRC command), +so that you can modify it: + +// TRANSLATION MISSING +irc_in_xxx:: + modifier sent before charset decoding: use with caution, the string may + contain invalid UTF-8 data; use only for raw operations on a message + +// TRANSLATION MISSING +irc_in2_xxx:: + modifier sent after charset decoding, so the string received is always + UTF-8 valid (*recommended*) [source,python] ---- @@ -1143,7 +1255,7 @@ def modifier_cb(data, modifier, modifier_data, string): # (Okay dies ist nicht wirklich sinnvoll, aber es ist auch nur ein Beispiel!) return "%s %s" % (string, modifier_data) -weechat.hook_modifier("irc_in_privmsg", "modifier_cb", "") +weechat.hook_modifier("irc_in2_privmsg", "modifier_cb", "") ---- [WARNING] diff --git a/doc/en/weechat_plugin_api.en.adoc b/doc/en/weechat_plugin_api.en.adoc index e6379b35889..287f10d928e 100644 --- a/doc/en/weechat_plugin_api.en.adoc +++ b/doc/en/weechat_plugin_api.en.adoc @@ -9871,12 +9871,16 @@ List of signals sent by WeeChat and plugins: | irc | xxx,irc_out_yyy ^(1)^ | String: message. | IRC message sent to server after automatic split - (to fit in 512 bytes by default). + (to fit in 512 bytes by default). + + *Warning:* the string may contain invalid UTF-8 data. + Signal "xxx,irc_out1_yyy" is recommended instead. | irc | xxx,irc_outtags_yyy ^(1)^ + _(WeeChat ≥ 0.3.4)_ | String: tags + ";" + message. | - Tags + IRC message sent to server. + Tags + IRC message sent to server. + + *Warning:* the string may contain invalid UTF-8 data. + Signal "xxx,irc_out1_yyy" is recommended instead. | irc | irc_ctcp | String: message. | @@ -11214,7 +11218,10 @@ List of modifiers used by WeeChat and plugins: | [[hook_modifier_irc_in_xxx]] irc_in_xxx ^(1)^ | Server name | - Content of message received from IRC server (before charset decoding). | + Content of message received from IRC server (before charset decoding). + + *Warning:* the string may contain invalid UTF-8 data; use only for raw + operations on a message. + Modifier <> is recommended instead. | New content of message. | [[hook_modifier_irc_in2_xxx]] irc_in2_xxx ^(1)^ + diff --git a/doc/en/weechat_scripting.en.adoc b/doc/en/weechat_scripting.en.adoc index 65c9f67b511..4f8da7faa0b 100644 --- a/doc/en/weechat_scripting.en.adoc +++ b/doc/en/weechat_scripting.en.adoc @@ -3,8 +3,9 @@ :email: flashcode@flashtux.org :lang: en :toc: left -:toclevels: 3 +:toclevels: 4 :sectnums: +:sectnumlevels: 3 :docinfo1: @@ -67,22 +68,89 @@ link:weechat_plugin_api.en.html#_hook_process[WeeChat plugin API reference]. ==== Python -* You have to `import weechat`. -* Functions `+print*+` are called `+prnt*+` in python (because _print_ is reserved - keyword). -* Functions are called with `weechat.xxx(arg1, arg2, ...)`. +===== Module + +WeeChat defines a `weechat` module which must be imported with `import weechat`. + +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...)`. + +Functions `+print*+` are called `+prnt*+` in python (because `print` was a +reserved keyword in Python 2). + +===== Strings received in callbacks + +In Python 3 and with WeeChat ≥ 2.7, the strings received in callbacks have type +`str` if the string has valid UTF-8 data (which is the most common case), +or `bytes` if the string is not UTF-8 valid. So the callback should take care +about this type if some invalid UTF-8 content can be received. + +Some invalid UTF-8 data may be received in these cases, so the callback can +receive a string of type `str` or `bytes` (this list is not exhaustive): + +[width="100%",cols="3m,3m,3m,8",options="header"] +|=== +| API function | Arguments | Examples | Description + +| hook_modifier | + irc_in_yyy | + pass:[irc_in_privmsg] + + pass:[irc_in_notice] | + A message received in IRC plugin, before it is decoded to UTF-8 (used + internally). + + + + It is recommended to use modifier `irc_in2_yyy` instead, the string received + is always UTF-8 valid. + + See function `hook_modifier` in the + link:weechat_plugin_api.en.html#_hook_modifier[WeeChat plugin API reference]. + +| hook_signal | + xxx,irc_out_yyy + + xxx,irc_outtags_yyy | + pass:[*,irc_out_privmsg] + + pass:[*,irc_out_notice] + + pass:[*,irc_outtags_privmsg] + + pass:[*,irc_outtags_notice] | + A message sent by IRC plugin, after it is encoded to the `encode` charset + defined by the user (if different from the default `UTF-8`). + + + + It is recommended to use signal `xxx,irc_out1_yyy` instead, the string received + is always UTF-8 valid. + + See function `hook_signal` in the + link:weechat_plugin_api.en.html#_hook_signal[WeeChat plugin API reference]. + +| hook_process + + hook_process_hashtable | + - | + - | + Output of the command, sent to the callback, can contain invalid UTF-8 data. + +|=== + +In Python 2, which is now deprecated and should not be used any more, the +strings sent to callbacks were always of type `str`, and may contain invalid +UTF-8 data, in the cases mentioned above. ==== Perl -* Functions are called with `weechat::xxx(arg1, arg2, ...);`. +===== Functions + +Functions are called with `weechat::xxx(arg1, arg2, ...);`. ==== Ruby -* You have to define _weechat_init_ and call _register_ inside. -* Functions are called with `Weechat.xxx(arg1, arg2, ...)`. -* Due to a limitation of Ruby (15 arguments max by function), the function - `Weechat.config_new_option` receives the callbacks in an array of 6 strings - (3 callbacks + 3 data strings), so a call to this function looks like: +===== Initialization + +You have to define _weechat_init_ and call _register_ inside. + +===== Functions + +Functions are called with `Weechat.xxx(arg1, arg2, ...)`. + +Due to a limitation of Ruby (15 arguments max by function), the function +`Weechat.config_new_option` receives the callbacks in an array of 6 strings +(3 callbacks + 3 data strings), so a call to this function looks like: [source,ruby] ---- @@ -92,29 +160,41 @@ Weechat.config_new_option(config, section, "name", "string", "description of opt ==== Lua -* Functions are called with `weechat.xxx(arg1, arg2, ...)`. +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...)`. ==== Tcl -* Functions are called with `weechat::xxx arg1 arg2 ...`. +===== Functions + +Functions are called with `weechat::xxx arg1 arg2 ...`. ==== Guile (Scheme) -* Functions are called with `(weechat:xxx arg1 arg2 ...)`. -* Following functions take one list of arguments (instead of many arguments - for other functions), because number of arguments exceed number of allowed - arguments in Guile: -** config_new_section -** config_new_option -** bar_new +===== Functions + +Functions are called with `(weechat:xxx arg1 arg2 ...)`. + +The following functions take one list of arguments (instead of many arguments +for other functions), because number of arguments exceed number of allowed +arguments in Guile: + +* config_new_section +* config_new_option +* bar_new ==== JavaScript -* Functions are called with `weechat.xxx(arg1, arg2, ...);`. +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...);`. ==== PHP -* Functions are called with `weechat_xxx(arg1, arg2, ...);`. +===== Functions + +Functions are called with `weechat_xxx(arg1, arg2, ...);`. [[register_function]] === Register function @@ -1081,14 +1161,20 @@ weechat.prnt("", "value of option weechat.color.chat_delimiters is: %s" [[irc_catch_messages]] ==== Catch messages -IRC plugin sends two signals for a message received (`xxx` is IRC internal +IRC plugin sends four signals for a message received (`xxx` is IRC internal server name, `yyy` is IRC command name like JOIN, QUIT, PRIVMSG, 301, ..): -xxxx,irc_in_yyy:: - signal sent before processing message +xxx,irc_in_yyy:: + signal sent before processing message, only if message is *not* ignored xxx,irc_in2_yyy:: - signal sent after processing message + signal sent after processing message, only if message is *not* ignored + +xxx,irc_raw_in_yyy:: + signal sent before processing message, even if message is ignored + +xxx,irc_raw_in2_yyy:: + signal sent after processing message, even if message is ignored [source,python] ---- @@ -1110,8 +1196,16 @@ weechat.hook_signal("*,irc_in2_join", "join_cb", "") [[irc_modify_messages]] ==== Modify messages -IRC plugin sends a "modifier" called "irc_in_xxx" ("xxx" is IRC command) for a -message received, so that you can modify it. +IRC plugin sends two "modifiers" for a message received ("xxx" is IRC command), +so that you can modify it: + +irc_in_xxx:: + modifier sent before charset decoding: use with caution, the string may + contain invalid UTF-8 data; use only for raw operations on a message + +irc_in2_xxx:: + modifier sent after charset decoding, so the string received is always + UTF-8 valid (*recommended*) [source,python] ---- @@ -1120,7 +1214,7 @@ def modifier_cb(data, modifier, modifier_data, string): # (OK that's not very useful, but that's just an example!) return "%s %s" % (string, modifier_data) -weechat.hook_modifier("irc_in_privmsg", "modifier_cb", "") +weechat.hook_modifier("irc_in2_privmsg", "modifier_cb", "") ---- [WARNING] diff --git a/doc/fr/weechat_plugin_api.fr.adoc b/doc/fr/weechat_plugin_api.fr.adoc index 8d0514afe26..74bf063d758 100644 --- a/doc/fr/weechat_plugin_api.fr.adoc +++ b/doc/fr/weechat_plugin_api.fr.adoc @@ -10072,12 +10072,16 @@ Liste des signaux envoyés par WeeChat et les extensions : _(WeeChat ≥ 0.3.7)_ | Chaîne : message. | Message IRC envoyé au serveur avant découpage automatique - (pour tenir dans les 512 octets par défaut). + (pour tenir dans les 512 octets par défaut). + + *Attention :* la chaîne peut contenir des données invalides UTF-8. + Le signal "xxx,irc_out1_yyy" est recommandé à la place de celui-ci. | irc | xxx,irc_out_yyy ^(1)^ | Chaîne : message. | Message IRC envoyé au serveur après découpage automatique - (pour tenir dans les 512 octets par défaut). + (pour tenir dans les 512 octets par défaut). + + *Attention :* la chaîne peut contenir des données invalides UTF-8. + Le signal "xxx,irc_out1_yyy" est recommandé à la place de celui-ci. | irc | xxx,irc_outtags_yyy ^(1)^ + _(WeeChat ≥ 0.3.4)_ | @@ -11449,7 +11453,11 @@ Liste des modificateurs utilisés par WeeChat et les extensions : | [[hook_modifier_irc_in_xxx]] irc_in_xxx ^(1)^ | Nom de serveur | - Contenu du message reçu du serveur IRC (avant décodage du jeu de caractères). | + Contenu du message reçu du serveur IRC (avant décodage du jeu de caractères). + + *Attention :* la chaîne peut contenir des données invalides UTF-8 ; à utiliser + seulement pour les opérations de bas niveau sur le message. + Le modificateur <> est recommandé à la + place de celui-ci. | Nouveau contenu du message. | [[hook_modifier_irc_in2_xxx]] irc_in2_xxx ^(1)^ + diff --git a/doc/fr/weechat_scripting.fr.adoc b/doc/fr/weechat_scripting.fr.adoc index 8e44561d15d..ea2dcc379d5 100644 --- a/doc/fr/weechat_scripting.fr.adoc +++ b/doc/fr/weechat_scripting.fr.adoc @@ -3,9 +3,10 @@ :email: flashcode@flashtux.org :lang: fr :toc: left -:toclevels: 3 +:toclevels: 4 :toc-title: Table des matières :sectnums: +:sectnumlevels: 3 :docinfo1: @@ -73,23 +74,93 @@ link:weechat_plugin_api.en.html#_hook_process[Référence API extension WeeChat] ==== Python -* Vous devez utiliser `import weechat`. -* Les fonctions `+print*+` se nomment `+prnt*+` en python (car _print_ est un mot - clé réservé). -* Les fonctions sont appelées par `weechat.xxx(arg1, arg2, ...)`. +===== Module + +WeeChat définit un module `weechat` qui doit être importé avec `import weechat`. + +===== Fonctions + +Les fonctions sont appelées avec `weechat.xxx(arg1, arg2, ...)`. + +Les fonctions `+print*+` se nomment `+prnt*+` en python (car `print` était un +mot clé réservé en Python 2). + +===== Chaînes reçues dans les fonctions de rappel + +En Python 3 et avec WeeChat ≥ 2.7, les chaînes reçues dans les fonctions de +rappel ont le type `str` si la chaîne a des données valides UTF-8 (ce qui est +le cas le plus courant) ou `bytes` si la chaîne n'est pas valide UTF-8. Donc la +fonction de rappel doit prendre en compte ce type si des données non valides +UTF-8 peuvent être reçues. + +Des données invalides UTF-8 peuvent être reçues dans ces cas, donc la fonction +de rappel peut recevoir une chaîne de type `str` ou `bytes` (cette liste n'est +pas exhaustive) : + +[width="100%",cols="3m,3m,3m,8",options="header"] +|=== +| Fonction API | Paramètres | Exemples | Description + +| hook_modifier | + irc_in_yyy | + pass:[irc_in_privmsg] + + pass:[irc_in_notice] | + Un message reçu dans l'extension IRC, avant qu'il ne soit décodé vers UTF-8. + + + + Il est recommandé d'utiliser plutôt le modificateur `irc_in2_yyy`, la chaîne + reçue sera toujours valide UTF-8. + + Voir la fonction `hook_modifier` dans la + link:weechat_plugin_api.fr.html#_hook_modifier[Référence API extension WeeChat]. + +| hook_signal | + xxx,irc_out_yyy + + xxx,irc_outtags_yyy | + pass:[*,irc_out_privmsg] + + pass:[*,irc_out_notice] + + pass:[*,irc_outtags_privmsg] + + pass:[*,irc_outtags_notice] | + Un message envoyé par l'extension IRC, après encodage vers le jeu de caractères + `encode` défini par l'utilisateur (si différent de `UTF-8`, qui est la valeur + par défaut). + + + + Il est recommandé d'utiliser plutôt le signal `xxx,irc_out1_yyy`, la chaîne + reçue sera toujours valide UTF-8. + + Voir la fonction `hook_signal` dans la + link:weechat_plugin_api.fr.html#_hook_signal[Référence API extension WeeChat]. + +| hook_process + + hook_process_hashtable | + - | + - | + La sortie de la commande, envoyée à la fonction de rappel, peut contenir des + données invalides UTF-8. + +|=== + +En Python 2, qui est déconseillé et ne devrait plus être utilisé, les chaînes +envoyées aux fonctions de rappel sont toujours de type `str`, et peuvent contenir +des données invalides UTF-8, dans les cas mentionnés ci-dessus. ==== Perl -* Les fonctions sont appelées par `weechat::xxx(arg1, arg2, ...);`. +===== Fonctions + +Les fonctions sont appelées par `weechat::xxx(arg1, arg2, ...);`. ==== Ruby -* Vous devez définir _weechat_init_ et appeler _register_ dedans. -* Les fonctions sont appelées par `Weechat.xxx(arg1, arg2, ...)`. -* En raison d'une limitation de Ruby (15 paramètres maximum par fonction), la - fonction `Weechat.config_new_option` reçoit les fonctions de rappel dans un tableau de - 6 chaînes de caractères (3 fonctions de rappel + 3 chaînes de données), donc un appel à - cette fonction ressemble à ceci : +===== Initialisation + +Vous devez définir _weechat_init_ et appeler _register_ dedans. + +===== Fonctions + +Les fonctions sont appelées par `Weechat.xxx(arg1, arg2, ...)`. + +En raison d'une limitation de Ruby (15 paramètres maximum par fonction), la +fonction `Weechat.config_new_option` reçoit les fonctions de rappel dans un +tableau de 6 chaînes de caractères (3 fonctions de rappel + 3 chaînes de +données), donc un appel à cette fonction ressemble à ceci : [source,ruby] ---- @@ -99,29 +170,41 @@ Weechat.config_new_option(config, section, "name", "string", "description of opt ==== Lua -* Les fonctions sont appelées par `weechat.xxx(arg1, arg2, ...)`. +===== Fonctions + +Les fonctions sont appelées par `weechat.xxx(arg1, arg2, ...)`. ==== Tcl -* Les fonctions sont appelées par `weechat::xxx arg1 arg2 ...`. +===== Fonctions + +Les fonctions sont appelées par `weechat::xxx arg1 arg2 ...`. ==== Guile (Scheme) -* Les fonctions sont appelées par `(weechat:xxx arg1 arg2 ...)`. -* Les fonctions suivantes prennent une liste de paramètres en entrée (au lieu - de plusieurs paramètres pour les autres fonctions), car le nombre de - paramètres excède la limite de Guile : -** config_new_section -** config_new_option -** bar_new +===== Fonctions + +Les fonctions sont appelées par `(weechat:xxx arg1 arg2 ...)`. + +Les fonctions suivantes prennent une liste de paramètres en entrée (au lieu de +plusieurs paramètres pour les autres fonctions), car le nombre de paramètres +excède la limite de Guile : + +* config_new_section +* config_new_option +* bar_new ==== JavaScript -* Les fonctions sont appelées par `weechat.xxx(arg1, arg2, ...);`. +===== Fonctions + +Les fonctions sont appelées par `weechat.xxx(arg1, arg2, ...);`. ==== PHP -* Les fonctions sont appelées par `weechat_xxx(arg1, arg2, ...);`. +===== Fonctions + +Les fonctions sont appelées par `weechat_xxx(arg1, arg2, ...);`. [[register_function]] === Fonction register @@ -1109,15 +1192,23 @@ weechat.prnt("", "la valeur de l'option weechat.color.chat_delimiters est : %s" [[irc_catch_messages]] ==== Intercepter des messages -L'extension IRC envoie deux signaux pour un message reçu (`xxx` est le nom +L'extension IRC envoie quatre signaux pour un message reçu (`xxx` est le nom interne du serveur IRC, `yyy` est le nom de la commande IRC comme JOIN, QUIT, PRIVMSG, 301, ..) : -xxxx,irc_in_yyy:: - signal envoyé avant traitement du message +xxx,irc_in_yyy:: + signal envoyé avant traitement du message, uniquement si le message n'est + *pas* ignoré xxx,irc_in2_yyy:: - message sent après traitement du message + signal envoyé après traitement du message, uniquement si le message n'est + *pas* ignoré + +xxx,irc_raw_in_yyy:: + signal envoyé avant traitement du message, même si le message est ignoré + +xxx,irc_raw_in2_yyy:: + signal envoyé après traitement du message, même si le message est ignoré [source,python] ---- @@ -1139,8 +1230,17 @@ weechat.hook_signal("*,irc_in2_join", "join_cb", "") [[irc_modify_messages]] ==== Modifier des messages -L'extension IRC envoie un modificateur appelé "irc_in_xxx" ("xxx" est la -commande IRC) pour un message reçu, de sorte que vous puissiez le modifier. +L'extension IRC envoie deux modificateurs pour un message reçu ("xxx" est la +commande IRC), de sorte que vous puissiez le modifier : + +irc_in_xxx:: + modificateur envoyé avant le décodage du jeu de caractères : à utiliser avec + précaution, la chaîne peut contenir des données invalides UTF-8 ; à utiliser + seulement pour les opérations de bas niveau sur le message + +irc_in2_xxx:: + modificateur envoyé après décodage du jeu de caractères, donc la chaîne + reçue est toujours valide UTF-8 (*recommendé*) [source,python] ---- @@ -1149,7 +1249,7 @@ def modifier_cb(data, modifier, modifier_data, string): # (ok ce n'est pas très utile, mais c'est juste un exemple !) return "%s %s" % (string, modifier_data) -weechat.hook_modifier("irc_in_privmsg", "modifier_cb", "") +weechat.hook_modifier("irc_in2_privmsg", "modifier_cb", "") ---- [WARNING] diff --git a/doc/it/weechat_plugin_api.it.adoc b/doc/it/weechat_plugin_api.it.adoc index 39ed5c073e3..4e5b32dc5c9 100644 --- a/doc/it/weechat_plugin_api.it.adoc +++ b/doc/it/weechat_plugin_api.it.adoc @@ -10209,12 +10209,17 @@ List of signals sent by WeeChat and plugins: | irc | xxx,irc_out_yyy ^(1)^ | String: messaggio. | IRC message sent to server after automatic split - (to fit in 512 bytes by default). + (to fit in 512 bytes by default). + + *Warning:* the string may contain invalid UTF-8 data. + Signal "xxx,irc_out1_yyy" is recommended instead. +// TRANSLATION MISSING | irc | xxx,irc_outtags_yyy ^(1)^ + _(WeeChat ≥ 0.3.4)_ | Stringa: tag + ";" + messaggio. | - Tag + messaggio IRC inviato al server. + Tag + messaggio IRC inviato al server. + + *Warning:* the string may contain invalid UTF-8 data. + Signal "xxx,irc_out1_yyy" is recommended instead. | irc | irc_ctcp | String: messaggio. | @@ -11663,9 +11668,13 @@ List of modifiers used by WeeChat and plugins: |=== | Modificatore | Dati modificatore | Stringa | Output +// TRANSLATION MISSING | [[hook_modifier_irc_in_xxx]] irc_in_xxx ^(1)^ | Nome server | - Contenuto del messaggio ricevuto dal server IRC (prima della codifica del set caratteri). | + Contenuto del messaggio ricevuto dal server IRC (prima della codifica del set caratteri). + + *Warning:* the string may contain invalid UTF-8 data; use only for raw + operations on a message. + Modifier <> is recommended instead. | Nuovo contenuto del messaggio. | [[hook_modifier_irc_in2_xxx]] irc_in2_xxx ^(1)^ + diff --git a/doc/it/weechat_scripting.it.adoc b/doc/it/weechat_scripting.it.adoc index e4f3d0b85ea..8c7dba6e31a 100644 --- a/doc/it/weechat_scripting.it.adoc +++ b/doc/it/weechat_scripting.it.adoc @@ -3,9 +3,10 @@ :email: flashcode@flashtux.org :lang: it :toc: left -:toclevels: 3 +:toclevels: 4 :toc-title: Indice :sectnums: +:sectnumlevels: 3 :docinfo1: @@ -76,23 +77,95 @@ link:weechat_plugin_api.it.html#_hook_process[WeeChat plugin API reference]. ==== Python -* E necessario `import weechat` -* Le funzioni `+print*+` sono chiamate `+prnt*+` in python (dato che _print_ - è una parola riservata) -* Le funzioni sono chiamate con `weechat.xxx(arg1, arg2, ...)` +// TRANSLATION MISSING +===== Module + +WeeChat defines a `weechat` module which must be imported with `import weechat`. + +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...)`. + +Functions `+print*+` are called `+prnt*+` in python (because `print` was a +reserved keyword in Python 2). + +// TRANSLATION MISSING +===== Strings received in callbacks + +In Python 3 and with WeeChat ≥ 2.7, the strings received in callbacks have type +`str` if the string has valid UTF-8 data (which is the most common case), +or `bytes` if the string is not UTF-8 valid. So the callback should take care +about this type if some invalid UTF-8 content can be received. + +Some invalid UTF-8 data may be received in these cases, so the callback can +receive a string of type `str` or `bytes` (this list is not exhaustive): + +[width="100%",cols="3m,3m,3m,8",options="header"] +|=== +| API function | Arguments | Examples | Description + +| hook_modifier | + irc_in_yyy | + pass:[irc_in_privmsg] + + pass:[irc_in_notice] | + A message received in IRC plugin, before it is decoded to UTF-8 (used + internally). + + + + It is recommended to use modifier `irc_in2_yyy` instead, the string received + is always UTF-8 valid. + + See function `hook_modifier` in the + link:weechat_plugin_api.en.html#_hook_modifier[WeeChat plugin API reference]. + +| hook_signal | + xxx,irc_out_yyy + + xxx,irc_outtags_yyy | + pass:[*,irc_out_privmsg] + + pass:[*,irc_out_notice] + + pass:[*,irc_outtags_privmsg] + + pass:[*,irc_outtags_notice] | + A message sent by IRC plugin, after it is encoded to the `encode` charset + defined by the user (if different from the default `UTF-8`). + + + + It is recommended to use signal `xxx,irc_out1_yyy` instead, the string received + is always UTF-8 valid. + + See function `hook_signal` in the + link:weechat_plugin_api.en.html#_hook_signal[WeeChat plugin API reference]. + +| hook_process + + hook_process_hashtable | + - | + - | + Output of the command, sent to the callback, can contain invalid UTF-8 data. + +|=== + +In Python 2, which is now deprecated and should not be used any more, the +strings sent to callbacks were always of type `str`, and may contain invalid +UTF-8 data, in the cases mentioned above. ==== Perl -* Le funzioni sono chiamate con `weechat::xxx(arg1, arg2, ...);` +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat::xxx(arg1, arg2, ...);`. ==== Ruby -* E necessario definire _weechat_init_ e chiamare _register_ all'interno -* Le funzioni sono chiamate con `Weechat.xxx(arg1, arg2, ...)` -* A causa di una limitazione di Ruby (massimo 15 argomenti per funzione), la - funzione `WeeChat.config_new_option` riceve le callback in un array di 6 - stringhe (3 callback + 3 stringhe di dati), così che una chiamata a questa - funzione appare come: +// TRANSLATION MISSING +===== Initialization + +You have to define _weechat_init_ and call _register_ inside. + +// TRANSLATION MISSING +===== Functions + +Functions are called with `Weechat.xxx(arg1, arg2, ...)`. + +Due to a limitation of Ruby (15 arguments max by function), the function +`Weechat.config_new_option` receives the callbacks in an array of 6 strings +(3 callbacks + 3 data strings), so a call to this function looks like: [source,ruby] ---- @@ -102,29 +175,46 @@ Weechat.config_new_option(config, section, "name", "string", "description of opt ==== Lua -* Le funzioni sono chiamate con `weechat.xxx(arg1, arg2, ...)` +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...)`. ==== Tcl -* Le funzioni sono chiamate con `weechat::xxx arg1 arg2 ...` +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat::xxx arg1 arg2 ...`. ==== Guile (Scheme) -* Le funzioni sono chiamate con `(weechat:xxx arg1 arg2 ...)` -* Le seguenti funzioni prendono un elenco di argomenti (invece di più argomenti - come per le altre funzioni), poiché il numero di argomenti eccede il numero - di argomenti consentiti in Guile: -** config_new_section -** config_new_option -** bar_new +// TRANSLATION MISSING +===== Functions + +Functions are called with `(weechat:xxx arg1 arg2 ...)`. + +The following functions take one list of arguments (instead of many arguments +for other functions), because number of arguments exceed number of allowed +arguments in Guile: + +* config_new_section +* config_new_option +* bar_new ==== JavaScript -* Le funzioni sono chiamate con `weechat.xxx(arg1, arg2, ...);` +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...);`. ==== PHP -* Le funzioni sono chiamate con `weechat_xxx(arg1, arg2, ...);` +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat_xxx(arg1, arg2, ...);`. [[register_function]] === Registrare una funzione @@ -1114,15 +1204,25 @@ weechat.prnt("", "value of option weechat.color.chat_delimiters is: %s" [[irc_catch_messages]] ==== Catturare messaggi -Il plugin IRC invia due segnali per un messaggio ricevuto (`xxx` è il nome -interno del server IRC, `yyy` è il nome del comando IRC come JOIN, QUIT, -PRIVMSG, 301, ..): +// TRANSLATION MISSING +IRC plugin sends four signals for a message received (`xxx` is IRC internal +server name, `yyy` is IRC command name like JOIN, QUIT, PRIVMSG, 301, ..): -xxxx,irc_in_yyy:: - segnale inviato prima di esaminare il messaggio +// TRANSLATION MISSING +xxx,irc_in_yyy:: + signal sent before processing message, only if message is *not* ignored +// TRANSLATION MISSING xxx,irc_in2_yyy:: - segnale inviato dopo aver esaminato il messaggio + signal sent after processing message, only if message is *not* ignored + +// TRANSLATION MISSING +xxx,irc_raw_in_yyy:: + signal sent before processing message, even if message is ignored + +// TRANSLATION MISSING +xxx,irc_raw_in2_yyy:: + signal sent after processing message, even if message is ignored [source,python] ---- @@ -1144,8 +1244,19 @@ weechat.hook_signal("*,irc_in2_join", "join_cb", "") [[irc_modify_messages]] ==== Modificare i messaggi -Il plugin IRC invia un "modificatore" chiamato "irc_in_xxx" ("xxx" è il comando -IRC) per un messaggio ricevuto, in modo da poterlo modificare. +// TRANSLATION MISSING +IRC plugin sends two "modifiers" for a message received ("xxx" is IRC command), +so that you can modify it: + +// TRANSLATION MISSING +irc_in_xxx:: + modifier sent before charset decoding: use with caution, the string may + contain invalid UTF-8 data; use only for raw operations on a message + +// TRANSLATION MISSING +irc_in2_xxx:: + modifier sent after charset decoding, so the string received is always + UTF-8 valid (*recommended*) [source,python] ---- @@ -1154,7 +1265,7 @@ def modifier_cb(data, modifier, modifier_data, string): # (ok non è molto utile, ma è solo un esempio!) return "%s %s" % (string, modifier_data) -weechat.hook_modifier("irc_in_privmsg", "modifier_cb", "") +weechat.hook_modifier("irc_in2_privmsg", "modifier_cb", "") ---- [WARNING] diff --git a/doc/ja/weechat_plugin_api.ja.adoc b/doc/ja/weechat_plugin_api.ja.adoc index bc1dedf7ec5..b3e16cbe8bc 100644 --- a/doc/ja/weechat_plugin_api.ja.adoc +++ b/doc/ja/weechat_plugin_api.ja.adoc @@ -9844,15 +9844,21 @@ WeeChat とプラグインが送信するシグナルのリスト: サーバに送信する IRC メッセージ (自動分割前、自動分割はデフォルトでメッセージを 512 バイト内に収まるように分割します)。 +// TRANSLATION MISSING | irc | xxx,irc_out_yyy ^(1)^ | String: メッセージ | サーバに送信する IRC メッセージ - (自動分割後、自動分割はデフォルトでメッセージを 512 バイト内に収まるように分割します)。 + (自動分割後、自動分割はデフォルトでメッセージを 512 バイト内に収まるように分割します)。 + + *Warning:* the string may contain invalid UTF-8 data. + Signal "xxx,irc_out1_yyy" is recommended instead. +// TRANSLATION MISSING | irc | xxx,irc_outtags_yyy ^(1)^ + _(WeeChat バージョン 0.3.4 以上で利用可)_ | String: タグ + ";" + メッセージ | - タグ + サーバに送信する IRC メッセージ + タグ + サーバに送信する IRC メッセージ + + *Warning:* the string may contain invalid UTF-8 data. + Signal "xxx,irc_out1_yyy" is recommended instead. | irc | irc_ctcp | String: メッセージ | @@ -11188,9 +11194,13 @@ WeeChat とプラグインが使う修飾子のリスト: |=== | 修飾子 | 修飾子データ | 文字列 | 出力 +// TRANSLATION MISSING | [[hook_modifier_irc_in_xxx]] irc_in_xxx ^(1)^ | サーバ名 | - IRC サーバから受信したメッセージの内容 (文字セットをデコードする前) | + IRC サーバから受信したメッセージの内容 (文字セットをデコードする前) + + *Warning:* the string may contain invalid UTF-8 data; use only for raw + operations on a message. + Modifier <> is recommended instead. | メッセージの新しい内容 | [[hook_modifier_irc_in2_xxx]] irc_in2_xxx ^(1)^ + diff --git a/doc/ja/weechat_scripting.ja.adoc b/doc/ja/weechat_scripting.ja.adoc index 5e97a45179b..b9ea20136e9 100644 --- a/doc/ja/weechat_scripting.ja.adoc +++ b/doc/ja/weechat_scripting.ja.adoc @@ -3,9 +3,10 @@ :email: flashcode@flashtux.org :lang: ja :toc: left -:toclevels: 3 +:toclevels: 4 :toc-title: 目次 :sectnums: +:sectnumlevels: 3 :docinfo1: @@ -73,22 +74,95 @@ link:weechat_plugin_api.ja.html#_hook_process[WeeChat プラグイン API リフ ==== Python -* 必ず `import weechat` を使ってください。 -* python では `+print*+` 系の関数は `+prnt*+` と書きます - (_print_ は予約済みキーワードなので)。 -* 関数は `weechat.xxx(arg1, arg2, ...)` のように呼び出してください。 +// TRANSLATION MISSING +===== Module + +WeeChat defines a `weechat` module which must be imported with `import weechat`. + +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...)`. + +Functions `+print*+` are called `+prnt*+` in python (because `print` was a +reserved keyword in Python 2). + +// TRANSLATION MISSING +===== Strings received in callbacks + +In Python 3 and with WeeChat ≥ 2.7, the strings received in callbacks have type +`str` if the string has valid UTF-8 data (which is the most common case), +or `bytes` if the string is not UTF-8 valid. So the callback should take care +about this type if some invalid UTF-8 content can be received. + +Some invalid UTF-8 data may be received in these cases, so the callback can +receive a string of type `str` or `bytes` (this list is not exhaustive): + +[width="100%",cols="3m,3m,3m,8",options="header"] +|=== +| API function | Arguments | Examples | Description + +| hook_modifier | + irc_in_yyy | + pass:[irc_in_privmsg] + + pass:[irc_in_notice] | + A message received in IRC plugin, before it is decoded to UTF-8 (used + internally). + + + + It is recommended to use modifier `irc_in2_yyy` instead, the string received + is always UTF-8 valid. + + See function `hook_modifier` in the + link:weechat_plugin_api.en.html#_hook_modifier[WeeChat plugin API reference]. + +| hook_signal | + xxx,irc_out_yyy + + xxx,irc_outtags_yyy | + pass:[*,irc_out_privmsg] + + pass:[*,irc_out_notice] + + pass:[*,irc_outtags_privmsg] + + pass:[*,irc_outtags_notice] | + A message sent by IRC plugin, after it is encoded to the `encode` charset + defined by the user (if different from the default `UTF-8`). + + + + It is recommended to use signal `xxx,irc_out1_yyy` instead, the string received + is always UTF-8 valid. + + See function `hook_signal` in the + link:weechat_plugin_api.en.html#_hook_signal[WeeChat plugin API reference]. + +| hook_process + + hook_process_hashtable | + - | + - | + Output of the command, sent to the callback, can contain invalid UTF-8 data. + +|=== + +In Python 2, which is now deprecated and should not be used any more, the +strings sent to callbacks were always of type `str`, and may contain invalid +UTF-8 data, in the cases mentioned above. ==== Perl -* 関数は `weechat::xxx(arg1, arg2, ...);` のように呼び出してください。 +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat::xxx(arg1, arg2, ...);`. ==== Ruby -* _weechat_init_ を定義して、内部で _register_ を呼び出してください。 -* 関数は `Weechat.xxx(arg1, arg2, ...)` のように呼び出してください。 -* Ruby では関数に渡せる引数の数が最大 15 個に制限されているため、`Weechat.config_new_option` - 関数はコールバック用の引数群を 6 個の文字列からなる 1 個の配列で受け取ります (3 個のコールバック - + 3 個のデータ文字列)、したがって `Weechat.config_new_option` 関数を呼び出すには以下のようにしてください: +// TRANSLATION MISSING +===== Initialization + +You have to define _weechat_init_ and call _register_ inside. + +// TRANSLATION MISSING +===== Functions + +Functions are called with `Weechat.xxx(arg1, arg2, ...)`. + +Due to a limitation of Ruby (15 arguments max by function), the function +`Weechat.config_new_option` receives the callbacks in an array of 6 strings +(3 callbacks + 3 data strings), so a call to this function looks like: [source,ruby] ---- @@ -98,29 +172,46 @@ Weechat.config_new_option(config, section, "name", "string", "description of opt ==== Lua -* 関数は `weechat.xxx(arg1, arg2, ...)` のように呼び出してください。 +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...)`. ==== Tcl -* 関数は `weechat::xxx arg1 arg2 ...` のように呼び出してください。 +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat::xxx arg1 arg2 ...`. ==== Guile (Scheme) -* 関数は `(weechat:xxx arg1 arg2 ...)` のように呼び出してください。 -* 以下の関数は引数のリストをひとつだけ取ります - (他の関数のように多くの引数を取れません)、この理由は引数の個数が - Guile で利用できる引数の数を超えるからです。 -** config_new_section -** config_new_option -** bar_new +// TRANSLATION MISSING +===== Functions + +Functions are called with `(weechat:xxx arg1 arg2 ...)`. + +The following functions take one list of arguments (instead of many arguments +for other functions), because number of arguments exceed number of allowed +arguments in Guile: + +* config_new_section +* config_new_option +* bar_new ==== JavaScript -* 関数は `weechat.xxx(arg1, arg2, ...);` のように呼び出してください。 +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...);`. ==== PHP -* 関数は `weechat_xxx(arg1, arg2, ...);` のように呼び出してください。 +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat_xxx(arg1, arg2, ...);`. [[register_function]] === 関数の登録 @@ -1089,14 +1180,25 @@ weechat.prnt("", "value of option weechat.color.chat_delimiters is: %s" [[irc_catch_messages]] ==== メッセージのキャッチ -メッセージを受信すると IRC プラグインは 2 つのシグナルを送信します (`xxx` -は IRC 内部サーバ名で、`yyy` は JOIN、QUIT、PRIVMSG、301 等の IRC コマンド名です): +// TRANSLATION MISSING +IRC plugin sends four signals for a message received (`xxx` is IRC internal +server name, `yyy` is IRC command name like JOIN, QUIT, PRIVMSG, 301, ..): -xxxx,irc_in_yyy:: - メッセージの処理が行われる前に送信されるシグナル +// TRANSLATION MISSING +xxx,irc_in_yyy:: + signal sent before processing message, only if message is *not* ignored +// TRANSLATION MISSING xxx,irc_in2_yyy:: - メッセージの処理が行われた後に送信されるシグナル + signal sent after processing message, only if message is *not* ignored + +// TRANSLATION MISSING +xxx,irc_raw_in_yyy:: + signal sent before processing message, even if message is ignored + +// TRANSLATION MISSING +xxx,irc_raw_in2_yyy:: + signal sent after processing message, even if message is ignored [source,python] ---- @@ -1118,8 +1220,19 @@ weechat.hook_signal("*,irc_in2_join", "join_cb", "") [[irc_modify_messages]] ==== メッセージの修正 -メッセージを受信すると IRC プラグインは "irc_in_xxx" ("xxx" は IRC コマンド) -と呼ばれる "modifier" を送信します。メッセージを修正するにはこのシグナルを使います。 +// TRANSLATION MISSING +IRC plugin sends two "modifiers" for a message received ("xxx" is IRC command), +so that you can modify it: + +// TRANSLATION MISSING +irc_in_xxx:: + modifier sent before charset decoding: use with caution, the string may + contain invalid UTF-8 data; use only for raw operations on a message + +// TRANSLATION MISSING +irc_in2_xxx:: + modifier sent after charset decoding, so the string received is always + UTF-8 valid (*recommended*) [source,python] ---- @@ -1128,7 +1241,7 @@ def modifier_cb(data, modifier, modifier_data, string): # (これは役に立ちませんが、例として!) return "%s %s" % (string, modifier_data) -weechat.hook_modifier("irc_in_privmsg", "modifier_cb", "") +weechat.hook_modifier("irc_in2_privmsg", "modifier_cb", "") ---- [WARNING] diff --git a/doc/pl/weechat_scripting.pl.adoc b/doc/pl/weechat_scripting.pl.adoc index e5941e906b8..72738725411 100644 --- a/doc/pl/weechat_scripting.pl.adoc +++ b/doc/pl/weechat_scripting.pl.adoc @@ -3,9 +3,10 @@ :email: flashcode@flashtux.org :lang: pl :toc: left -:toclevels: 3 +:toclevels: 4 :toc-title: Spis treści :sectnums: +:sectnumlevels: 3 :docinfo1: @@ -73,54 +74,144 @@ link:weechat_plugin_api.en.html#_hook_process[Opisu API wtyczek WeeChat] (Angiel ==== Python -* Należy wykonać `import weechat` -* Funkcje `+print*+` są nazwane `+prnt*+` w pythonie (ponieważ _print_ jest zastrzeżonym - słowem kluczowym) -* Funkcje są wywoływane za pomocą `weechat.xxx(arg1, arg2, ...)` +// TRANSLATION MISSING +===== Module + +WeeChat defines a `weechat` module which must be imported with `import weechat`. + +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...)`. + +Functions `+print*+` are called `+prnt*+` in python (because `print` was a +reserved keyword in Python 2). + +// TRANSLATION MISSING +===== Strings received in callbacks + +In Python 3 and with WeeChat ≥ 2.7, the strings received in callbacks have type +`str` if the string has valid UTF-8 data (which is the most common case), +or `bytes` if the string is not UTF-8 valid. So the callback should take care +about this type if some invalid UTF-8 content can be received. + +Some invalid UTF-8 data may be received in these cases, so the callback can +receive a string of type `str` or `bytes` (this list is not exhaustive): + +[width="100%",cols="3m,3m,3m,8",options="header"] +|=== +| API function | Arguments | Examples | Description + +| hook_modifier | + irc_in_yyy | + pass:[irc_in_privmsg] + + pass:[irc_in_notice] | + A message received in IRC plugin, before it is decoded to UTF-8 (used + internally). + + + + It is recommended to use modifier `irc_in2_yyy` instead, the string received + is always UTF-8 valid. + + See function `hook_modifier` in the + link:weechat_plugin_api.en.html#_hook_modifier[WeeChat plugin API reference]. + +| hook_signal | + xxx,irc_out_yyy + + xxx,irc_outtags_yyy | + pass:[*,irc_out_privmsg] + + pass:[*,irc_out_notice] + + pass:[*,irc_outtags_privmsg] + + pass:[*,irc_outtags_notice] | + A message sent by IRC plugin, after it is encoded to the `encode` charset + defined by the user (if different from the default `UTF-8`). + + + + It is recommended to use signal `xxx,irc_out1_yyy` instead, the string received + is always UTF-8 valid. + + See function `hook_signal` in the + link:weechat_plugin_api.en.html#_hook_signal[WeeChat plugin API reference]. + +| hook_process + + hook_process_hashtable | + - | + - | + Output of the command, sent to the callback, can contain invalid UTF-8 data. + +|=== + +In Python 2, which is now deprecated and should not be used any more, the +strings sent to callbacks were always of type `str`, and may contain invalid +UTF-8 data, in the cases mentioned above. ==== Perl -* Funkcje są wywoływane za pomocą `weechat::xxx(arg1, arg2, ...);` +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat::xxx(arg1, arg2, ...);`. ==== Ruby -* Trzeba zdefiniować _weechat_init_ i wywołać _register_ wewnątrz -* Funkcje są wywoływane za pomocą `Weechat.xxx(arg1, arg2, ...)` -* W związku z ograniczeniami Ruby (maksymalnie 15 argumentów dla funkcji), funkcja - `Weechat.config_new_option` otrzymuje callbacki w postaci tablicy 6 ciągów - (3 callbacki + 3 ciągi danych), wywołanie tej funkcji wygląda następująco: +// TRANSLATION MISSING +===== Initialization + +You have to define _weechat_init_ and call _register_ inside. + +// TRANSLATION MISSING +===== Functions + +Functions are called with `Weechat.xxx(arg1, arg2, ...)`. + +Due to a limitation of Ruby (15 arguments max by function), the function +`Weechat.config_new_option` receives the callbacks in an array of 6 strings +(3 callbacks + 3 data strings), so a call to this function looks like: [source,ruby] ---- -Weechat.config_new_option(config, section, "nazwa", "ciąg", "opis opcji", "", 0, 0, - "wartość", "wartość", 0, ["check_cb", "", "change_cb", "", "delete_cb", ""]) +Weechat.config_new_option(config, section, "name", "string", "description of option", "", 0, 0, + "value", "value", 0, ["check_cb", "", "change_cb", "", "delete_cb", ""]) ---- ==== Lua -* Funkcje są wywoływane za pomocą `weechat.xxx(arg1, arg2, ...)` +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...)`. ==== Tcl -* Funkcje są wywoływane za pomocą `weechat::xxx arg1 arg2 ...` +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat::xxx arg1 arg2 ...`. ==== Guile (Scheme) -* Funkcje są wywoływane za pomocą `(weechat:xxx arg1 arg2 ...)` -* Następujące funkcje przyjmują pojedynczą listę argumentów (zamiast wielu - argumentów dla innych funkcji), ponieważ ilość argumentów przekracza ilość - argumentów dozwolonych w Guile: -** config_new_section -** config_new_option -** bar_new +// TRANSLATION MISSING +===== Functions + +Functions are called with `(weechat:xxx arg1 arg2 ...)`. + +The following functions take one list of arguments (instead of many arguments +for other functions), because number of arguments exceed number of allowed +arguments in Guile: + +* config_new_section +* config_new_option +* bar_new ==== JavaScript -* Funkcje są wywoływane za pomocą `weechat.xxx(arg1, arg2, ...);` +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat.xxx(arg1, arg2, ...);`. ==== PHP -* Funkcje są wywoływane za pomocą `weechat_xxx(arg1, arg2, ...);` +// TRANSLATION MISSING +===== Functions + +Functions are called with `weechat_xxx(arg1, arg2, ...);`. [[register_function]] === Funkcja rejestrująca @@ -1087,14 +1178,25 @@ weechat.prnt("", "wartość opcji weechat.color.chat_delimiters to: %s" [[irc_catch_messages]] ==== Przechwytywanie wiadomości -Wtyczka IRC wysyła dwa sygnały dla otrzymanej wiadomości (`xxx` jest wewnętrzną - nazwą serwera IRC, `yyy` to komenda IRC jak JOIN, QUIT, PRIVMSG, 301, ..): +// TRANSLATION MISSING +IRC plugin sends four signals for a message received (`xxx` is IRC internal +server name, `yyy` is IRC command name like JOIN, QUIT, PRIVMSG, 301, ..): -xxxx,irc_in_yyy:: - sygnał wysłany przed przetworzeniem wiadomości +// TRANSLATION MISSING +xxx,irc_in_yyy:: + signal sent before processing message, only if message is *not* ignored +// TRANSLATION MISSING xxx,irc_in2_yyy:: - sygnał wysłany po przetworzeniu wiadomości + signal sent after processing message, only if message is *not* ignored + +// TRANSLATION MISSING +xxx,irc_raw_in_yyy:: + signal sent before processing message, even if message is ignored + +// TRANSLATION MISSING +xxx,irc_raw_in2_yyy:: + signal sent after processing message, even if message is ignored [source,python] ---- @@ -1116,8 +1218,19 @@ weechat.hook_signal("*,irc_in2_join", "join_cb", "") [[irc_modify_messages]] ==== Modyfikowanie wiadomości -Wtyczka IRC wysyła "modyfikator" nazwany "irc_in_xxx" ("xxx" to komenda IRC) dla -otrzymanej wiadomości, żeby można było ją zmodyfikować. +// TRANSLATION MISSING +IRC plugin sends two "modifiers" for a message received ("xxx" is IRC command), +so that you can modify it: + +// TRANSLATION MISSING +irc_in_xxx:: + modifier sent before charset decoding: use with caution, the string may + contain invalid UTF-8 data; use only for raw operations on a message + +// TRANSLATION MISSING +irc_in2_xxx:: + modifier sent after charset decoding, so the string received is always + UTF-8 valid (*recommended*) [source,python] ---- @@ -1126,7 +1239,7 @@ def modifier_cb(data, modifier, modifier_data, string): # (nie jest to może bardzo przydatne, ale to tylko przykład!) return "%s %s" % (string, modifier_data) -weechat.hook_modifier("irc_in_privmsg", "modifier_cb", "") +weechat.hook_modifier("irc_in2_privmsg", "modifier_cb", "") ---- [WARNING] diff --git a/src/plugins/python/weechat-python.c b/src/plugins/python/weechat-python.c index 34ad5f15b5c..52be4d1b0db 100644 --- a/src/plugins/python/weechat-python.c +++ b/src/plugins/python/weechat-python.c @@ -446,12 +446,13 @@ weechat_python_output (PyObject *self, PyObject *args) void * weechat_python_exec (struct t_plugin_script *script, int ret_type, const char *function, - char *format, void **argv) + const char *format, void **argv) { struct t_plugin_script *old_python_current_script; PyThreadState *old_interpreter; PyObject *evMain, *evDict, *evFunc, *rc; void *argv2[16], *ret_value, *ret_temp; + char format2[17]; int i, argc, *ret_int; ret_value = NULL; @@ -485,9 +486,33 @@ weechat_python_exec (struct t_plugin_script *script, argc = strlen (format); for (i = 0; i < 16; i++) { - argv2[i] = (i < argc) ? argv[i] : NULL; + if (i < argc) + { + argv2[i] = argv[i]; + if (format[i] == 's') + { +#if PY_MAJOR_VERSION >= 3 + if (weechat_utf8_is_valid (argv2[i], -1, NULL)) + format2[i] = 's'; /* Python 3: str */ + else + format2[i] = 'y'; /* Python 3: bytes */ +#else + format2[i] = 's'; /* Python 2: str */ +#endif + } + else + { + format2[i] = format[i]; + } + } + else + { + argv2[i] = NULL; + } } - rc = PyObject_CallFunction (evFunc, format, + format2[argc] = '\0'; + + rc = PyObject_CallFunction (evFunc, format2, argv2[0], argv2[1], argv2[2], argv2[3], argv2[4], argv2[5], diff --git a/src/plugins/python/weechat-python.h b/src/plugins/python/weechat-python.h index ed35f7bca77..4437e4ba437 100644 --- a/src/plugins/python/weechat-python.h +++ b/src/plugins/python/weechat-python.h @@ -61,6 +61,6 @@ extern struct t_hashtable *weechat_python_dict_to_hashtable (PyObject *dict, const char *type_values); extern void *weechat_python_exec (struct t_plugin_script *script, int ret_type, const char *function, - char *format, void **argv); + const char *format, void **argv); #endif /* WEECHAT_PLUGIN_PYTHON_H */