libxml-ruby 2.8.0 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (204) hide show
  1. checksums.yaml +5 -5
  2. data/HISTORY +842 -775
  3. data/LICENSE +20 -20
  4. data/MANIFEST +166 -166
  5. data/README.rdoc +217 -184
  6. data/Rakefile +90 -78
  7. data/ext/libxml/extconf.h +3 -0
  8. data/ext/libxml/extconf.rb +61 -116
  9. data/ext/libxml/libxml.c +80 -76
  10. data/ext/libxml/ruby_libxml.h +67 -75
  11. data/ext/libxml/ruby_xml.c +933 -893
  12. data/ext/libxml/ruby_xml.h +10 -10
  13. data/ext/libxml/ruby_xml_attr.c +333 -333
  14. data/ext/libxml/ruby_xml_attr.h +12 -12
  15. data/ext/libxml/ruby_xml_attr_decl.c +153 -153
  16. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  17. data/ext/libxml/ruby_xml_attributes.c +275 -275
  18. data/ext/libxml/ruby_xml_attributes.h +15 -15
  19. data/ext/libxml/ruby_xml_cbg.c +85 -85
  20. data/ext/libxml/ruby_xml_document.c +1123 -1147
  21. data/ext/libxml/ruby_xml_document.h +11 -11
  22. data/ext/libxml/ruby_xml_dtd.c +248 -268
  23. data/ext/libxml/ruby_xml_dtd.h +9 -9
  24. data/ext/libxml/ruby_xml_encoding.c +250 -260
  25. data/ext/libxml/ruby_xml_encoding.h +16 -19
  26. data/ext/libxml/ruby_xml_error.c +996 -996
  27. data/ext/libxml/ruby_xml_error.h +12 -12
  28. data/ext/libxml/ruby_xml_html_parser.c +89 -92
  29. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  30. data/ext/libxml/ruby_xml_html_parser_context.c +337 -338
  31. data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
  32. data/ext/libxml/ruby_xml_html_parser_options.c +46 -46
  33. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  34. data/ext/libxml/ruby_xml_input_cbg.c +191 -191
  35. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  36. data/ext/libxml/ruby_xml_io.c +47 -50
  37. data/ext/libxml/ruby_xml_io.h +10 -10
  38. data/ext/libxml/ruby_xml_namespace.c +153 -153
  39. data/ext/libxml/ruby_xml_namespace.h +10 -10
  40. data/ext/libxml/ruby_xml_namespaces.c +293 -293
  41. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  42. data/ext/libxml/ruby_xml_node.c +1402 -1452
  43. data/ext/libxml/ruby_xml_node.h +13 -11
  44. data/ext/libxml/ruby_xml_parser.c +91 -94
  45. data/ext/libxml/ruby_xml_parser.h +12 -12
  46. data/ext/libxml/ruby_xml_parser_context.c +999 -1001
  47. data/ext/libxml/ruby_xml_parser_context.h +10 -10
  48. data/ext/libxml/ruby_xml_parser_options.c +66 -66
  49. data/ext/libxml/ruby_xml_parser_options.h +12 -12
  50. data/ext/libxml/ruby_xml_reader.c +1239 -1228
  51. data/ext/libxml/ruby_xml_reader.h +17 -17
  52. data/ext/libxml/ruby_xml_relaxng.c +110 -111
  53. data/ext/libxml/ruby_xml_relaxng.h +10 -10
  54. data/ext/libxml/ruby_xml_sax2_handler.c +326 -328
  55. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  56. data/ext/libxml/ruby_xml_sax_parser.c +116 -120
  57. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  58. data/ext/libxml/ruby_xml_schema.c +278 -301
  59. data/ext/libxml/ruby_xml_schema.h +809 -809
  60. data/ext/libxml/ruby_xml_schema_attribute.c +109 -109
  61. data/ext/libxml/ruby_xml_schema_attribute.h +15 -15
  62. data/ext/libxml/ruby_xml_schema_element.c +95 -94
  63. data/ext/libxml/ruby_xml_schema_element.h +14 -14
  64. data/ext/libxml/ruby_xml_schema_facet.c +52 -52
  65. data/ext/libxml/ruby_xml_schema_facet.h +13 -13
  66. data/ext/libxml/ruby_xml_schema_type.c +232 -259
  67. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  68. data/ext/libxml/ruby_xml_version.h +9 -9
  69. data/ext/libxml/ruby_xml_writer.c +1133 -1137
  70. data/ext/libxml/ruby_xml_writer.h +10 -10
  71. data/ext/libxml/ruby_xml_xinclude.c +16 -16
  72. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  73. data/ext/libxml/ruby_xml_xpath.c +194 -188
  74. data/ext/libxml/ruby_xml_xpath.h +13 -13
  75. data/ext/libxml/ruby_xml_xpath_context.c +360 -361
  76. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  77. data/ext/libxml/ruby_xml_xpath_expression.c +81 -81
  78. data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
  79. data/ext/libxml/ruby_xml_xpath_object.c +338 -335
  80. data/ext/libxml/ruby_xml_xpath_object.h +17 -17
  81. data/ext/libxml/ruby_xml_xpointer.c +99 -99
  82. data/ext/libxml/ruby_xml_xpointer.h +11 -11
  83. data/ext/vc/libxml_ruby.sln +17 -15
  84. data/lib/libxml-ruby.rb +30 -0
  85. data/lib/libxml.rb +3 -33
  86. data/lib/libxml/node.rb +2 -78
  87. data/lib/libxml/parser.rb +0 -266
  88. data/lib/libxml/sax_parser.rb +0 -17
  89. data/lib/libxml/schema.rb +47 -66
  90. data/lib/libxml/schema/attribute.rb +19 -19
  91. data/lib/libxml/schema/element.rb +19 -27
  92. data/lib/libxml/schema/type.rb +21 -29
  93. data/libxml-ruby.gemspec +48 -44
  94. data/script/benchmark/depixelate +634 -634
  95. data/script/benchmark/hamlet.xml +9054 -9054
  96. data/script/benchmark/parsecount +170 -170
  97. data/script/benchmark/throughput +41 -41
  98. data/script/test +6 -6
  99. data/setup.rb +0 -1
  100. data/test/c14n/given/example-1.xml +14 -14
  101. data/test/c14n/given/example-2.xml +11 -11
  102. data/test/c14n/given/example-3.xml +18 -18
  103. data/test/c14n/given/example-4.xml +9 -9
  104. data/test/c14n/given/example-5.xml +12 -12
  105. data/test/c14n/given/example-6.xml +2 -2
  106. data/test/c14n/given/example-7.xml +11 -11
  107. data/test/c14n/given/example-8.xml +11 -11
  108. data/test/c14n/given/example-8.xpath +9 -9
  109. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  110. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  111. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  112. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  113. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  114. data/test/c14n/result/with-comments/example-1 +5 -5
  115. data/test/c14n/result/with-comments/example-2 +10 -10
  116. data/test/c14n/result/with-comments/example-3 +13 -13
  117. data/test/c14n/result/with-comments/example-4 +8 -8
  118. data/test/c14n/result/with-comments/example-5 +3 -3
  119. data/test/c14n/result/without-comments/example-1 +3 -3
  120. data/test/c14n/result/without-comments/example-2 +10 -10
  121. data/test/c14n/result/without-comments/example-3 +13 -13
  122. data/test/c14n/result/without-comments/example-4 +8 -8
  123. data/test/c14n/result/without-comments/example-5 +2 -2
  124. data/test/model/atom.xml +12 -12
  125. data/test/model/bands.iso-8859-1.xml +4 -4
  126. data/test/model/bands.utf-8.xml +4 -4
  127. data/test/model/bands.xml +4 -4
  128. data/test/model/books.xml +153 -153
  129. data/test/model/cwm_1_0.xml +11336 -0
  130. data/test/model/merge_bug_data.xml +58 -58
  131. data/test/model/ruby-lang.html +238 -238
  132. data/test/model/rubynet.xml +79 -79
  133. data/test/model/shiporder.rnc +28 -28
  134. data/test/model/shiporder.rng +86 -86
  135. data/test/model/shiporder.xml +22 -22
  136. data/test/model/shiporder.xsd +39 -39
  137. data/test/model/soap.xml +27 -27
  138. data/test/model/xinclude.xml +4 -4
  139. data/test/test.xml +2 -0
  140. data/test/{tc_attr.rb → test_attr.rb} +23 -25
  141. data/test/{tc_attr_decl.rb → test_attr_decl.rb} +13 -14
  142. data/test/{tc_attributes.rb → test_attributes.rb} +11 -18
  143. data/test/{tc_canonicalize.rb → test_canonicalize.rb} +36 -41
  144. data/test/test_deprecated_require.rb +12 -0
  145. data/test/{tc_document.rb → test_document.rb} +32 -27
  146. data/test/test_document_write.rb +146 -0
  147. data/test/{tc_dtd.rb → test_dtd.rb} +28 -29
  148. data/test/{tc_encoding.rb → test_encoding.rb} +129 -126
  149. data/test/{tc_encoding_sax.rb → test_encoding_sax.rb} +7 -6
  150. data/test/test_error.rb +178 -0
  151. data/test/test_helper.rb +3 -10
  152. data/test/test_html_parser.rb +162 -0
  153. data/test/test_html_parser_context.rb +23 -0
  154. data/test/test_namespace.rb +60 -0
  155. data/test/{tc_namespaces.rb → test_namespaces.rb} +34 -44
  156. data/test/{tc_node.rb → test_node.rb} +68 -47
  157. data/test/{tc_node_cdata.rb → test_node_cdata.rb} +12 -13
  158. data/test/{tc_node_comment.rb → test_node_comment.rb} +7 -8
  159. data/test/{tc_node_copy.rb → test_node_copy.rb} +4 -6
  160. data/test/{tc_node_edit.rb → test_node_edit.rb} +23 -41
  161. data/test/{tc_node_pi.rb → test_node_pi.rb} +37 -40
  162. data/test/{tc_node_text.rb → test_node_text.rb} +10 -12
  163. data/test/{tc_node_write.rb → test_node_write.rb} +18 -29
  164. data/test/test_node_xlink.rb +28 -0
  165. data/test/test_parser.rb +324 -0
  166. data/test/{tc_parser_context.rb → test_parser_context.rb} +41 -42
  167. data/test/{tc_properties.rb → test_properties.rb} +6 -7
  168. data/test/test_reader.rb +363 -0
  169. data/test/test_relaxng.rb +53 -0
  170. data/test/{tc_sax_parser.rb → test_sax_parser.rb} +36 -37
  171. data/test/{tc_schema.rb → test_schema.rb} +43 -37
  172. data/test/test_suite.rb +38 -40
  173. data/test/{tc_traversal.rb → test_traversal.rb} +5 -6
  174. data/test/{tc_writer.rb → test_writer.rb} +468 -448
  175. data/test/{tc_xinclude.rb → test_xinclude.rb} +4 -5
  176. data/test/test_xml.rb +262 -0
  177. data/test/{tc_xpath.rb → test_xpath.rb} +31 -32
  178. data/test/{tc_xpath_context.rb → test_xpath_context.rb} +8 -9
  179. data/test/test_xpath_expression.rb +37 -0
  180. data/test/{tc_xpointer.rb → test_xpointer.rb} +16 -18
  181. metadata +117 -95
  182. data/lib/libxml/ns.rb +0 -22
  183. data/lib/libxml/properties.rb +0 -23
  184. data/lib/libxml/reader.rb +0 -29
  185. data/lib/libxml/xpath_object.rb +0 -16
  186. data/test/etc_doc_to_s.rb +0 -21
  187. data/test/ets_doc_file.rb +0 -17
  188. data/test/ets_doc_to_s.rb +0 -23
  189. data/test/ets_gpx.rb +0 -28
  190. data/test/ets_node_gc.rb +0 -23
  191. data/test/ets_test.xml +0 -2
  192. data/test/ets_tsr.rb +0 -11
  193. data/test/tc_deprecated_require.rb +0 -13
  194. data/test/tc_document_write.rb +0 -196
  195. data/test/tc_error.rb +0 -180
  196. data/test/tc_html_parser.rb +0 -153
  197. data/test/tc_html_parser_context.rb +0 -24
  198. data/test/tc_namespace.rb +0 -62
  199. data/test/tc_node_xlink.rb +0 -29
  200. data/test/tc_parser.rb +0 -381
  201. data/test/tc_reader.rb +0 -400
  202. data/test/tc_relaxng.rb +0 -54
  203. data/test/tc_xml.rb +0 -226
  204. data/test/tc_xpath_expression.rb +0 -38
