1
0
mirror of https://github.com/irssi/irssi.git synced 2024-09-29 04:45:57 -04:00

Changed the escaping system - theme_format_expand_data()'s

EXPAND_FLAG_IGNORE_EMPTY now also checks if the argument is a $variable that
is empty. Statusbar now first expands the formats and after then expands
$variables. Should fix at least when trying to print #$$$ channel in
statusbar.


git-svn-id: http://svn.irssi.org/repos/irssi/trunk@2023 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2001-11-15 20:02:15 +00:00 committed by cras
parent cda63f03d4
commit fc91857029
3 changed files with 55 additions and 38 deletions

View File

@ -235,6 +235,46 @@ static void theme_format_append_next(THEME_REC *theme, GString *str,
(*format)++; (*format)++;
} }
/* returns TRUE if data is empty, or the data is a $variable which is empty */
static int data_is_empty(const char **data)
{
const char *p;
char *ret;
int free_ret, empty;
p = *data;
while (*p == ' ') p++;
if (*p == '}') {
/* empty */
*data = p+1;
return TRUE;
}
if (*p != '$') {
/* not empty */
return FALSE;
}
/* variable - check if it's empty */
p++;
ret = parse_special((char **) &p, active_win->active_server,
active_win->active, NULL, &free_ret, NULL, 0);
p++;
while (*p == ' ') p++;
empty = *p == '}' && (ret == NULL || *ret == '\0');
if (free_ret) g_free(ret);
if (empty) {
/* empty */
*data = p+1;
return TRUE;
}
return FALSE;
}
/* expand a single {abstract ...data... } */ /* expand a single {abstract ...data... } */
static char *theme_format_expand_abstract(THEME_REC *theme, static char *theme_format_expand_abstract(THEME_REC *theme,
const char **formatp, const char **formatp,
@ -261,17 +301,11 @@ static char *theme_format_expand_abstract(THEME_REC *theme,
treated as arguments */ treated as arguments */
if (*p == ' ') { if (*p == ' ') {
len++; len++;
if ((flags & EXPAND_FLAG_IGNORE_EMPTY)) { if ((flags & EXPAND_FLAG_IGNORE_EMPTY) && data_is_empty(&p)) {
/* if the data is empty, ignore the abstract */ *formatp = p;
p = format+len; g_free(abstract);
while (*p == ' ') p++; return NULL;
if (*p == '}') {
*formatp = p+1;
g_free(abstract);
return NULL;
}
} }
} }
*formatp = format+len; *formatp = format+len;

View File

@ -44,7 +44,7 @@ void theme_register_module(const char *module, FORMAT_REC *formats);
void theme_unregister_module(const char *module); void theme_unregister_module(const char *module);
#define EXPAND_FLAG_IGNORE_REPLACES 0x01 /* don't use the character replaces when expanding */ #define EXPAND_FLAG_IGNORE_REPLACES 0x01 /* don't use the character replaces when expanding */
#define EXPAND_FLAG_IGNORE_EMPTY 0x02 /* if abstract's argument is empty, don't try to expand it (ie. {xx }, but not {xx}) */ #define EXPAND_FLAG_IGNORE_EMPTY 0x02 /* if abstract's argument is empty, or the argument is a $variable that is empty, don't try to expand it (ie. {xx }, but not {xx}) */
#define EXPAND_FLAG_RECURSIVE_MASK 0x0f #define EXPAND_FLAG_RECURSIVE_MASK 0x0f
/* private */ /* private */
#define EXPAND_FLAG_ROOT 0x10 #define EXPAND_FLAG_ROOT 0x10

View File

@ -297,20 +297,6 @@ static void statusbar_calc_item_positions(STATUSBAR_REC *bar)
active_win = old_active_win; active_win = old_active_win;
} }
/*STATUSBAR_REC *statusbar_find(int pos, int line)
{
GSList *tmp;
for (tmp = statusbars; tmp != NULL; tmp = tmp->next) {
STATUSBAR_REC *rec = tmp->data;
if (rec->pos == pos && rec->line == line)
return rec;
}
return NULL;
}*/
void statusbar_redraw(STATUSBAR_REC *bar, int force) void statusbar_redraw(STATUSBAR_REC *bar, int force)
{ {
if (bar != NULL) { if (bar != NULL) {
@ -673,20 +659,17 @@ void statusbar_item_default_handler(SBAR_ITEM_REC *item, int get_size_only,
wiitem = active_win->active; wiitem = active_win->active;
} }
/* expand $variables */
tmpstr = parse_special_string(str, server, wiitem, data, NULL,
(escape_vars ? PARSE_FLAG_ESCAPE_VARS : 0 ) |
PARSE_FLAG_ESCAPE_THEME);
/* expand templates */ /* expand templates */
str = tmpstr; tmpstr = theme_format_expand_data(current_theme, &str,
tmpstr2 = theme_format_expand_data(current_theme, &str, 'n', 'n',
'n', 'n', NULL, NULL,
NULL, NULL, EXPAND_FLAG_ROOT |
EXPAND_FLAG_ROOT | EXPAND_FLAG_IGNORE_REPLACES |
EXPAND_FLAG_IGNORE_REPLACES | EXPAND_FLAG_IGNORE_EMPTY);
EXPAND_FLAG_IGNORE_EMPTY); /* expand $variables */
g_free(tmpstr); tmpstr2 = parse_special_string(tmpstr, server, wiitem, data, NULL,
(escape_vars ? PARSE_FLAG_ESCAPE_VARS : 0 ));
g_free(tmpstr);
/* remove color codes (not %formats) */ /* remove color codes (not %formats) */
tmpstr = strip_codes(tmpstr2); tmpstr = strip_codes(tmpstr2);