# HG changeset patch # User Nathan Walp # Date 1050048561 0 # Node ID 496ea7c1b77b5b9ce9f4c0531a9fc06d4ad3bff5 # Parent 145587c11207cb3ee99e512c4e53b85c738ef5b6 [gaim-migrate @ 5473] it dawned on me that since this function is so good at validating html, it might be pretty good at stripping html. so now we use it instead of strip_html and jabber messages don't get stripped of valid < and > characters committer: Tailor Script diff -r 145587c11207 -r 496ea7c1b77b src/gaim.h --- a/src/gaim.h Fri Apr 11 07:49:15 2003 +0000 +++ b/src/gaim.h Fri Apr 11 08:09:21 2003 +0000 @@ -371,7 +371,7 @@ extern void grab_url(char *, gboolean, void (*callback)(gpointer, char *, unsigned long), gpointer); extern gchar *strip_html(const gchar *); -extern char *html_to_xhtml(const char *); +extern void html_to_xhtml(const char *, char **, char **); struct g_url *parse_url(char *url); /* Functions in idle.c */ diff -r 145587c11207 -r 496ea7c1b77b src/html.c --- a/src/html.c Fri Apr 11 07:49:15 2003 +0000 +++ b/src/html.c Fri Apr 11 08:09:21 2003 +0000 @@ -344,6 +344,7 @@ c = p + 1; \ } else { \ xhtml = g_string_append(xhtml, "<"); \ + plain = g_string_append_c(plain, '<'); \ } \ continue; \ } \ @@ -357,29 +358,36 @@ pt->src_tag = x; \ pt->dest_tag = y; \ tags = g_list_prepend(tags, pt); \ + xhtml = g_string_append_c(xhtml, '>'); \ + } else { \ + xhtml = g_string_append(xhtml, "/>");\ } \ + c = strchr(c, '>') + 1; \ continue; \ } #define ALLOW_TAG(x) ALLOW_TAG_ALT(x, x) -char *html_to_xhtml(const char *html) { +void html_to_xhtml(const char *html, char **xhtml_out, char **plain_out) { GString *xhtml = g_string_new(""); + GString *plain = g_string_new(""); GList *tags = NULL, *tag; const char *q = NULL, *c = html; - char *ret; while(*c) { if(!q && (*c == '\"' || *c == '\'')) { q = c; xhtml = g_string_append_c(xhtml, *c); + plain = g_string_append_c(plain, *c); c++; } else if(q) { if(*c == *q) { q = NULL; } else if(*c == '\\') { xhtml = g_string_append_c(xhtml, *c); + plain = g_string_append_c(plain, *c); c++; } xhtml = g_string_append_c(xhtml, *c); + plain = g_string_append_c(plain, *c); c++; } else if(*c == '<') { if(*(c+1) == '/') { /* closing tag */ @@ -407,6 +415,7 @@ /* we tried to close a tag we never opened! escape it * and move on */ xhtml = g_string_append(xhtml, "<"); + plain = g_string_append_c(plain, '<'); c++; } } else { /* opening tag */ @@ -572,10 +581,12 @@ } xhtml = g_string_append(xhtml, "<"); + plain = g_string_append_c(plain, '<'); c++; } } else { xhtml = g_string_append_c(xhtml, *c); + plain = g_string_append_c(plain, *c); c++; } } @@ -585,7 +596,10 @@ tag = tag->next; } g_list_free(tags); - ret = g_strdup(xhtml->str); + if(xhtml_out) + *xhtml_out = g_strdup(xhtml->str); + if(plain_out) + *plain_out = g_strdup(plain->str); g_string_free(xhtml, TRUE); - return ret; + g_string_free(plain, TRUE); } diff -r 145587c11207 -r 496ea7c1b77b src/protocols/jabber/jabber.c --- a/src/protocols/jabber/jabber.c Fri Apr 11 07:49:15 2003 +0000 +++ b/src/protocols/jabber/jabber.c Fri Apr 11 08:09:21 2003 +0000 @@ -2424,26 +2424,27 @@ static void insert_message(xmlnode x, const char *message, gboolean use_xhtml) { xmlnode y; - char *buf = strip_html(message); + char *buf = g_strdup_printf("%s", message); + char *xhtml, *plain; + + html_to_xhtml(buf, &xhtml, &plain); + g_free(buf); + y = xmlnode_insert_tag(x, "body"); - xmlnode_insert_cdata(y, buf, -1); - g_free(buf); + xmlnode_insert_cdata(y, plain, -1); + g_free(plain); if(use_xhtml) { - char *buf2 = g_strdup_printf("%s", message); - buf = html_to_xhtml(buf2); - g_free(buf2); - - y = xmlnode_str(buf, strlen(buf)); + y = xmlnode_str(xhtml, strlen(xhtml)); if(y) { xmlnode_insert_tag_node(x, y); xmlnode_free(y); } else { debug_printf("holy cow, html_to_xhtml didn't work right!\n"); - debug_printf("the invalid XML: %s\n", buf); + debug_printf("the invalid XML: %s\n", xhtml); } - g_free(buf); } + g_free(xhtml); } static int jabber_send_im(struct gaim_connection *gc, char *who, char *message, int len, int flags)