nokogiri 1.14.5 → 1.16.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +19 -15
- data/README.md +4 -1
- data/dependencies.yml +9 -8
- data/ext/nokogiri/extconf.rb +69 -26
- 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 +3 -3
- data/ext/nokogiri/nokogiri.c +46 -24
- data/ext/nokogiri/nokogiri.h +23 -5
- data/ext/nokogiri/test_global_handlers.c +1 -1
- data/ext/nokogiri/xml_attr.c +1 -1
- data/ext/nokogiri/xml_cdata.c +30 -17
- data/ext/nokogiri/xml_comment.c +1 -1
- data/ext/nokogiri/xml_document.c +113 -25
- 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 -16
- data/ext/nokogiri/xml_node.c +13 -16
- data/ext/nokogiri/xml_node_set.c +125 -105
- data/ext/nokogiri/xml_processing_instruction.c +1 -1
- data/ext/nokogiri/xml_reader.c +61 -74
- data/ext/nokogiri/xml_relax_ng.c +66 -79
- data/ext/nokogiri/xml_sax_parser.c +24 -5
- data/ext/nokogiri/xml_sax_parser_context.c +50 -25
- data/ext/nokogiri/xml_sax_push_parser.c +30 -9
- data/ext/nokogiri/xml_schema.c +94 -115
- data/ext/nokogiri/xml_syntax_error.c +3 -3
- data/ext/nokogiri/xml_text.c +26 -13
- data/ext/nokogiri/xml_xpath_context.c +153 -83
- data/ext/nokogiri/xslt_stylesheet.c +111 -53
- data/gumbo-parser/Makefile +18 -0
- 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 +21 -5
- data/gumbo-parser/src/tokenizer.c +1 -0
- data/lib/nokogiri/css/parser_extras.rb +1 -1
- data/lib/nokogiri/css/xpath_visitor.rb +3 -23
- data/lib/nokogiri/extension.rb +1 -1
- data/lib/nokogiri/html4/document.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/html4/encoding_reader.rb +1 -1
- data/lib/nokogiri/html5/document_fragment.rb +1 -1
- data/lib/nokogiri/html5/node.rb +5 -0
- data/lib/nokogiri/html5.rb +0 -63
- data/lib/nokogiri/version/constant.rb +1 -1
- data/lib/nokogiri/version/info.rb +6 -5
- data/lib/nokogiri/xml/attr.rb +2 -2
- data/lib/nokogiri/xml/attribute_decl.rb +4 -2
- data/lib/nokogiri/xml/document.rb +4 -5
- data/lib/nokogiri/xml/document_fragment.rb +3 -3
- 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/namespace.rb +1 -2
- data/lib/nokogiri/xml/node/save_options.rb +8 -0
- data/lib/nokogiri/xml/node.rb +53 -37
- data/lib/nokogiri/xml/node_set.rb +3 -3
- data/lib/nokogiri/xml/pp/node.rb +23 -12
- data/lib/nokogiri/xml/reader.rb +10 -9
- data/lib/nokogiri/xml/sax/document.rb +1 -1
- data/lib/nokogiri/xml/searchable.rb +21 -13
- data/lib/nokogiri/xml/syntax_error.rb +1 -1
- data/lib/nokogiri/xml.rb +1 -1
- data/lib/nokogiri/xslt/stylesheet.rb +29 -7
- data/lib/nokogiri/xslt.rb +74 -4
- data/lib/nokogiri.rb +13 -5
- 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.12.7.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.39.tar.xz +0 -0
- metadata +14 -12
- 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
@@ -12,11 +12,20 @@ static const xmlChar *NOKOGIRI_BUILTIN_PREFIX = (const xmlChar *)"nokogiri-built
|
|
12
12
|
static const xmlChar *NOKOGIRI_BUILTIN_URI = (const xmlChar *)"https://www.nokogiri.org/default_ns/ruby/builtins";
|
13
13
|
|
14
14
|
static void
|
15
|
-
xml_xpath_context_deallocate(
|
15
|
+
xml_xpath_context_deallocate(void *data)
|
16
16
|
{
|
17
|
-
|
17
|
+
xmlXPathContextPtr c_context = data;
|
18
|
+
xmlXPathFreeContext(c_context);
|
18
19
|
}
|
19
20
|
|
21
|
+
static const rb_data_type_t xml_xpath_context_type = {
|
22
|
+
.wrap_struct_name = "Nokogiri::XML::XPathContext",
|
23
|
+
.function = {
|
24
|
+
.dfree = xml_xpath_context_deallocate,
|
25
|
+
},
|
26
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
27
|
+
};
|
28
|
+
|
20
29
|
/* find a CSS class in an HTML element's `class` attribute */
|
21
30
|
static const xmlChar *
|
22
31
|
builtin_css_class(const xmlChar *str, const xmlChar *val)
|
@@ -87,7 +96,8 @@ xpath_builtin_css_class(xmlXPathParserContextPtr ctxt, int nargs)
|
|
87
96
|
}
|
88
97
|
|
89
98
|
|
90
|
-
/* xmlXPathFunction to select nodes whose local name matches, for HTML5 CSS queries that should
|
99
|
+
/* xmlXPathFunction to select nodes whose local name matches, for HTML5 CSS queries that should
|
100
|
+
* ignore namespaces */
|
91
101
|
static void
|
92
102
|
xpath_builtin_local_name_is(xmlXPathParserContextPtr ctxt, int nargs)
|
93
103
|
{
|
@@ -100,7 +110,10 @@ xpath_builtin_local_name_is(xmlXPathParserContextPtr ctxt, int nargs)
|
|
100
110
|
CHECK_TYPE(XPATH_STRING);
|
101
111
|
element_name = valuePop(ctxt);
|
102
112
|
|
103
|
-
valuePush(
|
113
|
+
valuePush(
|
114
|
+
ctxt,
|
115
|
+
xmlXPathNewBoolean(xmlStrEqual(ctxt->context->node->name, element_name->stringval))
|
116
|
+
);
|
104
117
|
|
105
118
|
xmlXPathFreeObject(element_name);
|
106
119
|
}
|
@@ -108,44 +121,61 @@ xpath_builtin_local_name_is(xmlXPathParserContextPtr ctxt, int nargs)
|
|
108
121
|
|
109
122
|
/*
|
110
123
|
* call-seq:
|
111
|
-
*
|
124
|
+
* register_ns(prefix, uri) → Nokogiri::XML::XPathContext
|
125
|
+
*
|
126
|
+
* Register the namespace with +prefix+ and +uri+ for use in future queries.
|
112
127
|
*
|
113
|
-
*
|
128
|
+
* [Returns] +self+
|
114
129
|
*/
|
115
130
|
static VALUE
|
116
|
-
rb_xml_xpath_context_register_ns(VALUE
|
131
|
+
rb_xml_xpath_context_register_ns(VALUE rb_context, VALUE prefix, VALUE uri)
|
117
132
|
{
|
118
|
-
xmlXPathContextPtr
|
119
|
-
|
133
|
+
xmlXPathContextPtr c_context;
|
134
|
+
|
135
|
+
TypedData_Get_Struct(
|
136
|
+
rb_context,
|
137
|
+
xmlXPathContext,
|
138
|
+
&xml_xpath_context_type,
|
139
|
+
c_context
|
140
|
+
);
|
120
141
|
|
121
|
-
xmlXPathRegisterNs(
|
142
|
+
xmlXPathRegisterNs(c_context,
|
122
143
|
(const xmlChar *)StringValueCStr(prefix),
|
123
144
|
(const xmlChar *)StringValueCStr(uri)
|
124
145
|
);
|
125
|
-
return
|
146
|
+
return rb_context;
|
126
147
|
}
|
127
148
|
|
128
149
|
/*
|
129
150
|
* call-seq:
|
130
|
-
*
|
151
|
+
* register_variable(name, value) → Nokogiri::XML::XPathContext
|
131
152
|
*
|
132
|
-
* Register the variable +name+ with +value
|
153
|
+
* Register the variable +name+ with +value+ for use in future queries.
|
154
|
+
*
|
155
|
+
* [Returns] +self+
|
133
156
|
*/
|
134
157
|
static VALUE
|
135
|
-
rb_xml_xpath_context_register_variable(VALUE
|
158
|
+
rb_xml_xpath_context_register_variable(VALUE rb_context, VALUE name, VALUE value)
|
136
159
|
{
|
137
|
-
xmlXPathContextPtr
|
160
|
+
xmlXPathContextPtr c_context;
|
138
161
|
xmlXPathObjectPtr xmlValue;
|
139
|
-
|
162
|
+
|
163
|
+
TypedData_Get_Struct(
|
164
|
+
rb_context,
|
165
|
+
xmlXPathContext,
|
166
|
+
&xml_xpath_context_type,
|
167
|
+
c_context
|
168
|
+
);
|
140
169
|
|
141
170
|
xmlValue = xmlXPathNewCString(StringValueCStr(value));
|
142
171
|
|
143
|
-
xmlXPathRegisterVariable(
|
144
|
-
|
145
|
-
|
146
|
-
|
172
|
+
xmlXPathRegisterVariable(
|
173
|
+
c_context,
|
174
|
+
(const xmlChar *)StringValueCStr(name),
|
175
|
+
xmlValue
|
176
|
+
);
|
147
177
|
|
148
|
-
return
|
178
|
+
return rb_context;
|
149
179
|
}
|
150
180
|
|
151
181
|
|
@@ -154,12 +184,12 @@ rb_xml_xpath_context_register_variable(VALUE self, VALUE name, VALUE value)
|
|
154
184
|
* returns Qundef if no conversion was possible.
|
155
185
|
*/
|
156
186
|
static VALUE
|
157
|
-
xpath2ruby(xmlXPathObjectPtr c_xpath_object, xmlXPathContextPtr
|
187
|
+
xpath2ruby(xmlXPathObjectPtr c_xpath_object, xmlXPathContextPtr c_context)
|
158
188
|
{
|
159
189
|
VALUE rb_retval;
|
160
190
|
|
161
|
-
assert(
|
162
|
-
assert(DOC_RUBY_OBJECT_TEST(
|
191
|
+
assert(c_context->doc);
|
192
|
+
assert(DOC_RUBY_OBJECT_TEST(c_context->doc));
|
163
193
|
|
164
194
|
switch (c_xpath_object->type) {
|
165
195
|
case XPATH_STRING:
|
@@ -168,8 +198,10 @@ xpath2ruby(xmlXPathObjectPtr c_xpath_object, xmlXPathContextPtr ctx)
|
|
168
198
|
return rb_retval;
|
169
199
|
|
170
200
|
case XPATH_NODESET:
|
171
|
-
return noko_xml_node_set_wrap(
|
172
|
-
|
201
|
+
return noko_xml_node_set_wrap(
|
202
|
+
c_xpath_object->nodesetval,
|
203
|
+
DOC_RUBY_OBJECT(c_context->doc)
|
204
|
+
);
|
173
205
|
|
174
206
|
case XPATH_NUMBER:
|
175
207
|
return rb_float_new(c_xpath_object->floatval);
|
@@ -184,7 +216,7 @@ xpath2ruby(xmlXPathObjectPtr c_xpath_object, xmlXPathContextPtr ctx)
|
|
184
216
|
|
185
217
|
void
|
186
218
|
Nokogiri_marshal_xpath_funcall_and_return_values(
|
187
|
-
xmlXPathParserContextPtr
|
219
|
+
xmlXPathParserContextPtr ctxt,
|
188
220
|
int argc,
|
189
221
|
VALUE rb_xpath_handler,
|
190
222
|
const char *method_name
|
@@ -196,8 +228,8 @@ Nokogiri_marshal_xpath_funcall_and_return_values(
|
|
196
228
|
xmlNodeSetPtr c_node_set = NULL;
|
197
229
|
xmlXPathObjectPtr c_xpath_object;
|
198
230
|
|
199
|
-
assert(
|
200
|
-
assert(DOC_RUBY_OBJECT_TEST(
|
231
|
+
assert(ctxt->context->doc);
|
232
|
+
assert(DOC_RUBY_OBJECT_TEST(ctxt->context->doc));
|
201
233
|
|
202
234
|
argv = (VALUE *)ruby_xcalloc((size_t)argc, sizeof(VALUE));
|
203
235
|
for (int j = 0 ; j < argc ; ++j) {
|
@@ -205,15 +237,20 @@ Nokogiri_marshal_xpath_funcall_and_return_values(
|
|
205
237
|
}
|
206
238
|
|
207
239
|
for (int j = argc - 1 ; j >= 0 ; --j) {
|
208
|
-
c_xpath_object = valuePop(
|
209
|
-
argv[j] = xpath2ruby(c_xpath_object,
|
240
|
+
c_xpath_object = valuePop(ctxt);
|
241
|
+
argv[j] = xpath2ruby(c_xpath_object, ctxt->context);
|
210
242
|
if (argv[j] == Qundef) {
|
211
243
|
argv[j] = NOKOGIRI_STR_NEW2(xmlXPathCastToString(c_xpath_object));
|
212
244
|
}
|
213
245
|
xmlXPathFreeNodeSetList(c_xpath_object);
|
214
246
|
}
|
215
247
|
|
216
|
-
rb_retval = rb_funcall2(
|
248
|
+
rb_retval = rb_funcall2(
|
249
|
+
rb_xpath_handler,
|
250
|
+
rb_intern((const char *)method_name),
|
251
|
+
argc,
|
252
|
+
argv
|
253
|
+
);
|
217
254
|
|
218
255
|
for (int j = 0 ; j < argc ; ++j) {
|
219
256
|
rb_gc_unregister_address(&argv[j]);
|
@@ -224,31 +261,31 @@ Nokogiri_marshal_xpath_funcall_and_return_values(
|
|
224
261
|
case T_FLOAT:
|
225
262
|
case T_BIGNUM:
|
226
263
|
case T_FIXNUM:
|
227
|
-
xmlXPathReturnNumber(
|
264
|
+
xmlXPathReturnNumber(ctxt, NUM2DBL(rb_retval));
|
228
265
|
break;
|
229
266
|
case T_STRING:
|
230
|
-
xmlXPathReturnString(
|
267
|
+
xmlXPathReturnString(ctxt, xmlCharStrdup(StringValueCStr(rb_retval)));
|
231
268
|
break;
|
232
269
|
case T_TRUE:
|
233
|
-
xmlXPathReturnTrue(
|
270
|
+
xmlXPathReturnTrue(ctxt);
|
234
271
|
break;
|
235
272
|
case T_FALSE:
|
236
|
-
xmlXPathReturnFalse(
|
273
|
+
xmlXPathReturnFalse(ctxt);
|
237
274
|
break;
|
238
275
|
case T_NIL:
|
239
276
|
break;
|
240
277
|
case T_ARRAY: {
|
241
|
-
VALUE construct_args[2] = { DOC_RUBY_OBJECT(
|
278
|
+
VALUE construct_args[2] = { DOC_RUBY_OBJECT(ctxt->context->doc), rb_retval };
|
242
279
|
rb_node_set = rb_class_new_instance(2, construct_args, cNokogiriXmlNodeSet);
|
243
|
-
|
244
|
-
xmlXPathReturnNodeSet(
|
280
|
+
c_node_set = noko_xml_node_set_unwrap(rb_node_set);
|
281
|
+
xmlXPathReturnNodeSet(ctxt, xmlXPathNodeSetMerge(NULL, c_node_set));
|
245
282
|
}
|
246
283
|
break;
|
247
284
|
case T_DATA:
|
248
285
|
if (rb_obj_is_kind_of(rb_retval, cNokogiriXmlNodeSet)) {
|
249
|
-
|
286
|
+
c_node_set = noko_xml_node_set_unwrap(rb_retval);
|
250
287
|
/* Copy the node set, otherwise it will get GC'd. */
|
251
|
-
xmlXPathReturnNodeSet(
|
288
|
+
xmlXPathReturnNodeSet(ctxt, xmlXPathNodeSetMerge(NULL, c_node_set));
|
252
289
|
break;
|
253
290
|
}
|
254
291
|
default:
|
@@ -257,27 +294,36 @@ Nokogiri_marshal_xpath_funcall_and_return_values(
|
|
257
294
|
}
|
258
295
|
|
259
296
|
static void
|
260
|
-
method_caller(xmlXPathParserContextPtr
|
297
|
+
method_caller(xmlXPathParserContextPtr ctxt, int argc)
|
261
298
|
{
|
262
299
|
VALUE rb_xpath_handler = Qnil;
|
263
300
|
const char *method_name = NULL ;
|
264
301
|
|
265
|
-
assert(
|
266
|
-
assert(
|
267
|
-
assert(
|
268
|
-
assert(
|
302
|
+
assert(ctxt);
|
303
|
+
assert(ctxt->context);
|
304
|
+
assert(ctxt->context->userData);
|
305
|
+
assert(ctxt->context->function);
|
269
306
|
|
270
|
-
rb_xpath_handler = (VALUE)(
|
271
|
-
method_name = (const char *)(
|
307
|
+
rb_xpath_handler = (VALUE)(ctxt->context->userData);
|
308
|
+
method_name = (const char *)(ctxt->context->function);
|
272
309
|
|
273
|
-
Nokogiri_marshal_xpath_funcall_and_return_values(
|
310
|
+
Nokogiri_marshal_xpath_funcall_and_return_values(
|
311
|
+
ctxt,
|
312
|
+
argc,
|
313
|
+
rb_xpath_handler,
|
314
|
+
method_name
|
315
|
+
);
|
274
316
|
}
|
275
317
|
|
276
318
|
static xmlXPathFunction
|
277
|
-
handler_lookup(void *
|
319
|
+
handler_lookup(void *data, const xmlChar *c_name, const xmlChar *c_ns_uri)
|
278
320
|
{
|
279
|
-
VALUE
|
280
|
-
if (rb_respond_to(
|
321
|
+
VALUE rb_handler = (VALUE)data;
|
322
|
+
if (rb_respond_to(rb_handler, rb_intern((const char *)c_name))) {
|
323
|
+
if (c_ns_uri == NULL) {
|
324
|
+
NOKO_WARN_DEPRECATION("A custom XPath or CSS handler function named '%s' is being invoked without a namespace. Please update your query to reference this function as 'nokogiri:%s'. Invoking custom handler functions without a namespace is deprecated and will become an error in Nokogiri v1.17.0.",
|
325
|
+
c_name, c_name); // deprecated in v1.15.0, remove in v1.17.0
|
326
|
+
}
|
281
327
|
return method_caller;
|
282
328
|
}
|
283
329
|
|
@@ -286,9 +332,9 @@ handler_lookup(void *ctx, const xmlChar *c_name, const xmlChar *c_ns_uri)
|
|
286
332
|
|
287
333
|
PRINTFLIKE_DECL(2, 3)
|
288
334
|
static void
|
289
|
-
generic_exception_pusher(void *
|
335
|
+
generic_exception_pusher(void *data, const char *msg, ...)
|
290
336
|
{
|
291
|
-
VALUE rb_errors = (VALUE)
|
337
|
+
VALUE rb_errors = (VALUE)data;
|
292
338
|
VALUE rb_message;
|
293
339
|
VALUE rb_exception;
|
294
340
|
|
@@ -311,21 +357,29 @@ generic_exception_pusher(void *ctx, const char *msg, ...)
|
|
311
357
|
|
312
358
|
/*
|
313
359
|
* call-seq:
|
314
|
-
*
|
360
|
+
* evaluate(search_path, handler = nil) → Object
|
361
|
+
*
|
362
|
+
* Evaluate the +search_path+ query.
|
315
363
|
*
|
316
|
-
*
|
364
|
+
* [Returns] an object of the appropriate type for the query, which could be +NodeSet+, a +String+,
|
365
|
+
* a +Float+, or a boolean.
|
317
366
|
*/
|
318
367
|
static VALUE
|
319
|
-
rb_xml_xpath_context_evaluate(int argc, VALUE *argv, VALUE
|
368
|
+
rb_xml_xpath_context_evaluate(int argc, VALUE *argv, VALUE rb_context)
|
320
369
|
{
|
321
370
|
VALUE search_path, xpath_handler;
|
322
371
|
VALUE retval = Qnil;
|
323
|
-
xmlXPathContextPtr
|
372
|
+
xmlXPathContextPtr c_context;
|
324
373
|
xmlXPathObjectPtr xpath;
|
325
374
|
xmlChar *query;
|
326
375
|
VALUE errors = rb_ary_new();
|
327
376
|
|
328
|
-
|
377
|
+
TypedData_Get_Struct(
|
378
|
+
rb_context,
|
379
|
+
xmlXPathContext,
|
380
|
+
&xml_xpath_context_type,
|
381
|
+
c_context
|
382
|
+
);
|
329
383
|
|
330
384
|
if (rb_scan_args(argc, argv, "11", &search_path, &xpath_handler) == 1) {
|
331
385
|
xpath_handler = Qnil;
|
@@ -335,14 +389,18 @@ rb_xml_xpath_context_evaluate(int argc, VALUE *argv, VALUE self)
|
|
335
389
|
|
336
390
|
if (Qnil != xpath_handler) {
|
337
391
|
/* FIXME: not sure if this is the correct place to shove private data. */
|
338
|
-
|
339
|
-
xmlXPathRegisterFuncLookup(
|
392
|
+
c_context->userData = (void *)xpath_handler;
|
393
|
+
xmlXPathRegisterFuncLookup(
|
394
|
+
c_context,
|
395
|
+
handler_lookup,
|
396
|
+
(void *)xpath_handler
|
397
|
+
);
|
340
398
|
}
|
341
399
|
|
342
400
|
xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
|
343
401
|
xmlSetGenericErrorFunc((void *)errors, generic_exception_pusher);
|
344
402
|
|
345
|
-
xpath = xmlXPathEvalExpression(query,
|
403
|
+
xpath = xmlXPathEvalExpression(query, c_context);
|
346
404
|
|
347
405
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
348
406
|
xmlSetGenericErrorFunc(NULL, NULL);
|
@@ -351,9 +409,9 @@ rb_xml_xpath_context_evaluate(int argc, VALUE *argv, VALUE self)
|
|
351
409
|
rb_exc_raise(rb_ary_entry(errors, 0));
|
352
410
|
}
|
353
411
|
|
354
|
-
retval = xpath2ruby(xpath,
|
412
|
+
retval = xpath2ruby(xpath, c_context);
|
355
413
|
if (retval == Qundef) {
|
356
|
-
retval = noko_xml_node_set_wrap(NULL, DOC_RUBY_OBJECT(
|
414
|
+
retval = noko_xml_node_set_wrap(NULL, DOC_RUBY_OBJECT(c_context->doc));
|
357
415
|
}
|
358
416
|
|
359
417
|
xmlXPathFreeNodeSetList(xpath);
|
@@ -363,43 +421,55 @@ rb_xml_xpath_context_evaluate(int argc, VALUE *argv, VALUE self)
|
|
363
421
|
|
364
422
|
/*
|
365
423
|
* call-seq:
|
366
|
-
*
|
424
|
+
* new(node)
|
367
425
|
*
|
368
|
-
* Create a new XPathContext with +node+ as the
|
426
|
+
* Create a new XPathContext with +node+ as the context node.
|
369
427
|
*/
|
370
428
|
static VALUE
|
371
|
-
rb_xml_xpath_context_new(VALUE klass, VALUE
|
429
|
+
rb_xml_xpath_context_new(VALUE klass, VALUE rb_node)
|
372
430
|
{
|
373
431
|
xmlNodePtr node;
|
374
|
-
xmlXPathContextPtr
|
375
|
-
VALUE
|
432
|
+
xmlXPathContextPtr c_context;
|
433
|
+
VALUE rb_context;
|
376
434
|
|
377
|
-
Noko_Node_Get_Struct(
|
435
|
+
Noko_Node_Get_Struct(rb_node, xmlNode, node);
|
378
436
|
|
379
437
|
#if LIBXML_VERSION < 21000
|
380
438
|
/* deprecated in 40483d0 */
|
381
439
|
xmlXPathInit();
|
382
440
|
#endif
|
383
441
|
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
xmlXPathRegisterNs(
|
388
|
-
xmlXPathRegisterNs(
|
389
|
-
xmlXPathRegisterFuncNS(
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
442
|
+
c_context = xmlXPathNewContext(node->doc);
|
443
|
+
c_context->node = node;
|
444
|
+
|
445
|
+
xmlXPathRegisterNs(c_context, NOKOGIRI_PREFIX, NOKOGIRI_URI);
|
446
|
+
xmlXPathRegisterNs(c_context, NOKOGIRI_BUILTIN_PREFIX, NOKOGIRI_BUILTIN_URI);
|
447
|
+
xmlXPathRegisterFuncNS(
|
448
|
+
c_context,
|
449
|
+
(const xmlChar *)"css-class",
|
450
|
+
NOKOGIRI_BUILTIN_URI,
|
451
|
+
xpath_builtin_css_class
|
452
|
+
);
|
453
|
+
xmlXPathRegisterFuncNS(
|
454
|
+
c_context,
|
455
|
+
(const xmlChar *)"local-name-is",
|
456
|
+
NOKOGIRI_BUILTIN_URI,
|
457
|
+
xpath_builtin_local_name_is
|
458
|
+
);
|
459
|
+
|
460
|
+
rb_context = TypedData_Wrap_Struct(
|
461
|
+
klass,
|
462
|
+
&xml_xpath_context_type,
|
463
|
+
c_context
|
464
|
+
);
|
465
|
+
return rb_context;
|
396
466
|
}
|
397
467
|
|
398
468
|
void
|
399
469
|
noko_init_xml_xpath_context(void)
|
400
470
|
{
|
401
471
|
/*
|
402
|
-
* XPathContext is the entry point for searching a Document by using XPath.
|
472
|
+
* XPathContext is the entry point for searching a +Document+ by using XPath.
|
403
473
|
*/
|
404
474
|
cNokogiriXmlXpathContext = rb_define_class_under(mNokogiriXml, "XPathContext", rb_cObject);
|
405
475
|
|