int gui_filter_check_line (struct t_gui_line_data *line_data) { struct t_gui_filter *ptr_filter; int rc; /* line is always displayed if filters are disabled */ if (!gui_filters_enabled) return 1; if (gui_filter_line_has_tag_no_filter (line_data)) return 1; for (ptr_filter = gui_filters; ptr_filter; ptr_filter = ptr_filter->next_filter) { if (ptr_filter->enabled) { /* check buffer */ if (gui_buffer_match_list_split (line_data->buffer, ptr_filter->num_buffers, ptr_filter->buffers)) { if ((strcmp (ptr_filter->tags, "*") == 0) || (gui_line_match_tags (line_data, ptr_filter->tags_count, ptr_filter->tags_array))) { /* check line with regex */ rc = 1; if (!ptr_filter->regex_prefix && !ptr_filter->regex_message) rc = 0; if (gui_line_match_regex (line_data, ptr_filter->regex_prefix, ptr_filter->regex_message)) { rc = 0; } if (ptr_filter->regex && (ptr_filter->regex[0] == '!')) rc ^= 1; if (rc == 0) return 0; } } } } /* no tag or regex matching, then line is displayed */ return 1; }
void hook_line_exec (struct t_gui_line *line) { struct t_hook *ptr_hook, *next_hook; struct t_hashtable *hashtable, *hashtable2; char str_value[128], *str_tags; if (!weechat_hooks[HOOK_TYPE_LINE]) return; hashtable = NULL; hook_exec_start (); ptr_hook = weechat_hooks[HOOK_TYPE_LINE]; while (ptr_hook) { next_hook = ptr_hook->next_hook; if (!ptr_hook->deleted && !ptr_hook->running && ((HOOK_LINE(ptr_hook, buffer_type) == -1) || ((int)(line->data->buffer->type) == (HOOK_LINE(ptr_hook, buffer_type)))) && string_match_list (line->data->buffer->full_name, (const char **)HOOK_LINE(ptr_hook, buffers), 0) && (!HOOK_LINE(ptr_hook, tags_array) || gui_line_match_tags (line->data, HOOK_LINE(ptr_hook, tags_count), HOOK_LINE(ptr_hook, tags_array)))) { /* create the hashtable that will be sent to callback */ if (!hashtable) { hashtable = hashtable_new (32, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, NULL, NULL); if (!hashtable) break; } HASHTABLE_SET_POINTER("buffer", line->data->buffer); HASHTABLE_SET_STR("buffer_name", line->data->buffer->full_name); HASHTABLE_SET_STR("buffer_type", gui_buffer_type_string[line->data->buffer->type]); HASHTABLE_SET_INT("y", line->data->y); HASHTABLE_SET_TIME("date", line->data->date); HASHTABLE_SET_TIME("date_printed", line->data->date_printed); HASHTABLE_SET_STR_NOT_NULL("str_time", line->data->str_time); HASHTABLE_SET_INT("tags_count", line->data->tags_count); str_tags = string_build_with_split_string ( (const char **)line->data->tags_array, ","); HASHTABLE_SET_STR_NOT_NULL("tags", str_tags); if (str_tags) free (str_tags); HASHTABLE_SET_INT("displayed", line->data->displayed); HASHTABLE_SET_INT("notify_level", line->data->notify_level); HASHTABLE_SET_INT("highlight", line->data->highlight); HASHTABLE_SET_STR_NOT_NULL("prefix", line->data->prefix); HASHTABLE_SET_STR_NOT_NULL("message", line->data->message); /* run callback */ ptr_hook->running = 1; hashtable2 = (HOOK_LINE(ptr_hook, callback)) (ptr_hook->callback_pointer, ptr_hook->callback_data, hashtable); ptr_hook->running = 0; if (hashtable2) { gui_line_hook_update (line, hashtable, hashtable2); hashtable_free (hashtable2); if (!line->data->buffer) break; } } ptr_hook = next_hook; } hook_exec_end (); if (hashtable) hashtable_free (hashtable); }
int gui_line_has_highlight (struct t_gui_line *line) { int rc, i, j, no_highlight; char *msg_no_color, *highlight_words; /* * highlights are disabled on this buffer? (special value "-" means that * buffer does not want any highlight) */ if (line->data->buffer->highlight_words && (strcmp (line->data->buffer->highlight_words, "-") == 0)) return 0; /* * check if highlight is forced by a tag (with option highlight_tags) or * disabled for line */ no_highlight = 0; for (i = 0; i < line->data->tags_count; i++) { if (config_highlight_tags) { for (j = 0; j < config_num_highlight_tags; j++) { if (string_strcasecmp (line->data->tags_array[i], config_highlight_tags[j]) == 0) return 1; } } if (strcmp (line->data->tags_array[i], GUI_CHAT_TAG_NO_HIGHLIGHT) == 0) no_highlight = 1; } if (no_highlight) return 0; /* * check that line matches highlight tags, if any (if no tag is specified, * then any tag is allowed) */ if (line->data->buffer->highlight_tags_count > 0) { if (!gui_line_match_tags (line->data, line->data->buffer->highlight_tags_count, line->data->buffer->highlight_tags_array)) return 0; } /* remove color codes from line message */ msg_no_color = gui_color_decode (line->data->message, NULL); if (!msg_no_color) return 0; /* * there is highlight on line if one of buffer highlight words matches line * or one of global highlight words matches line */ highlight_words = gui_buffer_string_replace_local_var (line->data->buffer, line->data->buffer->highlight_words); rc = string_has_highlight (msg_no_color, (highlight_words) ? highlight_words : line->data->buffer->highlight_words); if (highlight_words) free (highlight_words); if (!rc) { highlight_words = gui_buffer_string_replace_local_var (line->data->buffer, CONFIG_STRING(config_look_highlight)); rc = string_has_highlight (msg_no_color, (highlight_words) ? highlight_words : CONFIG_STRING(config_look_highlight)); if (highlight_words) free (highlight_words); } if (!rc && config_highlight_regex) { rc = string_has_highlight_regex_compiled (msg_no_color, config_highlight_regex); } if (!rc && line->data->buffer->highlight_regex_compiled) { rc = string_has_highlight_regex_compiled (msg_no_color, line->data->buffer->highlight_regex_compiled); } free (msg_no_color); return rc; }