libxml-ruby 2.1.2-x86-mingw32 → 2.2.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/HISTORY CHANGED
@@ -1,5 +1,12 @@
1
1
  = Release History
2
2
 
3
+ == 2.2.0 / 2011-08-09 Charlie Savage
4
+
5
+ * Update encoding support for Ruby 1.9 so that libxml-ruby returns
6
+ strings encoded in UTF-8. This change was required since libxml internally
7
+ stores strings in UTF-8. The exceptions to this rule are the #to_s methods
8
+ which return UTF-8 by default but can return other encodings if requested.
9
+
3
10
  == 2.1.2 / 2011-08-03 Charlie Savage
4
11
 
5
12
  * Fix segmentation fault that could occur when an XPathContext was marked
@@ -21,21 +21,6 @@ static void rxml_init_memory(void)
21
21
  );*/
22
22
  }
23
23
 
24
- VALUE rxml_str_new2(const char* xstr, const char* xencoding)
25
- {
26
- #ifdef HAVE_RUBY_ENCODING_H
27
- if (xencoding)
28
- {
29
- xmlCharEncoding xmlEncoding = xmlParseCharEncoding(xencoding);
30
- VALUE encoding = rxml_xml_encoding_to_rb_encoding(mXMLEncoding, xmlEncoding);
31
- rb_encoding* xencodingPtr = (rb_encoding*) RDATA(encoding)->data;
32
- return rb_external_str_new_with_enc(xstr, strlen(xstr), xencodingPtr);
33
- }
34
- #endif
35
- return rb_str_new2(xstr);
36
- }
37
-
38
-
39
24
  void Init_libxml_ruby(void)
40
25
  {
41
26
  /* The libxml gem provides Ruby language bindings for GNOME's Libxml2
@@ -26,9 +26,6 @@
26
26
  #include <ruby/encoding.h>
27
27
  #endif
28
28
 
29
- // Ruby 1.8/1.9 encoding compatibility
30
- VALUE rxml_str_new2(const char* xstr, const char* xencoding);
31
-
32
29
  #ifdef LIBXML_DEBUG_ENABLED
33
30
  #include <libxml/xpathInternals.h>
34
31
  #endif
@@ -166,7 +166,7 @@ static VALUE rxml_attr_name_get(VALUE self)
166
166
  if (xattr->name == NULL)
167
167
  return Qnil;
168
168
  else
169
- return rxml_str_new2((const char*) xattr->name, (xattr->doc ? xattr->doc->encoding : NULL));
169
+ return rxml_new_cstr((const char*) xattr->name, NULL);
170
170
  }
171
171
 
172
172
  /*
@@ -285,7 +285,7 @@ VALUE rxml_attr_value_get(VALUE self)
285
285
 
286
286
  if (value != NULL)
287
287
  {
288
- result = rxml_str_new2((const char*) value, (xattr->doc ? xattr->doc->encoding : NULL));
288
+ result = rxml_new_cstr((const char*) value, NULL);
289
289
  xmlFree(value);
290
290
  }
291
291
  return result;
@@ -54,7 +54,7 @@ static VALUE rxml_attr_decl_name_get(VALUE self)
54
54
  if (xattr->name == NULL)
55
55
  return Qnil;
56
56
  else
57
- return rxml_str_new2((const char*) xattr->name, xattr->doc->encoding);
57
+ return rxml_new_cstr((const char*) xattr->name, xattr->doc->encoding);
58
58
  }
59
59
 
60
60
  /*
@@ -135,7 +135,7 @@ VALUE rxml_attr_decl_value_get(VALUE self)
135
135
  Data_Get_Struct(self, xmlAttribute, xattr);
136
136
 
137
137
  if (xattr->defaultValue)
138
- return rxml_str_new2((const char *)xattr->defaultValue, xattr->doc->encoding);
138
+ return rxml_new_cstr((const char *)xattr->defaultValue, NULL);
139
139
  else
140
140
  return Qnil;
141
141
  }
@@ -174,7 +174,7 @@ static VALUE rxml_document_canonicalize(int argc, VALUE *argv, VALUE self)
174
174
 
175
175
  if (buffer)
176
176
  {
177
- result = rxml_str_new2((const char*) buffer, (const char*)xdoc->encoding);
177
+ result = rxml_new_cstr((const char*) buffer, NULL);
178
178
  xmlFree(buffer);
179
179
  }
180
180
 
@@ -349,10 +349,12 @@ static VALUE rxml_document_rb_encoding_get(VALUE self)
349
349
  {
350
350
  xmlDocPtr xdoc;
351
351
  const char *xencoding;
352
+ rb_encoding* rbencoding;
352
353
  Data_Get_Struct(self, xmlDoc, xdoc);
353
354
 
354
355
  xencoding = (const char*)xdoc->encoding;
355
- return rxml_xml_encoding_to_rb_encoding(mXMLEncoding, xmlParseCharEncoding(xencoding));
356
+ rbencoding = rxml_xml_encoding_to_rb_encoding(mXMLEncoding, xmlParseCharEncoding(xencoding));
357
+ return rb_enc_from_encoding(rbencoding);
356
358
  }
357
359
  #endif
358
360
 
@@ -734,7 +736,7 @@ static VALUE rxml_document_to_s(int argc, VALUE *argv, VALUE self)
734
736
  Data_Get_Struct(self, xmlDoc, xdoc);
735
737
  xmlDocDumpFormatMemoryEnc(xdoc, &buffer, &length, xencoding, indent);
736
738
 
737
- result = rxml_str_new2((const char*) buffer, xencoding);
739
+ result = rxml_new_cstr((const char*) buffer, xencoding);
738
740
  xmlFree(buffer);
739
741
  return result;
740
742
  }
@@ -753,7 +755,7 @@ static VALUE rxml_document_url_get(VALUE self)
753
755
  if (xdoc->URL == NULL)
754
756
  return (Qnil);
755
757
  else
756
- return (rxml_str_new2((const char*) xdoc->URL, xdoc->encoding));
758
+ return (rxml_new_cstr((const char*) xdoc->URL, NULL));
757
759
  }
758
760
 
759
761
  /*
@@ -770,7 +772,7 @@ static VALUE rxml_document_version_get(VALUE self)
770
772
  if (xdoc->version == NULL)
771
773
  return (Qnil);
772
774
  else
773
- return (rxml_str_new2((const char*) xdoc->version, xdoc->encoding));
775
+ return (rxml_new_cstr((const char*) xdoc->version, NULL));
774
776
  }
775
777
 
776
778
  /*
@@ -90,7 +90,7 @@ static VALUE rxml_dtd_external_id_get(VALUE self)
90
90
  if (xdtd->ExternalID == NULL)
91
91
  return (Qnil);
92
92
  else
93
- return (rxml_str_new2((const char*) xdtd->ExternalID, xdtd->doc ? xdtd->doc->encoding : NULL));
93
+ return (rxml_new_cstr((const char*) xdtd->ExternalID, NULL));
94
94
  }
95
95
 
96
96
  /*
@@ -108,7 +108,7 @@ static VALUE rxml_dtd_name_get(VALUE self)
108
108
  if (xdtd->name == NULL)
109
109
  return (Qnil);
110
110
  else
111
- return (rxml_str_new2((const char*) xdtd->name, xdtd->doc ? xdtd->doc->encoding : NULL));
111
+ return (rxml_new_cstr((const char*) xdtd->name, NULL));
112
112
  }
113
113
 
114
114
 
@@ -127,7 +127,7 @@ static VALUE rxml_dtd_uri_get(VALUE self)
127
127
  if (xdtd->SystemID == NULL)
128
128
  return (Qnil);
129
129
  else
130
- return (rxml_str_new2((const char*) xdtd->SystemID, xdtd->doc ? xdtd->doc->encoding : NULL));
130
+ return (rxml_new_cstr((const char*) xdtd->SystemID, NULL));
131
131
  }
132
132
 
133
133
  /*
@@ -71,7 +71,7 @@ static VALUE rxml_encoding_to_s(VALUE klass, VALUE encoding)
71
71
  if (!xencoding)
72
72
  return Qnil;
73
73
  else
74
- return rxml_str_new2(xencoding, xencoding);
74
+ return rxml_new_cstr(xencoding, xencoding);
75
75
  }
76
76
 
77
77
  #ifdef HAVE_RUBY_ENCODING_H
@@ -79,7 +79,7 @@ static VALUE rxml_encoding_to_s(VALUE klass, VALUE encoding)
79
79
  * Converts an xmlCharEncoding enum value into a Ruby Encoding object (available
80
80
  * on Ruby 1.9.* and higher).
81
81
  */
82
- VALUE rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding)
82
+ rb_encoding* rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding)
83
83
  {
84
84
  const char* encodingName;
85
85
 
@@ -148,7 +148,7 @@ VALUE rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding)
148
148
  break;
