core: add support of logical and/or for argument "tags" in function hook_print

v2.8-utf8proc
Sebastien Helleu 2013-12-15 19:52:20 +01:00
parent 2f3d712a62
commit f44cf6ac3c
6 changed files with 58 additions and 51 deletions

View File

@ -11,6 +11,7 @@ http://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes]
== Version 0.4.3 (under dev)
* core: add support of logical and/or for argument "tags" in function hook_print
* core: rename buffer property "highlight_tags" to "highlight_tags_restrict",
new behavior for buffer property "highlight_tags" (force highlight on tags),
rename option irc.look.highlight_tags to irc.look.highlight_tags_restrict

View File

@ -7334,8 +7334,12 @@ struct t_hook *weechat_hook_print (struct t_gui_buffer *buffer,
Arguments:
* 'buffer': buffer pointer, if NULL, messages from any buffer are caught
* 'tags': only messages with these tags (comma separated list) will be caught
(optional)
* 'tags': catch only messages with these tags (optional):
** with WeeChat ≥ 0.4.3: comma-separated list of tags that must be in message
(logical "or"); it is possible to combine many tags as a logical "and" with
separator "+"; each tag can start or end with "*" to match many tags
** with WeeChat ≤ 0.4.2: comma-separated list of tags that must all be in
message (logical "and")
* 'message': only messages with this string will be caught (optional, case
insensitive)
* 'strip_colors': if 1, colors will be stripped from message displayed, before

View File

@ -7451,8 +7451,14 @@ Paramètres :
* 'buffer' : pointeur vers le tampon, si NULL, les messages de tous les tampons
sont interceptés
* 'tags' : seulement les messages avec ces étiquettes (liste séparée par des
virgules) seront interceptés (optionnel)
* 'tags' : intercepter seulement les messages avec ces étiquettes (optionnel) :
** avec WeeChat ≥ 0.4.3 : liste d'étiquettes (séparées par des virgules) qui
doivent être dans le message ("ou" logique); il est possible de combiner
plusieurs étiquettes sous forme d'un "et" logique avec le séparateur "+";
chaque étiquette peut commencer ou se terminer par "*" pour correspondre à
plusieurs étiquettes
** avec WeeChat ≤ 0.4.2 : liste d'étiquettes (séparées par des virgules) qui
doivent toutes être dans le message ("et" logique)
* 'message' : seulement les messages contenant cette chaîne seront interceptés
(optionnel, insensible à la casse)
* 'strip_colors' : si 1, les couleurs seront supprimées du message affiché,

View File

@ -7393,8 +7393,15 @@ Argomenti:
* 'buffer': puntatore al buffer, se NULL, verranno catturati i messaggi da qualsiasi
buffer
* 'tags': verranno catturati solo messaggi con queste tag (elenco separato da virgole)
(opzionale)
// TRANSLATION MISSING
* 'tags': catch only messages with these tags (optional):
// TRANSLATION MISSING
** with WeeChat ≥ 0.4.3: comma-separated list of tags that must be in message
(logical "or"); it is possible to combine many tags as a logical "and" with
separator "+"; each tag can start or end with "*" to match many tags
// TRANSLATION MISSING
** with WeeChat ≤ 0.4.2: comma-separated list of tags that must all be in
message (logical "and")
* 'message': verranno catturati solo i messaggi con questa stringa (opzionale,
non sensibile alle maiuscole)
* 'strip_colors': se 1, i colori verranno estratti dal messaggio visualizzato, prima

View File

@ -1987,6 +1987,8 @@ hook_print (struct t_weechat_plugin *plugin, struct t_gui_buffer *buffer,
{
struct t_hook *new_hook;
struct t_hook_print *new_hook_print;
char **tags_array;
int i;
if (!callback)
return NULL;
@ -2007,15 +2009,27 @@ hook_print (struct t_weechat_plugin *plugin, struct t_gui_buffer *buffer,
new_hook->hook_data = new_hook_print;
new_hook_print->callback = callback;
new_hook_print->buffer = buffer;
new_hook_print->tags_count = 0;
new_hook_print->tags_array = NULL;
if (tags)
{
new_hook_print->tags_array = string_split (tags, ",", 0, 0,
&new_hook_print->tags_count);
}
else
{
new_hook_print->tags_count = 0;
new_hook_print->tags_array = NULL;
tags_array = string_split (tags, ",", 0, 0,
&new_hook_print->tags_count);
if (tags_array)
{
new_hook_print->tags_array = malloc (new_hook_print->tags_count *
sizeof (*new_hook_print->tags_array));
if (new_hook_print->tags_array)
{
for (i = 0; i < new_hook_print->tags_count; i++)
{
new_hook_print->tags_array[i] = string_split (tags_array[i],
"+", 0, 0,
NULL);
}
}
string_free_split (tags_array);
}
}
new_hook_print->message = (message) ? strdup (message) : NULL;
new_hook_print->strip_colors = strip_colors;
@ -2034,7 +2048,6 @@ hook_print_exec (struct t_gui_buffer *buffer, struct t_gui_line *line)
{
struct t_hook *ptr_hook, *next_hook;
char *prefix_no_color, *message_no_color;
int tags_match, tag_found, i, j;
if (!line->data->message || !line->data->message[0])
return;
@ -2067,42 +2080,12 @@ hook_print_exec (struct t_gui_buffer *buffer, struct t_gui_line *line)
|| string_strcasestr (message_no_color, HOOK_PRINT(ptr_hook, message))))
{
/* check if tags match */
if (HOOK_PRINT(ptr_hook, tags_array))
{
/* if there are tags in message printed */
if (line->data->tags_array)
{
tags_match = 1;
for (i = 0; i < HOOK_PRINT(ptr_hook, tags_count); i++)
{
/* search for tag in message */
tag_found = 0;
for (j = 0; j < line->data->tags_count; j++)
{
if (string_strcasecmp (HOOK_PRINT(ptr_hook, tags_array)[i],
line->data->tags_array[j]) == 0)
{
tag_found = 1;
break;
}
}
/* tag was asked by hook but not found in message? */
if (!tag_found)
{
tags_match = 0;
break;
}
}
}
else
tags_match = 0;
}
else
tags_match = 1;
/* run callback */
if (tags_match)
if (!HOOK_PRINT(ptr_hook, tags_array)
|| gui_line_match_tags (line->data,
HOOK_PRINT(ptr_hook, tags_count),
HOOK_PRINT(ptr_hook, tags_array)))
{
/* run callback */
ptr_hook->running = 1;
(void) (HOOK_PRINT(ptr_hook, callback))
(ptr_hook->callback_data, buffer, line->data->date,
@ -3334,7 +3317,13 @@ unhook (struct t_hook *hook)
break;
case HOOK_TYPE_PRINT:
if (HOOK_PRINT(hook, tags_array))
string_free_split (HOOK_PRINT(hook, tags_array));
{
for (i = 0; i < HOOK_PRINT(hook, tags_count); i++)
{
string_free_split (HOOK_PRINT(hook, tags_array)[i]);
}
free (HOOK_PRINT(hook, tags_array));
}
if (HOOK_PRINT(hook, message))
free (HOOK_PRINT(hook, message));
break;

View File

@ -288,7 +288,7 @@ struct t_hook_print
t_hook_callback_print *callback; /* print callback */
struct t_gui_buffer *buffer; /* buffer selected (NULL = all) */
int tags_count; /* number of tags selected */
char **tags_array; /* tags selected (NULL = any) */
char ***tags_array; /* tags selected (NULL = any) */
char *message; /* part of message (NULL/empty = all)*/
int strip_colors; /* strip colors in msg for callback? */
};