Mercurial > pidgin
comparison src/html.c @ 5176:6911a84cbab1
[gaim-migrate @ 5540]
chip reminded me that attributes can't contain &, <, etc. this function
will become sentient soon, if we're not careful.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sat, 19 Apr 2003 17:00:40 +0000 |
parents | 376349b04123 |
children | 0241d6b6702d |
comparison
equal
deleted
inserted
replaced
5175:591e8d9a4697 | 5176:6911a84cbab1 |
---|---|
1 /* | 1 /* |
2 * gaim | 2 * gaim |
3 * | 3 * |
4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | 4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> |
5 * 2003, Nathan Walp <faceprint@faceprint.com> | |
5 * | 6 * |
6 * This program is free software; you can redistribute it and/or modify | 7 * This program is free software; you can redistribute it and/or modify |
7 * it under the terms of the GNU General Public License as published by | 8 * it under the terms of the GNU General Public License as published by |
8 * the Free Software Foundation; either version 2 of the License, or | 9 * the Free Software Foundation; either version 2 of the License, or |
9 * (at your option) any later version. | 10 * (at your option) any later version. |
327 char *src_tag; | 328 char *src_tag; |
328 char *dest_tag; | 329 char *dest_tag; |
329 }; | 330 }; |
330 | 331 |
331 #define ALLOW_TAG_ALT(x, y) if(!g_ascii_strncasecmp(c, "<" x " ", strlen("<" x " "))) { \ | 332 #define ALLOW_TAG_ALT(x, y) if(!g_ascii_strncasecmp(c, "<" x " ", strlen("<" x " "))) { \ |
332 const char *o = c + 1; \ | 333 const char *o = c + strlen("<" x); \ |
333 const char *p = NULL, *q = NULL, *r = NULL; \ | 334 const char *p = NULL, *q = NULL, *r = NULL; \ |
334 while(*o) { \ | 335 GString *innards = g_string_new(""); \ |
336 while(o && *o) { \ | |
335 if(!q && (*o == '\"' || *o == '\'') ) { \ | 337 if(!q && (*o == '\"' || *o == '\'') ) { \ |
336 q = o; \ | 338 q = o; \ |
337 } else if(q) { \ | 339 } else if(q) { \ |
338 if(*o == *q) { \ | 340 if(*o == *q) { \ |
341 char *unescaped = g_strndup(q+1, o-q-1); \ | |
342 char *escaped = g_markup_escape_text(unescaped, -1); \ | |
343 g_string_append_printf(innards, "%c%s%c", *q, escaped, *q); \ | |
339 q = NULL; \ | 344 q = NULL; \ |
340 } else if(*c == '\\') { \ | 345 } else if(*c == '\\') { \ |
341 o++; \ | 346 o++; \ |
342 } \ | 347 } \ |
343 } else if(*o == '<') { \ | 348 } else if(*o == '<') { \ |
344 r = o; \ | 349 r = o; \ |
345 } else if(*o == '>') { \ | 350 } else if(*o == '>') { \ |
346 p = o; \ | 351 p = o; \ |
347 break; \ | 352 break; \ |
353 } else { \ | |
354 innards = g_string_append_c(innards, *o); \ | |
348 } \ | 355 } \ |
349 o++; \ | 356 o++; \ |
350 } \ | 357 } \ |
351 if(p && !r) { \ | 358 if(p && !r) { \ |
352 if(*(p-1) != '/') { \ | 359 if(*(p-1) != '/') { \ |
355 pt->dest_tag = y; \ | 362 pt->dest_tag = y; \ |
356 tags = g_list_prepend(tags, pt); \ | 363 tags = g_list_prepend(tags, pt); \ |
357 } \ | 364 } \ |
358 xhtml = g_string_append(xhtml, "<" y); \ | 365 xhtml = g_string_append(xhtml, "<" y); \ |
359 c += strlen("<" x ); \ | 366 c += strlen("<" x ); \ |
360 xhtml = g_string_append_len(xhtml, c, (p - c) + 1); \ | 367 xhtml = g_string_append(xhtml, innards->str); \ |
368 xhtml = g_string_append_c(xhtml, '>'); \ | |
361 c = p + 1; \ | 369 c = p + 1; \ |
362 } else { \ | 370 } else { \ |
363 xhtml = g_string_append(xhtml, "<"); \ | 371 xhtml = g_string_append(xhtml, "<"); \ |
364 plain = g_string_append_c(plain, '<'); \ | 372 plain = g_string_append_c(plain, '<'); \ |
373 c++; \ | |
365 } \ | 374 } \ |
375 g_string_free(innards, TRUE); \ | |
366 continue; \ | 376 continue; \ |
367 } \ | 377 } \ |
368 if(!g_ascii_strncasecmp(c, "<" x, strlen("<" x)) && \ | 378 if(!g_ascii_strncasecmp(c, "<" x, strlen("<" x)) && \ |
369 (*(c+strlen("<" x)) == '>' || \ | 379 (*(c+strlen("<" x)) == '>' || \ |
370 !g_ascii_strncasecmp(c+strlen("<" x), "/>", 2))) { \ | 380 !g_ascii_strncasecmp(c+strlen("<" x), "/>", 2))) { \ |
387 void html_to_xhtml(const char *html, char **xhtml_out, char **plain_out) { | 397 void html_to_xhtml(const char *html, char **xhtml_out, char **plain_out) { |
388 GString *xhtml = g_string_new(""); | 398 GString *xhtml = g_string_new(""); |
389 GString *plain = g_string_new(""); | 399 GString *plain = g_string_new(""); |
390 GList *tags = NULL, *tag; | 400 GList *tags = NULL, *tag; |
391 const char *c = html; | 401 const char *c = html; |
392 while(*c) { | 402 |
403 while(c && *c) { | |
393 if(*c == '<') { | 404 if(*c == '<') { |
394 if(*(c+1) == '/') { /* closing tag */ | 405 if(*(c+1) == '/') { /* closing tag */ |
395 tag = tags; | 406 tag = tags; |
396 while(tag) { | 407 while(tag) { |
397 struct gaim_parse_tag *pt = tag->data; | 408 struct gaim_parse_tag *pt = tag->data; |