1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-05 01:03:14 +02:00

trigger: add regex command "y" to translate chars, set default regex command to "s" (regex replace) (closes #1510)

This commit is contained in:
Sébastien Helleu
2022-10-31 08:08:46 +01:00
parent 3b674a5e16
commit 7555993bbc
13 changed files with 1083 additions and 315 deletions
+110 -30
View File
@@ -267,18 +267,95 @@ trigger_callback_check_conditions (struct t_trigger *trigger,
}
/*
* Replaces text using one or more regex in the trigger.
* Replaces text using regex.
*
* Returns: text replaced.
*
* Note: result must be freed after use.
*/
char *
trigger_callback_regex_replace (struct t_trigger_context *context,
const char *text,
regex_t *regex,
const char *replace)
{
char *value;
struct t_hashtable *hashtable_options_regex;
if (!regex)
return NULL;
hashtable_options_regex = weechat_hashtable_new (
32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
weechat_hashtable_set (context->pointers, "regex", regex);
weechat_hashtable_set (hashtable_options_regex,
"regex_replace", replace);
value = weechat_string_eval_expression (
text,
context->pointers,
context->extra_vars,
hashtable_options_regex);
weechat_hashtable_free (hashtable_options_regex);
return value;
}
/*
* Translates chars.
*
* Returns: text with translated chars.
*
* Note: result must be freed after use.
*/
char *
trigger_callback_regex_translate_chars (struct t_trigger_context *context,
const char *text,
const char *chars1,
const char *chars2)
{
char *value, *chars1_eval, *chars2_eval;
chars1_eval = weechat_string_eval_expression (
chars1,
context->pointers,
context->extra_vars,
NULL);
chars2_eval = weechat_string_eval_expression (
chars2,
context->pointers,
context->extra_vars,
NULL);
value = weechat_string_translate_chars (text, chars1_eval, chars2_eval);
if (chars1_eval)
free (chars1_eval);
if (chars2_eval)
free (chars2_eval);
return value;
}
/*
* Executes regex commands.
*/
void
trigger_callback_replace_regex (struct t_trigger *trigger,
struct t_trigger_context *context,
int display_monitor)
trigger_callback_regex (struct t_trigger *trigger,
struct t_trigger_context *context,
int display_monitor)
{
char *value;
const char *ptr_key, *ptr_value;
int i, pointers_allocated;
struct t_hashtable *hashtable_options_regex;
pointers_allocated = 0;
@@ -298,9 +375,12 @@ trigger_callback_replace_regex (struct t_trigger *trigger,
for (i = 0; i < trigger->regex_count; i++)
{
/* if regex is not set (invalid), skip it */
if (!trigger->regex[i].regex)
/* if regex is not set (invalid) for command "regex replace", skip it */
if ((trigger->regex[i].command == TRIGGER_REGEX_COMMAND_REPLACE)
&& !trigger->regex[i].regex)
{
continue;
}
ptr_key = (trigger->regex[i].variable) ?
trigger->regex[i].variable :
@@ -336,25 +416,25 @@ trigger_callback_replace_regex (struct t_trigger *trigger,
ptr_value = weechat_hashtable_get (context->extra_vars, ptr_key);
}
hashtable_options_regex = weechat_hashtable_new (
32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
weechat_hashtable_set (context->pointers,
"regex", trigger->regex[i].regex);
weechat_hashtable_set (hashtable_options_regex,
"regex_replace",
trigger->regex[i].replace_escaped);
value = weechat_string_eval_expression (
ptr_value,
context->pointers,
context->extra_vars,
hashtable_options_regex);
weechat_hashtable_free (hashtable_options_regex);
switch (trigger->regex[i].command)
{
case TRIGGER_REGEX_COMMAND_REPLACE:
value = trigger_callback_regex_replace (
context,
ptr_value,
trigger->regex[i].regex,
trigger->regex[i].replace_escaped);
break;
case TRIGGER_REGEX_COMMAND_TRANSLATE_CHARS:
value = trigger_callback_regex_translate_chars (
context,
ptr_value,
trigger->regex[i].str_regex,
trigger->regex[i].replace);
break;
case TRIGGER_NUM_REGEX_COMMANDS:
break;
}
if (value)
{
@@ -493,7 +573,7 @@ trigger_callback_execute (struct t_trigger *trigger,
if (weechat_trigger_plugin->debug >= 1)
{
gettimeofday (&(context->start_check_conditions), NULL);
context->start_replace_regex = context->start_check_conditions;
context->start_regex = context->start_check_conditions;
context->start_run_command = context->start_check_conditions;
}
@@ -505,7 +585,7 @@ trigger_callback_execute (struct t_trigger *trigger,
/* replace text with regex */
if (weechat_trigger_plugin->debug >= 1)
gettimeofday (&(context->start_check_conditions), NULL);
trigger_callback_replace_regex (trigger, context, display_monitor);
trigger_callback_regex (trigger, context, display_monitor);
/* execute command(s) */
if (weechat_trigger_plugin->debug >= 1)
@@ -524,8 +604,8 @@ trigger_callback_execute (struct t_trigger *trigger,
time_init = weechat_util_timeval_diff (&(context->start_exec),
&(context->start_check_conditions));
time_cond = weechat_util_timeval_diff (&(context->start_check_conditions),
&(context->start_replace_regex));
time_regex = weechat_util_timeval_diff (&(context->start_replace_regex),
&(context->start_regex));
time_regex = weechat_util_timeval_diff (&(context->start_regex),
&(context->start_run_command));
time_cmd = weechat_util_timeval_diff (&(context->start_run_command),
&(context->end_exec));