builder-tool: Pass through CDATA where it makes sense

This avoids a ton of escaping for
GtkBuilderListItemFactory::bytes.
This commit is contained in:
Matthias Clasen 2019-12-13 14:03:20 -05:00
parent 2f21003064
commit 21eac434c3

View File

@ -264,6 +264,36 @@ keep_for_rewrite (const char *class_name,
return found; return found;
} }
static gboolean
has_attribute (Element *elt,
const char *name,
const char *value)
{
int i;
for (i = 0; elt->attribute_names[i]; i++)
{
if (strcmp (elt->attribute_names[i], name) == 0 &&
(value == NULL || strcmp (elt->attribute_values[i], value) == 0))
return TRUE;
}
return FALSE;
}
static gboolean
is_cdata_property (Element *element)
{
if (g_str_equal (element->element_name, "property") &&
has_attribute (element, "name", "bytes") &&
element->parent != NULL &&
g_str_equal (element->parent->element_name, "object") &&
has_attribute (element->parent, "class", "GtkBuilderListItemFactory"))
return TRUE;
return FALSE;
}
static gboolean static gboolean
is_pcdata_element (Element *element) is_pcdata_element (Element *element)
{ {
@ -486,23 +516,6 @@ value_is_default (Element *element,
return ret; return ret;
} }
static gboolean
has_attribute (Element *elt,
const char *name,
const char *value)
{
int i;
for (i = 0; elt->attribute_names[i]; i++)
{
if (strcmp (elt->attribute_names[i], name) == 0 &&
(value == NULL || strcmp (elt->attribute_values[i], value) == 0))
return TRUE;
}
return FALSE;
}
static const char * static const char *
get_attribute_value (Element *element, get_attribute_value (Element *element,
const char *name) const char *name)
@ -1794,9 +1807,18 @@ dump_element (Element *element,
} }
else else
{ {
char *escaped = g_markup_escape_text (element->data, -1); if (is_cdata_property (element))
g_fprintf (output, "%s", escaped); {
g_free (escaped); g_fprintf (output, "<![CDATA[");
g_fprintf (output, "%s", element->data);
g_fprintf (output, "]]>");
}
else
{
char *escaped = g_markup_escape_text (element->data, -1);
g_fprintf (output, "%s", escaped);
g_free (escaped);
}
} }
g_fprintf (output, "</%s>\n", element->element_name); g_fprintf (output, "</%s>\n", element->element_name);
} }