nokogiri 1.11.0.rc3-java → 1.11.4-java
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 +1015 -947
- data/LICENSE.md +1 -1
- data/README.md +168 -91
- data/dependencies.yml +12 -12
- data/ext/java/nokogiri/EncodingHandler.java +76 -89
- data/ext/java/nokogiri/HtmlDocument.java +135 -144
- data/ext/java/nokogiri/HtmlElementDescription.java +102 -117
- data/ext/java/nokogiri/HtmlEntityLookup.java +33 -60
- data/ext/java/nokogiri/HtmlSaxParserContext.java +218 -222
- data/ext/java/nokogiri/HtmlSaxPushParser.java +162 -169
- data/ext/java/nokogiri/NokogiriService.java +595 -556
- data/ext/java/nokogiri/XmlAttr.java +118 -126
- data/ext/java/nokogiri/XmlAttributeDecl.java +95 -106
- data/ext/java/nokogiri/XmlCdata.java +35 -58
- data/ext/java/nokogiri/XmlComment.java +46 -67
- data/ext/java/nokogiri/XmlDocument.java +645 -572
- data/ext/java/nokogiri/XmlDocumentFragment.java +125 -137
- data/ext/java/nokogiri/XmlDtd.java +448 -414
- data/ext/java/nokogiri/XmlElement.java +23 -48
- data/ext/java/nokogiri/XmlElementContent.java +343 -316
- data/ext/java/nokogiri/XmlElementDecl.java +124 -125
- data/ext/java/nokogiri/XmlEntityDecl.java +119 -127
- data/ext/java/nokogiri/XmlEntityReference.java +49 -72
- data/ext/java/nokogiri/XmlNamespace.java +175 -175
- data/ext/java/nokogiri/XmlNode.java +1843 -1622
- data/ext/java/nokogiri/XmlNodeSet.java +361 -331
- data/ext/java/nokogiri/XmlProcessingInstruction.java +47 -69
- data/ext/java/nokogiri/XmlReader.java +513 -450
- data/ext/java/nokogiri/XmlRelaxng.java +89 -101
- data/ext/java/nokogiri/XmlSaxParserContext.java +328 -310
- data/ext/java/nokogiri/XmlSaxPushParser.java +227 -220
- data/ext/java/nokogiri/XmlSchema.java +335 -242
- data/ext/java/nokogiri/XmlSyntaxError.java +113 -119
- data/ext/java/nokogiri/XmlText.java +55 -76
- data/ext/java/nokogiri/XmlXpathContext.java +242 -210
- data/ext/java/nokogiri/XsltStylesheet.java +280 -269
- data/ext/java/nokogiri/internals/ClosedStreamException.java +5 -2
- data/ext/java/nokogiri/internals/HtmlDomParserContext.java +201 -190
- data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +17 -10
- data/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +43 -16
- data/ext/java/nokogiri/internals/NokogiriDomParser.java +63 -80
- data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +107 -88
- data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +27 -52
- data/ext/java/nokogiri/internals/NokogiriHandler.java +316 -286
- data/ext/java/nokogiri/internals/NokogiriHelpers.java +736 -652
- data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +184 -173
- data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +79 -89
- data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +64 -79
- data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +84 -99
- data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +48 -65
- data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +119 -78
- data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +34 -54
- data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +23 -46
- data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +55 -72
- data/ext/java/nokogiri/internals/ParserContext.java +206 -211
- data/ext/java/nokogiri/internals/ReaderNode.java +478 -403
- data/ext/java/nokogiri/internals/SaveContextVisitor.java +822 -739
- data/ext/java/nokogiri/internals/SchemaErrorHandler.java +31 -54
- data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +129 -123
- data/ext/java/nokogiri/internals/XmlDeclHandler.java +3 -34
- data/ext/java/nokogiri/internals/XmlDomParserContext.java +206 -207
- data/ext/java/nokogiri/internals/XmlSaxParser.java +22 -47
- data/ext/java/nokogiri/internals/c14n/AttrCompare.java +71 -68
- data/ext/java/nokogiri/internals/c14n/C14nHelper.java +137 -118
- data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +27 -21
- data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +74 -61
- data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +230 -205
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +572 -547
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +17 -10
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +17 -10
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +323 -302
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +232 -219
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +22 -15
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +23 -16
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +23 -16
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +22 -15
- data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +575 -545
- data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +141 -120
- data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +39 -38
- data/ext/java/nokogiri/internals/c14n/Constants.java +13 -10
- data/ext/java/nokogiri/internals/c14n/ElementProxy.java +279 -247
- data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +66 -53
- data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +44 -37
- data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +135 -120
- data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +59 -48
- data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +384 -334
- data/ext/java/nokogiri/internals/c14n/NodeFilter.java +25 -24
- data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +151 -140
- data/ext/java/nokogiri/internals/c14n/XMLUtils.java +456 -423
- data/ext/java/nokogiri/internals/dom2dtm/DOM2DTM.java +1466 -1500
- data/ext/java/nokogiri/internals/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java +626 -574
- data/ext/nokogiri/depend +37 -358
- data/ext/nokogiri/extconf.rb +581 -374
- data/ext/nokogiri/html_document.c +78 -82
- data/ext/nokogiri/html_element_description.c +84 -71
- data/ext/nokogiri/html_entity_lookup.c +21 -16
- data/ext/nokogiri/html_sax_parser_context.c +69 -66
- data/ext/nokogiri/html_sax_push_parser.c +42 -34
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +192 -93
- 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 +246 -188
- data/ext/nokogiri/xml_document_fragment.c +13 -15
- data/ext/nokogiri/xml_dtd.c +54 -48
- data/ext/nokogiri/xml_element_content.c +30 -27
- data/ext/nokogiri/xml_element_decl.c +22 -22
- data/ext/nokogiri/xml_encoding_handler.c +17 -11
- data/ext/nokogiri/xml_entity_decl.c +32 -30
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +56 -49
- data/ext/nokogiri/xml_node.c +371 -320
- data/ext/nokogiri/xml_node_set.c +168 -156
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +191 -157
- data/ext/nokogiri/xml_relax_ng.c +52 -28
- data/ext/nokogiri/xml_sax_parser.c +118 -118
- data/ext/nokogiri/xml_sax_parser_context.c +103 -86
- data/ext/nokogiri/xml_sax_push_parser.c +36 -27
- data/ext/nokogiri/xml_schema.c +95 -47
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +13 -17
- data/ext/nokogiri/xml_xpath_context.c +206 -123
- data/ext/nokogiri/xslt_stylesheet.c +158 -161
- data/lib/nokogiri.rb +3 -7
- data/lib/nokogiri/css/parser.rb +3 -3
- data/lib/nokogiri/css/parser.y +2 -2
- data/lib/nokogiri/css/xpath_visitor.rb +70 -42
- data/lib/nokogiri/extension.rb +26 -0
- data/lib/nokogiri/html/document.rb +12 -26
- data/lib/nokogiri/html/document_fragment.rb +15 -15
- data/lib/nokogiri/nokogiri.jar +0 -0
- data/lib/nokogiri/version.rb +2 -149
- data/lib/nokogiri/version/constant.rb +5 -0
- data/lib/nokogiri/version/info.rb +205 -0
- data/lib/nokogiri/xml/document.rb +91 -35
- data/lib/nokogiri/xml/document_fragment.rb +4 -6
- data/lib/nokogiri/xml/node.rb +89 -69
- data/lib/nokogiri/xml/parse_options.rb +6 -0
- data/lib/nokogiri/xml/reader.rb +2 -9
- data/lib/nokogiri/xml/relax_ng.rb +6 -2
- data/lib/nokogiri/xml/schema.rb +12 -4
- data/lib/nokogiri/xml/searchable.rb +3 -1
- data/lib/nokogiri/xml/xpath.rb +1 -3
- data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
- metadata +86 -177
- data/ext/nokogiri/html_document.h +0 -10
- data/ext/nokogiri/html_element_description.h +0 -10
- data/ext/nokogiri/html_entity_lookup.h +0 -8
- data/ext/nokogiri/html_sax_parser_context.h +0 -11
- data/ext/nokogiri/html_sax_push_parser.h +0 -9
- data/ext/nokogiri/nokogiri.h +0 -134
- 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 -63
- 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/ext/nokogiri/xml_schema.c
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
-
#include <
|
1
|
+
#include <nokogiri.h>
|
2
2
|
|
3
|
-
|
3
|
+
VALUE cNokogiriXmlSchema;
|
4
|
+
|
5
|
+
static void
|
6
|
+
dealloc(xmlSchemaPtr schema)
|
4
7
|
{
|
5
8
|
NOKOGIRI_DEBUG_START(schema);
|
6
9
|
xmlSchemaFree(schema);
|
@@ -13,7 +16,8 @@ static void dealloc(xmlSchemaPtr schema)
|
|
13
16
|
*
|
14
17
|
* Validate a Nokogiri::XML::Document against this Schema.
|
15
18
|
*/
|
16
|
-
static VALUE
|
19
|
+
static VALUE
|
20
|
+
validate_document(VALUE self, VALUE document)
|
17
21
|
{
|
18
22
|
xmlDocPtr doc;
|
19
23
|
xmlSchemaPtr schema;
|
@@ -27,7 +31,7 @@ static VALUE validate_document(VALUE self, VALUE document)
|
|
27
31
|
|
28
32
|
valid_ctxt = xmlSchemaNewValidCtxt(schema);
|
29
33
|
|
30
|
-
if(NULL == valid_ctxt) {
|
34
|
+
if (NULL == valid_ctxt) {
|
31
35
|
/* we have a problem */
|
32
36
|
rb_raise(rb_eRuntimeError, "Could not create a validation context");
|
33
37
|
}
|
@@ -53,7 +57,8 @@ static VALUE validate_document(VALUE self, VALUE document)
|
|
53
57
|
*
|
54
58
|
* Validate a file against this Schema.
|
55
59
|
*/
|
56
|
-
static VALUE
|
60
|
+
static VALUE
|
61
|
+
validate_file(VALUE self, VALUE rb_filename)
|
57
62
|
{
|
58
63
|
xmlSchemaPtr schema;
|
59
64
|
xmlSchemaValidCtxtPtr valid_ctxt;
|
@@ -61,13 +66,13 @@ static VALUE validate_file(VALUE self, VALUE rb_filename)
|
|
61
66
|
VALUE errors;
|
62
67
|
|
63
68
|
Data_Get_Struct(self, xmlSchema, schema);
|
64
|
-
filename = (const char*)StringValueCStr(rb_filename) ;
|
69
|
+
filename = (const char *)StringValueCStr(rb_filename) ;
|
65
70
|
|
66
71
|
errors = rb_ary_new();
|
67
72
|
|
68
73
|
valid_ctxt = xmlSchemaNewValidCtxt(schema);
|
69
74
|
|
70
|
-
if(NULL == valid_ctxt) {
|
75
|
+
if (NULL == valid_ctxt) {
|
71
76
|
/* we have a problem */
|
72
77
|
rb_raise(rb_eRuntimeError, "Could not create a validation context");
|
73
78
|
}
|
@@ -93,15 +98,28 @@ static VALUE validate_file(VALUE self, VALUE rb_filename)
|
|
93
98
|
*
|
94
99
|
* Create a new Schema from the contents of +string+
|
95
100
|
*/
|
96
|
-
static VALUE
|
101
|
+
static VALUE
|
102
|
+
read_memory(int argc, VALUE *argv, VALUE klass)
|
97
103
|
{
|
104
|
+
VALUE content;
|
105
|
+
VALUE parse_options;
|
106
|
+
int parse_options_int;
|
107
|
+
xmlSchemaParserCtxtPtr ctx;
|
98
108
|
xmlSchemaPtr schema;
|
99
|
-
|
100
|
-
(const char *)StringValuePtr(content),
|
101
|
-
(int)RSTRING_LEN(content)
|
102
|
-
);
|
109
|
+
VALUE errors;
|
103
110
|
VALUE rb_schema;
|
104
|
-
|
111
|
+
int scanned_args = 0;
|
112
|
+
xmlExternalEntityLoader old_loader = 0;
|
113
|
+
|
114
|
+
scanned_args = rb_scan_args(argc, argv, "11", &content, &parse_options);
|
115
|
+
if (scanned_args == 1) {
|
116
|
+
parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA"));
|
117
|
+
}
|
118
|
+
parse_options_int = (int)NUM2INT(rb_funcall(parse_options, rb_intern("to_i"), 0));
|
119
|
+
|
120
|
+
ctx = xmlSchemaNewMemParserCtxt((const char *)StringValuePtr(content), (int)RSTRING_LEN(content));
|
121
|
+
|
122
|
+
errors = rb_ary_new();
|
105
123
|
xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
|
106
124
|
|
107
125
|
#ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS
|
@@ -112,23 +130,34 @@ static VALUE read_memory(VALUE klass, VALUE content)
|
|
112
130
|
);
|
113
131
|
#endif
|
114
132
|
|
115
|
-
|
133
|
+
if (parse_options_int & XML_PARSE_NONET) {
|
134
|
+
old_loader = xmlGetExternalEntityLoader();
|
135
|
+
xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
|
136
|
+
}
|
137
|
+
|
138
|
+
schema = xmlSchemaParse(ctx);
|
139
|
+
|
140
|
+
if (old_loader) {
|
141
|
+
xmlSetExternalEntityLoader(old_loader);
|
142
|
+
}
|
116
143
|
|
117
144
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
118
145
|
xmlSchemaFreeParserCtxt(ctx);
|
119
146
|
|
120
|
-
if(NULL == schema) {
|
147
|
+
if (NULL == schema) {
|
121
148
|
xmlErrorPtr error = xmlGetLastError();
|
122
|
-
if(error)
|
149
|
+
if (error) {
|
123
150
|
Nokogiri_error_raise(NULL, error);
|
124
|
-
else
|
151
|
+
} else {
|
125
152
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
153
|
+
}
|
126
154
|
|
127
155
|
return Qnil;
|
128
156
|
}
|
129
157
|
|
130
158
|
rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
|
131
159
|
rb_iv_set(rb_schema, "@errors", errors);
|
160
|
+
rb_iv_set(rb_schema, "@parse_options", parse_options);
|
132
161
|
|
133
162
|
return rb_schema;
|
134
163
|
}
|
@@ -138,24 +167,25 @@ static VALUE read_memory(VALUE klass, VALUE content)
|
|
138
167
|
* out from under the VALUE pointer. This function checks to see if any of
|
139
168
|
* those nodes have been exposed to Ruby, and if so we should raise an exception.
|
140
169
|
*/
|
141
|
-
static int
|
170
|
+
static int
|
171
|
+
has_blank_nodes_p(VALUE cache)
|
142
172
|
{
|
143
|
-
|
173
|
+
long i;
|
144
174
|
|
145
|
-
|
146
|
-
|
147
|
-
|
175
|
+
if (NIL_P(cache)) {
|
176
|
+
return 0;
|
177
|
+
}
|
148
178
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
}
|
179
|
+
for (i = 0; i < RARRAY_LEN(cache); i++) {
|
180
|
+
xmlNodePtr node;
|
181
|
+
VALUE element = rb_ary_entry(cache, i);
|
182
|
+
Data_Get_Struct(element, xmlNode, node);
|
183
|
+
if (xmlIsBlankNode(node)) {
|
184
|
+
return 1;
|
156
185
|
}
|
186
|
+
}
|
157
187
|
|
158
|
-
|
188
|
+
return 0;
|
159
189
|
}
|
160
190
|
|
161
191
|
/*
|
@@ -164,18 +194,29 @@ static int has_blank_nodes_p(VALUE cache)
|
|
164
194
|
*
|
165
195
|
* Create a new Schema from the Nokogiri::XML::Document +doc+
|
166
196
|
*/
|
167
|
-
static VALUE
|
197
|
+
static VALUE
|
198
|
+
from_document(int argc, VALUE *argv, VALUE klass)
|
168
199
|
{
|
200
|
+
VALUE document;
|
201
|
+
VALUE parse_options;
|
202
|
+
int parse_options_int;
|
169
203
|
xmlDocPtr doc;
|
170
204
|
xmlSchemaParserCtxtPtr ctx;
|
171
205
|
xmlSchemaPtr schema;
|
172
206
|
VALUE errors;
|
173
207
|
VALUE rb_schema;
|
208
|
+
int scanned_args = 0;
|
209
|
+
xmlExternalEntityLoader old_loader = 0;
|
210
|
+
|
211
|
+
scanned_args = rb_scan_args(argc, argv, "11", &document, &parse_options);
|
174
212
|
|
175
213
|
Data_Get_Struct(document, xmlDoc, doc);
|
214
|
+
doc = doc->doc; /* In case someone passes us a node. ugh. */
|
176
215
|
|
177
|
-
|
178
|
-
|
216
|
+
if (scanned_args == 1) {
|
217
|
+
parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA"));
|
218
|
+
}
|
219
|
+
parse_options_int = (int)NUM2INT(rb_funcall(parse_options, rb_intern("to_i"), 0));
|
179
220
|
|
180
221
|
if (has_blank_nodes_p(DOC_NODE_CACHE(doc))) {
|
181
222
|
rb_raise(rb_eArgError, "Creating a schema from a document that has blank nodes exposed to Ruby is dangerous");
|
@@ -194,41 +235,48 @@ static VALUE from_document(VALUE klass, VALUE document)
|
|
194
235
|
);
|
195
236
|
#endif
|
196
237
|
|
238
|
+
if (parse_options_int & XML_PARSE_NONET) {
|
239
|
+
old_loader = xmlGetExternalEntityLoader();
|
240
|
+
xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
|
241
|
+
}
|
242
|
+
|
197
243
|
schema = xmlSchemaParse(ctx);
|
198
244
|
|
245
|
+
if (old_loader) {
|
246
|
+
xmlSetExternalEntityLoader(old_loader);
|
247
|
+
}
|
248
|
+
|
199
249
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
200
250
|
xmlSchemaFreeParserCtxt(ctx);
|
201
251
|
|
202
|
-
if(NULL == schema) {
|
252
|
+
if (NULL == schema) {
|
203
253
|
xmlErrorPtr error = xmlGetLastError();
|
204
|
-
if(error)
|
254
|
+
if (error) {
|
205
255
|
Nokogiri_error_raise(NULL, error);
|
206
|
-
else
|
256
|
+
} else {
|
207
257
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
258
|
+
}
|
208
259
|
|
209
260
|
return Qnil;
|
210
261
|
}
|
211
262
|
|
212
263
|
rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
|
213
264
|
rb_iv_set(rb_schema, "@errors", errors);
|
265
|
+
rb_iv_set(rb_schema, "@parse_options", parse_options);
|
214
266
|
|
215
267
|
return rb_schema;
|
216
268
|
|
217
269
|
return Qnil;
|
218
270
|
}
|
219
271
|
|
220
|
-
|
221
|
-
|
272
|
+
void
|
273
|
+
noko_init_xml_schema()
|
222
274
|
{
|
223
|
-
|
224
|
-
VALUE xml = rb_define_module_under(nokogiri, "XML");
|
225
|
-
VALUE klass = rb_define_class_under(xml, "Schema", rb_cObject);
|
226
|
-
|
227
|
-
cNokogiriXmlSchema = klass;
|
275
|
+
cNokogiriXmlSchema = rb_define_class_under(mNokogiriXml, "Schema", rb_cObject);
|
228
276
|
|
229
|
-
rb_define_singleton_method(
|
230
|
-
rb_define_singleton_method(
|
277
|
+
rb_define_singleton_method(cNokogiriXmlSchema, "read_memory", read_memory, -1);
|
278
|
+
rb_define_singleton_method(cNokogiriXmlSchema, "from_document", from_document, -1);
|
231
279
|
|
232
|
-
rb_define_private_method(
|
233
|
-
rb_define_private_method(
|
280
|
+
rb_define_private_method(cNokogiriXmlSchema, "validate_document", validate_document, 1);
|
281
|
+
rb_define_private_method(cNokogiriXmlSchema, "validate_file", validate_file, 1);
|
234
282
|
}
|
@@ -1,38 +1,64 @@
|
|
1
|
-
#include <
|
1
|
+
#include <nokogiri.h>
|
2
2
|
|
3
|
-
|
3
|
+
VALUE cNokogiriXmlSyntaxError;
|
4
|
+
|
5
|
+
void
|
6
|
+
Nokogiri_structured_error_func_save(libxmlStructuredErrorHandlerState *handler_state)
|
7
|
+
{
|
8
|
+
/* this method is tightly coupled to the implementation of xmlSetStructuredErrorFunc */
|
9
|
+
handler_state->user_data = xmlStructuredErrorContext;
|
10
|
+
handler_state->handler = xmlStructuredError;
|
11
|
+
}
|
12
|
+
|
13
|
+
void
|
14
|
+
Nokogiri_structured_error_func_save_and_set(libxmlStructuredErrorHandlerState *handler_state,
|
15
|
+
void *user_data,
|
16
|
+
xmlStructuredErrorFunc handler)
|
17
|
+
{
|
18
|
+
Nokogiri_structured_error_func_save(handler_state);
|
19
|
+
xmlSetStructuredErrorFunc(user_data, handler);
|
20
|
+
}
|
21
|
+
|
22
|
+
void
|
23
|
+
Nokogiri_structured_error_func_restore(libxmlStructuredErrorHandlerState *handler_state)
|
24
|
+
{
|
25
|
+
xmlSetStructuredErrorFunc(handler_state->user_data, handler_state->handler);
|
26
|
+
}
|
27
|
+
|
28
|
+
void
|
29
|
+
Nokogiri_error_array_pusher(void *ctx, xmlErrorPtr error)
|
4
30
|
{
|
5
31
|
VALUE list = (VALUE)ctx;
|
6
32
|
Check_Type(list, T_ARRAY);
|
7
33
|
rb_ary_push(list, Nokogiri_wrap_xml_syntax_error(error));
|
8
34
|
}
|
9
35
|
|
10
|
-
void
|
36
|
+
void
|
37
|
+
Nokogiri_error_raise(void *ctx, xmlErrorPtr error)
|
11
38
|
{
|
12
39
|
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
13
40
|
}
|
14
41
|
|
15
|
-
VALUE
|
42
|
+
VALUE
|
43
|
+
Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error)
|
16
44
|
{
|
17
45
|
VALUE msg, e, klass;
|
18
46
|
|
19
47
|
klass = cNokogiriXmlSyntaxError;
|
20
48
|
|
21
49
|
if (error && error->domain == XML_FROM_XPATH) {
|
22
|
-
|
23
|
-
klass = rb_const_get(xpath, rb_intern("SyntaxError"));
|
50
|
+
klass = cNokogiriXmlXpathSyntaxError;
|
24
51
|
}
|
25
52
|
|
26
53
|
msg = (error && error->message) ? NOKOGIRI_STR_NEW2(error->message) : Qnil;
|
27
54
|
|
28
55
|
e = rb_class_new_instance(
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
56
|
+
1,
|
57
|
+
&msg,
|
58
|
+
klass
|
59
|
+
);
|
33
60
|
|
34
|
-
if (error)
|
35
|
-
{
|
61
|
+
if (error) {
|
36
62
|
rb_iv_set(e, "@domain", INT2NUM(error->domain));
|
37
63
|
rb_iv_set(e, "@code", INT2NUM(error->code));
|
38
64
|
rb_iv_set(e, "@level", INT2NUM((short)error->level));
|
@@ -48,17 +74,12 @@ VALUE Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error)
|
|
48
74
|
return e;
|
49
75
|
}
|
50
76
|
|
51
|
-
|
52
|
-
|
77
|
+
void
|
78
|
+
noko_init_xml_syntax_error()
|
53
79
|
{
|
54
|
-
|
55
|
-
VALUE xml = rb_define_module_under(nokogiri, "XML");
|
56
|
-
|
80
|
+
assert(cNokogiriSyntaxError);
|
57
81
|
/*
|
58
82
|
* The XML::SyntaxError is raised on parse errors
|
59
83
|
*/
|
60
|
-
|
61
|
-
VALUE klass = rb_define_class_under(xml, "SyntaxError", syntax_error_mommy);
|
62
|
-
cNokogiriXmlSyntaxError = klass;
|
63
|
-
|
84
|
+
cNokogiriXmlSyntaxError = rb_define_class_under(mNokogiriXml, "SyntaxError", cNokogiriSyntaxError);
|
64
85
|
}
|
data/ext/nokogiri/xml_text.c
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
#include <
|
1
|
+
#include <nokogiri.h>
|
2
|
+
|
3
|
+
VALUE cNokogiriXmlText ;
|
2
4
|
|
3
5
|
/*
|
4
6
|
* call-seq:
|
@@ -6,7 +8,8 @@
|
|
6
8
|
*
|
7
9
|
* Create a new Text element on the +document+ with +content+
|
8
10
|
*/
|
9
|
-
static VALUE
|
11
|
+
static VALUE
|
12
|
+
new (int argc, VALUE *argv, VALUE klass)
|
10
13
|
{
|
11
14
|
xmlDocPtr doc;
|
12
15
|
xmlNodePtr node;
|
@@ -22,31 +25,24 @@ static VALUE new(int argc, VALUE *argv, VALUE klass)
|
|
22
25
|
node = xmlNewText((xmlChar *)StringValueCStr(string));
|
23
26
|
node->doc = doc->doc;
|
24
27
|
|
25
|
-
|
28
|
+
noko_xml_document_pin_node(node);
|
26
29
|
|
27
|
-
rb_node =
|
30
|
+
rb_node = noko_xml_node_wrap(klass, node) ;
|
28
31
|
rb_obj_call_init(rb_node, argc, argv);
|
29
32
|
|
30
|
-
if(rb_block_given_p()) rb_yield(rb_node);
|
33
|
+
if (rb_block_given_p()) { rb_yield(rb_node); }
|
31
34
|
|
32
35
|
return rb_node;
|
33
36
|
}
|
34
37
|
|
35
|
-
|
36
|
-
|
38
|
+
void
|
39
|
+
noko_init_xml_text()
|
37
40
|
{
|
38
|
-
|
39
|
-
VALUE xml = rb_define_module_under(nokogiri, "XML");
|
40
|
-
/* */
|
41
|
-
VALUE node = rb_define_class_under(xml, "Node", rb_cObject);
|
42
|
-
VALUE char_data = rb_define_class_under(xml, "CharacterData", node);
|
43
|
-
|
41
|
+
assert(cNokogiriXmlCharacterData);
|
44
42
|
/*
|
45
43
|
* Wraps Text nodes.
|
46
44
|
*/
|
47
|
-
|
48
|
-
|
49
|
-
cNokogiriXmlText = klass;
|
45
|
+
cNokogiriXmlText = rb_define_class_under(mNokogiriXml, "Text", cNokogiriXmlCharacterData);
|
50
46
|
|
51
|
-
rb_define_singleton_method(
|
47
|
+
rb_define_singleton_method(cNokogiriXmlText, "new", new, -1);
|
52
48
|
}
|
@@ -1,29 +1,107 @@
|
|
1
|
-
#include <
|
1
|
+
#include <nokogiri.h>
|
2
2
|
|
3
|
-
|
3
|
+
VALUE cNokogiriXmlXpathContext;
|
4
4
|
|
5
|
-
|
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";
|
11
|
+
|
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,76 +153,76 @@ 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) {
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
156
|
+
switch (obj->type) {
|
157
|
+
case XPATH_STRING:
|
158
|
+
argv[i] = NOKOGIRI_STR_NEW2(obj->stringval);
|
159
|
+
break;
|
160
|
+
case XPATH_BOOLEAN:
|
161
|
+
argv[i] = obj->boolval == 1 ? Qtrue : Qfalse;
|
162
|
+
break;
|
163
|
+
case XPATH_NUMBER:
|
164
|
+
argv[i] = rb_float_new(obj->floatval);
|
165
|
+
break;
|
166
|
+
case XPATH_NODESET:
|
167
|
+
argv[i] = noko_xml_node_set_wrap(obj->nodesetval, doc);
|
168
|
+
break;
|
169
|
+
default:
|
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)) {
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
break;
|
108
|
-
case T_STRING:
|
109
|
-
xmlXPathReturnString(
|
110
|
-
ctx,
|
111
|
-
xmlCharStrdup(StringValueCStr(result))
|
112
|
-
);
|
113
|
-
break;
|
114
|
-
case T_TRUE:
|
115
|
-
xmlXPathReturnTrue(ctx);
|
116
|
-
break;
|
117
|
-
case T_FALSE:
|
118
|
-
xmlXPathReturnFalse(ctx);
|
119
|
-
break;
|
120
|
-
case T_NIL:
|
121
|
-
break;
|
122
|
-
case T_ARRAY:
|
123
|
-
{
|
124
|
-
VALUE args[2];
|
125
|
-
args[0] = doc;
|
126
|
-
args[1] = result;
|
127
|
-
node_set = rb_class_new_instance(2, args, cNokogiriXmlNodeSet);
|
128
|
-
Data_Get_Struct(node_set, xmlNodeSet, xml_node_set);
|
129
|
-
xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
|
130
|
-
}
|
183
|
+
switch (TYPE(result)) {
|
184
|
+
case T_FLOAT:
|
185
|
+
case T_BIGNUM:
|
186
|
+
case T_FIXNUM:
|
187
|
+
xmlXPathReturnNumber(ctx, NUM2DBL(result));
|
131
188
|
break;
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
189
|
+
case T_STRING:
|
190
|
+
xmlXPathReturnString(
|
191
|
+
ctx,
|
192
|
+
xmlCharStrdup(StringValueCStr(result))
|
193
|
+
);
|
194
|
+
break;
|
195
|
+
case T_TRUE:
|
196
|
+
xmlXPathReturnTrue(ctx);
|
197
|
+
break;
|
198
|
+
case T_FALSE:
|
199
|
+
xmlXPathReturnFalse(ctx);
|
200
|
+
break;
|
201
|
+
case T_NIL:
|
202
|
+
break;
|
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
|
+
}
|
211
|
+
break;
|
212
|
+
case T_DATA:
|
213
|
+
if (rb_obj_is_kind_of(result, cNokogiriXmlNodeSet)) {
|
214
|
+
Data_Get_Struct(result, xmlNodeSet, xml_node_set);
|
215
|
+
/* Copy the node set, otherwise it will get GC'd. */
|
216
|
+
xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
|
217
|
+
break;
|
141
218
|
}
|
219
|
+
default:
|
220
|
+
rb_raise(rb_eRuntimeError, "Invalid return type");
|
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,23 +313,23 @@ 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) {
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
316
|
+
switch (xpath->type) {
|
317
|
+
case XPATH_STRING:
|
318
|
+
thing = NOKOGIRI_STR_NEW2(xpath->stringval);
|
319
|
+
xmlFree(xpath->stringval);
|
320
|
+
break;
|
321
|
+
case XPATH_NODESET:
|
322
|
+
thing = noko_xml_node_set_wrap(xpath->nodesetval,
|
323
|
+
DOC_RUBY_OBJECT(ctx->doc));
|
324
|
+
break;
|
325
|
+
case XPATH_NUMBER:
|
326
|
+
thing = rb_float_new(xpath->floatval);
|
327
|
+
break;
|
328
|
+
case XPATH_BOOLEAN:
|
329
|
+
thing = xpath->boolval == 1 ? Qtrue : Qfalse;
|
330
|
+
break;
|
331
|
+
default:
|
332
|
+
thing = noko_xml_node_set_wrap(NULL, DOC_RUBY_OBJECT(ctx->doc));
|
247
333
|
}
|
248
334
|
|
249
335
|
xmlXPathFreeNodeSetList(xpath);
|
@@ -257,42 +343,39 @@ 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);
|
291
375
|
|
292
|
-
cNokogiriXmlXpathContext
|
376
|
+
rb_define_singleton_method(cNokogiriXmlXpathContext, "new", new, 1);
|
293
377
|
|
294
|
-
|
295
|
-
rb_define_method(
|
296
|
-
rb_define_method(
|
297
|
-
rb_define_method(klass, "register_ns", register_ns, 2);
|
378
|
+
rb_define_method(cNokogiriXmlXpathContext, "evaluate", evaluate, -1);
|
379
|
+
rb_define_method(cNokogiriXmlXpathContext, "register_variable", register_variable, 2);
|
380
|
+
rb_define_method(cNokogiriXmlXpathContext, "register_ns", register_ns, 2);
|
298
381
|
}
|