From ec44108653270359fa48fe4c08f112d2bec4e4cd Mon Sep 17 00:00:00 2001 From: Dale Whittaker Date: Sat, 9 May 2009 14:08:06 +0200 Subject: [PATCH] Improve title and URI display in the feed panel We strip HTML from "title" elements when required now. And we always try to show at least the URI for feeds in the WebKit view. And we fallback to using the URI in the treeview if the title/ description is empty. --- extensions/feed-panel/feed-atom.c | 29 +++++++++++++++++++++-- extensions/feed-panel/feed-panel.c | 28 ++++++++++++---------- extensions/feed-panel/feed-parse.c | 38 +++++++++++++++++++++++++++++- extensions/feed-panel/feed-parse.h | 5 ++++ extensions/feed-panel/feed-rss.c | 4 ++-- 5 files changed, 87 insertions(+), 17 deletions(-) diff --git a/extensions/feed-panel/feed-atom.c b/extensions/feed-panel/feed-atom.c index def46f61..de905f2f 100644 --- a/extensions/feed-panel/feed-atom.c +++ b/extensions/feed-panel/feed-atom.c @@ -138,6 +138,31 @@ atom_get_link (KatzeItem* item, } } +static gchar* +atom_get_title (FeedParser* fparser) +{ + if (!katze_item_get_name (fparser->item)) + { + gchar* type; + + type = (gchar*)xmlGetProp (fparser->node, BAD_CAST "type"); + if (type) + { + gchar* content = NULL; + + if (g_str_equal (type, "html") || + g_str_equal (type, "xhtml")) + content = feed_get_element_markup (fparser); + + xmlFree (type); + + if (content) + return content; + } + } + return feed_get_element_string (fparser); +} + static void atom_preparse_entry (FeedParser* fparser) { @@ -161,7 +186,7 @@ atom_parse_entry (FeedParser* fparser) } else if (!xmlStrcmp (node->name, BAD_CAST "title")) { - content = feed_get_element_string (fparser); + content = atom_get_title (fparser); katze_item_set_name (fparser->item, content); } else if (!xmlStrcmp (node->name, BAD_CAST "summary")) @@ -249,7 +274,7 @@ atom_parse_feed (FeedParser* fparser) } else if (!xmlStrcmp (node->name, BAD_CAST "title")) { - content = feed_get_element_string (fparser); + content = atom_get_title (fparser); katze_item_set_name (fparser->item, content); } else if (!xmlStrcmp (node->name, BAD_CAST "subtitle")) diff --git a/extensions/feed-panel/feed-panel.c b/extensions/feed-panel/feed-panel.c index 0c818bc7..bbef14f6 100644 --- a/extensions/feed-panel/feed-panel.c +++ b/extensions/feed-panel/feed-panel.c @@ -121,9 +121,9 @@ feed_panel_treeview_render_text_cb (GtkTreeViewColumn* column, g_assert (KATZE_IS_ITEM (item)); title = katze_item_get_name (item); - if (!title) + if (!title || !*title || g_str_equal (title, " ")) title = katze_item_get_text (item); - if (!title) + if (!title || !*title || g_str_equal (title, " ")) title = katze_item_get_uri (item); g_object_set (renderer, "text", title, NULL); @@ -377,23 +377,24 @@ feed_panel_cursor_or_row_changed_cb (GtkTreeView* treeview, text = g_strdup (katze_item_get_text (KATZE_ITEM (item))); else { + KatzeItem* parent; + const gchar* puri; + + parent = katze_item_get_parent (item); + g_assert (KATZE_IS_ARRAY (parent)); date = katze_item_get_added (item); + puri = katze_item_get_uri (parent); if (date) { time_t date_t; const struct tm* tm; static gchar date_format[512]; - const gchar* puri; - KatzeItem* parent; gchar* last_updated; date_t = (time_t)date; tm = localtime (&date_t); /* Some gcc versions complain about "%c" for no reason */ strftime (date_format, sizeof (date_format), "%c", tm); - parent = katze_item_get_parent (item); - g_assert (KATZE_IS_ARRAY (parent)); - puri = katze_item_get_uri (parent); /* i18n: The local date a feed was last updated */ last_updated = g_strdup_printf (C_("Feed", "Last updated: %s."), date_format); @@ -403,6 +404,12 @@ feed_panel_cursor_or_row_changed_cb (GtkTreeView* treeview, puri, last_updated); g_free (last_updated); } + else + { + text = g_strdup_printf ( + "feed" + "

%s

", puri); + } } webkit_web_view_load_html_string ( WEBKIT_WEB_VIEW (panel->webview), text ? text : "", uri); @@ -413,11 +420,8 @@ feed_panel_cursor_or_row_changed_cb (GtkTreeView* treeview, else { text = katze_item_get_text (item); - if (text) - { - webkit_web_view_load_html_string ( - WEBKIT_WEB_VIEW (panel->webview), text, uri); - } + webkit_web_view_load_html_string ( + WEBKIT_WEB_VIEW (panel->webview), text ? text : "", uri); } g_object_unref (item); } diff --git a/extensions/feed-panel/feed-parse.c b/extensions/feed-panel/feed-parse.c index 442e5ed5..4c09dc64 100644 --- a/extensions/feed-panel/feed-parse.c +++ b/extensions/feed-panel/feed-parse.c @@ -30,7 +30,43 @@ feed_get_element_string (FeedParser* fparser) return g_strdup (" "); } - return (gchar* )xmlNodeListGetString (fparser->doc, node->children, 1); + return (gchar*)xmlNodeListGetString (fparser->doc, node->children, 1); +} + +void +handle_markup_chars (void* user_data, + const xmlChar* ch, + int len) +{ + gchar** markup; + gchar* temp; + + markup = (gchar**)user_data; + temp = g_strndup ((gchar*)ch, len); + *markup = (*markup) ? g_strconcat (*markup, temp, NULL) : g_strdup (temp); + g_free (temp); +} + +gchar* +feed_get_element_markup (FeedParser* fparser) +{ + gchar* markup; + const xmlChar* stag; + + markup = feed_get_element_string (fparser); + if ((stag = xmlStrchr (BAD_CAST markup, '<')) && xmlStrchr (stag, '>')) + { + gchar* text = NULL; + htmlSAXHandlerPtr psax; + + psax = g_new0 (htmlSAXHandler, 1); + psax->characters = handle_markup_chars; + htmlSAXParseDoc (BAD_CAST markup, NULL, psax, &text); + g_free (psax); + g_free (markup); + return text; + } + return markup; } gint64 diff --git a/extensions/feed-panel/feed-parse.h b/extensions/feed-panel/feed-parse.h index 493b7ef7..84ae9f19 100644 --- a/extensions/feed-panel/feed-parse.h +++ b/extensions/feed-panel/feed-parse.h @@ -20,6 +20,7 @@ #include #include +#include G_BEGIN_DECLS @@ -52,9 +53,13 @@ typedef struct _FeedParser #define feed_parser_set_error(fparser, err, msg) \ *(fparser)->error = g_error_new ( \ FEED_PARSE_ERROR, (err), (msg)) + gchar* feed_get_element_string (FeedParser* fparser); +gchar* +feed_get_element_markup (FeedParser* fparser); + gint64 feed_get_element_date (FeedParser* fparser); diff --git a/extensions/feed-panel/feed-rss.c b/extensions/feed-panel/feed-rss.c index 84fd6d3b..03843df6 100644 --- a/extensions/feed-panel/feed-rss.c +++ b/extensions/feed-panel/feed-rss.c @@ -107,7 +107,7 @@ rss_parse_item (FeedParser* fparser) } else if (!xmlStrcmp (node->name, BAD_CAST "title")) { - content = feed_get_element_string (fparser); + content = feed_get_element_markup (fparser); katze_item_set_name (fparser->item, content); } else if (!xmlStrcmp (node->name, BAD_CAST "description")) @@ -165,7 +165,7 @@ rss_parse_channel (FeedParser* fparser) if (!xmlStrcmp (node->name, BAD_CAST "title")) { - content = feed_get_element_string (fparser); + content = feed_get_element_markup (fparser); katze_item_set_name (fparser->item, content); } else if (!xmlStrcmp (node->name, BAD_CAST "description"))