Mercurial > pidgin
changeset 24028:4df8161acc3b
Try to preserve HTML attributes in notification dialogs
HTML messages are first converted into XHTML, and then parsed from
libgnt. If something in the process fails, then the stripped plaintext
message is displayed instead. This is currently used for the 'Get info'
dialog.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sun, 31 Aug 2008 06:23:52 +0000 |
parents | c6670bbc2191 |
children | 8a488151e07a |
files | finch/gntnotify.c |
diffstat | 1 files changed, 65 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/finch/gntnotify.c Sun Aug 31 05:39:52 2008 +0000 +++ b/finch/gntnotify.c Sun Aug 31 06:23:52 2008 +0000 @@ -36,6 +36,7 @@ #include <util.h> #include "gntnotify.h" +#include "debug.h" static struct { @@ -83,12 +84,23 @@ GntWidget *msg; if (type == PURPLE_NOTIFY_FORMATTED) { int width = -1, height = -1; + char *plain = (char*)secondary; msg = gnt_text_view_new(); - gnt_text_view_set_flag(GNT_TEXT_VIEW(msg), GNT_TEXT_VIEW_TOP_ALIGN); - gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(msg), secondary, sf); + gnt_text_view_set_flag(GNT_TEXT_VIEW(msg), GNT_TEXT_VIEW_TOP_ALIGN | GNT_TEXT_VIEW_NO_SCROLL); + switch (type) { + case PURPLE_NOTIFY_FORMATTED: + plain = purple_markup_strip_html(secondary); + if (gnt_util_parse_xhtml_to_textview(secondary, GNT_TEXT_VIEW(msg))) + break; + /* Fallthrough */ + default: + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(msg), plain, sf); + } gnt_text_view_attach_scroll_widget(GNT_TEXT_VIEW(msg), button); - gnt_util_get_text_bound(secondary, &width, &height); + gnt_util_get_text_bound(plain, &width, &height); gnt_widget_set_size(msg, width + 3, height + 1); + if (plain != secondary) + g_free(plain); } else { msg = gnt_label_new_with_format(secondary, sf); } @@ -130,18 +142,18 @@ static void *finch_notify_formatted(const char *title, const char *primary, const char *secondary, const char *text) { - /* XXX: For now, simply strip the html and use _notify_message. For future use, - * there should be some way of parsing the makrups from GntTextView */ - char *unformat = purple_markup_strip_html(text); - char *t = g_strdup_printf("%s%s%s", + char *xhtml = NULL; + char *t = g_strdup_printf("<span>%s%s%s</span>", secondary ? secondary : "", secondary ? "\n" : "", - unformat ? unformat : ""); + text ? text : ""); + void *ret; - void *ret = finch_notify_message(PURPLE_NOTIFY_FORMATTED, title, primary, t); + purple_markup_html_to_xhtml(t, &xhtml, NULL); + ret = finch_notify_message(PURPLE_NOTIFY_FORMATTED, title, primary, xhtml); g_free(t); - g_free(unformat); + g_free(xhtml); return ret; } @@ -261,6 +273,46 @@ g_hash_table_remove(userinfo, key); } +static char * +purple_notify_user_info_get_xhtml(PurpleNotifyUserInfo *user_info) +{ + GList *l; + GString *text; + + text = g_string_new("<span>"); + + for (l = purple_notify_user_info_get_entries(user_info); l != NULL; + l = l->next) { + PurpleNotifyUserInfoEntry *user_info_entry = l->data; + PurpleNotifyUserInfoEntryType type = purple_notify_user_info_entry_get_type(user_info_entry); + const char *label = purple_notify_user_info_entry_get_label(user_info_entry); + const char *value = purple_notify_user_info_entry_get_value(user_info_entry); + + /* Handle the label/value pair itself */ + if (type == PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER) + g_string_append(text, "<u>"); + if (label) + g_string_append_printf(text, "<b>%s</b>", label); + g_string_append(text, "<span>"); + if (label && value) + g_string_append(text, ": "); + if (value) { + char *strip = purple_markup_strip_html(value); + g_string_append(text, strip); + g_free(strip); + } + g_string_append(text, "</span>"); + if (type == PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER) + g_string_append(text, "</u>"); + else if (type == PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK) + g_string_append(text, "<HR/>"); + g_string_append(text, "<BR/>"); + } + g_string_append(text, "</span>"); + + return g_string_free(text, FALSE); +} + static void * finch_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info) { @@ -269,7 +321,7 @@ void *ui_handle; char *key = userinfo_hash(purple_connection_get_account(gc), who); - info = purple_notify_user_info_get_text_with_newline(user_info, "<BR>"); + info = purple_notify_user_info_get_xhtml(user_info); ui_handle = g_hash_table_lookup(userinfo, key); if (ui_handle != NULL) { @@ -283,7 +335,8 @@ gnt_widget_get_size(GNT_WIDGET(msg), &tvw, &tvh); gnt_text_view_clear(msg); - gnt_text_view_append_text_with_flags(msg, strip, GNT_TEXT_FLAG_NORMAL); + if (!gnt_util_parse_xhtml_to_textview(info, msg)) + gnt_text_view_append_text_with_flags(msg, strip, GNT_TEXT_FLAG_NORMAL); gnt_text_view_scroll(msg, 0); gnt_util_get_text_bound(strip, &ntvw, &ntvh); ntvw += 3;