summaryrefslogtreecommitdiff
path: root/libappstream-glib/as-node.c
diff options
context:
space:
mode:
Diffstat (limited to 'libappstream-glib/as-node.c')
-rw-r--r--libappstream-glib/as-node.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/libappstream-glib/as-node.c b/libappstream-glib/as-node.c
index 9579bea..f793274 100644
--- a/libappstream-glib/as-node.c
+++ b/libappstream-glib/as-node.c
@@ -46,7 +46,8 @@ typedef struct
GList *attrs;
gchar *name; /* only used if tag == AS_TAG_UNKNOWN */
gchar *cdata;
- gboolean cdata_escaped;
+ guint8 cdata_escaped:1;
+ guint8 cdata_ignore:1;
AsTag tag;
} AsNodeData;
@@ -443,6 +444,7 @@ as_node_reflow_text (const gchar *text, gssize text_len)
typedef struct {
AsNode *current;
AsNodeFromXmlFlags flags;
+ const gchar * const *locales;
} AsNodeToXmlHelper;
/**
@@ -488,6 +490,7 @@ as_node_start_element_cb (GMarkupParseContext *context,
{
AsNodeToXmlHelper *helper = (AsNodeToXmlHelper *) user_data;
AsNodeData *data;
+ AsNodeData *data_parent;
AsNode *current;
gchar *tmp;
guint i;
@@ -501,6 +504,19 @@ as_node_start_element_cb (GMarkupParseContext *context,
attribute_values[i]);
}
+ /* parent node is being ignored */
+ data_parent = helper->current->data;
+ if (data_parent->cdata_ignore)
+ data->cdata_ignore = TRUE;
+
+ /* check if we should ignore the locale */
+ if (helper->flags & AS_NODE_FROM_XML_FLAG_ONLY_NATIVE_LANGS) {
+ const gchar *lang = as_node_attr_lookup (data, "xml:lang");
+ if (lang != NULL && !g_strv_contains (helper->locales, lang))
+ data->cdata_ignore = TRUE;
+
+ }
+
/* add the node to the DOM */
current = g_node_append_data (helper->current, data);
@@ -540,6 +556,11 @@ as_node_text_cb (GMarkupParseContext *context,
if (text_len == 0)
return;
+ /* ignoring */
+ data = helper->current->data;
+ if (data->cdata_ignore)
+ return;
+
/* all whitespace? */
for (i = 0; i < text_len; i++) {
if (!g_ascii_isspace(text[i]))
@@ -549,7 +570,6 @@ as_node_text_cb (GMarkupParseContext *context,
return;
/* split up into lines and add each with spaces stripped */
- data = helper->current->data;
if (data->cdata != NULL) {
g_set_error (error,
AS_NODE_ERROR,
@@ -649,6 +669,7 @@ as_node_from_xml (const gchar *data,
root = as_node_new ();
helper.flags = flags;
helper.current = root;
+ helper.locales = g_get_language_names ();
ctx = g_markup_parse_context_new (&parser,
G_MARKUP_PREFIX_ERROR_POSITION,
&helper,
@@ -784,6 +805,7 @@ as_node_from_file (GFile *file,
root = as_node_new ();
helper.flags = flags;
helper.current = root;
+ helper.locales = g_get_language_names ();
ctx = g_markup_parse_context_new (&parser,
G_MARKUP_PREFIX_ERROR_POSITION,
&helper,