libxml-ruby 2.2.2 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +14 -2
- data/MANIFEST +1 -0
- data/README.rdoc +2 -2
- data/ext/libxml/ruby_xml_document.c +191 -29
- data/ext/libxml/ruby_xml_document.h +1 -0
- data/ext/libxml/ruby_xml_encoding.c +21 -7
- data/ext/libxml/ruby_xml_encoding.h +1 -0
- data/ext/libxml/ruby_xml_node.c +38 -0
- data/ext/libxml/ruby_xml_sax2_handler.c +30 -34
- data/ext/libxml/ruby_xml_sax_parser.c +0 -14
- data/ext/libxml/ruby_xml_version.h +4 -4
- data/lib/libxml/document.rb +18 -16
- data/libxml-ruby.gemspec +3 -2
- data/test/c14n/given/doc.dtd +1 -0
- data/test/c14n/given/example-1.xml +14 -0
- data/test/c14n/given/example-2.xml +11 -0
- data/test/c14n/given/example-3.xml +18 -0
- data/test/c14n/given/example-4.xml +9 -0
- data/test/c14n/given/example-5.xml +12 -0
- data/test/c14n/given/example-6.xml +2 -0
- data/test/c14n/given/example-7.xml +11 -0
- data/test/c14n/given/example-8.xml +11 -0
- data/test/c14n/given/example-8.xpath +10 -0
- data/test/c14n/given/world.txt +1 -0
- data/test/c14n/result/1-1-without-comments/example-1 +4 -0
- data/test/c14n/result/1-1-without-comments/example-2 +11 -0
- data/test/c14n/result/1-1-without-comments/example-3 +14 -0
- data/test/c14n/result/1-1-without-comments/example-4 +9 -0
- data/test/c14n/result/1-1-without-comments/example-5 +3 -0
- data/test/c14n/result/1-1-without-comments/example-6 +1 -0
- data/test/c14n/result/1-1-without-comments/example-7 +1 -0
- data/test/c14n/result/1-1-without-comments/example-8 +1 -0
- data/test/c14n/result/with-comments/example-1 +6 -0
- data/test/c14n/result/with-comments/example-2 +11 -0
- data/test/c14n/result/with-comments/example-3 +14 -0
- data/test/c14n/result/with-comments/example-4 +9 -0
- data/test/c14n/result/with-comments/example-5 +4 -0
- data/test/c14n/result/with-comments/example-6 +1 -0
- data/test/c14n/result/with-comments/example-7 +1 -0
- data/test/c14n/result/without-comments/example-1 +4 -0
- data/test/c14n/result/without-comments/example-2 +11 -0
- data/test/c14n/result/without-comments/example-3 +14 -0
- data/test/c14n/result/without-comments/example-4 +9 -0
- data/test/c14n/result/without-comments/example-5 +3 -0
- data/test/c14n/result/without-comments/example-6 +1 -0
- data/test/c14n/result/without-comments/example-7 +1 -0
- data/test/tc_canonicalize.rb +125 -0
- data/test/tc_document.rb +2 -18
- data/test/tc_encoding.rb +7 -5
- data/test/tc_encoding_sax.rb +115 -0
- data/test/tc_node_pi.rb +40 -0
- data/test/tc_xpath.rb +23 -0
- data/test/test_suite.rb +7 -1
- metadata +45 -6
- data/test/new_main.rb +0 -29
data/HISTORY
CHANGED
@@ -1,6 +1,18 @@
|
|
1
1
|
= Release History
|
2
2
|
|
3
|
-
== 2.
|
3
|
+
== 2.3.0 / 2012-02-22 Ryan Johnson
|
4
|
+
|
5
|
+
* Add ability to insert new PI-nodes into the xmltree (Axel Struebing).
|
6
|
+
|
7
|
+
* Added full pass-through access to libxml2 xmlC14NDocDumpMemory method via
|
8
|
+
LibXML::XML::Document#canonicalize method with optional arguments.
|
9
|
+
|
10
|
+
* Added full test data for C14N based off of W3C spec.
|
11
|
+
(http://www.w3.org/TR/xml-c14n#Examples)
|
12
|
+
|
13
|
+
* Update sax handler to support encodings on Ruby 1.9 and higher.
|
14
|
+
|
15
|
+
== 2.2.2 / 2011-08-29 Charlie Savage
|
4
16
|
|
5
17
|
* ++API CHANGE+++
|
6
18
|
|
@@ -24,7 +36,7 @@ Fixes GitHub issue #30.
|
|
24
36
|
* Fixed bug where Node#inner_xml caused an error when it had no child nodes.
|
25
37
|
Fixes GitHub issues #31
|
26
38
|
|
27
|
-
* Don't require 'rake' in the gemspec to avoid annoying
|
39
|
+
* Don't require 'rake' in the gemspec to avoid annoying Bundler bugs
|
28
40
|
|
29
41
|
== 2.2.1 / 2011-08-13 Charlie Savage
|
30
42
|
|
data/MANIFEST
CHANGED
data/README.rdoc
CHANGED
@@ -94,12 +94,12 @@ namespace, in which case you can either write your code like this:
|
|
94
94
|
require 'libxml'
|
95
95
|
document = LibXML::XML::Document.new
|
96
96
|
|
97
|
-
Or you can utilize a namespace for
|
97
|
+
Or you can utilize a namespace for your own work and include LibXML into it.
|
98
98
|
For example:
|
99
99
|
|
100
100
|
require 'libxml'
|
101
101
|
|
102
|
-
|
102
|
+
module MyApplication
|
103
103
|
include LibXML
|
104
104
|
|
105
105
|
class MyClass
|
@@ -58,7 +58,7 @@ VALUE cXMLDocument;
|
|
58
58
|
void rxml_document_mark_node_list(xmlNodePtr xnode)
|
59
59
|
{
|
60
60
|
if (xnode == NULL) return;
|
61
|
-
|
61
|
+
|
62
62
|
while (xnode != NULL)
|
63
63
|
{
|
64
64
|
rxml_document_mark_node_list(xnode->children);
|
@@ -149,28 +149,183 @@ static VALUE rxml_document_initialize(int argc, VALUE *argv, VALUE self)
|
|
149
149
|
#endif
|
150
150
|
|
151
151
|
/*
|
152
|
-
* call-seq:
|
153
|
-
*
|
152
|
+
* :call-seq:
|
153
|
+
* document.canonicalize -> String
|
154
|
+
* document.canonicalize(options) -> String
|
154
155
|
*
|
155
|
-
*
|
156
|
+
* Returns a string containing the canonicalized form of the document.
|
157
|
+
* Implemented to include all of the functionality of the libxml2
|
158
|
+
* {xmlC14NDocDumpMemory}[http://xmlsoft.org/html/libxml-c14n.html#xmlC14NDocDumpMemory]
|
159
|
+
* method.
|
156
160
|
*
|
157
|
-
*
|
158
|
-
*
|
161
|
+
* === Options
|
162
|
+
* [comments]
|
163
|
+
* * *Type:* Boolean
|
164
|
+
* * *Default:* false
|
165
|
+
* Specifies if comments should be output.
|
166
|
+
* * Must be boolean, otherwise defaults to false.
|
167
|
+
* [inclusive_ns_prefixes]
|
168
|
+
* * *Type:* Array of strings
|
169
|
+
* * *Default:* empty array
|
170
|
+
* Array of namespace prefixes to include in exclusive canonicalization only.
|
171
|
+
* * The last item in the list is reserved for a NULL value because the C method demands it, therefore
|
172
|
+
* up to the first 255 valid entries will be used.
|
173
|
+
* * <em>Only used for *XML_C14N_EXCLUSIVE_1_0* mode. Ignored otherwise.</em>
|
174
|
+
* [mode]
|
175
|
+
* * *Type:* XML::Document Constant
|
176
|
+
* * *Default:* XML_C14N_1_0
|
177
|
+
* Specifies the mode of canonicalization.
|
178
|
+
* * *NOTE:* XML_C14N_1_1 may not be fully implemented upon compilation due to C library compatibility.
|
179
|
+
* Please check if XML_C14N_1_0 and XML_C14N_1_1 are the same value prior to using XML_C14N_1_1.
|
180
|
+
* [nodes]
|
181
|
+
* * *Type:* Array of XML::Node objects
|
182
|
+
* * *Default:* empty array
|
183
|
+
* XML::Nodes to include in the canonicalization process
|
184
|
+
* * For large lists of more than 256 valid namespaces, up to the first 256 valid entries will be used.
|
159
185
|
*/
|
160
|
-
|
186
|
+
#define C14N_NS_LIMIT 256
|
187
|
+
#define C14N_NODESET_LIMIT 256
|
188
|
+
|
189
|
+
static VALUE
|
190
|
+
rxml_document_canonicalize(int argc, VALUE *argv, VALUE self)
|
161
191
|
{
|
162
192
|
VALUE result = Qnil;
|
163
|
-
|
193
|
+
int length;
|
164
194
|
xmlDocPtr xdoc;
|
165
195
|
xmlChar *buffer = NULL;
|
166
|
-
|
196
|
+
VALUE option_hash = Qnil;
|
197
|
+
VALUE o_nodes = Qnil;
|
198
|
+
|
199
|
+
// :comments option
|
200
|
+
VALUE comments = Qfalse;
|
201
|
+
// :mode option
|
202
|
+
int c14n_mode = XML_C14N_1_0;
|
203
|
+
// :inclusive_ns_prefixes option (ARRAY)
|
204
|
+
|
205
|
+
xmlChar * inc_ns_prefixes_ptr[C14N_NS_LIMIT];
|
206
|
+
|
207
|
+
// :nodes option (ARRAY)
|
208
|
+
xmlNodePtr node_ptr_array[C14N_NODESET_LIMIT];
|
209
|
+
xmlNodeSet nodeset = {
|
210
|
+
0, C14N_NODESET_LIMIT, NULL
|
211
|
+
};
|
212
|
+
|
213
|
+
/* At least one NULL value must be defined in the array or the extension will
|
214
|
+
* segfault when using XML_C14N_EXCLUSIVE_1_0 mode.
|
215
|
+
* API docs: "list of inclusive namespace prefixes ended with a NULL"
|
216
|
+
*/
|
217
|
+
inc_ns_prefixes_ptr[0] = NULL;
|
218
|
+
|
219
|
+
rb_scan_args(argc, argv, "01", &option_hash);
|
220
|
+
// Do stuff if ruby hash passed as argument
|
221
|
+
if (!NIL_P(option_hash))
|
222
|
+
{
|
223
|
+
VALUE o_comments = Qnil;
|
224
|
+
VALUE o_mode = Qnil;
|
225
|
+
VALUE o_i_ns_prefixes = Qnil;
|
226
|
+
VALUE * list_in = NULL;
|
227
|
+
|
228
|
+
Check_Type(option_hash, T_HASH);
|
229
|
+
|
230
|
+
o_comments = rb_hash_aref(option_hash, ID2SYM(rb_intern("comments")));
|
231
|
+
comments = (RTEST(o_comments) ? 1 : 0);
|
232
|
+
|
233
|
+
o_mode = rb_hash_aref(option_hash, ID2SYM(rb_intern("mode")));
|
234
|
+
if (!NIL_P(o_mode))
|
235
|
+
{
|
236
|
+
Check_Type(o_mode, T_FIXNUM);
|
237
|
+
c14n_mode = NUM2INT(o_mode);
|
238
|
+
//TODO: clean this up
|
239
|
+
//if (c14n_mode > 2) { c14n_mode = 0; }
|
240
|
+
//mode_int = (NUM2INT(o_mode) > 2 ? 0 : NUM2INT(o_mode));
|
241
|
+
}
|
242
|
+
|
243
|
+
o_i_ns_prefixes = rb_hash_aref(option_hash, ID2SYM(rb_intern("inclusive_ns_prefixes")));
|
244
|
+
if (!NIL_P(o_i_ns_prefixes))
|
245
|
+
{
|
246
|
+
int i;
|
247
|
+
int p = 0; //pointer array index
|
248
|
+
VALUE *list_in = NULL;
|
249
|
+
int list_size = 0;
|
250
|
+
|
251
|
+
Check_Type(o_i_ns_prefixes, T_ARRAY);
|
252
|
+
list_in = RARRAY_PTR(o_i_ns_prefixes);
|
253
|
+
list_size = RARRAY_LEN(o_i_ns_prefixes);
|
254
|
+
|
255
|
+
if (list_size > 0)
|
256
|
+
{
|
257
|
+
for(i=0; i < list_size; ++i) {
|
258
|
+
if (p >= C14N_NS_LIMIT) { break; }
|
259
|
+
|
260
|
+
if (RTEST(list_in[i]))
|
261
|
+
{
|
262
|
+
if (TYPE(list_in[i]) == T_STRING)
|
263
|
+
{
|
264
|
+
inc_ns_prefixes_ptr[p] = (xmlChar *)StringValueCStr(list_in[i]);
|
265
|
+
p++;
|
266
|
+
}
|
267
|
+
}
|
268
|
+
}
|
269
|
+
}
|
270
|
+
|
271
|
+
// ensure p is not out of bound
|
272
|
+
p = (p >= C14N_NS_LIMIT ? (C14N_NS_LIMIT-1) : p);
|
273
|
+
|
274
|
+
// API docs: "list of inclusive namespace prefixes ended with a NULL"
|
275
|
+
// Set last element to NULL
|
276
|
+
inc_ns_prefixes_ptr[p] = NULL;
|
277
|
+
}
|
278
|
+
//o_ns_prefixes will free at end of block
|
279
|
+
|
280
|
+
o_nodes = rb_hash_aref(option_hash, ID2SYM(rb_intern("nodes")));
|
281
|
+
if (!NIL_P(o_nodes))
|
282
|
+
{
|
283
|
+
int i;
|
284
|
+
int p = 0; // index of pointer array
|
285
|
+
VALUE * list_in = NULL;
|
286
|
+
int node_list_size = 0;
|
287
|
+
|
288
|
+
if (CLASS_OF(o_nodes) == cXMLXPathObject)
|
289
|
+
{
|
290
|
+
o_nodes = rb_funcall(o_nodes, rb_intern("to_a"), 0);
|
291
|
+
}
|
292
|
+
else
|
293
|
+
{
|
294
|
+
Check_Type(o_nodes, T_ARRAY);
|
295
|
+
}
|
296
|
+
list_in = RARRAY_PTR(o_nodes);
|
297
|
+
node_list_size = RARRAY_LEN(o_nodes);
|
298
|
+
|
299
|
+
for (i=0; i < node_list_size; ++i)
|
300
|
+
{
|
301
|
+
if (p >= C14N_NODESET_LIMIT) { break; }
|
302
|
+
|
303
|
+
if (RTEST(list_in[i]))
|
304
|
+
{
|
305
|
+
xmlNodePtr node_ptr;
|
306
|
+
Data_Get_Struct(list_in[i], xmlNode, node_ptr);
|
307
|
+
node_ptr_array[p] = node_ptr;
|
308
|
+
p++;
|
309
|
+
}
|
310
|
+
}
|
311
|
+
|
312
|
+
// Need to set values in nodeset struct
|
313
|
+
nodeset.nodeNr = (node_list_size > C14N_NODESET_LIMIT ?
|
314
|
+
C14N_NODESET_LIMIT :
|
315
|
+
node_list_size);
|
316
|
+
nodeset.nodeTab = node_ptr_array;
|
317
|
+
}
|
318
|
+
}//option_hash
|
167
319
|
|
168
|
-
rb_scan_args(argc, argv, "01", &comments);
|
169
|
-
|
170
320
|
Data_Get_Struct(self, xmlDoc, xdoc);
|
171
|
-
length = xmlC14NDocDumpMemory(
|
172
|
-
|
173
|
-
|
321
|
+
length = xmlC14NDocDumpMemory(
|
322
|
+
xdoc,
|
323
|
+
(nodeset.nodeNr == 0 ? NULL : &nodeset),
|
324
|
+
c14n_mode,
|
325
|
+
&inc_ns_prefixes_ptr,
|
326
|
+
comments,
|
327
|
+
&buffer
|
328
|
+
);
|
174
329
|
|
175
330
|
if (buffer)
|
176
331
|
{
|
@@ -180,8 +335,8 @@ static VALUE rxml_document_canonicalize(int argc, VALUE *argv, VALUE self)
|
|
180
335
|
|
181
336
|
return result;
|
182
337
|
}
|
183
|
-
|
184
|
-
|
338
|
+
|
339
|
+
|
185
340
|
/*
|
186
341
|
* call-seq:
|
187
342
|
* document.compression -> num
|
@@ -356,7 +511,7 @@ static VALUE rxml_document_rb_encoding_get(VALUE self)
|
|
356
511
|
rbencoding = rxml_xml_encoding_to_rb_encoding(mXMLEncoding, xmlParseCharEncoding(xencoding));
|
357
512
|
return rb_enc_from_encoding(rbencoding);
|
358
513
|
}
|
359
|
-
#endif
|
514
|
+
#endif
|
360
515
|
|
361
516
|
/*
|
362
517
|
* call-seq:
|
@@ -615,7 +770,7 @@ static VALUE rxml_document_root_set(VALUE self, VALUE node)
|
|
615
770
|
*
|
616
771
|
* Saves a document to a file. You may provide an optional hash table
|
617
772
|
* to control how the string is generated. Valid options are:
|
618
|
-
*
|
773
|
+
*
|
619
774
|
* :indent - Specifies if the string should be indented. The default value
|
620
775
|
* is true. Note that indentation is only added if both :indent is
|
621
776
|
* true and XML.indent_tree_output is true. If :indent is set to false,
|
@@ -626,7 +781,7 @@ static VALUE rxml_document_root_set(VALUE self, VALUE node)
|
|
626
781
|
* #encoding. To override the orginal encoding, use one of the
|
627
782
|
* XML::Encoding encoding constants. */
|
628
783
|
static VALUE rxml_document_save(int argc, VALUE *argv, VALUE self)
|
629
|
-
{
|
784
|
+
{
|
630
785
|
VALUE options = Qnil;
|
631
786
|
VALUE filename = Qnil;
|
632
787
|
xmlDocPtr xdoc;
|
@@ -665,7 +820,7 @@ static VALUE rxml_document_save(int argc, VALUE *argv, VALUE self)
|
|
665
820
|
|
666
821
|
if (length == -1)
|
667
822
|
rxml_raise(&xmlLastError);
|
668
|
-
|
823
|
+
|
669
824
|
return (INT2NUM(length));
|
670
825
|
}
|
671
826
|
|
@@ -692,9 +847,9 @@ static VALUE rxml_document_standalone_q(VALUE self)
|
|
692
847
|
* document.to_s(:indent => true, :encoding => XML::Encoding::UTF_8) -> "string"
|
693
848
|
*
|
694
849
|
* Converts a document, and all of its children, to a string representation.
|
695
|
-
* You may provide an optional hash table to control how the string is
|
850
|
+
* You may provide an optional hash table to control how the string is
|
696
851
|
* generated. Valid options are:
|
697
|
-
*
|
852
|
+
*
|
698
853
|
* :indent - Specifies if the string should be indented. The default value
|
699
854
|
* is true. Note that indentation is only added if both :indent is
|
700
855
|
* true and XML.indent_tree_output is true. If :indent is set to false,
|
@@ -704,13 +859,13 @@ static VALUE rxml_document_standalone_q(VALUE self)
|
|
704
859
|
* defaults to XML::Encoding::UTF8. To change it, use one of the
|
705
860
|
* XML::Encoding encoding constants. */
|
706
861
|
static VALUE rxml_document_to_s(int argc, VALUE *argv, VALUE self)
|
707
|
-
{
|
862
|
+
{
|
708
863
|
VALUE result;
|
709
864
|
VALUE options = Qnil;
|
710
865
|
xmlDocPtr xdoc;
|
711
866
|
int indent = 1;
|
712
867
|
const char *xencoding = "UTF-8";
|
713
|
-
xmlChar *buffer;
|
868
|
+
xmlChar *buffer;
|
714
869
|
int length;
|
715
870
|
|
716
871
|
rb_scan_args(argc, argv, "01", &options);
|
@@ -826,10 +981,10 @@ static VALUE rxml_document_xinclude(VALUE self)
|
|
826
981
|
|
827
982
|
/*
|
828
983
|
* call-seq:
|
829
|
-
* document.order_elements!
|
830
|
-
*
|
984
|
+
* document.order_elements!
|
985
|
+
*
|
831
986
|
* Call this routine to speed up XPath computation on static documents.
|
832
|
-
* This stamps all the element nodes with the document order.
|
987
|
+
* This stamps all the element nodes with the document order.
|
833
988
|
*/
|
834
989
|
static VALUE rxml_document_order_elements(VALUE self)
|
835
990
|
{
|
@@ -841,7 +996,7 @@ static VALUE rxml_document_order_elements(VALUE self)
|
|
841
996
|
|
842
997
|
/*
|
843
998
|
* call-seq:
|
844
|
-
* document.validate_schema(schema)
|
999
|
+
* document.validate_schema(schema)
|
845
1000
|
*
|
846
1001
|
* Validate this document against the specified XML::Schema.
|
847
1002
|
* If the document is valid the method returns true. Otherwise an
|
@@ -874,7 +1029,7 @@ static VALUE rxml_document_validate_schema(VALUE self, VALUE schema)
|
|
874
1029
|
|
875
1030
|
/*
|
876
1031
|
* call-seq:
|
877
|
-
* document.validate_relaxng(relaxng)
|
1032
|
+
* document.validate_relaxng(relaxng)
|
878
1033
|
*
|
879
1034
|
* Validate this document against the specified XML::RelaxNG.
|
880
1035
|
* If the document is valid the method returns true. Otherwise an
|
@@ -941,6 +1096,13 @@ void rxml_init_document(void)
|
|
941
1096
|
cXMLDocument = rb_define_class_under(mXML, "Document", rb_cObject);
|
942
1097
|
rb_define_alloc_func(cXMLDocument, rxml_document_alloc);
|
943
1098
|
|
1099
|
+
/* Original C14N 1.0 spec */
|
1100
|
+
rb_define_const(cXMLDocument, "XML_C14N_1_0", INT2NUM(XML_C14N_1_0));
|
1101
|
+
/* Exclusive C14N 1.0 spec */
|
1102
|
+
rb_define_const(cXMLDocument, "XML_C14N_EXCLUSIVE_1_0", INT2NUM(XML_C14N_EXCLUSIVE_1_0));
|
1103
|
+
/* C14N 1.1 spec */
|
1104
|
+
rb_define_const(cXMLDocument, "XML_C14N_1_1", INT2NUM(XML_C14N_1_1));
|
1105
|
+
|
944
1106
|
rb_define_method(cXMLDocument, "initialize", rxml_document_initialize, -1);
|
945
1107
|
rb_define_method(cXMLDocument, "canonicalize", rxml_document_canonicalize, -1);
|
946
1108
|
rb_define_method(cXMLDocument, "child", rxml_document_child_get, 0);
|
@@ -164,27 +164,41 @@ VALUE rxml_encoding_to_rb_encoding(VALUE klass, VALUE encoding)
|
|
164
164
|
rb_encoding* rbencoding = rxml_xml_encoding_to_rb_encoding(klass, xmlEncoding);
|
165
165
|
return rb_enc_from_encoding(rbencoding);
|
166
166
|
}
|
167
|
-
#endif
|
168
|
-
|
169
167
|
|
170
|
-
|
168
|
+
rb_encoding* rxml_figure_encoding(const char* xencoding)
|
171
169
|
{
|
172
|
-
|
173
|
-
rb_encoding* rbencoding;
|
170
|
+
rb_encoding* result;
|
174
171
|
if (xencoding)
|
175
172
|
{
|
176
173
|
xmlCharEncoding xmlEncoding = xmlParseCharEncoding(xencoding);
|
177
|
-
|
174
|
+
result = rxml_xml_encoding_to_rb_encoding(mXMLEncoding, xmlEncoding);
|
178
175
|
}
|
179
176
|
else
|
180
177
|
{
|
181
|
-
|
178
|
+
result = rb_utf8_encoding();
|
182
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);
|
183
188
|
return rb_external_str_new_with_enc(xstr, strlen(xstr), rbencoding);
|
184
189
|
#endif
|
185
190
|
return rb_str_new2(xstr);
|
186
191
|
}
|
187
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
|
+
|
188
202
|
void rxml_init_encoding(void)
|
189
203
|
{
|
190
204
|
mXMLEncoding = rb_define_module_under(mXML, "Encoding");
|
@@ -9,6 +9,7 @@ void rxml_init_encoding();
|
|
9
9
|
|
10
10
|
// Ruby 1.8/1.9 encoding compatibility
|
11
11
|
VALUE rxml_new_cstr(const char* xstr, const char* xencoding);
|
12
|
+
VALUE rxml_new_cstr_len(const char* xstr, const int length, const char* xencoding);
|
12
13
|
|
13
14
|
#ifdef HAVE_RUBY_ENCODING_H
|
14
15
|
rb_encoding* rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding);
|
data/ext/libxml/ruby_xml_node.c
CHANGED
@@ -188,6 +188,43 @@ static VALUE rxml_node_new_comment(int argc, VALUE *argv, VALUE klass)
|
|
188
188
|
return rxml_node_wrap(xnode);
|
189
189
|
}
|
190
190
|
|
191
|
+
/*
|
192
|
+
* call-seq:
|
193
|
+
* XML::Node.new_pi(name, content = nil) -> XML::Node
|
194
|
+
*
|
195
|
+
* Create a new pi node, optionally setting
|
196
|
+
* the node's content.
|
197
|
+
*
|
198
|
+
*/
|
199
|
+
static VALUE rxml_node_new_pi(int argc, VALUE *argv, VALUE klass)
|
200
|
+
{
|
201
|
+
VALUE name = Qnil;
|
202
|
+
VALUE content = Qnil;
|
203
|
+
xmlNodePtr xnode;
|
204
|
+
|
205
|
+
rb_scan_args(argc, argv, "11", &name, &content);
|
206
|
+
|
207
|
+
if (NIL_P(name))
|
208
|
+
{
|
209
|
+
rb_raise(rb_eRuntimeError, "You must provide me with a name for a PI.");
|
210
|
+
}
|
211
|
+
name = rb_obj_as_string(name);
|
212
|
+
if (NIL_P(content))
|
213
|
+
{
|
214
|
+
xnode = xmlNewPI((xmlChar*) StringValuePtr(name), NULL);
|
215
|
+
}
|
216
|
+
else
|
217
|
+
{
|
218
|
+
content = rb_obj_as_string(content);
|
219
|
+
xnode = xmlNewPI((xmlChar*) StringValuePtr(name), (xmlChar*) StringValueCStr(content));
|
220
|
+
}
|
221
|
+
|
222
|
+
if (xnode == NULL)
|
223
|
+
rxml_raise(&xmlLastError);
|
224
|
+
|
225
|
+
return rxml_node_wrap(xnode);
|
226
|
+
}
|
227
|
+
|
191
228
|
/*
|
192
229
|
* call-seq:
|
193
230
|
* XML::Node.new_text(content) -> XML::Node
|
@@ -1342,6 +1379,7 @@ void rxml_init_node(void)
|
|
1342
1379
|
|
1343
1380
|
rb_define_singleton_method(cXMLNode, "new_cdata", rxml_node_new_cdata, -1);
|
1344
1381
|
rb_define_singleton_method(cXMLNode, "new_comment", rxml_node_new_comment, -1);
|
1382
|
+
rb_define_singleton_method(cXMLNode, "new_pi", rxml_node_new_pi, -1);
|
1345
1383
|
rb_define_singleton_method(cXMLNode, "new_text", rxml_node_new_text, 1);
|
1346
1384
|
|
1347
1385
|
/* Initialization */
|