mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 22:55:11 +00:00
parent
1936be0078
commit
f94db460ac
5 changed files with 204 additions and 2 deletions
|
|
@ -6,6 +6,7 @@
|
|||
#include <Cytoplasm/Json.h>
|
||||
#include <Cytoplasm/Str.h>
|
||||
#include <Cytoplasm/Uri.h>
|
||||
#include <Cytoplasm/Log.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
|
@ -267,6 +268,14 @@ ParseeXMPPify(HashMap *event)
|
|||
|
||||
html = StrConcat(3, "<html>", html, "</html>");
|
||||
elem = XMLCDecode(StrStreamReader(html), true, true);
|
||||
if (!elem)
|
||||
{
|
||||
/* Settle for the raw body instead.
|
||||
* TODO: Have the parser be more leinent on errors in HTML mode. */
|
||||
char *body = GetRawBody(event);
|
||||
Free(html);
|
||||
return StrDuplicate(body);
|
||||
}
|
||||
|
||||
flags.quote = false;
|
||||
xepd = XMPPifyElement(event, elem, flags);
|
||||
|
|
|
|||
|
|
@ -31,6 +31,12 @@ XMLCDecode(Stream *stream, bool autofree, bool html)
|
|||
bool flag = false;
|
||||
switch (event->type)
|
||||
{
|
||||
case XML_ERROR:
|
||||
XMLFreeEvent(event);
|
||||
XMLFreeElement(ret);
|
||||
ArrayFree(stack);
|
||||
XMLFreeLexer(lexer);
|
||||
return NULL;
|
||||
case XML_LEXER_STARTELEM:
|
||||
/* Create a new element that will populated. */
|
||||
top = XMLCreateTag(event->element);
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ static char * XMLPopElement(XMLexer *lexer);
|
|||
static XMLEvent * XMLCreateEmptyElem(XMLexer *lexer, HashMap *attrs);
|
||||
static XMLEvent * XMLCreateStart(XMLexer *lexer, HashMap *attrs);
|
||||
static XMLEvent * XMLCreateRelax(XMLexer *lexer);
|
||||
static XMLEvent * XMLCreateError(XMLexer *lexer);
|
||||
static XMLEvent * XMLCreateEnd(XMLexer *lexer, char *end);
|
||||
static XMLEvent * XMLCreateData(XMLexer *lexer);
|
||||
|
||||
|
|
@ -198,7 +199,9 @@ XMLCrank(XMLexer *lexer)
|
|||
else if (XMLookahead(lexer, "--", false))
|
||||
{
|
||||
/* Throw error */
|
||||
return NULL;
|
||||
XMLFreeEvent(event);
|
||||
event = XMLCreateError(lexer);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case XML_STATE_PI:
|
||||
|
|
@ -215,6 +218,9 @@ XMLCrank(XMLexer *lexer)
|
|||
if (!attrname)
|
||||
{
|
||||
/* TODO: Throw error */
|
||||
XMLFreeEvent(event);
|
||||
event = XMLCreateError(lexer);
|
||||
break;
|
||||
}
|
||||
XMLPushElement(lexer, attrname);
|
||||
|
||||
|
|
@ -241,7 +247,10 @@ XMLCrank(XMLexer *lexer)
|
|||
}
|
||||
else if (XMLookahead(lexer, "'", true))
|
||||
{
|
||||
while (true);
|
||||
//while (true); uh oh
|
||||
XMLFreeEvent(event);
|
||||
event = XMLCreateError(lexer);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case XML_STATE_ATTRTAIL:
|
||||
|
|
@ -250,6 +259,8 @@ XMLCrank(XMLexer *lexer)
|
|||
if (!XMLookahead(lexer, ">", true))
|
||||
{
|
||||
/* TODO: Throw error. */
|
||||
XMLFreeEvent(event);
|
||||
event = XMLCreateError(lexer);
|
||||
break;
|
||||
}
|
||||
lexer->state = XML_STATE_NONE;
|
||||
|
|
@ -258,6 +269,8 @@ XMLCrank(XMLexer *lexer)
|
|||
break;
|
||||
default:
|
||||
/* TODO */
|
||||
XMLFreeEvent(event);
|
||||
event = XMLCreateError(lexer);
|
||||
break;
|
||||
}
|
||||
/* TODO: Crank our XML parser. */
|
||||
|
|
@ -693,6 +706,26 @@ XMLCreateData(XMLexer *lexer)
|
|||
return event;
|
||||
}
|
||||
static XMLEvent *
|
||||
XMLCreateError(XMLexer *lexer)
|
||||
{
|
||||
XMLEvent *event = Malloc(sizeof(*event));
|
||||
size_t elements = ArraySize(lexer->data.elements);
|
||||
|
||||
event->type = XML_ERROR;
|
||||
event->element = elements ?
|
||||
StrDuplicate(ArrayGet(lexer->data.elements, elements - 1)) :
|
||||
NULL;
|
||||
event->attrs = NULL;
|
||||
event->data = NULL;
|
||||
|
||||
/* TODO */
|
||||
event->line = 0;
|
||||
event->col = 0;
|
||||
event->offset = 0;
|
||||
|
||||
return event;
|
||||
}
|
||||
static XMLEvent *
|
||||
XMLCreateRelax(XMLexer *lexer)
|
||||
{
|
||||
XMLEvent *event = Malloc(sizeof(*event));
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ typedef struct XMLEvent {
|
|||
XML_LEXER_DATA,
|
||||
XML_LEXER_ELEM, /* Empty attr */
|
||||
XML_LEXER_ENDELEM,
|
||||
|
||||
XML_ERROR,
|
||||
|
||||
XML_RELAX
|
||||
} type;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue