diff --git a/src/XEP-0393.c b/src/XEP-0393.c
index 22875a3..3fa7358 100644
--- a/src/XEP-0393.c
+++ b/src/XEP-0393.c
@@ -294,6 +294,7 @@ ShoveXML(XEP393Element *element, XMLElement *xmlparent)
{
XMLElement *head = xmlparent;
size_t i;
+ bool par = false;
if (!element || !xmlparent)
{
return;
@@ -324,6 +325,7 @@ ShoveXML(XEP393Element *element, XMLElement *xmlparent)
case XEP393_LINE:
head = XMLCreateTag("p");
XMLAddChild(xmlparent, head);
+ par = true;
break;
case XEP393_QUOT:
head = XMLCreateTag("blockquote");
@@ -360,6 +362,17 @@ ShoveXML(XEP393Element *element, XMLElement *xmlparent)
break;
default: break;
}
+
+ /* NOTE: Hack to get rid of stranded
-tags with no
+ * children. */
+ if (par && ArraySize(head->children) == 0)
+ {
+ ArrayDelete(
+ xmlparent->children,
+ ArraySize(xmlparent->children) - 1
+ );
+ XMLFreeElement(head);
+ }
}
#include
diff --git a/src/XML/Elements.c b/src/XML/Elements.c
index e3cdcbe..4eb83b5 100644
--- a/src/XML/Elements.c
+++ b/src/XML/Elements.c
@@ -162,3 +162,40 @@ XMLookForTKV(XMLElement *parent, char *tag, char *k, char *v)
return NULL;
}
+XMLElement *
+XMLCopy(XMLElement *original)
+{
+ XMLElement *ret = NULL;
+ if (!original)
+ {
+ return NULL;
+ }
+
+ ret = Malloc(sizeof(*ret));
+ ret->type = original->type;
+
+ ret->name = StrDuplicate(original->name);
+ ret->data = StrDuplicate(original->data);
+
+ if (original->children)
+ {
+ size_t i;
+ ret->children = ArrayCreate();
+
+ for (i = 0; i < ArraySize(ret->children); i++)
+ {
+ ArrayAdd(ret->children, XMLCopy(ArrayGet(original->children, i)));
+ }
+ }
+ if (original->attrs)
+ {
+ char *name, *value;
+ ret->attrs = HashMapCreate();
+ while (HashMapIterate(original->attrs, &name, (void **) &value))
+ {
+ HashMapSet(ret->attrs, name, StrDuplicate(value));
+ }
+ }
+
+ return ret;
+}
diff --git a/src/include/XML.h b/src/include/XML.h
index ebf8eb7..8fd108d 100644
--- a/src/include/XML.h
+++ b/src/include/XML.h
@@ -59,6 +59,7 @@ typedef struct XMLElement {
extern XMLElement * XMLCDecode(Stream *stream, bool autofree, bool html);
#define XMLDecode(stream, autofree) XMLCDecode(stream, autofree, false)
+extern XMLElement * XMLCopy(XMLElement *original);
extern XMLElement * XMLCreateTag(char *name);
extern XMLElement * XMLCreateText(char *data);
extern void XMLAddAttr(XMLElement *element, char *key, char *val);