[yelp] [libyelp] Various fixes for relative links in HTML documents



commit 46d5d135ff03253221172eecb57d3aa38298f803
Author: Shaun McCance <shaunm gnome org>
Date:   Mon May 10 12:25:36 2010 -0500

    [libyelp] Various fixes for relative links in HTML documents

 libyelp/yelp-document.c |   19 +++++++++++++++++++
 libyelp/yelp-uri.c      |   33 +++++++++++++++++++++++++--------
 libyelp/yelp-view.c     |   24 +++++++++++++++++++++++-
 3 files changed, 67 insertions(+), 9 deletions(-)
---
diff --git a/libyelp/yelp-document.c b/libyelp/yelp-document.c
index 1ead2fa..4501777 100644
--- a/libyelp/yelp-document.c
+++ b/libyelp/yelp-document.c
@@ -136,6 +136,7 @@ yelp_document_get_for_uri (YelpUri *uri)
 {
     static GHashTable *documents = NULL;
     gchar *docuri;
+    gchar *page_id, *tmp;
     YelpDocument *document = NULL;
 
     if (documents == NULL)
@@ -148,6 +149,24 @@ yelp_document_get_for_uri (YelpUri *uri)
     if (docuri == NULL)
 	return NULL;
 
+    switch (yelp_uri_get_document_type (uri)) {
+    case YELP_URI_DOCUMENT_TYPE_TEXT:
+    case YELP_URI_DOCUMENT_TYPE_HTML:
+    case YELP_URI_DOCUMENT_TYPE_XHTML:
+        /* We use YelpSimpleDocument for these, which is a single-file
+         * responder. But the document URI may be set to the directory
+         * holding the file, to allow a directory of HTML files to act
+         * as a single document. So we cache these by a fuller URI.
+         */
+        page_id = yelp_uri_get_page_id (uri);
+        tmp = g_strconcat (docuri, "/", page_id, NULL);
+        g_free (page_id);
+        g_free (docuri);
+        docuri = tmp;
+        break;
+    default:
+        break;
+    }
     document = g_hash_table_lookup (documents, docuri);
 
     if (document != NULL) {
diff --git a/libyelp/yelp-uri.c b/libyelp/yelp-uri.c
index 7e76042..e59494e 100644
--- a/libyelp/yelp-uri.c
+++ b/libyelp/yelp-uri.c
@@ -288,7 +288,7 @@ resolve_async (YelpUri *uri)
         case YELP_URI_DOCUMENT_TYPE_TEXT:
         case YELP_URI_DOCUMENT_TYPE_HTML:
         case YELP_URI_DOCUMENT_TYPE_XHTML:
-            /* FIXME: look up a relative file */
+            resolve_file_path (uri);
             break;
         case YELP_URI_DOCUMENT_TYPE_TOC:
             /* FIXME: what do we do? */
@@ -468,6 +468,13 @@ resolve_file_path (YelpUri *uri)
     gchar *path;
     const gchar *hash = strchr (priv->res_arg, '#');
 
+    /* Treat xref: URIs like relative file paths */
+    if (g_str_has_prefix (priv->res_arg, "xref:")) {
+        gchar *tmp = g_strdup (priv->res_arg + 5);
+        g_free (priv->res_arg);
+        priv->res_arg = tmp;
+    }
+
     if (priv->res_base)
         base_priv = GET_PRIV (priv->res_base);
 
@@ -1103,15 +1110,25 @@ resolve_gfile (YelpUri *uri, const gchar *hash)
                         priv->frag_id = g_strdup (splithash[1]);
                 }
             }
-            else if (g_str_equal (mime_type, "text/html")) {
-                priv->tmptype = YELP_URI_DOCUMENT_TYPE_HTML;
-                if (priv->frag_id == NULL)
-                    priv->frag_id = g_strdup (hash);
-            }
-            else if (g_str_equal (mime_type, "application/xhtml+xml")) {
-                priv->tmptype = YELP_URI_DOCUMENT_TYPE_XHTML;
+            else if (g_str_equal (mime_type, "text/html") || 
+                     g_str_equal (mime_type, "application/xhtml+xml")) {
+                GFile *parent = g_file_get_parent (priv->gfile);
+                priv->docuri = g_file_get_uri (parent);
+                g_object_unref (parent);
+                priv->tmptype = mime_type[0] == 't' ? YELP_URI_DOCUMENT_TYPE_HTML : YELP_URI_DOCUMENT_TYPE_XHTML;
+                if (priv->page_id == NULL)
+                    priv->page_id = g_file_get_basename (priv->gfile);
                 if (priv->frag_id == NULL)
                     priv->frag_id = g_strdup (hash);
+                if (priv->fulluri == NULL) {
+                    gchar *fulluri;
+                    fulluri = g_file_get_uri (priv->gfile);
+                    priv->fulluri = g_strconcat (fulluri,
+                                                 priv->frag_id ? "#" : NULL,
+                                                 priv->frag_id,
+                                                 NULL);
+                    g_free (fulluri);
+                }
             }
             else if (g_str_equal (mime_type, "application/x-gzip")) {
                 if (g_str_has_suffix (basename, ".info.gz"))
diff --git a/libyelp/yelp-view.c b/libyelp/yelp-view.c
index baf15bd..6ef7513 100644
--- a/libyelp/yelp-view.c
+++ b/libyelp/yelp-view.c
@@ -66,6 +66,9 @@ static void        view_resource_request          (WebKitWebView             *vi
                                                    WebKitNetworkRequest      *request,
                                                    WebKitNetworkResponse     *response,
                                                    gpointer                   user_data);
+static void        view_title_changed             (WebKitWebView             *view,
+                                                   GParamSpec                *spec,
+                                                   gpointer                   user_data);
 
 static void        view_print                     (GtkAction          *action,
                                                    YelpView           *view);
@@ -204,6 +207,8 @@ yelp_view_init (YelpView *view)
                           G_CALLBACK (view_navigation_requested), NULL);
     g_signal_connect (view, "resource-request-starting",
                       G_CALLBACK (view_resource_request), NULL);
+    g_signal_connect (view, "notify::title",
+                      G_CALLBACK (view_title_changed), NULL);
 
     priv->action_group = gtk_action_group_new ("YelpView");
     gtk_action_group_set_translation_domain (priv->action_group, GETTEXT_PACKAGE);
@@ -402,7 +407,10 @@ yelp_view_get_property (GObject    *object,
             g_value_set_string (value, priv->page_desc);
             break;
         case PROP_PAGE_ICON:
-            g_value_set_string (value, priv->page_icon);
+            if (priv->page_icon)
+                g_value_set_string (value, priv->page_icon);
+            else
+                g_value_set_string (value, "help-contents");
             break;
         case PROP_STATE:
             g_value_set_enum (value, priv->state);
@@ -610,6 +618,20 @@ view_resource_request (WebKitWebView         *view,
 }
 
 static void
+view_title_changed (WebKitWebView *view,
+                    GParamSpec    *spec,
+                    gpointer       user_data)
+{
+    YelpViewPrivate *priv = GET_PRIV (view);
+    if (priv->page_title == NULL) {
+        priv->page_title = g_strdup (webkit_web_view_get_title (view));
+        spec = g_object_class_find_property ((GObjectClass *) YELP_VIEW_GET_CLASS (view),
+                                             "page-title");
+        g_signal_emit_by_name (view, "notify::page-title", spec);
+    }
+}
+
+static void
 view_print (GtkAction *action, YelpView  *view)
 {
     webkit_web_frame_print (webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (view)));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]