summaryrefslogtreecommitdiff
path: root/libyelp/yelp-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'libyelp/yelp-view.c')
-rw-r--r--libyelp/yelp-view.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/libyelp/yelp-view.c b/libyelp/yelp-view.c
index 6776b4e2..df68ccd5 100644
--- a/libyelp/yelp-view.c
+++ b/libyelp/yelp-view.c
@@ -1886,11 +1886,43 @@ view_clear_load (YelpView *view)
}
}
+static gchar*
+fix_docbook_uri (YelpUri *docbook_uri, YelpDocument* document)
+{
+ SoupURI *soup_uri;
+ gchar *retval, *canonical;
+
+ canonical = yelp_uri_get_canonical_uri (docbook_uri);
+ soup_uri = soup_uri_new (canonical);
+ g_free (canonical);
+
+ /* We don't have actual page and frag IDs for DocBook. We just map IDs
+ of block elements. The result is that we get xref:someid#someid.
+ If someid is really the page ID, we just drop the frag reference.
+ Otherwise, normal page views scroll past the link trail.
+ */
+ if (soup_uri->fragment && YELP_IS_DOCBOOK_DOCUMENT (document)) {
+ gchar *page_id = yelp_uri_get_page_id (docbook_uri);
+ gchar *real_id = yelp_document_get_page_id (document, page_id);
+
+ if (g_str_equal (real_id, soup_uri->fragment))
+ soup_uri_set_fragment (soup_uri, NULL);
+
+ g_free (real_id);
+ g_free (page_id);
+ }
+
+ retval = soup_uri_to_string (soup_uri, FALSE);
+ soup_uri_free (soup_uri);
+
+ return retval;
+}
+
static void
view_load_page (YelpView *view)
{
YelpViewPrivate *priv = GET_PRIV (view);
- gchar *uri_str;
+ gchar *uri_str, *tmp_uri;
g_return_if_fail (priv->cancellable == NULL);
@@ -1915,7 +1947,17 @@ view_load_page (YelpView *view)
return;
}
- uri_str = build_network_uri (priv->uri, priv->document);
+ uri_str = yelp_uri_get_canonical_uri (priv->uri);
+
+ if (YELP_IS_DOCBOOK_DOCUMENT (priv->document)){
+ tmp_uri = uri_str;
+ uri_str = fix_docbook_uri (priv->uri, priv->document);
+ g_free (tmp_uri);
+ }
+
+ tmp_uri = uri_str;
+ uri_str = build_network_uri (uri_str);
+ g_free (tmp_uri);
g_signal_handler_block (view, priv->navigation_requested);
webkit_web_view_load_uri (WEBKIT_WEB_VIEW (view), uri_str);