]> spindle.queued.net Git - midori/commitdiff
Improve title and URI display in the feed panel
authorDale Whittaker <dayul@users.sf.net>
Sat, 9 May 2009 12:08:06 +0000 (14:08 +0200)
committerChristian Dywan <christian@twotoasts.de>
Sat, 9 May 2009 12:08:06 +0000 (14:08 +0200)
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
extensions/feed-panel/feed-panel.c
extensions/feed-panel/feed-parse.c
extensions/feed-panel/feed-parse.h
extensions/feed-panel/feed-rss.c

index def46f61a6d8fe39abc5954ce8162cff24092e58..de905f2fc0ad66f329e39a7c7218bfd7301370f3 100644 (file)
@@ -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"))
index 0c818bc75545e75662c4e2fb0cac41bb157617ac..bbef14f647cf942ef8d7500760923ab75cd1c845 100644 (file)
@@ -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 (
+                            "<html><head><title>feed</title></head>"
+                            "<body><h3>%s</h3></body></html>", 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);
     }
index 442e5ed51d3a3389dddc35e4a08e7fc313def862..4c09dc647eb5ab94e0b688bd56790122174faaa6 100644 (file)
@@ -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
index 493b7ef78e166baa8ec2c596edad26a7e3090f7b..84ae9f19d1d2a37b4b4f395c6b522977dc25ffca 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <libsoup/soup.h>
 #include <libxml/parser.h>
+#include <libxml/HTMLparser.h>
 
 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);
 
index 84fd6d3be493ca02d4d9e3c802a610339fa0ac82..03843df6c4f3f7f6a6dd65b3de01843975f67ea2 100644 (file)
@@ -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"))