149
149
  }
150
150
 
151
- return rb_enc_from_encoding(rb_enc_find(encodingName));
151
+ return rb_enc_find(encodingName);
152
152
  }
153
153
 
154
154
  /*
@@ -160,10 +160,31 @@ VALUE rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding)
160
160
  */
161
161
  VALUE rxml_encoding_to_rb_encoding(VALUE klass, VALUE encoding)
162
162
  {
163
- return rxml_xml_encoding_to_rb_encoding(klass, NUM2INT(encoding));
163
+ xmlCharEncoding xmlEncoding = (xmlCharEncoding)NUM2INT(encoding);
164
+ rb_encoding* rbencoding = rxml_xml_encoding_to_rb_encoding(klass, xmlEncoding);
165
+ return rb_enc_from_encoding(rbencoding);
164
166
  }
165
167
  #endif
166
168
 
169
+
170
+ VALUE rxml_new_cstr(const char* xstr, const char* xencoding)
171
+ {
172
+ #ifdef HAVE_RUBY_ENCODING_H
173
+ rb_encoding* rbencoding;
174
+ if (xencoding)
175
+ {
176
+ xmlCharEncoding xmlEncoding = xmlParseCharEncoding(xencoding);
177
+ rbencoding = rxml_xml_encoding_to_rb_encoding(mXMLEncoding, xmlEncoding);
178
+ }
179
+ else
180
+ {
181
+ rbencoding = rb_utf8_encoding();
182
+ }
183
+ return rb_external_str_new_with_enc(xstr, strlen(xstr), rbencoding);
184
+ #endif
185
+ return rb_str_new2(xstr);
186
+ }
187
+
167
188
  void rxml_init_encoding(void)
168
189
  {
169
190
  mXMLEncoding = rb_define_module_under(mXML, "Encoding");
@@ -7,8 +7,11 @@ extern VALUE mXMLEncoding;
7
7
 
8
8
  void rxml_init_encoding();
9
9
 
10
+ // Ruby 1.8/1.9 encoding compatibility
11
+ VALUE rxml_new_cstr(const char* xstr, const char* xencoding);
12
+
10
13
  #ifdef HAVE_RUBY_ENCODING_H
11
- VALUE rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding);
14
+ rb_encoding* rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding);
12
15
  #endif
13
16
 
14
17
  #endif
@@ -34,15 +34,6 @@ VALUE rxml_namespace_wrap(xmlNsPtr xns)
34
34
  return Data_Wrap_Struct(cXMLNamespace, NULL, NULL, xns);
35
35
  }
36
36
 
37
- static VALUE rxml_namespace_string(xmlNsPtr xns, const char* buffer)
38
- {
39
- const char* xencoding = NULL;
40
- #if LIBXML_VERSION >= 20628
41
- xencoding = xns->context ? xns->context->encoding : NULL;
42
- #endif
43
- return rxml_str_new2(buffer, xencoding);
44
- }
45
-
46
37
 
