degesch: detect highlights and display differently
This commit is contained in:
		
							parent
							
								
									87c1775129
								
							
						
					
					
						commit
						cdb1d81982
					
				
							
								
								
									
										73
									
								
								degesch.c
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								degesch.c
									
									
									
									
									
								
							| @ -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)); | ||||
| 	} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user