degesch: detect highlights and display differently

This commit is contained in:
Přemysl Eric Janouch 2015-04-27 22:40:33 +02:00
parent 87c1775129
commit cdb1d81982
1 changed files with 65 additions and 8 deletions

View File

@ -29,6 +29,7 @@
#define ATTR_EXTERNAL "attr_external"
#define ATTR_TIMESTAMP "attr_timestamp"
#define ATTR_HIGHLIGHT "attr_highlight"
#define ATTR_ACTION "attr_action"
#define ATTR_JOIN "attr_join"
#define ATTR_PART "attr_part"
@ -95,6 +96,7 @@ static struct config_item g_config_table[] =
{ ATTR_EXTERNAL, NULL, "Terminal attributes for external lines" },
{ ATTR_TIMESTAMP, NULL, "Terminal attributes for timestamps" },
{ ATTR_HIGHLIGHT, NULL, "Terminal attributes for highlights" },
{ ATTR_ACTION, NULL, "Terminal attributes for user actions" },
{ ATTR_JOIN, NULL, "Terminal attributes for joins" },
{ ATTR_PART, NULL, "Terminal attributes for parts" },
@ -789,6 +791,13 @@ init_colors (struct app_context *ctx)
INIT_ATTR (ATTR_JOIN, g_terminal.color_set_fg[2], "\x1b[32m");
INIT_ATTR (ATTR_PART, g_terminal.color_set_fg[1], "\x1b[31m");
char *highlight = xstrdup_printf ("%s%s%s",
g_terminal.color_set_fg[3],
g_terminal.color_set_bg[5],
enter_bold_mode);
INIT_ATTR (ATTR_HIGHLIGHT, highlight, "\x1b[33;37;1m");
free (highlight);
#undef INIT_ATTR
switch (ctx->color_mode)
@ -1231,16 +1240,26 @@ buffer_line_display (struct app_context *ctx,
switch (line->type)
{
case BUFFER_LINE_PRIVMSG:
formatter_add (&f, "<#c#s#r> #s", nick_color, nick, a->text);
if (line->flags & BUFFER_LINE_HIGHLIGHT)
formatter_add (&f, "#a<#s>#r #s", ATTR_HIGHLIGHT, nick, a->text);
else
formatter_add (&f, "<#c#s#r> #s", nick_color, nick, a->text);
break;
case BUFFER_LINE_ACTION:
formatter_add (&f, " #a*#r ", ATTR_ACTION);
if (line->flags & BUFFER_LINE_HIGHLIGHT)
formatter_add (&f, " #a*#r ", ATTR_HIGHLIGHT);
else
formatter_add (&f, " #a*#r ", ATTR_ACTION);
formatter_add (&f, "#c#s#r #s", nick_color, nick, a->text);
break;
case BUFFER_LINE_NOTICE:
formatter_add (&f, " - ");
formatter_add (&f, "#s(#c#s#r): #s",
"Notice", nick_color, nick, a->text);
if (line->flags & BUFFER_LINE_HIGHLIGHT)
formatter_add (&f, "#a#s(#s)#r: #s",
ATTR_HIGHLIGHT, "Notice", nick, a->text);
else
formatter_add (&f, "#s(#c#s#r): #s",
"Notice", nick_color, nick, a->text);
break;
case BUFFER_LINE_JOIN:
formatter_add (&f, "#a-->#r ", ATTR_JOIN);
@ -2441,6 +2460,38 @@ irc_get_buffer_for_message (struct app_context *ctx,
return buffer;
}
static bool
irc_is_highlight (struct app_context *ctx, const char *message)
{
// Well, this is rather crude but it should make most users happy.
// Ideally we could do this at least in proper Unicode.
char *copy = xstrdup (message);
for (char *p = copy; *p; p++)
*p = irc_tolower (*p);
char *nick = xstrdup (ctx->irc_user->nickname);
for (char *p = nick; *p; p++)
*p = irc_tolower (*p);
// Special characters allowed in nicknames by RFC 2812: []\`_^{|} and -
// Also excluded from the ASCII: common user channel prefixes: +%@&~
const char *delimiters = ",.;:!?()<>/=#$* \t\r\n\v\f\"'";
bool result = false;
char *save = NULL;
for (char *token = strtok_r (copy, delimiters, &save);
token; token = strtok_r (NULL, delimiters, &save))
if (!strcmp (token, nick))
{
result = true;
break;
}
free (copy);
free (nick);
return result;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static void
@ -2651,8 +2702,11 @@ irc_handle_notice_text (struct app_context *ctx,
if (buffer)
{
// TODO: highlights
buffer_send (ctx, buffer, BUFFER_LINE_NOTICE, 0,
// TODO: some more obvious indication of highlights
int flags = irc_is_highlight (ctx, text->str)
? BUFFER_LINE_HIGHLIGHT
: 0;
buffer_send (ctx, buffer, BUFFER_LINE_NOTICE, flags,
.who = irc_to_utf8 (ctx, msg->prefix),
.text = irc_to_utf8 (ctx, text->str));
}
@ -2812,11 +2866,14 @@ irc_handle_privmsg_text (struct app_context *ctx,
if (buffer)
{
// TODO: highlights
// TODO: some more obvious indication of highlights
int flags = irc_is_highlight (ctx, text->str)
? BUFFER_LINE_HIGHLIGHT
: 0;
enum buffer_line_type type = is_action
? BUFFER_LINE_ACTION
: BUFFER_LINE_PRIVMSG;
buffer_send (ctx, buffer, type, 0,
buffer_send (ctx, buffer, type, flags,
.who = irc_to_utf8 (ctx, msg->prefix),
.text = irc_to_utf8 (ctx, text->str));
}