[gtk+] gtk-builder-tool: Strip placeholders



commit 9ff14a818819d89d4d7b8e3be398e13dfc430cff
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat May 2 14:39:35 2015 -0400

    gtk-builder-tool: Strip placeholders
    
    glade likes to sprinkle <child><placeholder/></child> all
    over the place - get rid of it.

 gtk/gtk-builder-tool.c |   75 +++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 61 insertions(+), 14 deletions(-)
---
diff --git a/gtk/gtk-builder-tool.c b/gtk/gtk-builder-tool.c
index 33a9d12..2b2009c 100644
--- a/gtk/gtk-builder-tool.c
+++ b/gtk/gtk-builder-tool.c
@@ -32,6 +32,8 @@ typedef struct {
   gboolean packing_started;
   gboolean cell_packing;
   gboolean cell_packing_started;
+  gint in_child;
+  gint child_started;
   gchar **attribute_names;
   gchar **attribute_values;
   GString *value;
@@ -161,6 +163,20 @@ needs_explicit_setting (MyParserData *data,
 }
 
 static void
+maybe_start_child (MyParserData *data)
+{
+  if (data->in_child > 0)
+    {
+      if (data->child_started < data->in_child)
+        {
+          g_print ("%*s<child>\n", data->indent, "");
+          data->indent += 2;
+          data->child_started += 1;
+        }
+    }
+}
+
+static void
 maybe_emit_property (MyParserData *data)
 {
   gint i;
@@ -327,6 +343,15 @@ start_element (GMarkupParseContext  *context,
 
       return;
     }
+  else if (strcmp (element_name, "child") == 0)
+    {
+      data->in_child += 1;
+
+      if (attribute_names[0] == NULL)
+        return;
+
+      data->child_started += 1;
+    }
   else if (strcmp (element_name, "attribute") == 0)
     {
       /* attribute in label has no content */
@@ -345,9 +370,15 @@ start_element (GMarkupParseContext  *context,
     {
       data->value = g_string_new ("");
     }
+  else if (strcmp (element_name, "placeholder") == 0)
+    {
+      return;
+    }
   else if (strcmp (element_name, "object") == 0 ||
            strcmp (element_name, "template") == 0)
     {
+      maybe_start_child (data);
+
       for (i = 0; attribute_names[i]; i++)
         {
           if (strcmp (attribute_names[i], "class") == 0)
@@ -400,17 +431,15 @@ end_element (GMarkupParseContext  *context,
       if (!data->cell_packing_started)
         return;
     }
-  else if (data->value != 0)
+  else if (strcmp (element_name, "child") == 0)
+    {
+      data->in_child -= 1;
+      if (data->child_started == data->in_child)
+        return;
+      data->child_started -= 1;
+    }
+  else if (strcmp (element_name, "placeholder") == 0)
     {
-      gchar *escaped;
-
-      escaped = g_markup_escape_text (data->value->str, -1);
-      g_print ("%s%s</%s>\n", data->unclosed_starttag ? ">" : "", escaped, element_name);
-      g_free (escaped);
-      g_string_free (data->value, TRUE);
-      data->value = NULL;
-      data->unclosed_starttag = FALSE;
-      data->indent -= 2;
       return;
     }
   else if (strcmp (element_name, "object") == 0 ||
@@ -420,13 +449,29 @@ end_element (GMarkupParseContext  *context,
       data->classes = g_list_delete_link (data->classes, data->classes);
     }
 
-  data->indent -= 2;
+  if (data->value != NULL)
+    {
+      gchar *escaped;
 
-  if (data->unclosed_starttag)
-    g_print ("/>\n");
+      if (data->unclosed_starttag)
+        g_print (">");
+
+      escaped = g_markup_escape_text (data->value->str, -1);
+      g_print ("%s</%s>\n", escaped, element_name);
+      g_free (escaped);
+
+      g_string_free (data->value, TRUE);
+      data->value = NULL;
+    }
   else
-    g_print ("%*s</%s>\n", data->indent, "", element_name);
+    {
+      if (data->unclosed_starttag)
+        g_print ("/>\n");
+      else
+        g_print ("%*s</%s>\n", data->indent - 2, "", element_name);
+    }
 
+  data->indent -= 2;
   data->unclosed_starttag = FALSE;
 }
 
@@ -491,6 +536,8 @@ do_simplify (const gchar *filename)
   data.packing_started = FALSE;
   data.cell_packing = FALSE;
   data.cell_packing_started = FALSE;
+  data.in_child = 0;
+  data.child_started = 0;
   data.unclosed_starttag = FALSE;
   data.indent = 0;
 


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