| 473 tags = g_list_prepend(tags, pt); |
471 tags = g_list_prepend(tags, pt); |
| 474 c = strchr(c, '>') + 1; |
472 c = strchr(c, '>') + 1; |
| 475 xhtml = g_string_append(xhtml, "<span style='vertical-align:super;'>"); |
473 xhtml = g_string_append(xhtml, "<span style='vertical-align:super;'>"); |
| 476 continue; |
474 continue; |
| 477 } |
475 } |
| |
476 if(!g_ascii_strncasecmp(c, "<font", 5) && (*(c+5) == '>' || *(c+5) == ' ')) { |
| |
477 const char *p = c; |
| |
478 GString *style = g_string_new(""); |
| |
479 struct gaim_parse_tag *pt; |
| |
480 while(*p && *p != '>') { |
| |
481 if(!g_ascii_strncasecmp(p, "color=", strlen("color="))) { |
| |
482 const char *q = p + strlen("color="); |
| |
483 GString *color = g_string_new(""); |
| |
484 if(*q == '\'' || *q == '\"') |
| |
485 q++; |
| |
486 while(*q && *q != '\"' && *q != '\'' && *q != ' ') { |
| |
487 color = g_string_append_c(color, *q); |
| |
488 q++; |
| |
489 } |
| |
490 g_string_append_printf(style, "color: %s; ", color->str); |
| |
491 g_string_free(color, TRUE); |
| |
492 p = q; |
| |
493 } else if(!g_ascii_strncasecmp(p, "face=", strlen("face="))) { |
| |
494 const char *q = p + strlen("face="); |
| |
495 gboolean space_allowed = FALSE; |
| |
496 GString *face = g_string_new(""); |
| |
497 if(*q == '\'' || *q == '\"') { |
| |
498 space_allowed = TRUE; |
| |
499 q++; |
| |
500 } |
| |
501 while(*q && *q != '\"' && *q != '\'' && (space_allowed || *q != ' ')) { |
| |
502 face = g_string_append_c(face, *q); |
| |
503 q++; |
| |
504 } |
| |
505 g_string_append_printf(style, "font-family: %s; ", face->str); |
| |
506 g_string_free(face, TRUE); |
| |
507 p = q; |
| |
508 } else if(!g_ascii_strncasecmp(p, "size=", strlen("size="))) { |
| |
509 const char *q = p + strlen("size="); |
| |
510 int sz; |
| |
511 const char *size = "medium"; |
| |
512 if(*q == '\'' || *q == '\"') |
| |
513 q++; |
| |
514 sz = atoi(q); |
| |
515 if(sz < 3) |
| |
516 size = "smaller"; |
| |
517 else if(sz > 3) |
| |
518 size = "larger"; |
| |
519 g_string_append_printf(style, "font-size: %s; ", size); |
| |
520 p = q; |
| |
521 } |
| |
522 p++; |
| |
523 } |
| |
524 c = strchr(c, '>') + 1; |
| |
525 pt = g_new0(struct gaim_parse_tag, 1); |
| |
526 pt->src_tag = "font"; |
| |
527 pt->dest_tag = "span"; |
| |
528 tags = g_list_prepend(tags, pt); |
| |
529 xhtml = g_string_append(xhtml, "<span"); |
| |
530 if(style->len) |
| |
531 g_string_append_printf(xhtml, " style='%s'", style->str); |
| |
532 xhtml = g_string_append_c(xhtml, '>'); |
| |
533 g_string_free(style, TRUE); |
| |
534 continue; |
| |
535 } |
| |
536 if(!g_ascii_strncasecmp(c, "<body ", 6)) { |
| |
537 const char *p = c; |
| |
538 gboolean did_something = FALSE; |
| |
539 while(*p && *p != '>') { |
| |
540 if(!g_ascii_strncasecmp(p, "bgcolor=", strlen("bgcolor="))) { |
| |
541 const char *q = p + strlen("bgcolor="); |
| |
542 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); |
| |
543 GString *color = g_string_new(""); |
| |
544 if(*q == '\'' || *q == '\"') |
| |
545 q++; |
| |
546 while(*q && *q != '\"' && *q != '\'' && *q != ' ') { |
| |
547 color = g_string_append_c(color, *q); |
| |
548 q++; |
| |
549 } |
| |
550 g_string_append_printf(xhtml, "<span style='background: %s;'>", color->str); |
| |
551 g_string_free(color, TRUE); |
| |
552 c = strchr(c, '>') + 1; |
| |
553 pt->src_tag = "body"; |
| |
554 pt->dest_tag = "span"; |
| |
555 tags = g_list_prepend(tags, pt); |
| |
556 did_something = TRUE; |
| |
557 break; |
| |
558 } |
| |
559 p++; |
| |
560 } |
| |
561 if(did_something) continue; |
| |
562 } |
| |
563 /* this has to come after the special case for bgcolor */ |
| |
564 ALLOW_TAG("body"); |
| 478 if(!g_ascii_strncasecmp(c, "<!--", strlen("<!--"))) { |
565 if(!g_ascii_strncasecmp(c, "<!--", strlen("<!--"))) { |
| 479 char *p = strstr(c + strlen("<!--"), "-->"); |
566 char *p = strstr(c + strlen("<!--"), "-->"); |
| 480 if(p) { |
567 if(p) { |
| 481 xhtml = g_string_append(xhtml, "<!--"); |
568 xhtml = g_string_append(xhtml, "<!--"); |
| 482 c += strlen("<!--"); |
569 c += strlen("<!--"); |