nokogiri 1.14.5 → 1.15.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of nokogiri might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +9 -8
- data/dependencies.yml +6 -6
- data/ext/nokogiri/extconf.rb +66 -22
- data/ext/nokogiri/html4_document.c +1 -2
- data/ext/nokogiri/html4_element_description.c +19 -14
- data/ext/nokogiri/html4_sax_parser_context.c +10 -16
- data/ext/nokogiri/html4_sax_push_parser.c +2 -2
- data/ext/nokogiri/nokogiri.c +46 -24
- data/ext/nokogiri/nokogiri.h +13 -2
- data/ext/nokogiri/xml_attr.c +1 -1
- data/ext/nokogiri/xml_cdata.c +10 -2
- data/ext/nokogiri/xml_comment.c +1 -1
- data/ext/nokogiri/xml_document.c +102 -22
- data/ext/nokogiri/xml_document_fragment.c +1 -1
- data/ext/nokogiri/xml_dtd.c +1 -1
- data/ext/nokogiri/xml_element_content.c +32 -29
- data/ext/nokogiri/xml_element_decl.c +5 -5
- data/ext/nokogiri/xml_encoding_handler.c +12 -4
- data/ext/nokogiri/xml_entity_reference.c +1 -1
- data/ext/nokogiri/xml_namespace.c +11 -12
- data/ext/nokogiri/xml_node.c +7 -7
- data/ext/nokogiri/xml_node_set.c +125 -105
- data/ext/nokogiri/xml_processing_instruction.c +1 -1
- data/ext/nokogiri/xml_reader.c +37 -28
- data/ext/nokogiri/xml_relax_ng.c +65 -78
- data/ext/nokogiri/xml_sax_parser.c +24 -5
- data/ext/nokogiri/xml_sax_parser_context.c +46 -25
- data/ext/nokogiri/xml_sax_push_parser.c +29 -8
- data/ext/nokogiri/xml_schema.c +90 -116
- data/ext/nokogiri/xml_text.c +10 -2
- data/ext/nokogiri/xml_xpath_context.c +156 -83
- data/ext/nokogiri/xslt_stylesheet.c +103 -50
- data/gumbo-parser/src/error.c +8 -4
- data/gumbo-parser/src/foreign_attrs.c +13 -14
- data/gumbo-parser/src/foreign_attrs.gperf +1 -1
- data/gumbo-parser/src/parser.c +13 -0
- data/lib/nokogiri/css/xpath_visitor.rb +2 -2
- data/lib/nokogiri/extension.rb +1 -1
- data/lib/nokogiri/html4/document_fragment.rb +1 -1
- data/lib/nokogiri/html4/element_description_defaults.rb +1821 -353
- data/lib/nokogiri/html5/document_fragment.rb +1 -1
- data/lib/nokogiri/html5/node.rb +5 -0
- data/lib/nokogiri/html5.rb +5 -2
- data/lib/nokogiri/jruby/nokogiri_jars.rb +3 -3
- data/lib/nokogiri/version/constant.rb +1 -1
- data/lib/nokogiri/xml/attribute_decl.rb +4 -2
- data/lib/nokogiri/xml/document_fragment.rb +1 -1
- data/lib/nokogiri/xml/element_content.rb +10 -2
- data/lib/nokogiri/xml/element_decl.rb +4 -2
- data/lib/nokogiri/xml/entity_decl.rb +4 -2
- data/lib/nokogiri/xml/node/save_options.rb +8 -0
- data/lib/nokogiri/xml/node.rb +22 -13
- data/lib/nokogiri/xml/pp/node.rb +23 -12
- data/lib/nokogiri/xml/sax/document.rb +1 -1
- data/lib/nokogiri/xml/searchable.rb +18 -10
- data/lib/nokogiri/xslt.rb +73 -3
- data/lib/nokogiri.rb +12 -4
- data/lib/xsd/xmlparser/nokogiri.rb +1 -1
- data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
- data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
- data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
- data/ports/archives/libxml2-2.11.3.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
- metadata +9 -7
- data/patches/libxslt/0001-update-automake-files-for-arm64.patch +0 -3037
- data/ports/archives/libxml2-2.10.4.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.37.tar.xz +0 -0
data/ext/nokogiri/xml_node_set.c
CHANGED
@@ -39,8 +39,9 @@ ruby_object_get(xmlNodePtr c_node)
|
|
39
39
|
|
40
40
|
|
41
41
|
static void
|
42
|
-
|
42
|
+
xml_node_set_mark(void *data)
|
43
43
|
{
|
44
|
+
xmlNodeSetPtr node_set = data;
|
44
45
|
VALUE rb_node;
|
45
46
|
int jnode;
|
46
47
|
|
@@ -52,6 +53,37 @@ mark(xmlNodeSetPtr node_set)
|
|
52
53
|
}
|
53
54
|
}
|
54
55
|
|
56
|
+
static void
|
57
|
+
xml_node_set_deallocate(void *data)
|
58
|
+
{
|
59
|
+
xmlNodeSetPtr node_set = data;
|
60
|
+
/*
|
61
|
+
* For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the
|
62
|
+
* offending call to xmlXPathNodeSetFreeNs().
|
63
|
+
*/
|
64
|
+
if (node_set->nodeTab != NULL) {
|
65
|
+
xmlFree(node_set->nodeTab);
|
66
|
+
}
|
67
|
+
|
68
|
+
xmlFree(node_set);
|
69
|
+
}
|
70
|
+
|
71
|
+
|
72
|
+
static VALUE
|
73
|
+
xml_node_set_allocate(VALUE klass)
|
74
|
+
{
|
75
|
+
return noko_xml_node_set_wrap(xmlXPathNodeSetCreate(NULL), Qnil);
|
76
|
+
}
|
77
|
+
|
78
|
+
static const rb_data_type_t xml_node_set_type = {
|
79
|
+
.wrap_struct_name = "Nokogiri::XML::NodeSet",
|
80
|
+
.function = {
|
81
|
+
.dmark = xml_node_set_mark,
|
82
|
+
.dfree = xml_node_set_deallocate,
|
83
|
+
},
|
84
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
85
|
+
};
|
86
|
+
|
55
87
|
static void
|
56
88
|
xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val)
|
57
89
|
{
|
@@ -81,28 +113,6 @@ xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val)
|
|
81
113
|
}
|
82
114
|
|
83
115
|
|
84
|
-
static void
|
85
|
-
deallocate(xmlNodeSetPtr node_set)
|
86
|
-
{
|
87
|
-
/*
|
88
|
-
* For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the
|
89
|
-
* offending call to xmlXPathNodeSetFreeNs().
|
90
|
-
*/
|
91
|
-
if (node_set->nodeTab != NULL) {
|
92
|
-
xmlFree(node_set->nodeTab);
|
93
|
-
}
|
94
|
-
|
95
|
-
xmlFree(node_set);
|
96
|
-
}
|
97
|
-
|
98
|
-
|
99
|
-
static VALUE
|
100
|
-
allocate(VALUE klass)
|
101
|
-
{
|
102
|
-
return noko_xml_node_set_wrap(xmlXPathNodeSetCreate(NULL), Qnil);
|
103
|
-
}
|
104
|
-
|
105
|
-
|
106
116
|
/*
|
107
117
|
* call-seq:
|
108
118
|
* dup
|
@@ -111,16 +121,16 @@ allocate(VALUE klass)
|
|
111
121
|
* duplicated (similar to how Array and other Enumerable classes work).
|
112
122
|
*/
|
113
123
|
static VALUE
|
114
|
-
duplicate(VALUE
|
124
|
+
duplicate(VALUE rb_self)
|
115
125
|
{
|
116
|
-
xmlNodeSetPtr
|
126
|
+
xmlNodeSetPtr c_self;
|
117
127
|
xmlNodeSetPtr dupl;
|
118
128
|
|
119
|
-
|
129
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
120
130
|
|
121
|
-
dupl = xmlXPathNodeSetMerge(NULL,
|
131
|
+
dupl = xmlXPathNodeSetMerge(NULL, c_self);
|
122
132
|
|
123
|
-
return noko_xml_node_set_wrap(dupl, rb_iv_get(
|
133
|
+
return noko_xml_node_set_wrap(dupl, rb_iv_get(rb_self, "@document"));
|
124
134
|
}
|
125
135
|
|
126
136
|
/*
|
@@ -130,13 +140,13 @@ duplicate(VALUE self)
|
|
130
140
|
* Get the length of the node set
|
131
141
|
*/
|
132
142
|
static VALUE
|
133
|
-
length(VALUE
|
143
|
+
length(VALUE rb_self)
|
134
144
|
{
|
135
|
-
xmlNodeSetPtr
|
145
|
+
xmlNodeSetPtr c_self;
|
136
146
|
|
137
|
-
|
147
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
138
148
|
|
139
|
-
return
|
149
|
+
return c_self ? INT2NUM(c_self->nodeNr) : INT2NUM(0);
|
140
150
|
}
|
141
151
|
|
142
152
|
/*
|
@@ -146,19 +156,19 @@ length(VALUE self)
|
|
146
156
|
* Append +node+ to the NodeSet.
|
147
157
|
*/
|
148
158
|
static VALUE
|
149
|
-
push(VALUE
|
159
|
+
push(VALUE rb_self, VALUE rb_node)
|
150
160
|
{
|
151
|
-
xmlNodeSetPtr
|
161
|
+
xmlNodeSetPtr c_self;
|
152
162
|
xmlNodePtr node;
|
153
163
|
|
154
164
|
Check_Node_Set_Node_Type(rb_node);
|
155
165
|
|
156
|
-
|
166
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
157
167
|
Noko_Node_Get_Struct(rb_node, xmlNode, node);
|
158
168
|
|
159
|
-
xmlXPathNodeSetAdd(
|
169
|
+
xmlXPathNodeSetAdd(c_self, node);
|
160
170
|
|
161
|
-
return
|
171
|
+
return rb_self;
|
162
172
|
}
|
163
173
|
|
164
174
|
/*
|
@@ -169,18 +179,18 @@ push(VALUE self, VALUE rb_node)
|
|
169
179
|
* if found, otherwise returns nil.
|
170
180
|
*/
|
171
181
|
static VALUE
|
172
|
-
delete (VALUE
|
182
|
+
delete (VALUE rb_self, VALUE rb_node)
|
173
183
|
{
|
174
|
-
xmlNodeSetPtr
|
184
|
+
xmlNodeSetPtr c_self;
|
175
185
|
xmlNodePtr node;
|
176
186
|
|
177
187
|
Check_Node_Set_Node_Type(rb_node);
|
178
188
|
|
179
|
-
|
189
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
180
190
|
Noko_Node_Get_Struct(rb_node, xmlNode, node);
|
181
191
|
|
182
|
-
if (xmlXPathNodeSetContains(
|
183
|
-
xpath_node_set_del(
|
192
|
+
if (xmlXPathNodeSetContains(c_self, node)) {
|
193
|
+
xpath_node_set_del(c_self, node);
|
184
194
|
return rb_node;
|
185
195
|
}
|
186
196
|
return Qnil ;
|
@@ -194,20 +204,20 @@ delete (VALUE self, VALUE rb_node)
|
|
194
204
|
* Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.
|
195
205
|
*/
|
196
206
|
static VALUE
|
197
|
-
intersection(VALUE
|
207
|
+
intersection(VALUE rb_self, VALUE rb_other)
|
198
208
|
{
|
199
|
-
xmlNodeSetPtr
|
209
|
+
xmlNodeSetPtr c_self, c_other ;
|
200
210
|
xmlNodeSetPtr intersection;
|
201
211
|
|
202
212
|
if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
|
203
213
|
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
204
214
|
}
|
205
215
|
|
206
|
-
|
207
|
-
|
216
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
217
|
+
TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
|
208
218
|
|
209
|
-
intersection = xmlXPathIntersection(
|
210
|
-
return noko_xml_node_set_wrap(intersection, rb_iv_get(
|
219
|
+
intersection = xmlXPathIntersection(c_self, c_other);
|
220
|
+
return noko_xml_node_set_wrap(intersection, rb_iv_get(rb_self, "@document"));
|
211
221
|
}
|
212
222
|
|
213
223
|
|
@@ -218,17 +228,17 @@ intersection(VALUE self, VALUE rb_other)
|
|
218
228
|
* Returns true if any member of node set equals +node+.
|
219
229
|
*/
|
220
230
|
static VALUE
|
221
|
-
include_eh(VALUE
|
231
|
+
include_eh(VALUE rb_self, VALUE rb_node)
|
222
232
|
{
|
223
|
-
xmlNodeSetPtr
|
233
|
+
xmlNodeSetPtr c_self;
|
224
234
|
xmlNodePtr node;
|
225
235
|
|
226
236
|
Check_Node_Set_Node_Type(rb_node);
|
227
237
|
|
228
|
-
|
238
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
229
239
|
Noko_Node_Get_Struct(rb_node, xmlNode, node);
|
230
240
|
|
231
|
-
return (xmlXPathNodeSetContains(
|
241
|
+
return (xmlXPathNodeSetContains(c_self, node) ? Qtrue : Qfalse);
|
232
242
|
}
|
233
243
|
|
234
244
|
|
@@ -240,22 +250,22 @@ include_eh(VALUE self, VALUE rb_node)
|
|
240
250
|
* set.
|
241
251
|
*/
|
242
252
|
static VALUE
|
243
|
-
rb_xml_node_set_union(VALUE
|
253
|
+
rb_xml_node_set_union(VALUE rb_self, VALUE rb_other)
|
244
254
|
{
|
245
|
-
xmlNodeSetPtr
|
255
|
+
xmlNodeSetPtr c_self, c_other;
|
246
256
|
xmlNodeSetPtr c_new_node_set;
|
247
257
|
|
248
258
|
if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
|
249
259
|
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
250
260
|
}
|
251
261
|
|
252
|
-
|
253
|
-
|
262
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
263
|
+
TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
|
254
264
|
|
255
|
-
c_new_node_set = xmlXPathNodeSetMerge(NULL,
|
265
|
+
c_new_node_set = xmlXPathNodeSetMerge(NULL, c_self);
|
256
266
|
c_new_node_set = xmlXPathNodeSetMerge(c_new_node_set, c_other);
|
257
267
|
|
258
|
-
return noko_xml_node_set_wrap(c_new_node_set, rb_iv_get(
|
268
|
+
return noko_xml_node_set_wrap(c_new_node_set, rb_iv_get(rb_self, "@document"));
|
259
269
|
}
|
260
270
|
|
261
271
|
/*
|
@@ -266,9 +276,9 @@ rb_xml_node_set_union(VALUE rb_node_set, VALUE rb_other)
|
|
266
276
|
* each item that also appears in +node_set+
|
267
277
|
*/
|
268
278
|
static VALUE
|
269
|
-
minus(VALUE
|
279
|
+
minus(VALUE rb_self, VALUE rb_other)
|
270
280
|
{
|
271
|
-
xmlNodeSetPtr
|
281
|
+
xmlNodeSetPtr c_self, c_other;
|
272
282
|
xmlNodeSetPtr new;
|
273
283
|
int j ;
|
274
284
|
|
@@ -276,55 +286,55 @@ minus(VALUE self, VALUE rb_other)
|
|
276
286
|
rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
|
277
287
|
}
|
278
288
|
|
279
|
-
|
280
|
-
|
289
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
290
|
+
TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
|
281
291
|
|
282
|
-
new = xmlXPathNodeSetMerge(NULL,
|
283
|
-
for (j = 0 ; j <
|
284
|
-
xpath_node_set_del(new,
|
292
|
+
new = xmlXPathNodeSetMerge(NULL, c_self);
|
293
|
+
for (j = 0 ; j < c_other->nodeNr ; ++j) {
|
294
|
+
xpath_node_set_del(new, c_other->nodeTab[j]);
|
285
295
|
}
|
286
296
|
|
287
|
-
return noko_xml_node_set_wrap(new, rb_iv_get(
|
297
|
+
return noko_xml_node_set_wrap(new, rb_iv_get(rb_self, "@document"));
|
288
298
|
}
|
289
299
|
|
290
300
|
|
291
301
|
static VALUE
|
292
|
-
index_at(VALUE
|
302
|
+
index_at(VALUE rb_self, long offset)
|
293
303
|
{
|
294
|
-
xmlNodeSetPtr
|
304
|
+
xmlNodeSetPtr c_self;
|
295
305
|
|
296
|
-
|
306
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
297
307
|
|
298
|
-
if (offset >=
|
308
|
+
if (offset >= c_self->nodeNr || abs((int)offset) > c_self->nodeNr) {
|
299
309
|
return Qnil;
|
300
310
|
}
|
301
311
|
|
302
|
-
if (offset < 0) { offset +=
|
312
|
+
if (offset < 0) { offset += c_self->nodeNr ; }
|
303
313
|
|
304
|
-
return noko_xml_node_wrap_node_set_result(
|
314
|
+
return noko_xml_node_wrap_node_set_result(c_self->nodeTab[offset], rb_self);
|
305
315
|
}
|
306
316
|
|
307
317
|
static VALUE
|
308
|
-
subseq(VALUE
|
318
|
+
subseq(VALUE rb_self, long beg, long len)
|
309
319
|
{
|
310
320
|
long j;
|
311
|
-
xmlNodeSetPtr
|
321
|
+
xmlNodeSetPtr c_self;
|
312
322
|
xmlNodeSetPtr new_set ;
|
313
323
|
|
314
|
-
|
324
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
315
325
|
|
316
|
-
if (beg >
|
326
|
+
if (beg > c_self->nodeNr) { return Qnil ; }
|
317
327
|
if (beg < 0 || len < 0) { return Qnil ; }
|
318
328
|
|
319
|
-
if ((beg + len) >
|
320
|
-
len =
|
329
|
+
if ((beg + len) > c_self->nodeNr) {
|
330
|
+
len = c_self->nodeNr - beg ;
|
321
331
|
}
|
322
332
|
|
323
333
|
new_set = xmlXPathNodeSetCreate(NULL);
|
324
334
|
for (j = beg ; j < beg + len ; ++j) {
|
325
|
-
xmlXPathNodeSetAddUnique(new_set,
|
335
|
+
xmlXPathNodeSetAddUnique(new_set, c_self->nodeTab[j]);
|
326
336
|
}
|
327
|
-
return noko_xml_node_set_wrap(new_set, rb_iv_get(
|
337
|
+
return noko_xml_node_set_wrap(new_set, rb_iv_get(rb_self, "@document"));
|
328
338
|
}
|
329
339
|
|
330
340
|
/*
|
@@ -343,21 +353,21 @@ subseq(VALUE self, long beg, long len)
|
|
343
353
|
* nil if the +index+ (or +start+) are out of range.
|
344
354
|
*/
|
345
355
|
static VALUE
|
346
|
-
slice(int argc, VALUE *argv, VALUE
|
356
|
+
slice(int argc, VALUE *argv, VALUE rb_self)
|
347
357
|
{
|
348
358
|
VALUE arg ;
|
349
359
|
long beg, len ;
|
350
|
-
xmlNodeSetPtr
|
360
|
+
xmlNodeSetPtr c_self;
|
351
361
|
|
352
|
-
|
362
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
353
363
|
|
354
364
|
if (argc == 2) {
|
355
365
|
beg = NUM2LONG(argv[0]);
|
356
366
|
len = NUM2LONG(argv[1]);
|
357
367
|
if (beg < 0) {
|
358
|
-
beg +=
|
368
|
+
beg += c_self->nodeNr ;
|
359
369
|
}
|
360
|
-
return subseq(
|
370
|
+
return subseq(rb_self, beg, len);
|
361
371
|
}
|
362
372
|
|
363
373
|
if (argc != 1) {
|
@@ -366,20 +376,20 @@ slice(int argc, VALUE *argv, VALUE self)
|
|
366
376
|
arg = argv[0];
|
367
377
|
|
368
378
|
if (FIXNUM_P(arg)) {
|
369
|
-
return index_at(
|
379
|
+
return index_at(rb_self, FIX2LONG(arg));
|
370
380
|
}
|
371
381
|
|
372
382
|
/* if arg is Range */
|
373
|
-
switch (rb_range_beg_len(arg, &beg, &len, (long)
|
383
|
+
switch (rb_range_beg_len(arg, &beg, &len, (long)c_self->nodeNr, 0)) {
|
374
384
|
case Qfalse:
|
375
385
|
break;
|
376
386
|
case Qnil:
|
377
387
|
return Qnil;
|
378
388
|
default:
|
379
|
-
return subseq(
|
389
|
+
return subseq(rb_self, beg, len);
|
380
390
|
}
|
381
391
|
|
382
|
-
return index_at(
|
392
|
+
return index_at(rb_self, NUM2LONG(arg));
|
383
393
|
}
|
384
394
|
|
385
395
|
|
@@ -390,17 +400,17 @@ slice(int argc, VALUE *argv, VALUE self)
|
|
390
400
|
* Return this list as an Array
|
391
401
|
*/
|
392
402
|
static VALUE
|
393
|
-
to_array(VALUE
|
403
|
+
to_array(VALUE rb_self)
|
394
404
|
{
|
395
|
-
xmlNodeSetPtr
|
405
|
+
xmlNodeSetPtr c_self ;
|
396
406
|
VALUE list;
|
397
407
|
int i;
|
398
408
|
|
399
|
-
|
409
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
400
410
|
|
401
|
-
list = rb_ary_new2(
|
402
|
-
for (i = 0; i <
|
403
|
-
VALUE elt = noko_xml_node_wrap_node_set_result(
|
411
|
+
list = rb_ary_new2(c_self->nodeNr);
|
412
|
+
for (i = 0; i < c_self->nodeNr; i++) {
|
413
|
+
VALUE elt = noko_xml_node_wrap_node_set_result(c_self->nodeTab[i], rb_self);
|
404
414
|
rb_ary_push(list, elt);
|
405
415
|
}
|
406
416
|
|
@@ -414,25 +424,25 @@ to_array(VALUE self)
|
|
414
424
|
* Unlink this NodeSet and all Node objects it contains from their current context.
|
415
425
|
*/
|
416
426
|
static VALUE
|
417
|
-
unlink_nodeset(VALUE
|
427
|
+
unlink_nodeset(VALUE rb_self)
|
418
428
|
{
|
419
|
-
xmlNodeSetPtr
|
429
|
+
xmlNodeSetPtr c_self;
|
420
430
|
int j, nodeNr ;
|
421
431
|
|
422
|
-
|
432
|
+
TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
|
423
433
|
|
424
|
-
nodeNr =
|
434
|
+
nodeNr = c_self->nodeNr ;
|
425
435
|
for (j = 0 ; j < nodeNr ; j++) {
|
426
|
-
if (! NOKOGIRI_NAMESPACE_EH(
|
436
|
+
if (! NOKOGIRI_NAMESPACE_EH(c_self->nodeTab[j])) {
|
427
437
|
VALUE node ;
|
428
438
|
xmlNodePtr node_ptr;
|
429
|
-
node = noko_xml_node_wrap(Qnil,
|
439
|
+
node = noko_xml_node_wrap(Qnil, c_self->nodeTab[j]);
|
430
440
|
rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */
|
431
441
|
Noko_Node_Get_Struct(node, xmlNode, node_ptr);
|
432
|
-
|
442
|
+
c_self->nodeTab[j] = node_ptr ;
|
433
443
|
}
|
434
444
|
}
|
435
|
-
return
|
445
|
+
return rb_self ;
|
436
446
|
}
|
437
447
|
|
438
448
|
|
@@ -446,7 +456,7 @@ noko_xml_node_set_wrap(xmlNodeSetPtr c_node_set, VALUE document)
|
|
446
456
|
c_node_set = xmlXPathNodeSetCreate(NULL);
|
447
457
|
}
|
448
458
|
|
449
|
-
rb_node_set =
|
459
|
+
rb_node_set = TypedData_Wrap_Struct(cNokogiriXmlNodeSet, &xml_node_set_type, c_node_set);
|
450
460
|
|
451
461
|
if (!NIL_P(document)) {
|
452
462
|
rb_iv_set(rb_node_set, "@document", document);
|
@@ -461,6 +471,7 @@ noko_xml_node_set_wrap(xmlNodeSetPtr c_node_set, VALUE document)
|
|
461
471
|
return rb_node_set ;
|
462
472
|
}
|
463
473
|
|
474
|
+
|
464
475
|
VALUE
|
465
476
|
noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set)
|
466
477
|
{
|
@@ -472,12 +483,21 @@ noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set)
|
|
472
483
|
}
|
473
484
|
|
474
485
|
|
486
|
+
xmlNodeSetPtr
|
487
|
+
noko_xml_node_set_unwrap(VALUE rb_node_set)
|
488
|
+
{
|
489
|
+
xmlNodeSetPtr c_node_set;
|
490
|
+
TypedData_Get_Struct(rb_node_set, xmlNodeSet, &xml_node_set_type, c_node_set);
|
491
|
+
return c_node_set;
|
492
|
+
}
|
493
|
+
|
494
|
+
|
475
495
|
void
|
476
496
|
noko_init_xml_node_set(void)
|
477
497
|
{
|
478
498
|
cNokogiriXmlNodeSet = rb_define_class_under(mNokogiriXml, "NodeSet", rb_cObject);
|
479
499
|
|
480
|
-
rb_define_alloc_func(cNokogiriXmlNodeSet,
|
500
|
+
rb_define_alloc_func(cNokogiriXmlNodeSet, xml_node_set_allocate);
|
481
501
|
|
482
502
|
rb_define_method(cNokogiriXmlNodeSet, "length", length, 0);
|
483
503
|
rb_define_method(cNokogiriXmlNodeSet, "[]", slice, -1);
|