[MOD] Get rid of childrenless tags in XMLd text

This commit is contained in:
LDA 2024-08-02 15:08:46 +02:00
commit 74f3fbdccc
3 changed files with 51 additions and 0 deletions

View file

@ -294,6 +294,7 @@ ShoveXML(XEP393Element *element, XMLElement *xmlparent)
{ {
XMLElement *head = xmlparent; XMLElement *head = xmlparent;
size_t i; size_t i;
bool par = false;
if (!element || !xmlparent) if (!element || !xmlparent)
{ {
return; return;
@ -324,6 +325,7 @@ ShoveXML(XEP393Element *element, XMLElement *xmlparent)
case XEP393_LINE: case XEP393_LINE:
head = XMLCreateTag("p"); head = XMLCreateTag("p");
XMLAddChild(xmlparent, head); XMLAddChild(xmlparent, head);
par = true;
break; break;
case XEP393_QUOT: case XEP393_QUOT:
head = XMLCreateTag("blockquote"); head = XMLCreateTag("blockquote");
@ -360,6 +362,17 @@ ShoveXML(XEP393Element *element, XMLElement *xmlparent)
break; break;
default: break; default: break;
} }
/* NOTE: Hack to get rid of stranded <p/>-tags with no
* children. */
if (par && ArraySize(head->children) == 0)
{
ArrayDelete(
xmlparent->children,
ArraySize(xmlparent->children) - 1
);
XMLFreeElement(head);
}
} }
#include <StringStream.h> #include <StringStream.h>

View file

@ -162,3 +162,40 @@ XMLookForTKV(XMLElement *parent, char *tag, char *k, char *v)
return NULL; 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;
}

View file

@ -59,6 +59,7 @@ typedef struct XMLElement {
extern XMLElement * XMLCDecode(Stream *stream, bool autofree, bool html); extern XMLElement * XMLCDecode(Stream *stream, bool autofree, bool html);
#define XMLDecode(stream, autofree) XMLCDecode(stream, autofree, false) #define XMLDecode(stream, autofree) XMLCDecode(stream, autofree, false)
extern XMLElement * XMLCopy(XMLElement *original);
extern XMLElement * XMLCreateTag(char *name); extern XMLElement * XMLCreateTag(char *name);
extern XMLElement * XMLCreateText(char *data); extern XMLElement * XMLCreateText(char *data);
extern void XMLAddAttr(XMLElement *element, char *key, char *val); extern void XMLAddAttr(XMLElement *element, char *key, char *val);