[caribou] Removed Json loader and replaced with XML loader.



commit f735e635ed282a18814857371ccf1baa236e0d18
Author: Eitan Isaacson <eitan monotonous org>
Date:   Tue Jun 14 11:00:44 2011 -0700

    Removed Json loader and replaced with XML loader.

 configure.ac                      |    2 +-
 libcaribou/Makefile.am            |    8 +-
 libcaribou/json-deserializer.vala |  136 ----------------------------------
 libcaribou/key-model.vala         |    3 +-
 libcaribou/keyboard-model.vala    |    2 +-
 libcaribou/xml-deserializer.vala  |  148 +++++++++++++++++++++++++++++++++++++
 6 files changed, 155 insertions(+), 144 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 04e28c1..1de639f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -45,7 +45,7 @@ PKG_CHECK_MODULES(LIBCARIBOU, [
   xtst,
   x11,
   libxklavier,
-  json-glib-1.0,
+  libxml-2.0,
   gee-1.0
   ])
 AC_SUBST(LIBCARIBOU_CFLAGS)
diff --git a/libcaribou/Makefile.am b/libcaribou/Makefile.am
index e879eb3..e01a188 100644
--- a/libcaribou/Makefile.am
+++ b/libcaribou/Makefile.am
@@ -9,8 +9,8 @@ libcaribou_la_VALAFLAGS = \
 	-H caribou.h --vapi caribou-1.0.vapi \
 	-h caribou-internals.h \
 	--vapidir=. \
-	--pkg x11 --pkg json-glib-1.0 --pkg gdk-3.0 --pkg gio-2.0 --pkg gee-1.0 \
-	--pkg libxklavier --pkg external-libs --pkg gdk-x11-3.0 \
+	--pkg x11 --pkg gdk-3.0 --pkg gio-2.0 --pkg gee-1.0 \
+	--pkg libxklavier --pkg external-libs --pkg gdk-x11-3.0 --pkg libxml-2.0 \
 	--internal-vapi caribou-internals-1.0.vapi \
 	--library caribou-1.0 --gir _Caribou-1.0.gir \
 	$(VALAFLAGS)
@@ -39,11 +39,11 @@ libcaribou_la_SOURCES = \
 	key-model.vala \
 	column-model.vala \
 	scanner.vala \
-	json-deserializer.vala \
 	iscannable-item.vala \
 	iscannable-group.vala \
 	scannable-group.vala \
-	ikeyboard-object.vala
+	ikeyboard-object.vala \
+	xml-deserializer.vala
 
 EXTRA_DIST = \
 	external-libs.vapi \
diff --git a/libcaribou/key-model.vala b/libcaribou/key-model.vala
index 81babd6..da90c4f 100644
--- a/libcaribou/key-model.vala
+++ b/libcaribou/key-model.vala
@@ -40,8 +40,7 @@ namespace Caribou {
             extended_keys = new Gee.ArrayList<KeyModel> ();
         }
 
