[Xfce4-commits] <midori:master> Add initial support for HTML bookmarks import

Christian Dywan noreply at xfce.org
Sat Jan 29 09:04:03 CET 2011


Updating branch refs/heads/master
         to 4ed49d001fbb05fa4ed8f41939ea522c7a660c67 (commit)
       from 567d5a7d140456c8db9bf84d1e768f1f39a732ed (commit)

commit 4ed49d001fbb05fa4ed8f41939ea522c7a660c67
Author: Paweł Forysiuk <tuxator at o2.pl>
Date:   Thu Jan 27 18:52:37 2011 +0100

    Add initial support for HTML bookmarks import

 midori/midori-array.c |   97 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 97 insertions(+), 0 deletions(-)

diff --git a/midori/midori-array.c b/midori/midori-array.c
index 58a2aad..f6495e5 100644
--- a/midori/midori-array.c
+++ b/midori/midori-array.c
@@ -294,6 +294,73 @@ katze_array_from_xmlDocPtr (KatzeArray* array,
 }
 
 static gboolean
+katze_array_from_mozilla_file (KatzeArray*  array,
+                               const gchar* filename)
+{
+    gchar* line  = NULL;
+    GIOChannel* channel = g_io_channel_new_file (filename, "r", 0);
+    KatzeArray* folder  = array;
+    KatzeItem* item = NULL;
+
+    if (!channel)
+        return FALSE;
+
+    while (g_io_channel_read_line (channel, &line, NULL, NULL, NULL)
+            == G_IO_STATUS_NORMAL)
+    {
+        g_strstrip (line);
+        /* parse lines with bookmarks data only, skip the rest */
+        if (!strncmp (line, "<D", 2) || !strncmp (line, "</D", 3))
+        {
+            gchar** element = g_strsplit_set (line, "<>", -1);
+            /* current item */
+            if (katze_str_equal (element[1], "DT"))
+            {
+                /* item is bookmark */
+                if (!strncmp (element[3], "A HREF", 6))
+                {
+                    gchar** parts = g_strsplit (line, "\"", -1);
+                    item = katze_item_new ();
+                    katze_array_add_item (folder, item);
+                    item->name = g_strdup (element[4]);
+                    item->uri = g_strdup (parts[1]);
+                    g_strfreev (parts);
+                }
+                /* item is folder */
+                if (!strncmp (element[3], "H3", 2))
+                {
+                    item = (KatzeItem*)katze_array_new (KATZE_TYPE_ARRAY);
+                    katze_array_add_item (folder, item);
+                    folder = (KatzeArray*)item;
+                    item->name = g_strdup (element[4]);
+                }
+            }
+            /* item description */
+            if (item && katze_str_equal (element[1], "DD"))
+            {
+                if (element[2])
+                    item->text = g_strdup (element[2]);
+                item = NULL;
+            }
+            /* end of current folder, level-up */
+            if (katze_str_equal (element[1], "/DL"))
+            {
+                if (folder != array)
+                    folder = katze_item_get_parent ((KatzeItem*)folder);
+                else
+                    g_warning ("A level-up although we are at the top level");
+                continue;
+            }
+            g_strfreev (element);
+        }
+        continue;
+    }
+    g_io_channel_shutdown (channel, FALSE, 0);
+    g_io_channel_unref (channel);
+    return TRUE;
+}
+
+static gboolean
 katze_array_from_opera_file (KatzeArray* array,
                              const gchar*  filename)
 {
@@ -422,6 +489,36 @@ midori_array_from_file (KatzeArray*  array,
     if (!format)
         format = "";
 
+    /* mozilla html */
+    if (!*format && g_str_has_suffix (filename, ".html"))
+    {
+        FILE* file;
+        if ((file = g_fopen (filename, "r")))
+        {
+            gchar line[50];
+            while (fgets (line, 50, file))
+            {
+                g_strstrip (line);
+                if (katze_str_equal (line, "<!DOCTYPE NETSCAPE-Bookmark-file-1>"))
+                {
+                    if (!katze_array_from_mozilla_file (array, filename))
+                    {
+                        /* Parsing failed */
+                        fclose (file);
+                        if (error)
+                            *error = g_error_new_literal (G_FILE_ERROR,
+                                    G_FILE_ERROR_FAILED, _("Malformed document."));
+                        return FALSE;
+                    }
+                    return TRUE;
+                }
+                else
+                    break;
+            }
+            fclose (file);
+        }
+    }
+
     /* Opera6 */
     if (katze_str_equal (format, "opera")
     || (!*format && g_str_has_suffix (filename, ".adr")))



More information about the Xfce4-commits mailing list