[yelp] Fix some issues with previous/next links



commit 5ca0a22c2d24a1ab9245e6dc13b694cc2c1e0d48
Author: Shaun McCance <shaunm gnome org>
Date:   Thu Jan 6 19:48:10 2011 -0500

    Fix some issues with previous/next links

 libyelp/yelp-docbook-document.c |    7 ----
 libyelp/yelp-mallard-document.c |   60 +++++++++++++++++++++++++++++---------
 2 files changed, 46 insertions(+), 21 deletions(-)
---
diff --git a/libyelp/yelp-docbook-document.c b/libyelp/yelp-docbook-document.c
index 00d4cde..7dcf917 100644
--- a/libyelp/yelp-docbook-document.c
+++ b/libyelp/yelp-docbook-document.c
@@ -197,8 +197,6 @@ yelp_docbook_document_new (YelpUri *uri)
 
     priv->uri = g_object_ref (uri);
 
-    yelp_document_set_page_id (YELP_DOCUMENT (docbook), "//about", "//about");
-
     priv->sections =
         GTK_TREE_MODEL (gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING));
 
@@ -359,14 +357,10 @@ docbook_process (YelpDocbookDocument *docbook)
         priv->root_id = g_strdup (id);
         yelp_document_set_page_id (document, NULL, (gchar *) id);
         yelp_document_set_page_id (document, "//index", (gchar *) id);
-        yelp_document_set_prev_id (document, (gchar *) id, "//about");
-        yelp_document_set_next_id (document, "//about", (gchar *) id);
     }
     else {
         priv->root_id = g_strdup ("//index");
         yelp_document_set_page_id (document, NULL, "//index");
-        yelp_document_set_prev_id (document, "//index", "//about");
-        yelp_document_set_next_id (document, "//about", "//index");
         /* add the id attribute to the root element with value "index"
          * so when we try to load the document later, it doesn't fail */
         if (priv->xmlcur->ns)
@@ -377,7 +371,6 @@ docbook_process (YelpDocbookDocument *docbook)
             xmlNewProp (priv->xmlcur, BAD_CAST "id", BAD_CAST "//index");
     }
     yelp_document_set_root_id (document, priv->root_id, priv->root_id);
-    yelp_document_set_root_id (document, "//about", priv->root_id);
     g_mutex_unlock (priv->mutex);
 
     g_mutex_lock (priv->mutex);
diff --git a/libyelp/yelp-mallard-document.c b/libyelp/yelp-mallard-document.c
index 1bab124..8f81e46 100644
--- a/libyelp/yelp-mallard-document.c
+++ b/libyelp/yelp-mallard-document.c
@@ -69,6 +69,7 @@ typedef struct {
 
     gchar         *page_title;
     gchar         *page_desc;
+    gchar         *next_page;
 } MallardPageData;
 
 static void           yelp_mallard_document_class_init (YelpMallardDocumentClass *klass);
@@ -348,6 +349,14 @@ mallard_think (YelpMallardDocument *mallard)
                 yelp_document_set_page_desc ((YelpDocument *) mallard,
                                              page_data->page_id,
                                              page_data->page_desc);
+                if (page_data->next_page != NULL) {
+                    yelp_document_set_next_id ((YelpDocument *) mallard,
+                                               page_data->page_id,
+                                               page_data->next_page);
+                    yelp_document_set_prev_id ((YelpDocument *) mallard,
+                                               page_data->next_page,
+                                               page_data->page_id);
+                }
                 yelp_document_signal ((YelpDocument *) mallard,
                                       page_data->page_id,
                                       YELP_DOCUMENT_SIGNAL_INFO,
@@ -606,20 +615,25 @@ mallard_page_data_info (MallardPageData *page_data,
             xmlAddChild (cache_node, title_node);
 
             type = xmlGetProp (child, BAD_CAST "type");
-            role = xmlGetProp (child, BAD_CAST "role");
-
-            if (xmlStrEqual (type, BAD_CAST "link") && role == NULL)
-                page_data->link_title = TRUE;
-            if (xmlStrEqual (type, BAD_CAST "sort"))
-                page_data->sort_title = TRUE;
-            if (xmlStrEqual (type, BAD_CAST "text")) {
-                YelpMallardDocumentPrivate *priv = GET_PRIV (page_data->mallard);
-                xmlXPathObjectPtr obj;
-                page_data->xpath->node = child;
-                obj = xmlXPathCompiledEval (priv->normalize, page_data->xpath);
-                g_free (page_data->page_title);
-                page_data->page_title = g_strdup (obj->stringval);
-                xmlXPathFreeObject (obj);
+
+            if (type != NULL) {
+                role = xmlGetProp (child, BAD_CAST "role");
+                if (xmlStrEqual (type, BAD_CAST "link") && role == NULL)
+                    page_data->link_title = TRUE;
+                if (xmlStrEqual (type, BAD_CAST "sort"))
+                    page_data->sort_title = TRUE;
+                if (xmlStrEqual (type, BAD_CAST "text")) {
+                    YelpMallardDocumentPrivate *priv = GET_PRIV (page_data->mallard);
+                    xmlXPathObjectPtr obj;
+                    page_data->xpath->node = child;
+                    obj = xmlXPathCompiledEval (priv->normalize, page_data->xpath);
+                    g_free (page_data->page_title);
+                    page_data->page_title = g_strdup (obj->stringval);
+                    xmlXPathFreeObject (obj);
+                }
+                if (role != NULL)
+                    xmlFree (role);
+                xmlFree (type);
             }
         }
         else if (xml_node_is_ns_name (child, MALLARD_NS, BAD_CAST "desc")) {
@@ -633,7 +647,24 @@ mallard_page_data_info (MallardPageData *page_data,
             xmlAddChild (cache_node, xmlCopyNode (child, 1));
         }
         else if (xml_node_is_ns_name (child, MALLARD_NS, BAD_CAST "link")) {
+            xmlChar *type, *next;
+
             xmlAddChild (cache_node, xmlCopyNode (child, 1));
+
+            type = xmlGetProp (child, BAD_CAST "type");
+            if (type != NULL) {
+                if (xmlStrEqual (type, "next")) {
+                    next = xmlGetProp (child, BAD_CAST "xref");
+                    if (next != NULL) {
+                        if (page_data->next_page != NULL)
+                            g_free (page_data->next_page);
+                        page_data->next_page = g_strdup (next);
+                        xmlFree (next);
+                    }
+                }
+                xmlFree (type);
+            }
+
         }
         else if (xml_node_is_ns_name (child, MALLARD_NS, BAD_CAST "revision")) {
             xmlAddChild (cache_node, xmlCopyNode (child, 1));
@@ -698,6 +729,7 @@ mallard_page_data_free (MallardPageData *page_data)
         xmlXPathFreeContext (page_data->xpath);
     g_free (page_data->page_title);
     g_free (page_data->page_desc);
+    g_free (page_data->next_page);
     g_free (page_data);
 }
 



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