nokogiri 1.10.3 → 1.12.5
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 +3 -0
- data/LICENSE-DEPENDENCIES.md +1173 -884
- data/LICENSE.md +1 -1
- data/README.md +176 -96
- data/dependencies.yml +28 -26
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +716 -414
- data/ext/nokogiri/gumbo.c +584 -0
- data/ext/nokogiri/html4_document.c +166 -0
- data/ext/nokogiri/html4_element_description.c +294 -0
- data/ext/nokogiri/html4_entity_lookup.c +37 -0
- data/ext/nokogiri/html4_sax_parser_context.c +120 -0
- data/ext/nokogiri/html4_sax_push_parser.c +95 -0
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +228 -91
- data/ext/nokogiri/nokogiri.h +191 -89
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +15 -15
- data/ext/nokogiri/xml_attribute_decl.c +18 -18
- data/ext/nokogiri/xml_cdata.c +13 -18
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +267 -195
- data/ext/nokogiri/xml_document_fragment.c +13 -15
- data/ext/nokogiri/xml_dtd.c +54 -48
- data/ext/nokogiri/xml_element_content.c +31 -26
- data/ext/nokogiri/xml_element_decl.c +22 -22
- data/ext/nokogiri/xml_encoding_handler.c +28 -17
- data/ext/nokogiri/xml_entity_decl.c +32 -30
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +60 -51
- data/ext/nokogiri/xml_node.c +493 -407
- data/ext/nokogiri/xml_node_set.c +174 -162
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +197 -172
- data/ext/nokogiri/xml_relax_ng.c +52 -28
- data/ext/nokogiri/xml_sax_parser.c +112 -112
- data/ext/nokogiri/xml_sax_parser_context.c +105 -86
- data/ext/nokogiri/xml_sax_push_parser.c +36 -27
- data/ext/nokogiri/xml_schema.c +112 -33
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +13 -17
- data/ext/nokogiri/xml_xpath_context.c +158 -73
- data/ext/nokogiri/xslt_stylesheet.c +158 -164
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +101 -0
- data/gumbo-parser/THANKS +27 -0
- data/gumbo-parser/src/Makefile +34 -0
- data/gumbo-parser/src/README.md +41 -0
- data/gumbo-parser/src/ascii.c +75 -0
- data/gumbo-parser/src/ascii.h +115 -0
- data/gumbo-parser/src/attribute.c +42 -0
- data/gumbo-parser/src/attribute.h +17 -0
- data/gumbo-parser/src/char_ref.c +22225 -0
- data/gumbo-parser/src/char_ref.h +29 -0
- data/gumbo-parser/src/char_ref.rl +2154 -0
- data/gumbo-parser/src/error.c +626 -0
- data/gumbo-parser/src/error.h +148 -0
- data/gumbo-parser/src/foreign_attrs.c +104 -0
- data/gumbo-parser/src/foreign_attrs.gperf +27 -0
- data/gumbo-parser/src/gumbo.h +943 -0
- data/gumbo-parser/src/insertion_mode.h +33 -0
- data/gumbo-parser/src/macros.h +91 -0
- data/gumbo-parser/src/parser.c +4886 -0
- data/gumbo-parser/src/parser.h +41 -0
- data/gumbo-parser/src/replacement.h +33 -0
- data/gumbo-parser/src/string_buffer.c +103 -0
- data/gumbo-parser/src/string_buffer.h +68 -0
- data/gumbo-parser/src/string_piece.c +48 -0
- data/gumbo-parser/src/svg_attrs.c +174 -0
- data/gumbo-parser/src/svg_attrs.gperf +77 -0
- data/gumbo-parser/src/svg_tags.c +137 -0
- data/gumbo-parser/src/svg_tags.gperf +55 -0
- data/gumbo-parser/src/tag.c +222 -0
- data/gumbo-parser/src/tag_lookup.c +382 -0
- data/gumbo-parser/src/tag_lookup.gperf +169 -0
- data/gumbo-parser/src/tag_lookup.h +13 -0
- data/gumbo-parser/src/token_buffer.c +79 -0
- data/gumbo-parser/src/token_buffer.h +71 -0
- data/gumbo-parser/src/token_type.h +17 -0
- data/gumbo-parser/src/tokenizer.c +3463 -0
- data/gumbo-parser/src/tokenizer.h +112 -0
- data/gumbo-parser/src/tokenizer_states.h +339 -0
- data/gumbo-parser/src/utf8.c +245 -0
- data/gumbo-parser/src/utf8.h +164 -0
- data/gumbo-parser/src/util.c +68 -0
- data/gumbo-parser/src/util.h +30 -0
- data/gumbo-parser/src/vector.c +111 -0
- data/gumbo-parser/src/vector.h +45 -0
- data/lib/nokogiri/css/node.rb +1 -0
- data/lib/nokogiri/css/parser.rb +64 -63
- data/lib/nokogiri/css/parser.y +3 -3
- data/lib/nokogiri/css/parser_extras.rb +39 -36
- data/lib/nokogiri/css/syntax_error.rb +2 -1
- data/lib/nokogiri/css/tokenizer.rb +105 -103
- data/lib/nokogiri/css/xpath_visitor.rb +73 -43
- data/lib/nokogiri/css.rb +15 -14
- data/lib/nokogiri/decorators/slop.rb +1 -0
- data/lib/nokogiri/extension.rb +31 -0
- data/lib/nokogiri/gumbo.rb +14 -0
- data/lib/nokogiri/html.rb +32 -27
- data/lib/nokogiri/{html → html4}/builder.rb +3 -2
- data/lib/nokogiri/{html → html4}/document.rb +17 -30
- data/lib/nokogiri/{html → html4}/document_fragment.rb +18 -17
- data/lib/nokogiri/{html → html4}/element_description.rb +2 -1
- data/lib/nokogiri/{html → html4}/element_description_defaults.rb +2 -1
- data/lib/nokogiri/{html → html4}/entity_lookup.rb +2 -1
- data/lib/nokogiri/{html → html4}/sax/parser.rb +12 -14
- data/lib/nokogiri/html4/sax/parser_context.rb +19 -0
- data/lib/nokogiri/{html → html4}/sax/push_parser.rb +6 -5
- data/lib/nokogiri/html4.rb +40 -0
- data/lib/nokogiri/html5/document.rb +74 -0
- data/lib/nokogiri/html5/document_fragment.rb +80 -0
- data/lib/nokogiri/html5/node.rb +93 -0
- data/lib/nokogiri/html5.rb +473 -0
- data/lib/nokogiri/jruby/dependencies.rb +20 -0
- data/lib/nokogiri/syntax_error.rb +1 -0
- data/lib/nokogiri/version/constant.rb +5 -0
- data/lib/nokogiri/version/info.rb +215 -0
- data/lib/nokogiri/version.rb +3 -109
- data/lib/nokogiri/xml/attr.rb +1 -0
- data/lib/nokogiri/xml/attribute_decl.rb +1 -0
- data/lib/nokogiri/xml/builder.rb +74 -32
- data/lib/nokogiri/xml/cdata.rb +1 -0
- data/lib/nokogiri/xml/character_data.rb +1 -0
- data/lib/nokogiri/xml/document.rb +138 -41
- data/lib/nokogiri/xml/document_fragment.rb +5 -6
- data/lib/nokogiri/xml/dtd.rb +1 -0
- data/lib/nokogiri/xml/element_content.rb +1 -0
- data/lib/nokogiri/xml/element_decl.rb +1 -0
- data/lib/nokogiri/xml/entity_decl.rb +1 -0
- data/lib/nokogiri/xml/entity_reference.rb +1 -0
- data/lib/nokogiri/xml/namespace.rb +1 -0
- data/lib/nokogiri/xml/node/save_options.rb +2 -1
- data/lib/nokogiri/xml/node.rb +629 -293
- data/lib/nokogiri/xml/node_set.rb +1 -0
- data/lib/nokogiri/xml/notation.rb +1 -0
- data/lib/nokogiri/xml/parse_options.rb +12 -3
- data/lib/nokogiri/xml/pp/character_data.rb +1 -0
- data/lib/nokogiri/xml/pp/node.rb +1 -0
- data/lib/nokogiri/xml/pp.rb +3 -2
- data/lib/nokogiri/xml/processing_instruction.rb +1 -0
- data/lib/nokogiri/xml/reader.rb +9 -12
- data/lib/nokogiri/xml/relax_ng.rb +7 -2
- data/lib/nokogiri/xml/sax/document.rb +25 -30
- data/lib/nokogiri/xml/sax/parser.rb +1 -0
- data/lib/nokogiri/xml/sax/parser_context.rb +1 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +1 -0
- data/lib/nokogiri/xml/sax.rb +5 -4
- data/lib/nokogiri/xml/schema.rb +13 -4
- data/lib/nokogiri/xml/searchable.rb +25 -16
- data/lib/nokogiri/xml/syntax_error.rb +1 -0
- data/lib/nokogiri/xml/text.rb +1 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +2 -1
- data/lib/nokogiri/xml/xpath.rb +4 -5
- data/lib/nokogiri/xml/xpath_context.rb +1 -0
- data/lib/nokogiri/xml.rb +36 -36
- data/lib/nokogiri/xslt/stylesheet.rb +2 -1
- data/lib/nokogiri/xslt.rb +17 -16
- data/lib/nokogiri.rb +32 -51
- data/lib/xsd/xmlparser/nokogiri.rb +1 -0
- data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
- data/patches/libxml2/{0003-Update-entities-to-remove-handling-of-ssi.patch → 0002-Update-entities-to-remove-handling-of-ssi.patch} +0 -0
- data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
- data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
- data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
- data/patches/libxml2/0006-update-automake-files-for-arm64.patch +2511 -0
- data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +31 -0
- data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
- data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +19 -0
- data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
- metadata +151 -153
- data/ext/nokogiri/html_document.c +0 -170
- data/ext/nokogiri/html_document.h +0 -10
- data/ext/nokogiri/html_element_description.c +0 -279
- data/ext/nokogiri/html_element_description.h +0 -10
- data/ext/nokogiri/html_entity_lookup.c +0 -32
- data/ext/nokogiri/html_entity_lookup.h +0 -8
- data/ext/nokogiri/html_sax_parser_context.c +0 -116
- data/ext/nokogiri/html_sax_parser_context.h +0 -11
- data/ext/nokogiri/html_sax_push_parser.c +0 -87
- data/ext/nokogiri/html_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_attr.h +0 -9
- data/ext/nokogiri/xml_attribute_decl.h +0 -9
- data/ext/nokogiri/xml_cdata.h +0 -9
- data/ext/nokogiri/xml_comment.h +0 -9
- data/ext/nokogiri/xml_document.h +0 -23
- data/ext/nokogiri/xml_document_fragment.h +0 -10
- data/ext/nokogiri/xml_dtd.h +0 -10
- data/ext/nokogiri/xml_element_content.h +0 -10
- data/ext/nokogiri/xml_element_decl.h +0 -9
- data/ext/nokogiri/xml_encoding_handler.h +0 -8
- data/ext/nokogiri/xml_entity_decl.h +0 -10
- data/ext/nokogiri/xml_entity_reference.h +0 -9
- data/ext/nokogiri/xml_io.c +0 -61
- data/ext/nokogiri/xml_io.h +0 -11
- data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
- data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
- data/ext/nokogiri/xml_namespace.h +0 -14
- data/ext/nokogiri/xml_node.h +0 -13
- data/ext/nokogiri/xml_node_set.h +0 -12
- data/ext/nokogiri/xml_processing_instruction.h +0 -9
- data/ext/nokogiri/xml_reader.h +0 -10
- data/ext/nokogiri/xml_relax_ng.h +0 -9
- data/ext/nokogiri/xml_sax_parser.h +0 -39
- data/ext/nokogiri/xml_sax_parser_context.h +0 -10
- data/ext/nokogiri/xml_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_schema.h +0 -9
- data/ext/nokogiri/xml_syntax_error.h +0 -13
- data/ext/nokogiri/xml_text.h +0 -9
- data/ext/nokogiri/xml_xpath_context.h +0 -10
- data/ext/nokogiri/xslt_stylesheet.h +0 -14
- data/lib/nokogiri/html/sax/parser_context.rb +0 -16
- data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
- data/patches/libxslt/0001-Fix-security-framework-bypass.patch +0 -120
- data/ports/archives/libxml2-2.9.9.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.33.tar.gz +0 -0
@@ -1,29 +1,107 @@
|
|
1
|
-
#include <
|
1
|
+
#include <nokogiri.h>
|
2
2
|
|
3
|
-
|
3
|
+
VALUE cNokogiriXmlXpathContext;
|
4
|
+
|
5
|
+
/*
|
6
|
+
* these constants have matching declarations in
|
7
|
+
* ext/java/nokogiri/internals/NokogiriNamespaceContext.java
|
8
|
+
*/
|
9
|
+
static const xmlChar *NOKOGIRI_BUILTIN_PREFIX = (const xmlChar *)"nokogiri-builtin";
|
10
|
+
static const xmlChar *NOKOGIRI_BUILTIN_URI = (const xmlChar *)"https://www.nokogiri.org/default_ns/ruby/builtins";
|
4
11
|
|
5
|
-
static void
|
12
|
+
static void
|
13
|
+
deallocate(xmlXPathContextPtr ctx)
|
6
14
|
{
|
7
15
|
NOKOGIRI_DEBUG_START(ctx);
|
8
16
|
xmlXPathFreeContext(ctx);
|
9
17
|
NOKOGIRI_DEBUG_END(ctx);
|
10
18
|
}
|
11
19
|
|
20
|
+
/* find a CSS class in an HTML element's `class` attribute */
|
21
|
+
static const xmlChar *
|
22
|
+
builtin_css_class(const xmlChar *str, const xmlChar *val)
|
23
|
+
{
|
24
|
+
int val_len;
|
25
|
+
|
26
|
+
if (str == NULL) { return (NULL); }
|
27
|
+
if (val == NULL) { return (NULL); }
|
28
|
+
|
29
|
+
val_len = xmlStrlen(val);
|
30
|
+
if (val_len == 0) { return (str); }
|
31
|
+
|
32
|
+
while (*str != 0) {
|
33
|
+
if ((*str == *val) && !xmlStrncmp(str, val, val_len)) {
|
34
|
+
const xmlChar *next_byte = str + val_len;
|
35
|
+
|
36
|
+
/* only match if the next byte is whitespace or end of string */
|
37
|
+
if ((*next_byte == 0) || (IS_BLANK_CH(*next_byte))) {
|
38
|
+
return ((const xmlChar *)str);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
/* advance str to whitespace */
|
43
|
+
while ((*str != 0) && !IS_BLANK_CH(*str)) {
|
44
|
+
str++;
|
45
|
+
}
|
46
|
+
|
47
|
+
/* advance str to start of next word or end of string */
|
48
|
+
while ((*str != 0) && IS_BLANK_CH(*str)) {
|
49
|
+
str++;
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
return (NULL);
|
54
|
+
}
|
55
|
+
|
56
|
+
/* xmlXPathFunction to wrap builtin_css_class() */
|
57
|
+
static void
|
58
|
+
xpath_builtin_css_class(xmlXPathParserContextPtr ctxt, int nargs)
|
59
|
+
{
|
60
|
+
xmlXPathObjectPtr hay, needle;
|
61
|
+
|
62
|
+
CHECK_ARITY(2);
|
63
|
+
|
64
|
+
CAST_TO_STRING;
|
65
|
+
needle = valuePop(ctxt);
|
66
|
+
if ((needle == NULL) || (needle->type != XPATH_STRING)) {
|
67
|
+
xmlXPathFreeObject(needle);
|
68
|
+
XP_ERROR(XPATH_INVALID_TYPE);
|
69
|
+
}
|
70
|
+
|
71
|
+
CAST_TO_STRING;
|
72
|
+
hay = valuePop(ctxt);
|
73
|
+
if ((hay == NULL) || (hay->type != XPATH_STRING)) {
|
74
|
+
xmlXPathFreeObject(hay);
|
75
|
+
xmlXPathFreeObject(needle);
|
76
|
+
XP_ERROR(XPATH_INVALID_TYPE);
|
77
|
+
}
|
78
|
+
|
79
|
+
if (builtin_css_class(hay->stringval, needle->stringval)) {
|
80
|
+
valuePush(ctxt, xmlXPathNewBoolean(1));
|
81
|
+
} else {
|
82
|
+
valuePush(ctxt, xmlXPathNewBoolean(0));
|
83
|
+
}
|
84
|
+
|
85
|
+
xmlXPathFreeObject(hay);
|
86
|
+
xmlXPathFreeObject(needle);
|
87
|
+
}
|
88
|
+
|
12
89
|
/*
|
13
90
|
* call-seq:
|
14
91
|
* register_ns(prefix, uri)
|
15
92
|
*
|
16
93
|
* Register the namespace with +prefix+ and +uri+.
|
17
94
|
*/
|
18
|
-
static VALUE
|
95
|
+
static VALUE
|
96
|
+
register_ns(VALUE self, VALUE prefix, VALUE uri)
|
19
97
|
{
|
20
98
|
xmlXPathContextPtr ctx;
|
21
99
|
Data_Get_Struct(self, xmlXPathContext, ctx);
|
22
100
|
|
23
|
-
xmlXPathRegisterNs(
|
24
|
-
|
25
|
-
|
26
|
-
|
101
|
+
xmlXPathRegisterNs(ctx,
|
102
|
+
(const xmlChar *)StringValueCStr(prefix),
|
103
|
+
(const xmlChar *)StringValueCStr(uri)
|
104
|
+
);
|
27
105
|
return self;
|
28
106
|
}
|
29
107
|
|
@@ -33,23 +111,26 @@ static VALUE register_ns(VALUE self, VALUE prefix, VALUE uri)
|
|
33
111
|
*
|
34
112
|
* Register the variable +name+ with +value+.
|
35
113
|
*/
|
36
|
-
static VALUE
|
114
|
+
static VALUE
|
115
|
+
register_variable(VALUE self, VALUE name, VALUE value)
|
37
116
|
{
|
38
|
-
|
39
|
-
|
40
|
-
|
117
|
+
xmlXPathContextPtr ctx;
|
118
|
+
xmlXPathObjectPtr xmlValue;
|
119
|
+
Data_Get_Struct(self, xmlXPathContext, ctx);
|
41
120
|
|
42
|
-
|
121
|
+
xmlValue = xmlXPathNewCString(StringValueCStr(value));
|
43
122
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
123
|
+
xmlXPathRegisterVariable(ctx,
|
124
|
+
(const xmlChar *)StringValueCStr(name),
|
125
|
+
xmlValue
|
126
|
+
);
|
48
127
|
|
49
|
-
|
128
|
+
return self;
|
50
129
|
}
|
51
130
|
|
52
|
-
void
|
131
|
+
void
|
132
|
+
Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr ctx, int nargs, VALUE handler,
|
133
|
+
const char *function_name)
|
53
134
|
{
|
54
135
|
int i;
|
55
136
|
VALUE result, doc;
|
@@ -72,7 +153,7 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c
|
|
72
153
|
i = nargs - 1;
|
73
154
|
do {
|
74
155
|
obj = valuePop(ctx);
|
75
|
-
switch(obj->type) {
|
156
|
+
switch (obj->type) {
|
76
157
|
case XPATH_STRING:
|
77
158
|
argv[i] = NOKOGIRI_STR_NEW2(obj->stringval);
|
78
159
|
break;
|
@@ -83,23 +164,23 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c
|
|
83
164
|
argv[i] = rb_float_new(obj->floatval);
|
84
165
|
break;
|
85
166
|
case XPATH_NODESET:
|
86
|
-
argv[i] =
|
167
|
+
argv[i] = noko_xml_node_set_wrap(obj->nodesetval, doc);
|
87
168
|
break;
|
88
169
|
default:
|
89
170
|
argv[i] = NOKOGIRI_STR_NEW2(xmlXPathCastToString(obj));
|
90
171
|
}
|
91
172
|
xmlXPathFreeNodeSetList(obj);
|
92
|
-
} while(i-- > 0);
|
173
|
+
} while (i-- > 0);
|
93
174
|
}
|
94
175
|
|
95
|
-
result = rb_funcall2(handler, rb_intern((const char*)function_name), nargs, argv);
|
176
|
+
result = rb_funcall2(handler, rb_intern((const char *)function_name), nargs, argv);
|
96
177
|
|
97
178
|
for (i = 0 ; i < nargs ; ++i) {
|
98
179
|
rb_gc_unregister_address(&argv[i]);
|
99
180
|
}
|
100
181
|
free(argv);
|
101
182
|
|
102
|
-
switch(TYPE(result)) {
|
183
|
+
switch (TYPE(result)) {
|
103
184
|
case T_FLOAT:
|
104
185
|
case T_BIGNUM:
|
105
186
|
case T_FIXNUM:
|
@@ -107,8 +188,8 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c
|
|
107
188
|
break;
|
108
189
|
case T_STRING:
|
109
190
|
xmlXPathReturnString(
|
110
|
-
|
111
|
-
|
191
|
+
ctx,
|
192
|
+
xmlCharStrdup(StringValueCStr(result))
|
112
193
|
);
|
113
194
|
break;
|
114
195
|
case T_TRUE:
|
@@ -119,18 +200,17 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c
|
|
119
200
|
break;
|
120
201
|
case T_NIL:
|
121
202
|
break;
|
122
|
-
case T_ARRAY:
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
}
|
203
|
+
case T_ARRAY: {
|
204
|
+
VALUE args[2];
|
205
|
+
args[0] = doc;
|
206
|
+
args[1] = result;
|
207
|
+
node_set = rb_class_new_instance(2, args, cNokogiriXmlNodeSet);
|
208
|
+
Data_Get_Struct(node_set, xmlNodeSet, xml_node_set);
|
209
|
+
xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
|
210
|
+
}
|
131
211
|
break;
|
132
212
|
case T_DATA:
|
133
|
-
if(rb_obj_is_kind_of(result, cNokogiriXmlNodeSet)) {
|
213
|
+
if (rb_obj_is_kind_of(result, cNokogiriXmlNodeSet)) {
|
134
214
|
Data_Get_Struct(result, xmlNodeSet, xml_node_set);
|
135
215
|
/* Copy the node set, otherwise it will get GC'd. */
|
136
216
|
xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
|
@@ -138,10 +218,11 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c
|
|
138
218
|
}
|
139
219
|
default:
|
140
220
|
rb_raise(rb_eRuntimeError, "Invalid return type");
|
141
|
-
|
221
|
+
}
|
142
222
|
}
|
143
223
|
|
144
|
-
static void
|
224
|
+
static void
|
225
|
+
ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
|
145
226
|
{
|
146
227
|
VALUE handler = Qnil;
|
147
228
|
const char *function = NULL ;
|
@@ -152,26 +233,29 @@ static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
|
|
152
233
|
assert(ctx->context->function);
|
153
234
|
|
154
235
|
handler = (VALUE)(ctx->context->userData);
|
155
|
-
function = (const char*)(ctx->context->function);
|
236
|
+
function = (const char *)(ctx->context->function);
|
156
237
|
|
157
238
|
Nokogiri_marshal_xpath_funcall_and_return_values(ctx, nargs, handler, function);
|
158
239
|
}
|
159
240
|
|
160
|
-
static xmlXPathFunction
|
161
|
-
|
162
|
-
|
241
|
+
static xmlXPathFunction
|
242
|
+
lookup(void *ctx,
|
243
|
+
const xmlChar *name,
|
244
|
+
const xmlChar *ns_uri)
|
163
245
|
{
|
164
246
|
VALUE xpath_handler = (VALUE)ctx;
|
165
|
-
if(rb_respond_to(xpath_handler, rb_intern((const char *)name)))
|
247
|
+
if (rb_respond_to(xpath_handler, rb_intern((const char *)name))) {
|
166
248
|
return ruby_funcall;
|
249
|
+
}
|
167
250
|
|
168
251
|
return NULL;
|
169
252
|
}
|
170
253
|
|
171
|
-
NORETURN(static void xpath_generic_exception_handler(void *
|
172
|
-
static void
|
254
|
+
NORETURN(static void xpath_generic_exception_handler(void *ctx, const char *msg, ...));
|
255
|
+
static void
|
256
|
+
xpath_generic_exception_handler(void *ctx, const char *msg, ...)
|
173
257
|
{
|
174
|
-
char *
|
258
|
+
char *message;
|
175
259
|
|
176
260
|
va_list args;
|
177
261
|
va_start(args, msg);
|
@@ -187,7 +271,8 @@ static void xpath_generic_exception_handler(void * ctx, const char *msg, ...)
|
|
187
271
|
*
|
188
272
|
* Evaluate the +search_path+ returning an XML::XPath object.
|
189
273
|
*/
|
190
|
-
static VALUE
|
274
|
+
static VALUE
|
275
|
+
evaluate(int argc, VALUE *argv, VALUE self)
|
191
276
|
{
|
192
277
|
VALUE search_path, xpath_handler;
|
193
278
|
VALUE thing = Qnil;
|
@@ -197,12 +282,13 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
|
|
197
282
|
|
198
283
|
Data_Get_Struct(self, xmlXPathContext, ctx);
|
199
284
|
|
200
|
-
if(rb_scan_args(argc, argv, "11", &search_path, &xpath_handler) == 1)
|
285
|
+
if (rb_scan_args(argc, argv, "11", &search_path, &xpath_handler) == 1) {
|
201
286
|
xpath_handler = Qnil;
|
287
|
+
}
|
202
288
|
|
203
289
|
query = (xmlChar *)StringValueCStr(search_path);
|
204
290
|
|
205
|
-
if(Qnil != xpath_handler) {
|
291
|
+
if (Qnil != xpath_handler) {
|
206
292
|
/* FIXME: not sure if this is the correct place to shove private data. */
|
207
293
|
ctx->userData = (void *)xpath_handler;
|
208
294
|
xmlXPathRegisterFuncLookup(ctx, lookup, (void *)xpath_handler);
|
@@ -219,7 +305,7 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
|
|
219
305
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
220
306
|
xmlSetGenericErrorFunc(NULL, NULL);
|
221
307
|
|
222
|
-
if(xpath == NULL) {
|
308
|
+
if (xpath == NULL) {
|
223
309
|
xmlErrorPtr error = xmlGetLastError();
|
224
310
|
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
225
311
|
}
|
@@ -227,14 +313,14 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
|
|
227
313
|
assert(ctx->doc);
|
228
314
|
assert(DOC_RUBY_OBJECT_TEST(ctx->doc));
|
229
315
|
|
230
|
-
switch(xpath->type) {
|
316
|
+
switch (xpath->type) {
|
231
317
|
case XPATH_STRING:
|
232
318
|
thing = NOKOGIRI_STR_NEW2(xpath->stringval);
|
233
319
|
xmlFree(xpath->stringval);
|
234
320
|
break;
|
235
321
|
case XPATH_NODESET:
|
236
|
-
thing =
|
237
|
-
|
322
|
+
thing = noko_xml_node_set_wrap(xpath->nodesetval,
|
323
|
+
DOC_RUBY_OBJECT(ctx->doc));
|
238
324
|
break;
|
239
325
|
case XPATH_NUMBER:
|
240
326
|
thing = rb_float_new(xpath->floatval);
|
@@ -243,7 +329,7 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
|
|
243
329
|
thing = xpath->boolval == 1 ? Qtrue : Qfalse;
|
244
330
|
break;
|
245
331
|
default:
|
246
|
-
thing =
|
332
|
+
thing = noko_xml_node_set_wrap(NULL, DOC_RUBY_OBJECT(ctx->doc));
|
247
333
|
}
|
248
334
|
|
249
335
|
xmlXPathFreeNodeSetList(xpath);
|
@@ -257,42 +343,41 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
|
|
257
343
|
*
|
258
344
|
* Create a new XPathContext with +node+ as the reference point.
|
259
345
|
*/
|
260
|
-
static VALUE
|
346
|
+
static VALUE
|
347
|
+
new (VALUE klass, VALUE nodeobj)
|
261
348
|
{
|
262
349
|
xmlNodePtr node;
|
263
350
|
xmlXPathContextPtr ctx;
|
264
351
|
VALUE self;
|
265
352
|
|
266
|
-
xmlXPathInit();
|
267
|
-
|
268
353
|
Data_Get_Struct(nodeobj, xmlNode, node);
|
269
354
|
|
355
|
+
xmlXPathInit();
|
356
|
+
|
270
357
|
ctx = xmlXPathNewContext(node->doc);
|
271
358
|
ctx->node = node;
|
359
|
+
|
360
|
+
xmlXPathRegisterNs(ctx, NOKOGIRI_BUILTIN_PREFIX, NOKOGIRI_BUILTIN_URI);
|
361
|
+
xmlXPathRegisterFuncNS(ctx, (const xmlChar *)"css-class", NOKOGIRI_BUILTIN_URI,
|
362
|
+
xpath_builtin_css_class);
|
363
|
+
|
272
364
|
self = Data_Wrap_Struct(klass, 0, deallocate, ctx);
|
273
|
-
/*rb_iv_set(self, "@xpath_handler", Qnil); */
|
274
365
|
return self;
|
275
366
|
}
|
276
367
|
|
277
|
-
|
278
|
-
|
368
|
+
void
|
369
|
+
noko_init_xml_xpath_context(void)
|
279
370
|
{
|
280
|
-
VALUE module = rb_define_module("Nokogiri");
|
281
|
-
|
282
|
-
/*
|
283
|
-
* Nokogiri::XML
|
284
|
-
*/
|
285
|
-
VALUE xml = rb_define_module_under(module, "XML");
|
286
|
-
|
287
371
|
/*
|
288
372
|
* XPathContext is the entry point for searching a Document by using XPath.
|
289
373
|
*/
|
290
|
-
|
374
|
+
cNokogiriXmlXpathContext = rb_define_class_under(mNokogiriXml, "XPathContext", rb_cObject);
|
375
|
+
|
376
|
+
rb_undef_alloc_func(cNokogiriXmlXpathContext);
|
291
377
|
|
292
|
-
cNokogiriXmlXpathContext
|
378
|
+
rb_define_singleton_method(cNokogiriXmlXpathContext, "new", new, 1);
|
293
379
|
|
294
|
-
|
295
|
-
rb_define_method(
|
296
|
-
rb_define_method(
|
297
|
-
rb_define_method(klass, "register_ns", register_ns, 2);
|
380
|
+
rb_define_method(cNokogiriXmlXpathContext, "evaluate", evaluate, -1);
|
381
|
+
rb_define_method(cNokogiriXmlXpathContext, "register_variable", register_variable, 2);
|
382
|
+
rb_define_method(cNokogiriXmlXpathContext, "register_ns", register_ns, 2);
|
298
383
|
}
|