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);