47
38
  /*
48
39
  * call-seq:
@@ -90,7 +81,7 @@ static VALUE rxml_namespace_href_get(VALUE self)
90
81
  if (xns->href == NULL)
91
82
  return Qnil;
92
83
  else
93
- return rxml_namespace_string(xns, (const char*) xns->href);
84
+ return rxml_new_cstr((const char*) xns->href, NULL);
94
85
  }
95
86
 
96
87
  /*
@@ -125,7 +116,7 @@ static VALUE rxml_namespace_prefix_get(VALUE self)
125
116
  if (xns->prefix == NULL)
126
117
  return Qnil;
127
118
  else
128
- return rxml_namespace_string(xns, (const char*) xns->prefix);
119
+ return rxml_new_cstr((const char*) xns->prefix, NULL);
129
120
  }
130
121
 
131
122
  /*
@@ -300,7 +300,7 @@ static VALUE rxml_node_base_uri_get(VALUE self)
300
300
  base_uri = xmlNodeGetBase(xnode->doc, xnode);
301
301
  if (base_uri)
302
302
  {
303
- result = rxml_str_new2((const char*) base_uri, xnode->doc ? xnode->doc->encoding : NULL);
303
+ result = rxml_new_cstr((const char*) base_uri, NULL);
304
304
  xmlFree(base_uri);
305
305
  }
306
306
 
@@ -344,7 +344,7 @@ static VALUE rxml_node_content_get(VALUE self)
344
344
  content = xmlNodeGetContent(xnode);
345
345
  if (content)
346
346
  {
347
- result = rxml_str_new2((const char *) content, xnode->doc ? xnode->doc->encoding : NULL);
347
+ result = rxml_new_cstr((const char *) content, NULL);
348
348
  xmlFree(content);
349
349
  }
350
350
 
@@ -391,7 +391,7 @@ static VALUE rxml_node_content_stripped_get(VALUE self)
391
391
  content = xmlNodeGetContent(xnode);
392
392
  if (content)
393
393
  {
394
- result = rxml_str_new2((const char*) content, xnode->doc ? xnode->doc->encoding : NULL);
394
+ result = rxml_new_cstr((const char*) content, NULL);
395
395
  xmlFree(content);
396
396
  }
397
397
  return (result);
@@ -582,9 +582,9 @@ static VALUE rxml_node_to_s(int argc, VALUE *argv, VALUE self)
582
582
  xmlOutputBufferFlush(output);
583
583
 
584
584
  if (output->conv)
585
- result = rxml_str_new2((const char*) output->conv->content, xencoding);
585
+ result = rxml_new_cstr((const char*) output->conv->content, xencoding);
586
586
  else
587
- result = rxml_str_new2((const char*) output->buffer->content, xencoding);
587
+ result = rxml_new_cstr((const char*) output->buffer->content, xencoding);
588
588
 
589
589
  xmlOutputBufferClose(output);
590
590
 
@@ -688,7 +688,7 @@ static VALUE rxml_node_lang_get(VALUE self)
688
688
 
689
689
  if (lang)
690
690
  {
691
- result = rxml_str_new2((const char*) lang, xnode->doc ? xnode->doc->encoding : NULL);
691
+ result = rxml_new_cstr((const char*) lang, NULL);
692
692
  xmlFree(lang);
693
693
  }
694
694
 
@@ -821,11 +821,11 @@ static VALUE rxml_node_xlink_type_name(VALUE self)
821
821
  case XLINK_TYPE_NONE:
822
822
  return (Qnil);
823
823
  case XLINK_TYPE_SIMPLE:
824
- return (rxml_str_new2("simple", xnode->doc ? xnode->doc->encoding : NULL));
824
+ return (rxml_new_cstr("simple", NULL));
825
825
  case XLINK_TYPE_EXTENDED:
826
- return (rxml_str_new2("extended", xnode->doc ? xnode->doc->encoding : NULL));
826
+ return (rxml_new_cstr("extended", NULL));
827
827
  case XLINK_TYPE_EXTENDED_SET:
828
- return (rxml_str_new2("extended_set", xnode->doc ? xnode->doc->encoding : NULL));
828
+ return (rxml_new_cstr("extended_set", NULL));
829
829
  default:
830
830
  rb_fatal("Unknowng xlink type, %d", xlt);
831
831
  }
@@ -876,7 +876,7 @@ static VALUE rxml_node_name_get(VALUE self)
876
876
  if (xnode->name == NULL)
877
877
  return (Qnil);
878
878
  else
879
- return (rxml_str_new2((const char*) name, xnode->doc ? xnode->doc->encoding : NULL));
879
+ return (rxml_new_cstr((const char*) name, NULL));
880
880
  }
881
881
 
882
882
  /*
@@ -968,7 +968,7 @@ static VALUE rxml_node_path(VALUE self)
968
968
  if (path == NULL)
969
969
  return (Qnil);
970
970
  else
971
- return (rxml_str_new2((const char*) path, xnode->doc ? xnode->doc->encoding : NULL));
971
+ return (rxml_new_cstr((const char*) path, NULL));
972
972
  }
973
973
 
974
974
  /*
@@ -188,7 +188,7 @@ static VALUE rxml_parser_context_base_uri_get(VALUE self)
188
188
  Data_Get_Struct(self, xmlParserCtxt, ctxt);
189
189
 
190
190
  if (ctxt->input && ctxt->input->filename)
191
- return rxml_str_new2(ctxt->input->filename, ctxt->encoding);
191
+ return rxml_new_cstr(ctxt->input->filename, ctxt->encoding);
192
192
  else
193
193
  return Qnil;
194
194
  }
@@ -229,7 +229,7 @@ static VALUE rxml_parser_context_data_directory_get(VALUE self)
229
229
  if (ctxt->directory == NULL)
230
230
  return (Qnil);
231
231
  else
232
- return (rxml_str_new2(ctxt->directory, ctxt->encoding));
232
+ return (rxml_new_cstr(ctxt->directory, ctxt->encoding));
233
233
  }
234
234
 
235
235
  /*
@@ -487,7 +487,7 @@ static VALUE rxml_parser_context_name_node_get(VALUE self)
487
487
  if (ctxt->name == NULL)
488
488
  return (Qnil);
489
489
  else
490
- return (rxml_str_new2((const char*) ctxt->name, ctxt->encoding));
490
+ return (rxml_new_cstr((const char*) ctxt->name, ctxt->encoding));
491
491
  }
492
492
 
493
493
  /*
@@ -514,7 +514,7 @@ static VALUE rxml_parser_context_name_tab_get(VALUE self)
514
514
  if (ctxt->nameTab[i] == NULL)
515
515
  continue;
516
516
  else
517
- rb_ary_push(tab_ary, rxml_str_new2((const char*) ctxt->nameTab[i], ctxt->encoding));
517
+ rb_ary_push(tab_ary, rxml_new_cstr((const char*) ctxt->nameTab[i], ctxt->encoding));
518
518
  }
519
519
 
520
520
  return (tab_ary);
@@ -780,7 +780,7 @@ static VALUE rxml_parser_context_subset_name_get(VALUE self)
780
780
  if (ctxt->intSubName == NULL)
781
781
  return (Qnil);
782
782
  else
783
- return (rxml_str_new2((const char*) ctxt->intSubName, ctxt->encoding));
783
+ return (rxml_new_cstr((const char*) ctxt->intSubName, ctxt->encoding));
784
784
  }
785
785
 
786
786
  /*
@@ -799,7 +799,7 @@ static VALUE rxml_parser_context_subset_external_uri_get(VALUE self)
799
799
  if (ctxt->extSubURI == NULL)
800
800
  return (Qnil);
801
801
  else
802
- return (rxml_str_new2((const char*) ctxt->extSubURI, ctxt->encoding));
802
+ return (rxml_new_cstr((const char*) ctxt->extSubURI, ctxt->encoding));
803
803
  }
804
804
 
805
805
  /*
@@ -818,7 +818,7 @@ static VALUE rxml_parser_context_subset_external_system_id_get(VALUE self)
818
818
  if (ctxt->extSubSystem == NULL)
819
819
  return (Qnil);
820
820
  else
821
- return (rxml_str_new2((const char*) ctxt->extSubSystem, ctxt->encoding));
821
+ return (rxml_new_cstr((const char*) ctxt->extSubSystem, ctxt->encoding));
822
822
  }
823
823
 
824
824
  /*
@@ -903,7 +903,7 @@ static VALUE rxml_parser_context_version_get(VALUE self)
903
903
  if (ctxt->version == NULL)
904
904
  return (Qnil);
905
905
  else
906
- return (rxml_str_new2((const char*) ctxt->version, ctxt->encoding));
906
+ return (rxml_new_cstr((const char*) ctxt->version, ctxt->encoding));
907
907
  }
908
908
 
909
909
  /*
@@ -489,7 +489,7 @@ static VALUE rxml_reader_read_inner_xml(VALUE self)
489
489
  if (xml)
490
490
  {
491
491
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
492
- result = rxml_str_new2((const char*) xml, xencoding);
492
+ result = rxml_new_cstr((const char*) xml, xencoding);
493
493
  xmlFree(xml);
494
494
  }
495
495
 
@@ -515,7 +515,7 @@ static VALUE rxml_reader_read_outer_xml(VALUE self)
515
515
  if (xml)
516
516
  {
517
517
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
518
- result = rxml_str_new2((const char*) xml, xencoding);
518
+ result = rxml_new_cstr((const char*) xml, xencoding);
519
519
  xmlFree(xml);
520
520
  }
521
521
 
@@ -553,7 +553,7 @@ static VALUE rxml_reader_read_string(VALUE self)
553
553
  if (xml)
554
554
  {
555
555
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
556
- result = rxml_str_new2((const char*) xml, xencoding);
556
+ result = rxml_new_cstr((const char*) xml, xencoding);
557
557
  xmlFree(xml);
558
558
  }
559
559
 
@@ -612,7 +612,7 @@ static VALUE rxml_reader_name(VALUE self)
612
612
  const xmlChar *result = xmlTextReaderConstName(xReader);
613
613
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
614
614
 
615
- return (result == NULL ? Qnil : rxml_str_new2(result, xencoding));
615
+ return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
616
616
  }
617
617
 
618
618
  /*
@@ -627,7 +627,7 @@ static VALUE rxml_reader_local_name(VALUE self)
627
627
  const xmlChar *result = xmlTextReaderConstLocalName(xReader);
628
628
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
629
629
 
630
- return (result == NULL ? Qnil : rxml_str_new2(result, xencoding));
630
+ return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
631
631
  }
632
632
 
633
633
  /*
@@ -680,7 +680,7 @@ static VALUE rxml_reader_base_uri(VALUE self)
680
680
  const xmlChar *result = xmlTextReaderConstBaseUri(xReader);
681
681
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
682
682
 
683
- return (result == NULL ? Qnil : rxml_str_new2(result, xencoding));
683
+ return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
684
684
  }
685
685
 
686
686
  /*
@@ -695,7 +695,7 @@ static VALUE rxml_reader_namespace_uri(VALUE self)
695
695
  const xmlChar *result = xmlTextReaderConstNamespaceUri(xReader);
696
696
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
697
697
 
698
- return (result == NULL ? Qnil : rxml_str_new2(result, xencoding));
698
+ return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
699
699
  }
700
700
 
701
701
  /*
@@ -710,7 +710,7 @@ static VALUE rxml_reader_value(VALUE self)
710
710
  const xmlChar *result = xmlTextReaderConstValue(xReader);
711
711
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
712
712
 
713
- return (result == NULL ? Qnil : rxml_str_new2(result, xencoding));
713
+ return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
714
714
  }
715
715
 
716
716
  /*
@@ -725,7 +725,7 @@ static VALUE rxml_reader_prefix(VALUE self)
725
725
  const xmlChar *result = xmlTextReaderConstPrefix(xReader);
726
726
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
727
727
 
728
- return (result == NULL ? Qnil : rxml_str_new2(result, xencoding));
728
+ return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
729
729
  }
730
730
 
731
731
  /*
@@ -781,7 +781,7 @@ static VALUE rxml_reader_xml_lang(VALUE self)
781
781
  const xmlChar *result = xmlTextReaderConstXmlLang(xReader);
782
782
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
783
783
 
784
- return (result == NULL ? Qnil : rxml_str_new2(result, xencoding));
784
+ return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
785
785
  }
786
786
 
787
787
  /*
@@ -796,7 +796,7 @@ static VALUE rxml_reader_xml_version(VALUE self)
796
796
  const xmlChar *result = xmlTextReaderConstXmlVersion(xReader);
797
797
  const xmlChar *xencoding = xmlTextReaderConstEncoding(xReader);
798
798
 
799
- return (result == NULL ? Qnil : rxml_str_new2(result, xencoding));
799
+ return (result == NULL ? Qnil : rxml_new_cstr(result, xencoding));
800
800
  }
801
801
 
802
802
  /*
@@ -849,7 +849,7 @@ static VALUE rxml_reader_attribute(VALUE self, VALUE key)
849
849
 
850
850
  if (xattr)
851
851
  {
852
- result = rxml_str_new2(xattr, xencoding);
852
+ result = rxml_new_cstr(xattr, xencoding);
853
853
  xmlFree(xattr);
854
854
  }
855
855
  return result;
@@ -871,7 +871,7 @@ static VALUE rxml_reader_lookup_namespace(VALUE self, VALUE prefix)
871
871
 
872
872
  if (xnamespace)
873
873
  {
874
- result = rxml_str_new2((const char*)xnamespace, (const char*)xencoding);
874
+ result = rxml_new_cstr((const char*)xnamespace, (const char*)xencoding);
875
875
  xmlFree((void *)xnamespace);
876
876
  }
877
877
  return result;
@@ -1,9 +1,9 @@
1
1
  /* Don't nuke this block! It is used for automatically updating the
2
2
  * versions below. VERSION = string formatting, VERNUM = numbered
3
3
  * version for inline testing: increment both or none at all.*/
