diff -Nru appstream-glib-0.7.18/debian/changelog appstream-glib-0.7.18/debian/changelog
--- appstream-glib-0.7.18/debian/changelog 2021-11-07 19:38:32.000000000 +0100
+++ appstream-glib-0.7.18/debian/changelog 2023-06-07 17:42:20.000000000 +0200
@@ -1,3 +1,11 @@
+appstream-glib (0.7.18-2ubuntu0.1) jammy; urgency=medium
+
+ * Add support-em-code.patch, improve-em-code-handling.patch:
+ - Do not fail parsing when encountering valid or "
++ "It now also supports em and
+ elements in AppStream XML.
+
+ -- Matthias Klumpp
and
to the files. Not all package manager can
+ handle that. An example would be pamac from Manjaro
+
+---
+ libappstream-glib/as-node.c | 36 ++++++++++++++++++++++++++++++++
+ libappstream-glib/as-self-test.c | 16 ++++++++++++++
+ 2 files changed, 52 insertions(+)
+
+diff --git a/libappstream-glib/as-node.c b/libappstream-glib/as-node.c
+index aafb16aa..b4159ea9 100644
+--- a/libappstream-glib/as-node.c
++++ b/libappstream-glib/as-node.c
+@@ -555,6 +555,8 @@ typedef struct {
+ AsNode *current;
+ AsNodeFromXmlFlags flags;
+ const gchar * const *locales;
++ guint8 is_em_text;
++ guint8 is_code_text;
+ } AsNodeToXmlHelper;
+
+ /**
+@@ -604,6 +606,16 @@ as_node_start_element_cb (GMarkupParseContext *context,
+ AsNode *current;
+ guint i;
+
++ /* do not create a child node for em and code tags */
++ if (g_strcmp0 (element_name, "em") == 0) {
++ helper->is_em_text = 1;
++ return;
++ }
++ if (g_strcmp0 (element_name, "code") == 0) {
++ helper->is_code_text = 1;
++ return;
++ }
++
+ /* check if we should ignore the locale */
+ data = g_slice_new0 (AsNodeData);
+
+@@ -662,6 +674,16 @@ as_node_end_element_cb (GMarkupParseContext *context,
+ GError **error)
+ {
+ AsNodeToXmlHelper *helper = (AsNodeToXmlHelper *) user_data;
++
++ /* do not create a child node for em and code tags */
++ if (g_strcmp0 (element_name, "em") == 0) {
++ helper->is_em_text = 0;
++ return;
++ }
++ if (g_strcmp0 (element_name, "code") == 0) {
++ helper->is_code_text = 0;
++ return;
++ }
+ helper->current = helper->current->parent;
+ }
+
+@@ -695,6 +717,20 @@ as_node_text_cb (GMarkupParseContext *context,
+
+ /* split up into lines and add each with spaces stripped */
+ if (data->cdata != NULL) {
++ /* support em and code tags */
++ if (g_strcmp0 (as_tag_data_get_name (data), "p") == 0 ||
++ g_strcmp0 (as_tag_data_get_name (data), "li") == 0) {
++ g_autoptr(GString) str = g_string_new (data->cdata);
++ as_ref_string_unref (data->cdata);
++ if (helper->is_em_text)
++ g_string_append_printf (str, "%s", text);
++ else if (helper->is_code_text)
++ g_string_append_printf (str, "%s
", text);
++ else
++ g_string_append (str, text);
++ data->cdata = as_ref_string_new_with_length (str->str, str->len);
++ return;
++ }
+ g_set_error (error,
+ AS_NODE_ERROR,
+ AS_NODE_ERROR_INVALID_MARKUP,
+diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c
+index 2f0820fc..eafb15e1 100644
+--- a/libappstream-glib/as-self-test.c
++++ b/libappstream-glib/as-self-test.c
+@@ -2865,6 +2865,11 @@ as_test_node_xml_func (void)
+ ""
+ "code
tags."
++ "code
tags.");
++ as_node_unref (root);
++
+ /* keep comments */
+ root = as_node_from_xml (valid,
+ AS_NODE_FROM_XML_FLAG_KEEP_COMMENTS,
diff -Nru appstream-glib-0.7.18/debian/patches/04_improve-em-code-handling.patch appstream-glib-0.7.18/debian/patches/04_improve-em-code-handling.patch
--- appstream-glib-0.7.18/debian/patches/04_improve-em-code-handling.patch 1970-01-01 01:00:00.000000000 +0100
+++ appstream-glib-0.7.18/debian/patches/04_improve-em-code-handling.patch 2023-06-07 17:41:01.000000000 +0200
@@ -0,0 +1,242 @@
+From 674490bd54ff206f213ca4547db7fdb591a0fb3d Mon Sep 17 00:00:00 2001
+From: "Jan Alexander Steffens (heftig)" tags
+
+This is still not great code but at least somewhat an improvement. Tests
+were expanded to showcase the new behavior.
+
+I think, ideally, we would append opening/closing tags to the ancestor
+`p` or `li` node's cdata as soon as we encounter the start/end of an
+`em` or `code` element. This would then also handle empty elements
+correctly.
+---
+ libappstream-glib/as-node.c | 108 ++++++++++++++++++-------------
+ libappstream-glib/as-self-test.c | 39 ++++++++++-
+ 2 files changed, 101 insertions(+), 46 deletions(-)
+
+--- a/libappstream-glib/as-node.c
++++ b/libappstream-glib/as-node.c
+@@ -555,8 +555,8 @@
+ AsNode *current;
+ AsNodeFromXmlFlags flags;
+ const gchar * const *locales;
+- guint8 is_em_text;
+- guint8 is_code_text;
++ guint8 is_em_text:1;
++ guint8 is_code_text:1;
+ } AsNodeToXmlHelper;
+
+ /**
+@@ -674,6 +674,7 @@
+ GError **error)
+ {
+ AsNodeToXmlHelper *helper = (AsNodeToXmlHelper *) user_data;
++ AsNodeData *data = helper->current->data;
+
+ /* do not create a child node for em and code tags */
+ if (g_strcmp0 (element_name, "em") == 0) {
+@@ -684,6 +685,42 @@
+ helper->is_code_text = 0;
+ return;
+ }
++
++ if (data->cdata != NULL) {
++ /* split up into lines and add each with spaces stripped */
++ if ((helper->flags & AS_NODE_FROM_XML_FLAG_LITERAL_TEXT) == 0) {
++ AsRefString *cdata = data->cdata;
++ data->cdata = as_node_reflow_text (cdata, strlen (cdata));
++ as_ref_string_unref (cdata);
++ }
++
++ /* intern commonly duplicated tag values and save a bit of memory */
++ if (data->is_tag_valid) {
++ AsNode *root = g_node_get_root (helper->current);
++ switch (data->tag) {
++ case AS_TAG_CATEGORY:
++ case AS_TAG_COMPULSORY_FOR_DESKTOP:
++ case AS_TAG_CONTENT_ATTRIBUTE:
++ case AS_TAG_DEVELOPER_NAME:
++ case AS_TAG_EXTENDS:
++ case AS_TAG_ICON:
++ case AS_TAG_ID:
++ case AS_TAG_KUDO:
++ case AS_TAG_LANG:
++ case AS_TAG_METADATA_LICENSE:
++ case AS_TAG_MIMETYPE:
++ case AS_TAG_PROJECT_GROUP:
++ case AS_TAG_PROJECT_LICENSE:
++ case AS_TAG_SOURCE_PKGNAME:
++ case AS_TAG_URL:
++ as_node_cdata_to_intern (root, data);
++ break;
++ default:
++ break;
++ }
++ }
++ }
++
+ helper->current = helper->current->parent;
+ }
+
+@@ -715,22 +752,9 @@
+ if (i >= text_len)
+ return;
+
+- /* split up into lines and add each with spaces stripped */
+- if (data->cdata != NULL) {
+- /* support em and code tags */
+- if (g_strcmp0 (as_tag_data_get_name (data), "p") == 0 ||
+- g_strcmp0 (as_tag_data_get_name (data), "li") == 0) {
+- g_autoptr(GString) str = g_string_new (data->cdata);
+- as_ref_string_unref (data->cdata);
+- if (helper->is_em_text)
+- g_string_append_printf (str, "%s", text);
+- else if (helper->is_code_text)
+- g_string_append_printf (str, "
%s
", text);
+- else
+- g_string_append (str, text);
+- data->cdata = as_ref_string_new_with_length (str->str, str->len);
+- return;
+- }
++ if (data->cdata != NULL &&
++ g_strcmp0 (as_tag_data_get_name (data), "p") != 0 &&
++ g_strcmp0 (as_tag_data_get_name (data), "li") != 0) {
+ g_set_error (error,
+ AS_NODE_ERROR,
+ AS_NODE_ERROR_INVALID_MARKUP,
+@@ -739,37 +763,33 @@
+ data->cdata, text);
+ return;
+ }
+- if ((helper->flags & AS_NODE_FROM_XML_FLAG_LITERAL_TEXT) > 0) {
+- data->cdata = as_ref_string_new_with_length (text, text_len + 1);
+- } else {
+- data->cdata = as_node_reflow_text (text, (gssize) text_len);
+- }
+
+- /* intern commonly duplicated tag values and save a bit of memory */
+- if (data->is_tag_valid && data->cdata != NULL) {
+- AsNode *root = g_node_get_root (helper->current);
+- switch (data->tag) {
+- case AS_TAG_CATEGORY:
+- case AS_TAG_COMPULSORY_FOR_DESKTOP:
+- case AS_TAG_CONTENT_ATTRIBUTE:
+- case AS_TAG_DEVELOPER_NAME:
+- case AS_TAG_EXTENDS:
+- case AS_TAG_ICON:
+- case AS_TAG_ID:
+- case AS_TAG_KUDO:
+- case AS_TAG_LANG:
+- case AS_TAG_METADATA_LICENSE:
+- case AS_TAG_MIMETYPE:
+- case AS_TAG_PROJECT_GROUP:
+- case AS_TAG_PROJECT_LICENSE:
+- case AS_TAG_SOURCE_PKGNAME:
+- case AS_TAG_URL:
+- as_node_cdata_to_intern (root, data);
+- break;
+- default:
+- break;
++ /* support em and code tags */
++ if (helper->is_em_text || helper->is_code_text || data->cdata != NULL) {
++ g_autoptr(GString) str = g_string_new (NULL);
++
++ if (data->cdata != NULL) {
++ g_string_append (str, data->cdata);
++ as_ref_string_unref (data->cdata);
+ }
++
++ if (helper->is_em_text)
++ g_string_append (str, "");
++ if (helper->is_code_text)
++ g_string_append (str, "");
++
++ g_string_append_len (str, text, text_len);
++
++ if (helper->is_code_text)
++ g_string_append (str, "
");
++ if (helper->is_em_text)
++ g_string_append (str, "");
++
++ data->cdata = as_ref_string_new_with_length (str->str, str->len);
++ return;
+ }
++
++ data->cdata = as_ref_string_new_with_length (text, text_len);
+ }
+
+ static void
+@@ -826,7 +846,7 @@
+ AsNodeFromXmlFlags flags,
+ GError **error)
+ {
+- AsNodeToXmlHelper helper;
++ AsNodeToXmlHelper helper = {0};
+ AsNode *root = NULL;
+ gboolean ret;
+ g_autoptr(GError) error_local = NULL;
+@@ -963,7 +983,7 @@
+ GCancellable *cancellable,
+ GError **error)
+ {
+- AsNodeToXmlHelper helper;
++ AsNodeToXmlHelper helper = {0};
+ GError *error_local = NULL;
+ AsNode *root = NULL;
+ const gchar *content_type = NULL;
+--- a/libappstream-glib/as-self-test.c
++++ b/libappstream-glib/as-self-test.c
+@@ -2866,6 +2866,15 @@
+ "It now also supports em and code
tags."
+ "
Emphasis at the start of the paragraph
" ++ "" ++ "
empty emphasis
" ++ "code
tags.");
++ g_assert_cmpstr (as_node_get_data (n2), ==, "It now also supports em and code
tags.");
++ as_node_unref (root);
++
++ root = as_node_from_xml (valid_em_code_2, 0, &error);
++ g_assert_no_error (error);
++ g_assert (root != NULL);
++
++ n2 = as_node_find (root, "description/p");
++ g_assert (n2 != NULL);
++ g_assert_cmpstr (as_node_get_data (n2), ==, "Emphasis at the start of the paragraph");
++ as_node_unref (root);
++
++ root = as_node_from_xml (valid_em_code_empty, 0, &error);
++ g_assert_no_error (error);
++ g_assert (root != NULL);
++
++ n2 = as_node_find (root, "description/p");
++ g_assert (n2 != NULL);
++ g_assert_cmpstr (as_node_get_data (n2), ==, NULL);
++ as_node_unref (root);
++
++ root = as_node_from_xml (valid_em_code_empty_2, 0, &error);
++ g_assert_no_error (error);
++ g_assert (root != NULL);
++
++ n2 = as_node_find (root, "description/p");
++ g_assert (n2 != NULL);
++ g_assert_cmpstr (as_node_get_data (n2), ==, "empty emphasis");
+ as_node_unref (root);
+
+ /* keep comments */
diff -Nru appstream-glib-0.7.18/debian/patches/series appstream-glib-0.7.18/debian/patches/series
--- appstream-glib-0.7.18/debian/patches/series 2021-11-07 19:19:16.000000000 +0100
+++ appstream-glib-0.7.18/debian/patches/series 2023-06-07 17:39:52.000000000 +0200
@@ -1,2 +1,4 @@
01_as-app-Parse-custom-tags-from-DEP-11.patch
02_as-app-Parse-launchables-from-DEP-11.patch
+03_support-em-code.patch
+04_improve-em-code-handling.patch