diff options
Diffstat (limited to 'src/bookmarks/ephy-bookmarks-export.c')
-rw-r--r-- | src/bookmarks/ephy-bookmarks-export.c | 81 |
1 files changed, 59 insertions, 22 deletions
diff --git a/src/bookmarks/ephy-bookmarks-export.c b/src/bookmarks/ephy-bookmarks-export.c index 7ca93811e..7f026f3a1 100644 --- a/src/bookmarks/ephy-bookmarks-export.c +++ b/src/bookmarks/ephy-bookmarks-export.c @@ -17,6 +17,7 @@ */ #include <libxml/tree.h> +#include <libgnomevfs/gnome-vfs-uri.h> #include <libgnomevfs/gnome-vfs-utils.h> #include "ephy-bookmarks-export.h" @@ -25,12 +26,12 @@ #include "ephy-debug.h" static void -add_topics_list (EphyNode *topics, EphyNode *bmk, xmlNodePtr parent) +add_topics_list (EphyNode *topics, EphyNode *bmk, + xmlNodePtr parent, xmlNsPtr dc_ns) { GPtrArray *children; int i; GList *bmks = NULL, *l; - xmlNodePtr xml_node; children = ephy_node_get_children (topics); for (i = 0; i < children->len; i++) @@ -57,11 +58,12 @@ add_topics_list (EphyNode *topics, EphyNode *bmk, xmlNodePtr parent) { const char *name; EphyNode *node = l->data; + xmlNodePtr item_node; - xml_node = xmlNewChild (parent, NULL, "dc:subject", NULL); name = ephy_node_get_property_string (node, EPHY_NODE_KEYWORD_PROP_NAME); - xmlNodeSetContent (xml_node, name); + item_node = xmlNewChild (parent, dc_ns, "subject", NULL); + xmlNodeSetContent (item_node, name); } g_list_free (bmks); @@ -75,8 +77,9 @@ ephy_bookmarks_export_rdf (EphyBookmarks *bookmarks, EphyNode *topics; xmlDocPtr doc; xmlNodePtr root, xml_node, channel_node, channel_seq_node; - char *uri; + xmlNsPtr ephy_ns, rdf_ns, dc_ns; GPtrArray *children; + char *file_uri; int i; LOG ("Exporting to rdf") @@ -86,14 +89,14 @@ ephy_bookmarks_export_rdf (EphyBookmarks *bookmarks, root = xmlNewDocNode (doc, NULL, "rdf:RDF", NULL); xmlDocSetRootElement (doc, root); - xmlSetProp (root, "xmlns:rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); - xmlSetProp (root, "xmlns", "http://purl.org/rss/1.0/"); - xmlSetProp (root, "xmlns:dc", "http://purl.org/dc/elements/1.1/"); - + rdf_ns = xmlNewNs (root, "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf"); + xmlNewNs (root, "http://purl.org/rss/1.0/", NULL); + dc_ns = xmlNewNs (root, "http://purl.org/dc/elements/1.1/", "dc"); + ephy_ns = xmlNewNs (root, "http://gnome.org/ns/epiphany#", "ephy"); channel_node = xmlNewChild (root, NULL, "channel", NULL); - uri = gnome_vfs_get_uri_from_local_path (filename); - xmlSetProp (channel_node, "rdf:about", uri); - g_free (uri); + file_uri = gnome_vfs_get_uri_from_local_path (filename); + xmlSetProp (channel_node, "rdf:about", file_uri); + g_free (file_uri); xml_node = xmlNewChild (channel_node, NULL, "title", NULL); xmlNodeSetContent (xml_node, "Epiphany bookmarks"); @@ -103,7 +106,7 @@ ephy_bookmarks_export_rdf (EphyBookmarks *bookmarks, xml_node = xmlNewChild (channel_node, NULL, "items", NULL); - channel_seq_node = xmlNewChild (xml_node, NULL, "rdf:Seq", NULL); + channel_seq_node = xmlNewChild (xml_node, rdf_ns, "Seq", NULL); bmks = ephy_bookmarks_get_bookmarks (bookmarks); topics = ephy_bookmarks_get_keywords (bookmarks); @@ -114,28 +117,62 @@ ephy_bookmarks_export_rdf (EphyBookmarks *bookmarks, EphyNode *kid; const char *url, *title; xmlNodePtr item_node; + xmlChar *encoded_link; + char *link = NULL; + gboolean smart_url; kid = g_ptr_array_index (children, i); - + smart_url = ephy_node_get_property_boolean + (kid, EPHY_NODE_BMK_PROP_HAS_SMART_ADDRESS); url = ephy_node_get_property_string (kid, EPHY_NODE_BMK_PROP_LOCATION); title = ephy_node_get_property_string (kid, EPHY_NODE_BMK_PROP_TITLE); - item_node = xmlNewChild (channel_seq_node, NULL, "rdf:li", NULL); - xmlSetProp (item_node, "rdf:about", url); + if (smart_url) + { + GnomeVFSURI *uri; + + uri = gnome_vfs_uri_new (url); + + if (uri) + { + link = g_strconcat (gnome_vfs_uri_get_scheme (uri), + "://", + gnome_vfs_uri_get_host_name (uri), + NULL); + + gnome_vfs_uri_unref (uri); + } + } + + if (link == NULL) + { + link = g_strdup (url); + } + + encoded_link = xmlEncodeEntitiesReentrant (doc, link); + + item_node = xmlNewChild (channel_seq_node, rdf_ns, "li", NULL); + xmlSetNsProp (item_node, rdf_ns, "about", link); item_node = xmlNewChild (root, NULL, "item", NULL); - xmlSetProp (item_node, "rdf:about", url); + xmlSetNsProp (item_node, rdf_ns, "about", link); - xml_node = xmlNewChild (item_node, NULL, "title", NULL); - xmlNodeSetContent (xml_node, title); + xml_node = xmlNewChild (item_node, NULL, "title", title); + + xml_node = xmlNewChild (item_node, NULL, "link", encoded_link); + + if (smart_url) + { + xml_node = xmlNewChild (item_node, ephy_ns, "smartlink", url); + } - xml_node = xmlNewChild (item_node, NULL, "link", NULL); - xmlNodeSetContent (xml_node, url); + add_topics_list (topics, kid, item_node, dc_ns); - add_topics_list (topics, kid, item_node); + xmlFree (encoded_link); + g_free (link); } ephy_node_thaw (bmks); |