4
- #define RUBY_LIBXML_VERSION "2.1.2"
5
- #define RUBY_LIBXML_VERNUM 212
4
+ #define RUBY_LIBXML_VERSION "2.2.0"
5
+ #define RUBY_LIBXML_VERNUM 220
6
6
  #define RUBY_LIBXML_VER_MAJ 2
7
- #define RUBY_LIBXML_VER_MIN 1
8
- #define RUBY_LIBXML_VER_MIC 2
7
+ #define RUBY_LIBXML_VER_MIN 2
8
+ #define RUBY_LIBXML_VER_MIC 0
9
9
  #define RUBY_LIBXML_VER_PATCH 0
@@ -104,7 +104,7 @@ rxml_xpath_to_value(xmlXPathContextPtr xctxt, xmlXPathObjectPtr xobject) {
104
104
  xmlXPathFreeObject(xobject);
105
105
  break;
106
106
  case XPATH_STRING:
107
- result = rxml_str_new2((const char*)xobject->stringval, xctxt->doc->encoding);
107
+ result = rxml_new_cstr((const char*)xobject->stringval, xctxt->doc->encoding);
108
108
  xmlXPathFreeObject(xobject);
109
109
  break;
110
110
  default:
@@ -159,8 +159,8 @@ static VALUE rxml_xpath_context_register_namespaces_from_node(VALUE self,
159
159
  Skip it for now. */
160
160
  if (xns->prefix)
161
161
  {
162
- VALUE prefix = rxml_str_new2((const char*)xns->prefix, xctxt->doc->encoding);
163
- VALUE uri = rxml_str_new2((const char*)xns->href, xctxt->doc->encoding);
162
+ VALUE prefix = rxml_new_cstr((const char*)xns->prefix, xctxt->doc->encoding);
163
+ VALUE uri = rxml_new_cstr((const char*)xns->href, xctxt->doc->encoding);
164
164
  rxml_xpath_context_register_namespace(self, prefix, uri);
165
165
  }
166
166
  xns = xns->next;
@@ -215,7 +215,7 @@ static VALUE rxml_xpath_context_register_namespaces(VALUE self, VALUE nslist)
215
215
  {
216
216
  rprefix = rb_str_new(StringValuePtr(nslist), (int) ((long) cp
217
217
  - (long) StringValuePtr(nslist)));
218
- ruri = rxml_str_new2(&cp[1], xctxt->doc->encoding);
218
+ ruri = rxml_new_cstr(&cp[1], xctxt->doc->encoding);
219
219
  }
220
220
  /* Should test the results of this */
221
221
  rxml_xpath_context_register_namespace(self, rprefix, ruri);
@@ -292,7 +292,7 @@ static VALUE rxml_xpath_object_string(VALUE self)
292
292
  if (rxpop->xpop->stringval == NULL)
293
293
  return Qnil;
294
294
 
295
- return rxml_str_new2((const char*) rxpop->xpop->stringval, rxpop->xdoc->encoding);
295
+ return rxml_new_cstr((const char*) rxpop->xpop->stringval, rxpop->xdoc->encoding);
296
296
  }
297
297
 
298
298
  /*
Binary file
Binary file
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ string1 = "(ISC)²"
4
+ puts string1.encoding
5
+ puts string1.bytes.to_a.join(' ')
6
+ puts string1
7
+
8
+ puts ""
9
+ string2 = string1.encode('iso-8859-1')
10
+ puts string2.encoding
11
+ puts string2.bytes.to_a.join(' ')
12
+ puts string2
13
+
14
+ puts ""
15
+ string3 = string1.force_encoding('iso-8859-1').encode('utf-8')
16
+ puts string3.encoding
17
+ puts string3.bytes.to_a.join(' ')
18
+ puts string3
19
+
20
+ #UTF-8
21
+ #40 73 83 67 41 194 178
22
+ #(ISC)²
23
+ #
24
+ #ISO-8859-1
25
+ #40 73 83 67 41 178
26
+ #(ISC)²
27
+
28
+
29
+ #40 73 83 67 41 195 130 194 178
@@ -48,7 +48,7 @@ class AttrNodeTest < Test::Unit::TestCase
48
48
  def test_name
49
49
  attribute = city_member.attributes.get_attribute('name')
50
50
  assert_equal('name', attribute.name)
51
- assert_equal(Encoding::ASCII_8BIT, attribute.name.encoding) if defined?(Encoding)
51
+ assert_equal(Encoding::UTF_8, attribute.name.encoding) if defined?(Encoding)
52
52
 
53
53
  attribute = city_member.attributes.get_attribute('href')
54
54
  assert_equal('href', attribute.name)
@@ -64,7 +64,7 @@ class AttrNodeTest < Test::Unit::TestCase
64
64
  def test_value
65
65
  attribute = city_member.attributes.get_attribute('name')
66
66
  assert_equal('Cambridge', attribute.value)
67
- assert_equal(Encoding::ASCII_8BIT, attribute.value.encoding) if defined?(Encoding)
67
+ assert_equal(Encoding::UTF_8, attribute.value.encoding) if defined?(Encoding)
68
68
 
69
69
  attribute = city_member.attributes.get_attribute('href')
70
70
  assert_equal('http://www.foo.net/cgi-bin/wfs?FeatureID=C10239', attribute.value)
@@ -74,12 +74,12 @@ class AttrNodeTest < Test::Unit::TestCase
74
74
  attribute = city_member.attributes.get_attribute('name')
75
75
  attribute.value = 'London'
76
76
  assert_equal('London', attribute.value)
77
- assert_equal(Encoding::ASCII_8BIT, attribute.value.encoding) if defined?(Encoding)
77
+ assert_equal(Encoding::UTF_8, attribute.value.encoding) if defined?(Encoding)
78
78
 
79
79
  attribute = city_member.attributes.get_attribute('href')
80
80
  attribute.value = 'http://i.have.changed'
81
81
  assert_equal('http://i.have.changed', attribute.value)
82
- assert_equal(Encoding::ASCII_8BIT, attribute.value.encoding) if defined?(Encoding)
82
+ assert_equal(Encoding::UTF_8, attribute.value.encoding) if defined?(Encoding)
83
83
  end
84
84
 
85
85
  def test_set_nil
@@ -88,20 +88,6 @@ class TestDocument < Test::Unit::TestCase
88
88
  @doc.to_s(:indent => false))
89
89
  end
90
90
 
91
- def test_encoding
92
- doc = XML::Document.new
93
- assert_equal(XML::Encoding::NONE, doc.encoding)
94
- assert_equal(Encoding::ASCII_8BIT, doc.rb_encoding) if defined?(Encoding)
95
-
96
- file = File.expand_path(File.join(File.dirname(__FILE__), 'model/bands.xml'))
97
- doc = XML::Document.file(file)
98
- assert_equal(XML::Encoding::UTF_8, doc.encoding)
99
- assert_equal(Encoding::UTF_8, doc.rb_encoding) if defined?(Encoding)
100
-
101
- doc.encoding = XML::Encoding::ISO_8859_1
102
- assert_equal(XML::Encoding::ISO_8859_1, doc.encoding)
103
- assert_equal(Encoding::ISO8859_1, doc.rb_encoding) if defined?(Encoding)
104
- end
105
91
 
106
92
  def test_doc_node_type
107
93
  assert_equal(XML::Node::DOCUMENT_NODE, XML::Document.new.node_type)
@@ -6,17 +6,7 @@ require 'test/unit'
6
6
 
7
7
  class TestDocumentWrite < Test::Unit::TestCase
8
8
  def setup
9
- load_encoding("utf-8")
10
- end
11
-
12
- def teardown
13
- XML.default_keep_blanks = true
14
- @doc = nil
15
- end
16
-
17
- def load_encoding(name)
18
- @encoding = Encoding.find(name) if defined?(Encoding)
19
- @file_name = "model/bands.#{name.downcase}.xml"
9
+ @file_name = "model/bands.utf-8.xml"
20
10
 
21
11
  # Strip spaces to make testing easier
22
12
  XML.default_keep_blanks = false
@@ -24,6 +14,11 @@ class TestDocumentWrite < Test::Unit::TestCase
24
14
  @doc = XML::Document.file(file)
25
15
  end
26
16
 
17
+ def teardown
18
+ XML.default_keep_blanks = true
19
+ @doc = nil
20
+ end
21
+
27
22
  # --- to_s tests ---
28
23
  def test_to_s_default
29
24
  # Default to_s has indentation
@@ -0,0 +1,119 @@
1
+ # encoding: UTF-8
2
+
3
+ if defined?(Encoding)
4
+ require './test_helper'
5
+ require 'test/unit'
6
+
7
+ # Code UTF8 Latin1 Hex
8
+ # m 109 109 6D
9
+ # ö 195 182 246 C3 B6 / F6
10
+ # t 116 116 74
11
+ # l 108 108 6C
12
+ # e 101 101 65
13
+ # y 121 121 79
14
+ # _ 95 95 5F
15
+ # c 99 99 63
16
+ # r 114 114 72
17
+ # ü 195 188 252 C3 BC / FC
18
+ # e 101 101 65
19
+
20
+ # See:
21
+ # http://en.wikipedia.org/wiki/ISO/IEC_8859-1
22
+ # http://en.wikipedia.org/wiki/List_of_Unicode_characters
23
+
24
+ class TestEncoding < Test::Unit::TestCase
25
+ def setup
26
+ Encoding.default_internal = nil
27
+ end
28
+
29
+ def load_encoding(encoding)
30
+ @encoding = encoding
31
+ file_name = "model/bands.#{@encoding.name.downcase}.xml"
32
+
33
+ # Strip spaces to make testing easier
34
+ XML.default_keep_blanks = false
35
+ file = File.join(File.dirname(__FILE__), file_name)
36
+ @doc = XML::Document.file(file)
37
+ end
38
+
39
+ def test_encoding
40
+ doc = XML::Document.new
41
+ assert_equal(XML::Encoding::NONE, doc.encoding)
42
+ assert_equal(Encoding::ASCII_8BIT, doc.rb_encoding) if defined?(Encoding)
43
+
44
+ file = File.expand_path(File.join(File.dirname(__FILE__), 'model/bands.xml'))
45
+ doc = XML::Document.file(file)
46
+ assert_equal(XML::Encoding::UTF_8, doc.encoding)
47
+ assert_equal(Encoding::UTF_8, doc.rb_encoding) if defined?(Encoding)
48
+
49
+ doc.encoding = XML::Encoding::ISO_8859_1
50
+ assert_equal(XML::Encoding::ISO_8859_1, doc.encoding)
51
+ assert_equal(Encoding::ISO8859_1, doc.rb_encoding) if defined?(Encoding)
52
+ end
53
+
54
+ def test_no_internal_encoding_iso_8859_1
55
+ Encoding.default_internal = nil
56
+ load_encoding(Encoding::ISO_8859_1)
57
+ node = @doc.root.children.first
58
+
59
+ name = node.name
60
+ assert_equal(Encoding::UTF_8, name.encoding)
61
+ assert_equal("m\u00F6tley_cr\u00FCe", name)
62
+ assert_equal("109 195 182 116 108 101 121 95 99 114 195 188 101",
63
+ name.bytes.to_a.join(" "))
64
+ assert_equal("M\u00F6tley Cr\u00FCe is an American heavy metal band formed in Los Angeles, California in 1981.",
65
+ node.content)
66
+
67
+ name = name.encode(Encoding::ISO_8859_1)
68
+ assert_equal(Encoding::ISO_8859_1, name.encoding)
69
+ assert_equal("m\xF6tley_cr\xFCe".force_encoding(Encoding::ISO_8859_1), name)
70
+ assert_equal("109 246 116 108 101 121 95 99 114 252 101",
71
+ name.bytes.to_a.join(" "))
72
+ assert_equal("M\xF6tley Cr\xFCe is an American heavy metal band formed in Los Angeles, California in 1981.".force_encoding(Encoding::ISO_8859_1),
73
+ node.content.encode(Encoding::ISO_8859_1))
74
+ end
75
+
76
+ def test_internal_encoding_iso_8859_1
77
+ Encoding.default_internal = Encoding::ISO_8859_1
78
+ load_encoding(Encoding::ISO_8859_1)
79
+ node = @doc.root.children.first
80
+
81
+ name = node.name
82
+ assert_equal(Encoding::ISO_8859_1, name.encoding)
83
+ assert_equal("109 246 116 108 101 121 95 99 114 252 101",
84
+ name.bytes.to_a.join(" "))
85
+ assert_equal("m\xF6tley_cr\xFCe".force_encoding(Encoding::ISO_8859_1), name)
86
+ assert_equal("109 246 116 108 101 121 95 99 114 252 101",
87
+ name.bytes.to_a.join(" "))
88
+ assert_equal("M\xF6tley Cr\xFCe is an American heavy metal band formed in Los Angeles, California in 1981.".force_encoding(Encoding::ISO_8859_1),
89
+ node.content.encode(Encoding::ISO_8859_1))
90
+ end
91
+
92
+ def test_no_internal_encoding_utf_8
93
+ Encoding.default_internal = nil
94
+ load_encoding(Encoding::UTF_8)
95
+ node = @doc.root.children.first
96
+
97
+ name = node.name
98
+ assert_equal(@encoding, name.encoding)
99
+ assert_equal("109 195 182 116 108 101 121 95 99 114 195 188 101",
100
+ name.bytes.to_a.join(" "))
101
+
102
+ name = name.encode(Encoding::ISO_8859_1)
103
+ assert_equal(Encoding::ISO_8859_1, name.encoding)
104
+ assert_equal("109 246 116 108 101 121 95 99 114 252 101",
105
+ name.bytes.to_a.join(" "))
106
+ end
107
+
108
+ def test_internal_encoding_utf_8
109
+ Encoding.default_internal = Encoding::ISO_8859_1
110
+ load_encoding(Encoding::UTF_8)
111
+ node = @doc.root.children.first
112
+
113
+ name = node.name
114
+ assert_equal(Encoding::ISO_8859_1, name.encoding)
115
+ assert_equal("109 246 116 108 101 121 95 99 114 252 101",
116
+ name.bytes.to_a.join(" "))
117
+ end
118
+ end
119
+ end
@@ -5,23 +5,18 @@ require 'test/unit'
5
5
 
6
6
  class TestNode < Test::Unit::TestCase
7
7
  def setup
8
- load_encoding("utf-8")
9
- end
10
-
11
- def teardown
12
- XML.default_keep_blanks = true
13
- @doc = nil
14
- end
15
-
16
- def load_encoding(name)
17
- @encoding = Encoding.find(name) if defined?(Encoding)
18
- @file_name = "model/bands.#{name.downcase}.xml"
8
+ @file_name = "model/bands.utf-8.xml"
19
9
 
20
10
  # Strip spaces to make testing easier
21
11
  XML.default_keep_blanks = false
22
12
  file = File.join(File.dirname(__FILE__), @file_name)
23
13
  @doc = XML::Document.file(file)
24
14
  end
15
+
16
+ def teardown
17
+ XML.default_keep_blanks = true
18
+ @doc = nil
19
+ end
25
20
 
26
21
  def nodes
27
22
  # Find all nodes with a country attributes
@@ -65,7 +60,7 @@ class TestNode < Test::Unit::TestCase
65
60
  assert_instance_of(XML::Node, @doc.root.child)
66
61
 
67
62
  if defined?(Encoding)
68
- assert_equal(@encoding, @doc.root.child.name.encoding)
63
+ assert_equal(Encoding::UTF_8, @doc.root.child.name.encoding)
69
64
  assert_equal("m\u00F6tley_cr\u00FCe", @doc.root.child.name)
70
65
  else
71
66
  assert_equal("m\303\266tley_cr\303\274e", @doc.root.child.name)
@@ -79,25 +74,8 @@ class TestNode < Test::Unit::TestCase
79
74
  end
80
75
 
81
76
  def test_name
82
- if defined?(Encoding)
83
- assert_equal(@encoding, nodes[0].name.encoding)
84
- assert_equal("m\u00F6tley_cr\u00FCe", nodes[0].name)
85
- else
86
- assert_equal("m\303\266tley_cr\303\274e", nodes[0].name)
87
- end
88
- assert_equal("iron_maiden", nodes[1].name)
89
- end
90
-
91
- def test_name_iso_8859_1
92
- load_encoding("iso-8859-1")
93
-
94
- if defined?(Encoding)
95
- assert_equal(@encoding, nodes[0].name.encoding)
96
- assert_equal("m\303\266tley_cr\303\274e".force_encoding(@encoding), nodes[0].name)
97
- else
98
- assert_equal("m\303\266tley_cr\303\274e", nodes[0].name)
99
- end
100
- assert_equal("iron_maiden", nodes[1].name)
77
+ node = @doc.root.children.last
78
+ assert_equal("iron_maiden", node.name)
101
79
  end
102
80
 
103
81
  def test_node_find
@@ -140,47 +118,9 @@ class TestNode < Test::Unit::TestCase
140
118
  end
141
119
 
142
120
  def test_content
143
- if defined?(Encoding)
144
- assert_equal(@encoding, @doc.root.content.encoding)
145
- assert_equal("M\u00F6tley Cr\u00FCe is an American heavy metal band formed in Los Angeles, California in 1981.Iron Maiden is a British heavy metal band formed in 1975.",
146
- @doc.root.content)
147
-
148
- first = @doc.root.child
149
- assert_equal("M\u00F6tley Cr\u00FCe is an American heavy metal band formed in Los Angeles, California in 1981.",
150
- first.content)
151
- assert_equal("Iron Maiden is a British heavy metal band formed in 1975.", first.next.content)
152
- else
153
- assert_equal("M\303\266tley Cr\303\274e is an American heavy metal band formed in Los Angeles, California in 1981.Iron Maiden is a British heavy metal band formed in 1975.",
154
- @doc.root.content)
155
-
156
- first = @doc.root.child
157
- assert_equal("M\303\266tley Cr\303\274e is an American heavy metal band formed in Los Angeles, California in 1981.",
158
- first.content)
159
- assert_equal("Iron Maiden is a British heavy metal band formed in 1975.",
160
- first.next.content)
161
- end
162
- end
163
-
164
- def test_content_iso_8859_1
165
- load_encoding("iso-8859-1")
166
- if defined?(Encoding)
167
- assert_equal(@encoding, @doc.root.content.encoding)
168
- assert_equal("M\xC3\xB6tley Cr\xC3\xBCe is an American heavy metal band formed in Los Angeles, California in 1981.Iron Maiden is a British heavy metal band formed in 1975.".force_encoding(@encoding),
169
- @doc.root.content)
170
-
171
- first = @doc.root.child
172
- assert_equal("M\xC3\xB6tley Cr\xC3\xBCe is an American heavy metal band formed in Los Angeles, California in 1981.".force_encoding(@encoding),
173
- first.content)
174
- assert_equal("Iron Maiden is a British heavy metal band formed in 1975.", first.next.content)
175
- else
176
- assert_equal("M\303\266tley Cr\303\274e is an American heavy metal band formed in Los Angeles, California in 1981.Iron Maiden is a British heavy metal band formed in 1975.",
177
- @doc.root.content)
178
-
179
- first = @doc.root.child
180
- assert_equal("M\303\266tley Cr\303\274e is an American heavy metal band formed in Los Angeles, California in 1981.",
181
- first.content)
182
- assert_equal("Iron Maiden is a British heavy metal band formed in 1975.", first.next.content)
183
- end
121
+ node = @doc.root.last
122
+ assert_equal("Iron Maiden is a British heavy metal band formed in 1975.",
123
+ node.content)
184
124
  end
185
125
 
186
126
  def test_base
@@ -227,8 +227,8 @@ class TestParser < Test::Unit::TestCase
227
227
  doc = parser.parse
228
228
  node = doc.find_first('//metal')
229
229
  if defined?(Encoding)
230
- assert_equal(Encoding::ISO8859_1, node.content.encoding)
231
- assert_equal("m\303\266tley_cr\303\274e".force_encoding(Encoding::ISO8859_1), node.content)
230
+ assert_equal(Encoding::UTF_8, node.content.encoding)
231
+ assert_equal("m\303\266tley_cr\303\274e", node.content)
232
232
  else
233
233
  assert_equal("m\303\266tley_cr\303\274e", node.content)
234
234
  end
@@ -11,6 +11,7 @@ require './tc_attributes'
11
11
  require './tc_document'
12
12
  require './tc_document_write'
13
13
  require './tc_dtd'
14
+ require './tc_encoding'
14
15
  require './tc_error'
15
16
  require './tc_html_parser'
16
17
  require './tc_html_parser_context'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libxml-ruby
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 7
5
5
  prerelease:
6
6
  segments:
7
7
  - 2
8
- - 1
9
8
  - 2
10
- version: 2.1.2
9
+ - 0
10
+ version: 2.2.0
11
11
  platform: x86-mingw32
12
12
  authors:
13
13
  - Ross Bamform
@@ -20,7 +20,7 @@ autorequire:
20
20
  bindir: bin
21
21
  cert_chain: []
22
22
 
23
- date: 2011-08-03 00:00:00 Z
23
+ date: 2011-08-09 00:00:00 Z
24
24
  dependencies: []
25
25
 
26
26
  description: " The Libxml-Ruby project provides Ruby language bindings for the GNOME\n Libxml2 XML toolkit. It is free software, released under the MIT License.\n Libxml-ruby's primary advantage over REXML is performance - if speed\n is your need, these are good libraries to consider, as demonstrated\n by the informal benchmark below.\n"
@@ -156,6 +156,7 @@ files:
156
156
  - test/model/shiporder.xsd
157
157
  - test/model/soap.xml
158
158
  - test/model/xinclude.xml
159
+ - test/new_main.rb
159
160
  - test/tc_attr.rb
160
161
  - test/tc_attributes.rb
161
162
  - test/tc_attr_decl.rb
@@ -163,6 +164,7 @@ files:
163
164
  - test/tc_document.rb
164
165
  - test/tc_document_write.rb
165
166
  - test/tc_dtd.rb
167
+ - test/tc_encoding.rb
166
168
  - test/tc_error.rb
167
169
  - test/tc_gc.rb
168
170
  - test/tc_html_parser.rb
@@ -241,6 +243,7 @@ test_files:
241
243
  - test/tc_document.rb
242
244
  - test/tc_document_write.rb
243
245
  - test/tc_dtd.rb
246
+ - test/tc_encoding.rb
244
247
  - test/tc_error.rb
245
248
  - test/tc_gc.rb
246
249
  - test/tc_html_parser.rb