* src/kz-xml.c: Fix a bug a xml data written with "CDATA" was
not parsed. (ex. kernel.org RSS http://kernel.org/kdist/rss.xml )
@@ -1,3 +1,8 @@ | ||
1 | +2008-01-09 Ryo SHIMIZU <furyo@on-air.ne.jp> | |
2 | + | |
3 | + * src/kz-xml.c: Fix a bug a xml data written with "CDATA" was | |
4 | + not parsed. (ex. kernel.org RSS http://kernel.org/kdist/rss.xml ) | |
5 | + | |
1 | 6 | 2008-01-07 Kouhei Sutou <kou@cozmixng.org> |
2 | 7 | |
3 | 8 | * configure.ac: added module/embed/gecko/gtkmozembed/Makefile. |
@@ -36,6 +36,7 @@ | ||
36 | 36 | static void dispose (GObject *object); |
37 | 37 | |
38 | 38 | static void kz_xml_attr_free (KzXMLAttr *attr); |
39 | +gchar *get_cdata_as_plaintext(gpointer content); | |
39 | 40 | |
40 | 41 | |
41 | 42 | G_DEFINE_TYPE(KzXML, kz_xml, G_TYPE_OBJECT) |
@@ -497,6 +498,12 @@ | ||
497 | 498 | g_free(escaped); |
498 | 499 | } |
499 | 500 | } |
501 | + else if (node->type == KZ_XML_NODE_CDATA) | |
502 | + { | |
503 | + gchar *cdata_text = get_cdata_as_plaintext(node->content); | |
504 | + g_string_append(gstr, cdata_text); | |
505 | + g_free(cdata_text); | |
506 | + } | |
500 | 507 | else |
501 | 508 | { |
502 | 509 | g_string_append(gstr, node->content); |
@@ -529,7 +536,14 @@ | ||
529 | 536 | |
530 | 537 | if (node->type == KZ_XML_NODE_TEXT) |
531 | 538 | g_string_append(gstr, node->content); |
539 | + if (node->type == KZ_XML_NODE_CDATA) | |
540 | + { | |
541 | + gchar *cdata_text = get_cdata_as_plaintext(node->content); | |
542 | + g_string_append(gstr, cdata_text); | |
543 | + g_free(cdata_text); | |
544 | + } | |
532 | 545 | |
546 | + | |
533 | 547 | for (list = node->children; list; list = g_list_next(list)) |
534 | 548 | kz_xml_node_append_string(list->data, gstr); |
535 | 549 | } |
@@ -1035,3 +1049,32 @@ | ||
1035 | 1049 | kz_xml_node_arrange_indent(node, indent_level + 1); |
1036 | 1050 | } |
1037 | 1051 | } |
1052 | + | |
1053 | +gchar * | |
1054 | +get_cdata_as_plaintext(gpointer content) | |
1055 | +{ | |
1056 | + gchar *cdata_text; | |
1057 | + gchar *plain_text; | |
1058 | + gchar *str; | |
1059 | + gint i, j; | |
1060 | + | |
1061 | + str = (char*)content; | |
1062 | + | |
1063 | + i = j = strlen("<![CDATA["); | |
1064 | + while(str[i] != '\0') | |
1065 | + { | |
1066 | + if(str[i] == ']' && str[i+3] == '\0') | |
1067 | + { | |
1068 | + break; | |
1069 | + } | |
1070 | + i++; | |
1071 | + } | |
1072 | + | |
1073 | + cdata_text = g_strndup(str+j, i-j); | |
1074 | + plain_text = remove_tag((const gchar*)cdata_text, (gsize)strlen(cdata_text)); | |
1075 | + | |
1076 | + if(cdata_text) | |
1077 | + g_free(cdata_text); | |
1078 | + | |
1079 | + return plain_text; | |
1080 | +} |