@@ -1,9 +1,9 @@
1
- #ifndef __RXML_DTD__
2
- #define __RXML_DTD__
3
-
4
- extern VALUE cXMLDtd;
5
-
6
- void rxml_init_dtd(void);
7
- VALUE rxml_dtd_wrap(xmlDtdPtr xdtd);
8
-
9
- #endif
1
+ #ifndef __RXML_DTD__
2
+ #define __RXML_DTD__
3
+
4
+ extern VALUE cXMLDtd;
5
+
6
+ void rxml_init_dtd(void);
7
+ VALUE rxml_dtd_wrap(xmlDtdPtr xdtd);
8
+
9
+ #endif
@@ -1,260 +1,250 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #include <stdarg.h>
4
- #include "ruby_libxml.h"
5
-
6
- /*
7
- * Document-class: LibXML::XML::Encoding
8
- *
9
- * The encoding class exposes the encodings that libxml
10
- * supports via constants.
11
- *
12
- * LibXML converts all data sources to UTF8
13
- * internally before processing them. By default,
14
- * LibXML determines a data source's encoding
15
- * using the algorithm described on its
16
- * website[http://xmlsoft.org/encoding.html].
17
- *
18
- * However, you may override a data source's encoding
19
- * by using the encoding constants defined in this
20
- * module.
21
- *
22
- * Example 1:
23
- *
24
- * io = File.open('some_file', 'rb')
25
- * parser = XML::Parser.io(io, :encoding => XML::Encoding::ISO_8859_1)
26
- * doc = parser.parse
27
- *
28
- * Example 2:
29
- *
30
- * parser = XML::HTMLParser.file("some_file", :encoding => XML::Encoding::ISO_8859_1)
31
- * doc = parser.parse
32
- *
33
- * Example 3:
34
- *
35
- * document = XML::Document.new
36
- * document.encoding = XML::Encoding::ISO_8859_1
37
- * doc << XML::Node.new
38
- */
39
-
40
- VALUE mXMLEncoding;
41
-
42
- /*
43
- * call-seq:
44
- * Encoding.from_s("UTF_8") -> XML::Encoding::UTF_8
45
- *
46
- * Converts an encoding string to an encoding constant
47
- * defined on the XML::Encoding class.
48
- */
49
- static VALUE rxml_encoding_from_s(VALUE klass, VALUE encoding)
50
- {
51
- xmlCharEncoding xencoding;
52
-
53
- if (encoding == Qnil)
54
- return Qnil;
55
-
56
- xencoding = xmlParseCharEncoding(StringValuePtr(encoding));
57
- return INT2NUM(xencoding);
58
- }
59
-
60
- /*
61
- * call-seq:
62
- * Encoding.to_s(XML::Encoding::UTF_8) -> "UTF-8"
63
- *
64
- * Converts an encoding constant defined on the XML::Encoding
65
- * class to its text representation.
66
- */
67
- static VALUE rxml_encoding_to_s(VALUE klass, VALUE encoding)
68
- {
69
- const char* xencoding = xmlGetCharEncodingName(NUM2INT(encoding));
70
-
71
- if (!xencoding)
72
- return Qnil;
73
- else
74
- return rxml_new_cstr(xencoding, xencoding);
75
- }
76
-
77
- #ifdef HAVE_RUBY_ENCODING_H
78
- /*
79
- * Converts an xmlCharEncoding enum value into a Ruby Encoding object (available
80
- * on Ruby 1.9.* and higher).
81
- */
82
- rb_encoding* rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding)
83
- {
84
- const char* encodingName;
85
-
86
- switch (xmlEncoding)
87
- {
88
- case XML_CHAR_ENCODING_UTF8:
89
- encodingName = "UTF-8";
90
- break;
91
- case XML_CHAR_ENCODING_UTF16LE:
92
- encodingName = "UTF-16LE";
93
- break;
94
- case XML_CHAR_ENCODING_UTF16BE:
95
- encodingName = "UTF-16BE";
96
- break;
97
- case XML_CHAR_ENCODING_UCS4LE:
98
- encodingName = "UCS-4LE";
99
- break;
100
- case XML_CHAR_ENCODING_UCS4BE:
101
- encodingName = "UCS-4BE";
102
- break;
103
- case XML_CHAR_ENCODING_UCS2:
104
- encodingName = "UCS-2";
105
- break;
106
- case XML_CHAR_ENCODING_8859_1:
107
- encodingName = "ISO8859-1";
108
- break;
109
- case XML_CHAR_ENCODING_8859_2:
110
- encodingName = "ISO8859-2";
111
- break;
112
- case XML_CHAR_ENCODING_8859_3:
113
- encodingName = "ISO8859-3";
114
- break;
115
- case XML_CHAR_ENCODING_8859_4:
116
- encodingName = "ISO8859-4";
117
- break;
118
- case XML_CHAR_ENCODING_8859_5:
119
- encodingName = "ISO8859-5";
120
- break;
121
- case XML_CHAR_ENCODING_8859_6:
122
- encodingName = "ISO8859-6";
123
- break;
124
- case XML_CHAR_ENCODING_8859_7:
125
- encodingName = "ISO8859-7";
126
- break;
127
- case XML_CHAR_ENCODING_8859_8:
128
- encodingName = "ISO8859-8";
129
- break;
130
- case XML_CHAR_ENCODING_8859_9:
131
- encodingName = "ISO8859-9";
132
- break;
133
- case XML_CHAR_ENCODING_2022_JP:
134
- encodingName = "ISO-2022-JP";
135
- break;
136
- case XML_CHAR_ENCODING_SHIFT_JIS:
137
- encodingName = "SHIFT-JIS";
138
- break;
139
- case XML_CHAR_ENCODING_EUC_JP:
140
- encodingName = "EUC-JP";
141
- break;
142
- case XML_CHAR_ENCODING_ASCII:
143
- encodingName = "US-ASCII";
144
- break;
145
- default:
146
- /* Covers XML_CHAR_ENCODING_ERROR, XML_CHAR_ENCODING_NONE, XML_CHAR_ENCODING_EBCDIC */
147
- encodingName = "ASCII-8BIT";
148
- break;
149
- }
150
-
151
- return rb_enc_find(encodingName);
152
- }
153
-
154
- /*
155
- * call-seq:
156
- * Input.encoding_to_rb_encoding(Input::ENCODING) -> Encoding
157
- *
158
- * Converts an encoding constant defined on the XML::Encoding
159
- * class to a Ruby encoding object (available on Ruby 1.9.* and higher).
160
- */
161
- VALUE rxml_encoding_to_rb_encoding(VALUE klass, VALUE encoding)
162
- {
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);
166
- }
167
-
168
- rb_encoding* rxml_figure_encoding(const char* xencoding)
169
- {
170
- rb_encoding* result;
171
- if (xencoding)
172
- {
173
- xmlCharEncoding xmlEncoding = xmlParseCharEncoding(xencoding);
174
- result = rxml_xml_encoding_to_rb_encoding(mXMLEncoding, xmlEncoding);
175
- }
176
- else
177
- {
178
- result = rb_utf8_encoding();
179
- }
180
- return result;
181
- }
182
- #endif
183
-
184
- VALUE rxml_new_cstr(const char* xstr, const char* xencoding)
185
- {
186
- #ifdef HAVE_RUBY_ENCODING_H
187
- rb_encoding *rbencoding = rxml_figure_encoding(xencoding);
188
- return rb_external_str_new_with_enc(xstr, strlen(xstr), rbencoding);
189
- #endif
190
- return rb_str_new2(xstr);
191
- }
192
-
193
- VALUE rxml_new_cstr_len(const char* xstr, const int length, const char* xencoding)
194
- {
195
- #ifdef HAVE_RUBY_ENCODING_H
196
- rb_encoding *rbencoding = rxml_figure_encoding(xencoding);
197
- return rb_external_str_new_with_enc(xstr, length, rbencoding);
198
- #endif
199
- return rb_str_new(xstr, length);
200
- }
201
-
202
- void rxml_init_encoding(void)
203
- {
204
- mXMLEncoding = rb_define_module_under(mXML, "Encoding");
205
- rb_define_module_function(mXMLEncoding, "from_s", rxml_encoding_from_s, 1);
206
- rb_define_module_function(mXMLEncoding, "to_s", rxml_encoding_to_s, 1);
207
-
208
- #ifdef HAVE_RUBY_ENCODING_H
209
- // rb_define_module_function(mXMLEncoding, "to_rb_encoding", rxml_encoding_to_rb_encoding, 2);
210
- #endif
211
-
212
- /* -1: No char encoding detected. */
213
- rb_define_const(mXMLEncoding, "ERROR", INT2NUM(XML_CHAR_ENCODING_ERROR));
214
- /* 0: No char encoding detected. */
215
- rb_define_const(mXMLEncoding, "NONE", INT2NUM(XML_CHAR_ENCODING_NONE));
216
- /* 1: UTF-8 */
217
- rb_define_const(mXMLEncoding, "UTF_8", INT2NUM(XML_CHAR_ENCODING_UTF8));
218
- /* 2: UTF-16 little endian. */
219
- rb_define_const(mXMLEncoding, "UTF_16LE", INT2NUM(XML_CHAR_ENCODING_UTF16LE));
220
- /* 3: UTF-16 big endian. */
221
- rb_define_const(mXMLEncoding, "UTF_16BE", INT2NUM(XML_CHAR_ENCODING_UTF16BE));
222
- /* 4: UCS-4 little endian. */
223
- rb_define_const(mXMLEncoding, "UCS_4LE", INT2NUM(XML_CHAR_ENCODING_UCS4LE));
224
- /* 5: UCS-4 big endian. */
225
- rb_define_const(mXMLEncoding, "UCS_4BE", INT2NUM(XML_CHAR_ENCODING_UCS4BE));
226
- /* 6: EBCDIC uh! */
227
- rb_define_const(mXMLEncoding, "EBCDIC", INT2NUM(XML_CHAR_ENCODING_EBCDIC));
228
- /* 7: UCS-4 unusual ordering. */
229
- rb_define_const(mXMLEncoding, "UCS_4_2143", INT2NUM(XML_CHAR_ENCODING_UCS4_2143));
230
- /* 8: UCS-4 unusual ordering. */
231
- rb_define_const(mXMLEncoding, "UCS_4_3412", INT2NUM(XML_CHAR_ENCODING_UCS4_3412));
232
- /* 9: UCS-2. */
233
- rb_define_const(mXMLEncoding, "UCS_2", INT2NUM(XML_CHAR_ENCODING_UCS2));
234
- /* 10: ISO-8859-1 ISO Latin 1. */
235
- rb_define_const(mXMLEncoding, "ISO_8859_1", INT2NUM(XML_CHAR_ENCODING_8859_1));
236
- /* 11: ISO-8859-2 ISO Latin 2. */
237
- rb_define_const(mXMLEncoding, "ISO_8859_2", INT2NUM(XML_CHAR_ENCODING_8859_2));
238
- /* 12: ISO-8859-3. */
239
- rb_define_const(mXMLEncoding, "ISO_8859_3", INT2NUM(XML_CHAR_ENCODING_8859_3));
240
- /* 13: ISO-8859-4. */
241
- rb_define_const(mXMLEncoding, "ISO_8859_4", INT2NUM(XML_CHAR_ENCODING_8859_4));
242
- /* 14: ISO-8859-5. */
243
- rb_define_const(mXMLEncoding, "ISO_8859_5", INT2NUM(XML_CHAR_ENCODING_8859_5));
244
- /* 15: ISO-8859-6. */
245
- rb_define_const(mXMLEncoding, "ISO_8859_6", INT2NUM(XML_CHAR_ENCODING_8859_6));
246
- /* 16: ISO-8859-7. */
247
- rb_define_const(mXMLEncoding, "ISO_8859_7", INT2NUM(XML_CHAR_ENCODING_8859_7));
248
- /* 17: ISO-8859-8. */
249
- rb_define_const(mXMLEncoding, "ISO_8859_8", INT2NUM(XML_CHAR_ENCODING_8859_8));
250
- /* 18: ISO-8859-9. */
251
- rb_define_const(mXMLEncoding, "ISO_8859_9", INT2NUM(XML_CHAR_ENCODING_8859_9));
252
- /* 19: ISO-2022-JP. */
253
- rb_define_const(mXMLEncoding, "ISO_2022_JP", INT2NUM(XML_CHAR_ENCODING_2022_JP));
254
- /* 20: Shift_JIS. */
255
- rb_define_const(mXMLEncoding, "SHIFT_JIS", INT2NUM(XML_CHAR_ENCODING_SHIFT_JIS));
256
- /* 21: EUC-JP. */
257
- rb_define_const(mXMLEncoding, "EUC_JP", INT2NUM(XML_CHAR_ENCODING_EUC_JP));
258
- /* 22: pure ASCII. */
259
- rb_define_const(mXMLEncoding, "ASCII", INT2NUM(XML_CHAR_ENCODING_ASCII));
260
- }
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #include <stdarg.h>
4
+ #include "ruby_libxml.h"
5
+
6
+ /*
7
+ * Document-class: LibXML::XML::Encoding
8
+ *
9
+ * The encoding class exposes the encodings that libxml
10
+ * supports via constants.
11
+ *
12
+ * LibXML converts all data sources to UTF8
13
+ * internally before processing them. By default,
14
+ * LibXML determines a data source's encoding
15
+ * using the algorithm described on its
16
+ * website[http://xmlsoft.org/encoding.html].
17
+ *
18
+ * However, you may override a data source's encoding
19
+ * by using the encoding constants defined in this
20
+ * module.
21
+ *
22
+ * Example 1:
23
+ *
24
+ * io = File.open('some_file', 'rb')
25
+ * parser = XML::Parser.io(io, :encoding => XML::Encoding::ISO_8859_1)
26
+ * doc = parser.parse
27
+ *
28
+ * Example 2:
29
+ *
30
+ * parser = XML::HTMLParser.file("some_file", :encoding => XML::Encoding::ISO_8859_1)
31
+ * doc = parser.parse
32
+ *
33
+ * Example 3:
34
+ *
35
+ * document = XML::Document.new
36
+ * document.encoding = XML::Encoding::ISO_8859_1
37
+ * doc << XML::Node.new
38
+ */
39
+
40
+ VALUE mXMLEncoding;
41
+
42
+ /*
43
+ * call-seq:
44
+ * Encoding.from_s("UTF_8") -> XML::Encoding::UTF_8
45
+ *
46
+ * Converts an encoding string to an encoding constant
47
+ * defined on the XML::Encoding class.
48
+ */
49
+ static VALUE rxml_encoding_from_s(VALUE klass, VALUE encoding)
50
+ {
51
+ xmlCharEncoding xencoding;
52
+
53
+ if (encoding == Qnil)
54
+ return Qnil;
55
+
56
+ xencoding = xmlParseCharEncoding(StringValuePtr(encoding));
57
+ return INT2NUM(xencoding);
58
+ }
59
+
60
+ /*
61
+ * call-seq:
62
+ * Encoding.to_s(XML::Encoding::UTF_8) -> "UTF-8"
63
+ *
64
+ * Converts an encoding constant defined on the XML::Encoding
65
+ * class to its text representation.
66
+ */
67
+ static VALUE rxml_encoding_to_s(VALUE klass, VALUE encoding)
68
+ {
69
+ const xmlChar* xencoding = (const xmlChar*)xmlGetCharEncodingName(NUM2INT(encoding));
70
+
71
+ if (!xencoding)
72
+ return Qnil;
73
+ else
74
+ return rxml_new_cstr(xencoding, xencoding);
75
+ }
76
+
77
+ /*
78
+ * Converts an xmlCharEncoding enum value into a Ruby Encoding object (available
79
+ * on Ruby 1.9.* and higher).
80
+ */
81
+ rb_encoding* rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding)
82
+ {
83
+ const char* encodingName;
84
+
85
+ switch (xmlEncoding)
86
+ {
87
+ case XML_CHAR_ENCODING_UTF8:
88
+ encodingName = "UTF-8";
89
+ break;
90
+ case XML_CHAR_ENCODING_UTF16LE:
91
+ encodingName = "UTF-16LE";
92
+ break;
93
+ case XML_CHAR_ENCODING_UTF16BE:
94
+ encodingName = "UTF-16BE";
95
+ break;
96
+ case XML_CHAR_ENCODING_UCS4LE:
97
+ encodingName = "UCS-4LE";
98
+ break;
99
+ case XML_CHAR_ENCODING_UCS4BE:
100
+ encodingName = "UCS-4BE";
101
+ break;
102
+ case XML_CHAR_ENCODING_UCS2:
103
+ encodingName = "UCS-2";
104
+ break;
105
+ case XML_CHAR_ENCODING_8859_1:
106
+ encodingName = "ISO8859-1";
107
+ break;
108
+ case XML_CHAR_ENCODING_8859_2:
109
+ encodingName = "ISO8859-2";
110
+ break;
111
+ case XML_CHAR_ENCODING_8859_3:
112
+ encodingName = "ISO8859-3";
113
+ break;
114
+ case XML_CHAR_ENCODING_8859_4:
115
+ encodingName = "ISO8859-4";
116
+ break;
117
+ case XML_CHAR_ENCODING_8859_5:
118
+ encodingName = "ISO8859-5";
119
+ break;
120
+ case XML_CHAR_ENCODING_8859_6:
121
+ encodingName = "ISO8859-6";
122
+ break;
123
+ case XML_CHAR_ENCODING_8859_7:
124
+ encodingName = "ISO8859-7";
125
+ break;
126
+ case XML_CHAR_ENCODING_8859_8:
127
+ encodingName = "ISO8859-8";
128
+ break;
129
+ case XML_CHAR_ENCODING_8859_9:
130
+ encodingName = "ISO8859-9";
131
+ break;
132
+ case XML_CHAR_ENCODING_2022_JP:
133
+ encodingName = "ISO-2022-JP";
134
+ break;
135
+ case XML_CHAR_ENCODING_SHIFT_JIS:
136
+ encodingName = "SHIFT-JIS";
137
+ break;
138
+ case XML_CHAR_ENCODING_EUC_JP:
139
+ encodingName = "EUC-JP";
140
+ break;
141
+ case XML_CHAR_ENCODING_ASCII:
142
+ encodingName = "US-ASCII";
143
+ break;
144
+ default:
145
+ /* Covers XML_CHAR_ENCODING_ERROR, XML_CHAR_ENCODING_NONE, XML_CHAR_ENCODING_EBCDIC */
146
+ encodingName = "ASCII-8BIT";
147
+ break;
148
+ }
149
+
150
+ return rb_enc_find(encodingName);
151
+ }
152
+
153
+ /*
154
+ * call-seq:
155
+ * Input.encoding_to_rb_encoding(Input::ENCODING) -> Encoding
156
+ *
157
+ * Converts an encoding constant defined on the XML::Encoding
158
+ * class to a Ruby encoding object (available on Ruby 1.9.* and higher).
159
+ */
160
+ VALUE rxml_encoding_to_rb_encoding(VALUE klass, VALUE encoding)
161
+ {
162
+ xmlCharEncoding xmlEncoding = (xmlCharEncoding)NUM2INT(encoding);
163
+ rb_encoding* rbencoding = rxml_xml_encoding_to_rb_encoding(klass, xmlEncoding);
164
+ return rb_enc_from_encoding(rbencoding);
165
+ }
166
+
167
+ rb_encoding* rxml_figure_encoding(const xmlChar* xencoding)
168
+ {
169
+ rb_encoding* result;
170
+ if (xencoding)
171
+ {
172
+ xmlCharEncoding xmlEncoding = xmlParseCharEncoding((const char*)xencoding);
173
+ result = rxml_xml_encoding_to_rb_encoding(mXMLEncoding, xmlEncoding);
174
+ }
175
+ else
176
+ {
177
+ result = rb_utf8_encoding();
178
+ }
179
+ return result;
180
+ }
181
+
182
+ VALUE rxml_new_cstr(const xmlChar* xstr, const xmlChar* xencoding)
183
+ {
184
+ rb_encoding *rbencoding = rxml_figure_encoding(xencoding);
185
+ return rb_external_str_new_with_enc((const char*)xstr, strlen((const char*)xstr), rbencoding);
186
+ }
187
+
188
+ VALUE rxml_new_cstr_len(const xmlChar* xstr, const long length, const xmlChar* xencoding)
189
+ {
190
+ rb_encoding *rbencoding = rxml_figure_encoding(xencoding);
191
+ return rb_external_str_new_with_enc((const char*)xstr, length, rbencoding);
192
+ }
193
+
194
+ void rxml_init_encoding(void)
195
+ {
196
+ mXMLEncoding = rb_define_module_under(mXML, "Encoding");
197
+ rb_define_module_function(mXMLEncoding, "from_s", rxml_encoding_from_s, 1);
198
+ rb_define_module_function(mXMLEncoding, "to_s", rxml_encoding_to_s, 1);
199
+
200
+ rb_define_module_function(mXMLEncoding, "to_rb_encoding", rxml_encoding_to_rb_encoding, 2);
201
+
202
+ /* -1: No char encoding detected. */
203
+ rb_define_const(mXMLEncoding, "ERROR", INT2NUM(XML_CHAR_ENCODING_ERROR));
204
+ /* 0: No char encoding detected. */
205
+ rb_define_const(mXMLEncoding, "NONE", INT2NUM(XML_CHAR_ENCODING_NONE));
206
+ /* 1: UTF-8 */
207
+ rb_define_const(mXMLEncoding, "UTF_8", INT2NUM(XML_CHAR_ENCODING_UTF8));
208
+ /* 2: UTF-16 little endian. */
209
+ rb_define_const(mXMLEncoding, "UTF_16LE", INT2NUM(XML_CHAR_ENCODING_UTF16LE));
210
+ /* 3: UTF-16 big endian. */
211
+ rb_define_const(mXMLEncoding, "UTF_16BE", INT2NUM(XML_CHAR_ENCODING_UTF16BE));
212
+ /* 4: UCS-4 little endian. */
213
+ rb_define_const(mXMLEncoding, "UCS_4LE", INT2NUM(XML_CHAR_ENCODING_UCS4LE));
214
+ /* 5: UCS-4 big endian. */
215
+ rb_define_const(mXMLEncoding, "UCS_4BE", INT2NUM(XML_CHAR_ENCODING_UCS4BE));
216
+ /* 6: EBCDIC uh! */
217
+ rb_define_const(mXMLEncoding, "EBCDIC", INT2NUM(XML_CHAR_ENCODING_EBCDIC));
218
+ /* 7: UCS-4 unusual ordering. */
219
+ rb_define_const(mXMLEncoding, "UCS_4_2143", INT2NUM(XML_CHAR_ENCODING_UCS4_2143));
220
+ /* 8: UCS-4 unusual ordering. */
221
+ rb_define_const(mXMLEncoding, "UCS_4_3412", INT2NUM(XML_CHAR_ENCODING_UCS4_3412));
222
+ /* 9: UCS-2. */
223
+ rb_define_const(mXMLEncoding, "UCS_2", INT2NUM(XML_CHAR_ENCODING_UCS2));
224
+ /* 10: ISO-8859-1 ISO Latin 1. */
225
+ rb_define_const(mXMLEncoding, "ISO_8859_1", INT2NUM(XML_CHAR_ENCODING_8859_1));
226
+ /* 11: ISO-8859-2 ISO Latin 2. */
227
+ rb_define_const(mXMLEncoding, "ISO_8859_2", INT2NUM(XML_CHAR_ENCODING_8859_2));
228
+ /* 12: ISO-8859-3. */
229
+ rb_define_const(mXMLEncoding, "ISO_8859_3", INT2NUM(XML_CHAR_ENCODING_8859_3));
230
+ /* 13: ISO-8859-4. */
231
+ rb_define_const(mXMLEncoding, "ISO_8859_4", INT2NUM(XML_CHAR_ENCODING_8859_4));
232
+ /* 14: ISO-8859-5. */
233
+ rb_define_const(mXMLEncoding, "ISO_8859_5", INT2NUM(XML_CHAR_ENCODING_8859_5));
234
+ /* 15: ISO-8859-6. */
235
+ rb_define_const(mXMLEncoding, "ISO_8859_6", INT2NUM(XML_CHAR_ENCODING_8859_6));
236
+ /* 16: ISO-8859-7. */
237
+ rb_define_const(mXMLEncoding, "ISO_8859_7", INT2NUM(XML_CHAR_ENCODING_8859_7));
238
+ /* 17: ISO-8859-8. */
239
+ rb_define_const(mXMLEncoding, "ISO_8859_8", INT2NUM(XML_CHAR_ENCODING_8859_8));
240
+ /* 18: ISO-8859-9. */
241
+ rb_define_const(mXMLEncoding, "ISO_8859_9", INT2NUM(XML_CHAR_ENCODING_8859_9));
242
+ /* 19: ISO-2022-JP. */
243
+ rb_define_const(mXMLEncoding, "ISO_2022_JP", INT2NUM(XML_CHAR_ENCODING_2022_JP));
244
+ /* 20: Shift_JIS. */
245
+ rb_define_const(mXMLEncoding, "SHIFT_JIS", INT2NUM(XML_CHAR_ENCODING_SHIFT_JIS));
246
+ /* 21: EUC-JP. */
247
+ rb_define_const(mXMLEncoding, "EUC_JP", INT2NUM(XML_CHAR_ENCODING_EUC_JP));
248
+ /* 22: pure ASCII. */
249
+ rb_define_const(mXMLEncoding, "ASCII", INT2NUM(XML_CHAR_ENCODING_ASCII));
250
+ }