-        internal void add_subkey (string name) {
-            KeyModel key = new KeyModel (name);
+        internal void add_subkey (KeyModel key) {
             key.key_activated.connect(on_subkey_activated);
             extended_keys.add (key);
         }
diff --git a/libcaribou/keyboard-model.vala b/libcaribou/keyboard-model.vala
index e34a3a3..0b7bea0 100644
--- a/libcaribou/keyboard-model.vala
+++ b/libcaribou/keyboard-model.vala
@@ -32,7 +32,7 @@ namespace Caribou {
         }
 
         private void populate_group (string group, string variant) {
-            GroupModel grp = JsonDeserializer.load_group (keyboard_type,
+            GroupModel grp = XmlDeserializer.load_group (keyboard_type,
                                                           group, variant);
             if (grp != null) {
                 groups.set (GroupModel.create_group_name (group, variant), grp);
diff --git a/libcaribou/xml-deserializer.vala b/libcaribou/xml-deserializer.vala
new file mode 100644
index 0000000..4656f28
--- /dev/null
+++ b/libcaribou/xml-deserializer.vala
@@ -0,0 +1,148 @@
+using Xml;
+
+namespace Caribou {
+
+    private class XmlDeserializer : Object {
+
+        public static string? get_layout_file_inner (string data_dir,
+                                                    string group,
+                                                    string variant) {
+            string[] files = {@"$(group)_$(variant).xml", @"$(group).xml"};
+
+            foreach (string fn in files) {
+                string layout_fn = GLib.Path.build_filename (data_dir, fn);
+                GLib.File fp = GLib.File.new_for_path (layout_fn);
+                if (fp.query_exists ())
+                    return layout_fn;
+            }
+
+            return null;
+        }
+
+        public static string get_layout_file (string keyboard_type, string group,
+                                              string variant) throws IOError {
+
+            List<string> dirs = new List<string> ();
+            string custom_dir = Environment.get_variable("CARIBOU_LAYOUTS_DIR");
+
+            if (custom_dir != null)
+                dirs.append (Path.build_filename (custom_dir, "layouts",
+                                                  keyboard_type));
+
+            dirs.append (Path.build_filename (Environment.get_user_data_dir (),
+                                              "caribou", "layouts", keyboard_type));
+
+            foreach (string dir in Environment.get_system_data_dirs ()) {
+                dirs.append (Path.build_filename (
+                                 dir, "caribou", "layouts", keyboard_type));
+            }
+
+            foreach (string data_dir in dirs) {
+                string fn = get_layout_file_inner (data_dir, group, variant);
+                if (fn != null)
+                    return fn;
+            }
+
+            throw new IOError.NOT_FOUND (
+                "Could not find layout file for %s %s", group, variant);                       }
+
+        public static GroupModel? load_group (string keyboard_type,
+                                              string group, string variant) {
+            Doc* doc;
+
+            try {
+                string fn = get_layout_file (keyboard_type, group, variant);
+                doc = Parser.parse_file (fn);
+                if (doc == null)
+                    throw new IOError.FAILED (
+                        "Cannot load XML text reader for %s", fn);
+            } catch (GLib.Error e) {
+                stdout.printf ("Failed to load XML: %s\n", e.message);
+                return null;
+            }
+
+            GroupModel grp = new GroupModel (group, variant);
+            Xml.Node* node = doc->children;
+
+            create_levels_from_xml (grp, node);
+
+            delete doc;
+            Parser.cleanup ();
+
+            return grp;
+        }
+
+        public static void create_levels_from_xml (GroupModel group,
+                                                   Xml.Node* node) {
+            assert (node->name == "layout");
+            for (Xml.Node* iter = node->children; iter != null; iter = iter->next) {
+                if (iter->type != ElementType.ELEMENT_NODE)
+                    continue;
+
+                string levelname = iter->get_prop ("name");
+                string mode = iter->get_prop ("mode");
+
+                LevelModel level = new LevelModel(mode);
+                load_rows (level, iter);
+
+                group.add_level(levelname, level);
+            }
+        }
+
+        public static void load_rows (LevelModel level, Xml.Node* node) {
+            assert (node->name == "level");
+            int rownum = 0;
+            for (Xml.Node* i = node->children; i != null; i = i->next) {
+                if (i->type != ElementType.ELEMENT_NODE)
+                    continue;
+
+                int colnum = 0;
+                for (Xml.Node* i2 = i->children; i2 != null; i2 = i2->next) {
+                    if (i2->name == "key")
+                        level.add_key (rownum, colnum, load_key(i2));
+                    else if (i2->name == "column")
+                        load_column (level, rownum, colnum++, i2);
+                }
+                rownum++;
+            }
+        }
+
+        public static void load_column (LevelModel level, int row, int col,
+                                        Xml.Node* node) {
+            assert (node->name == "column");
+            for (Xml.Node* i = node->children; i != null; i = i->next) {
+                if (i->type != ElementType.ELEMENT_NODE)
+                    continue;
+                
+                level.add_key (row, col, load_key (i));
+            }
+        }
+
+        public static KeyModel load_key (Xml.Node* node) {
+            assert (node->name == "key");
+
+            string name = node->get_prop ("name");
+            assert (name != null);
+
+            KeyModel key = new KeyModel (name);
+
+            for (Attr* prop = node->properties; prop != null; prop = prop->next) {
+                if (prop->name == "toggle")
+                    key.toggle = prop->children->content;
+                else if (prop->name == "margin-left")
+                    key.margin_left = double.parse (prop->children->content);
+                else if (prop->name == "width")
+                    key.width = double.parse (prop->children->content);
+            }
+
+            for (Xml.Node* i = node->children; i != null; i = i->next) {
+                if (i->type != ElementType.ELEMENT_NODE)
+                    continue;
+
+                key.add_subkey (load_key (i));
+            }
+
+            return key;
+        }
+    }
+}
\ No newline at end of file



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