nokogiri 1.11.0-x86-mingw32 → 1.11.5-x86-mingw32
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/LICENSE-DEPENDENCIES.md +12 -12
- data/LICENSE.md +1 -1
- data/README.md +21 -16
- data/dependencies.yml +12 -12
- data/ext/nokogiri/depend +34 -474
- data/ext/nokogiri/extconf.rb +253 -183
- data/ext/nokogiri/html_document.c +10 -15
- 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 +67 -64
- data/ext/nokogiri/html_sax_push_parser.c +42 -34
- data/ext/nokogiri/include/libxml2/libxml/c14n.h +6 -4
- data/ext/nokogiri/include/libxml2/libxml/parser.h +9 -7
- data/ext/nokogiri/include/libxml2/libxml/tree.h +3 -3
- data/ext/nokogiri/include/libxml2/libxml/xmlIO.h +2 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlexports.h +39 -115
- data/ext/nokogiri/include/libxml2/libxml/xmlschemas.h +1 -1
- data/ext/nokogiri/include/libxml2/libxml/xmlversion.h +6 -6
- data/ext/nokogiri/include/libxml2/libxml/xpath.h +1 -3
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +190 -60
- data/ext/nokogiri/nokogiri.h +158 -75
- 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 +29 -23
- data/ext/nokogiri/xml_sax_parser.c +117 -112
- data/ext/nokogiri/xml_sax_parser_context.c +101 -84
- data/ext/nokogiri/xml_sax_push_parser.c +36 -27
- data/ext/nokogiri/xml_schema.c +48 -42
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +13 -17
- data/ext/nokogiri/xml_xpath_context.c +134 -127
- data/ext/nokogiri/xslt_stylesheet.c +157 -157
- data/lib/nokogiri.rb +1 -22
- data/lib/nokogiri/2.5/nokogiri.so +0 -0
- data/lib/nokogiri/2.6/nokogiri.so +0 -0
- data/lib/nokogiri/2.7/nokogiri.so +0 -0
- data/lib/nokogiri/3.0/nokogiri.so +0 -0
- data/lib/nokogiri/css/parser.rb +1 -1
- data/lib/nokogiri/extension.rb +26 -0
- data/lib/nokogiri/html/document_fragment.rb +15 -15
- data/lib/nokogiri/version/constant.rb +1 -1
- data/lib/nokogiri/version/info.rb +32 -8
- data/lib/nokogiri/xml/document.rb +74 -28
- data/lib/nokogiri/xml/node.rb +39 -42
- data/lib/nokogiri/xml/reader.rb +2 -9
- data/lib/nokogiri/xml/xpath.rb +1 -3
- data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
- metadata +11 -43
- 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/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
@@ -1,8 +1,9 @@
|
|
1
|
-
#include <
|
1
|
+
#include <nokogiri.h>
|
2
2
|
|
3
3
|
VALUE cNokogiriXmlSaxParserContext ;
|
4
4
|
|
5
|
-
static void
|
5
|
+
static void
|
6
|
+
deallocate(xmlParserCtxtPtr ctxt)
|
6
7
|
{
|
7
8
|
NOKOGIRI_DEBUG_START(ctxt);
|
8
9
|
|
@@ -22,19 +23,19 @@ static void deallocate(xmlParserCtxtPtr ctxt)
|
|
22
23
|
static VALUE
|
23
24
|
parse_io(VALUE klass, VALUE io, VALUE encoding)
|
24
25
|
{
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
26
|
+
xmlParserCtxtPtr ctxt;
|
27
|
+
xmlCharEncoding enc = (xmlCharEncoding)NUM2INT(encoding);
|
28
|
+
|
29
|
+
ctxt = xmlCreateIOParserCtxt(NULL, NULL,
|
30
|
+
(xmlInputReadCallback)noko_io_read,
|
31
|
+
(xmlInputCloseCallback)noko_io_close,
|
32
|
+
(void *)io, enc);
|
33
|
+
if (ctxt->sax) {
|
34
|
+
xmlFree(ctxt->sax);
|
35
|
+
ctxt->sax = NULL;
|
36
|
+
}
|
37
|
+
|
38
|
+
return Data_Wrap_Struct(klass, NULL, deallocate, ctxt);
|
38
39
|
}
|
39
40
|
|
40
41
|
/*
|
@@ -43,7 +44,8 @@ parse_io(VALUE klass, VALUE io, VALUE encoding)
|
|
43
44
|
*
|
44
45
|
* Parse file given +filename+
|
45
46
|
*/
|
46
|
-
static VALUE
|
47
|
+
static VALUE
|
48
|
+
parse_file(VALUE klass, VALUE filename)
|
47
49
|
{
|
48
50
|
xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(StringValueCStr(filename));
|
49
51
|
return Data_Wrap_Struct(klass, NULL, deallocate, ctxt);
|
@@ -58,41 +60,44 @@ static VALUE parse_file(VALUE klass, VALUE filename)
|
|
58
60
|
static VALUE
|
59
61
|
parse_memory(VALUE klass, VALUE data)
|
60
62
|
{
|
61
|
-
|
63
|
+
xmlParserCtxtPtr ctxt;
|
62
64
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
65
|
+
if (NIL_P(data)) {
|
66
|
+
rb_raise(rb_eArgError, "data cannot be nil");
|
67
|
+
}
|
68
|
+
if (!(int)RSTRING_LEN(data)) {
|
69
|
+
rb_raise(rb_eRuntimeError, "data cannot be empty");
|
70
|
+
}
|
67
71
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
72
|
+
ctxt = xmlCreateMemoryParserCtxt(StringValuePtr(data),
|
73
|
+
(int)RSTRING_LEN(data));
|
74
|
+
if (ctxt->sax) {
|
75
|
+
xmlFree(ctxt->sax);
|
76
|
+
ctxt->sax = NULL;
|
77
|
+
}
|
74
78
|
|
75
|
-
|
79
|
+
return Data_Wrap_Struct(klass, NULL, deallocate, ctxt);
|
76
80
|
}
|
77
81
|
|
78
82
|
static VALUE
|
79
83
|
parse_doc(VALUE ctxt_val)
|
80
84
|
{
|
81
|
-
|
82
|
-
|
83
|
-
|
85
|
+
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr)ctxt_val;
|
86
|
+
xmlParseDocument(ctxt);
|
87
|
+
return Qnil;
|
84
88
|
}
|
85
89
|
|
86
90
|
static VALUE
|
87
91
|
parse_doc_finalize(VALUE ctxt_val)
|
88
92
|
{
|
89
|
-
|
93
|
+
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr)ctxt_val;
|
90
94
|
|
91
|
-
|
92
|
-
|
95
|
+
if (NULL != ctxt->myDoc) {
|
96
|
+
xmlFreeDoc(ctxt->myDoc);
|
97
|
+
}
|
93
98
|
|
94
|
-
|
95
|
-
|
99
|
+
NOKOGIRI_SAX_TUPLE_DESTROY(ctxt->userData);
|
100
|
+
return Qnil;
|
96
101
|
}
|
97
102
|
|
98
103
|
/*
|
@@ -104,25 +109,29 @@ parse_doc_finalize(VALUE ctxt_val)
|
|
104
109
|
static VALUE
|
105
110
|
parse_with(VALUE self, VALUE sax_handler)
|
106
111
|
{
|
107
|
-
|
108
|
-
|
112
|
+
xmlParserCtxtPtr ctxt;
|
113
|
+
xmlSAXHandlerPtr sax;
|
109
114
|
|
110
|
-
|
111
|
-
|
115
|
+
if (!rb_obj_is_kind_of(sax_handler, cNokogiriXmlSaxParser)) {
|
116
|
+
rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::SAX::Parser");
|
117
|
+
}
|
112
118
|
|
113
|
-
|
114
|
-
|
119
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
120
|
+
Data_Get_Struct(sax_handler, xmlSAXHandler, sax);
|
121
|
+
|
122
|
+
/* Free the sax handler since we'll assign our own */
|
123
|
+
if (ctxt->sax && ctxt->sax != (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) {
|
124
|
+
xmlFree(ctxt->sax);
|
125
|
+
}
|
115
126
|
|
116
|
-
|
117
|
-
|
118
|
-
xmlFree(ctxt->sax);
|
127
|
+
ctxt->sax = sax;
|
128
|
+
ctxt->userData = (void *)NOKOGIRI_SAX_TUPLE_NEW(ctxt, sax_handler);
|
119
129
|
|
120
|
-
|
121
|
-
ctxt->userData = (void *)NOKOGIRI_SAX_TUPLE_NEW(ctxt, sax_handler);
|
130
|
+
xmlSetStructuredErrorFunc(NULL, NULL);
|
122
131
|
|
123
|
-
|
132
|
+
rb_ensure(parse_doc, (VALUE)ctxt, parse_doc_finalize, (VALUE)ctxt);
|
124
133
|
|
125
|
-
|
134
|
+
return Qnil;
|
126
135
|
}
|
127
136
|
|
128
137
|
/*
|
@@ -132,15 +141,17 @@ parse_with(VALUE self, VALUE sax_handler)
|
|
132
141
|
* Should this parser replace entities? & will get converted to '&' if
|
133
142
|
* set to true
|
134
143
|
*/
|
135
|
-
static VALUE
|
144
|
+
static VALUE
|
145
|
+
set_replace_entities(VALUE self, VALUE value)
|
136
146
|
{
|
137
147
|
xmlParserCtxtPtr ctxt;
|
138
148
|
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
139
149
|
|
140
|
-
if(Qfalse == value)
|
150
|
+
if (Qfalse == value) {
|
141
151
|
ctxt->replaceEntities = 0;
|
142
|
-
else
|
152
|
+
} else {
|
143
153
|
ctxt->replaceEntities = 1;
|
154
|
+
}
|
144
155
|
|
145
156
|
return value;
|
146
157
|
}
|
@@ -152,15 +163,17 @@ static VALUE set_replace_entities(VALUE self, VALUE value)
|
|
152
163
|
* Should this parser replace entities? & will get converted to '&' if
|
153
164
|
* set to true
|
154
165
|
*/
|
155
|
-
static VALUE
|
166
|
+
static VALUE
|
167
|
+
get_replace_entities(VALUE self)
|
156
168
|
{
|
157
169
|
xmlParserCtxtPtr ctxt;
|
158
170
|
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
159
171
|
|
160
|
-
if(0 == ctxt->replaceEntities)
|
172
|
+
if (0 == ctxt->replaceEntities) {
|
161
173
|
return Qfalse;
|
162
|
-
else
|
174
|
+
} else {
|
163
175
|
return Qtrue;
|
176
|
+
}
|
164
177
|
}
|
165
178
|
|
166
179
|
/*
|
@@ -168,7 +181,8 @@ static VALUE get_replace_entities(VALUE self)
|
|
168
181
|
*
|
169
182
|
* Get the current line the parser context is processing.
|
170
183
|
*/
|
171
|
-
static VALUE
|
184
|
+
static VALUE
|
185
|
+
line(VALUE self)
|
172
186
|
{
|
173
187
|
xmlParserCtxtPtr ctxt;
|
174
188
|
xmlParserInputPtr io;
|
@@ -176,8 +190,9 @@ static VALUE line(VALUE self)
|
|
176
190
|
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
177
191
|
|
178
192
|
io = ctxt->input;
|
179
|
-
if(io)
|
193
|
+
if (io) {
|
180
194
|
return INT2NUM(io->line);
|
195
|
+
}
|
181
196
|
|
182
197
|
return Qnil;
|
183
198
|
}
|
@@ -187,7 +202,8 @@ static VALUE line(VALUE self)
|
|
187
202
|
*
|
188
203
|
* Get the current column the parser context is processing.
|
189
204
|
*/
|
190
|
-
static VALUE
|
205
|
+
static VALUE
|
206
|
+
column(VALUE self)
|
191
207
|
{
|
192
208
|
xmlParserCtxtPtr ctxt;
|
193
209
|
xmlParserInputPtr io;
|
@@ -195,8 +211,9 @@ static VALUE column(VALUE self)
|
|
195
211
|
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
196
212
|
|
197
213
|
io = ctxt->input;
|
198
|
-
if(io)
|
214
|
+
if (io) {
|
199
215
|
return INT2NUM(io->col);
|
216
|
+
}
|
200
217
|
|
201
218
|
return Qnil;
|
202
219
|
}
|
@@ -208,15 +225,17 @@ static VALUE column(VALUE self)
|
|
208
225
|
* Should this parser recover from structural errors? It will not stop processing
|
209
226
|
* file on structural errors if set to true
|
210
227
|
*/
|
211
|
-
static VALUE
|
228
|
+
static VALUE
|
229
|
+
set_recovery(VALUE self, VALUE value)
|
212
230
|
{
|
213
231
|
xmlParserCtxtPtr ctxt;
|
214
232
|
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
215
233
|
|
216
|
-
if(value == Qfalse)
|
234
|
+
if (value == Qfalse) {
|
217
235
|
ctxt->recovery = 0;
|
218
|
-
else
|
236
|
+
} else {
|
219
237
|
ctxt->recovery = 1;
|
238
|
+
}
|
220
239
|
|
221
240
|
return value;
|
222
241
|
}
|
@@ -228,35 +247,33 @@ static VALUE set_recovery(VALUE self, VALUE value)
|
|
228
247
|
* Should this parser recover from structural errors? It will not stop processing
|
229
248
|
* file on structural errors if set to true
|
230
249
|
*/
|
231
|
-
static VALUE
|
250
|
+
static VALUE
|
251
|
+
get_recovery(VALUE self)
|
232
252
|
{
|
233
253
|
xmlParserCtxtPtr ctxt;
|
234
254
|
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
235
255
|
|
236
|
-
if(ctxt->recovery == 0)
|
256
|
+
if (ctxt->recovery == 0) {
|
237
257
|
return Qfalse;
|
238
|
-
else
|
258
|
+
} else {
|
239
259
|
return Qtrue;
|
260
|
+
}
|
240
261
|
}
|
241
262
|
|
242
|
-
void
|
263
|
+
void
|
264
|
+
noko_init_xml_sax_parser_context()
|
243
265
|
{
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
rb_define_method(
|
256
|
-
rb_define_method(
|
257
|
-
rb_define_method(klass, "replace_entities", get_replace_entities, 0);
|
258
|
-
rb_define_method(klass, "recovery=", set_recovery, 1);
|
259
|
-
rb_define_method(klass, "recovery", get_recovery, 0);
|
260
|
-
rb_define_method(klass, "line", line, 0);
|
261
|
-
rb_define_method(klass, "column", column, 0);
|
266
|
+
cNokogiriXmlSaxParserContext = rb_define_class_under(mNokogiriXmlSax, "ParserContext", rb_cObject);
|
267
|
+
|
268
|
+
rb_define_singleton_method(cNokogiriXmlSaxParserContext, "io", parse_io, 2);
|
269
|
+
rb_define_singleton_method(cNokogiriXmlSaxParserContext, "memory", parse_memory, 1);
|
270
|
+
rb_define_singleton_method(cNokogiriXmlSaxParserContext, "file", parse_file, 1);
|
271
|
+
|
272
|
+
rb_define_method(cNokogiriXmlSaxParserContext, "parse_with", parse_with, 1);
|
273
|
+
rb_define_method(cNokogiriXmlSaxParserContext, "replace_entities=", set_replace_entities, 1);
|
274
|
+
rb_define_method(cNokogiriXmlSaxParserContext, "replace_entities", get_replace_entities, 0);
|
275
|
+
rb_define_method(cNokogiriXmlSaxParserContext, "recovery=", set_recovery, 1);
|
276
|
+
rb_define_method(cNokogiriXmlSaxParserContext, "recovery", get_recovery, 0);
|
277
|
+
rb_define_method(cNokogiriXmlSaxParserContext, "line", line, 0);
|
278
|
+
rb_define_method(cNokogiriXmlSaxParserContext, "column", column, 0);
|
262
279
|
}
|
@@ -1,6 +1,9 @@
|
|
1
|
-
#include <
|
1
|
+
#include <nokogiri.h>
|
2
2
|
|
3
|
-
|
3
|
+
VALUE cNokogiriXmlSaxPushParser ;
|
4
|
+
|
5
|
+
static void
|
6
|
+
deallocate(xmlParserCtxtPtr ctx)
|
4
7
|
{
|
5
8
|
NOKOGIRI_DEBUG_START(ctx);
|
6
9
|
if (ctx != NULL) {
|
@@ -10,7 +13,8 @@ static void deallocate(xmlParserCtxtPtr ctx)
|
|
10
13
|
NOKOGIRI_DEBUG_END(ctx);
|
11
14
|
}
|
12
15
|
|
13
|
-
static VALUE
|
16
|
+
static VALUE
|
17
|
+
allocate(VALUE klass)
|
14
18
|
{
|
15
19
|
return Data_Wrap_Struct(klass, NULL, deallocate, NULL);
|
16
20
|
}
|
@@ -21,10 +25,11 @@ static VALUE allocate(VALUE klass)
|
|
21
25
|
*
|
22
26
|
* Write +chunk+ to PushParser. +last_chunk+ triggers the end_document handle
|
23
27
|
*/
|
24
|
-
static VALUE
|
28
|
+
static VALUE
|
29
|
+
native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
|
25
30
|
{
|
26
31
|
xmlParserCtxtPtr ctx;
|
27
|
-
const char *
|
32
|
+
const char *chunk = NULL;
|
28
33
|
int size = 0;
|
29
34
|
|
30
35
|
|
@@ -35,6 +40,8 @@ static VALUE native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
|
|
35
40
|
size = (int)RSTRING_LEN(_chunk);
|
36
41
|
}
|
37
42
|
|
43
|
+
xmlSetStructuredErrorFunc(NULL, NULL);
|
44
|
+
|
38
45
|
if (xmlParseChunk(ctx, chunk, size, Qtrue == _last_chunk ? 1 : 0)) {
|
39
46
|
if (!(ctx->options & XML_PARSE_RECOVER)) {
|
40
47
|
xmlErrorPtr e = xmlCtxtGetLastError(ctx);
|
@@ -51,10 +58,11 @@ static VALUE native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
|
|
51
58
|
*
|
52
59
|
* Initialize the push parser with +xml_sax+ using +filename+
|
53
60
|
*/
|
54
|
-
static VALUE
|
61
|
+
static VALUE
|
62
|
+
initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename)
|
55
63
|
{
|
56
64
|
xmlSAXHandlerPtr sax;
|
57
|
-
const char *
|
65
|
+
const char *filename = NULL;
|
58
66
|
xmlParserCtxtPtr ctx;
|
59
67
|
|
60
68
|
Data_Get_Struct(_xml_sax, xmlSAXHandler, sax);
|
@@ -79,7 +87,8 @@ static VALUE initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename)
|
|
79
87
|
return self;
|
80
88
|
}
|
81
89
|
|
82
|
-
static VALUE
|
90
|
+
static VALUE
|
91
|
+
get_options(VALUE self)
|
83
92
|
{
|
84
93
|
xmlParserCtxtPtr ctx;
|
85
94
|
Data_Get_Struct(self, xmlParserCtxt, ctx);
|
@@ -87,7 +96,8 @@ static VALUE get_options(VALUE self)
|
|
87
96
|
return INT2NUM(ctx->options);
|
88
97
|
}
|
89
98
|
|
90
|
-
static VALUE
|
99
|
+
static VALUE
|
100
|
+
set_options(VALUE self, VALUE options)
|
91
101
|
{
|
92
102
|
xmlParserCtxtPtr ctx;
|
93
103
|
Data_Get_Struct(self, xmlParserCtxt, ctx);
|
@@ -106,7 +116,8 @@ static VALUE set_options(VALUE self, VALUE options)
|
|
106
116
|
* Should this parser replace entities? & will get converted to '&' if
|
107
117
|
* set to true
|
108
118
|
*/
|
109
|
-
static VALUE
|
119
|
+
static VALUE
|
120
|
+
get_replace_entities(VALUE self)
|
110
121
|
{
|
111
122
|
xmlParserCtxtPtr ctx;
|
112
123
|
Data_Get_Struct(self, xmlParserCtxt, ctx);
|
@@ -125,7 +136,8 @@ static VALUE get_replace_entities(VALUE self)
|
|
125
136
|
* Should this parser replace entities? & will get converted to '&' if
|
126
137
|
* set to true
|
127
138
|
*/
|
128
|
-
static VALUE
|
139
|
+
static VALUE
|
140
|
+
set_replace_entities(VALUE self, VALUE value)
|
129
141
|
{
|
130
142
|
xmlParserCtxtPtr ctx;
|
131
143
|
Data_Get_Struct(self, xmlParserCtxt, ctx);
|
@@ -139,21 +151,18 @@ static VALUE set_replace_entities(VALUE self, VALUE value)
|
|
139
151
|
return value;
|
140
152
|
}
|
141
153
|
|
142
|
-
|
143
|
-
|
154
|
+
void
|
155
|
+
noko_init_xml_sax_push_parser()
|
144
156
|
{
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
cNokogiriXmlSaxPushParser =
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
rb_define_private_method(
|
155
|
-
|
156
|
-
rb_define_method(klass, "options=", set_options, 1);
|
157
|
-
rb_define_method(klass, "replace_entities", get_replace_entities, 0);
|
158
|
-
rb_define_method(klass, "replace_entities=", set_replace_entities, 1);
|
157
|
+
cNokogiriXmlSaxPushParser = rb_define_class_under(mNokogiriXmlSax, "PushParser", rb_cObject);
|
158
|
+
|
159
|
+
rb_define_alloc_func(cNokogiriXmlSaxPushParser, allocate);
|
160
|
+
|
161
|
+
rb_define_method(cNokogiriXmlSaxPushParser, "options", get_options, 0);
|
162
|
+
rb_define_method(cNokogiriXmlSaxPushParser, "options=", set_options, 1);
|
163
|
+
rb_define_method(cNokogiriXmlSaxPushParser, "replace_entities", get_replace_entities, 0);
|
164
|
+
rb_define_method(cNokogiriXmlSaxPushParser, "replace_entities=", set_replace_entities, 1);
|
165
|
+
|
166
|
+
rb_define_private_method(cNokogiriXmlSaxPushParser, "initialize_native", initialize_native, 2);
|
167
|
+
rb_define_private_method(cNokogiriXmlSaxPushParser, "native_write", native_write, 2);
|
159
168
|
}
|
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,7 +98,8 @@ 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
|
{
|
98
104
|
VALUE content;
|
99
105
|
VALUE parse_options;
|
@@ -107,7 +113,7 @@ static VALUE read_memory(int argc, VALUE *argv, VALUE klass)
|
|
107
113
|
|
108
114
|
scanned_args = rb_scan_args(argc, argv, "11", &content, &parse_options);
|
109
115
|
if (scanned_args == 1) {
|
110
|
-
parse_options =
|
116
|
+
parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA"));
|
111
117
|
}
|
112
118
|
parse_options_int = (int)NUM2INT(rb_funcall(parse_options, rb_intern("to_i"), 0));
|
113
119
|
|
@@ -121,7 +127,7 @@ static VALUE read_memory(int argc, VALUE *argv, VALUE klass)
|
|
121
127
|
ctx,
|
122
128
|
Nokogiri_error_array_pusher,
|
123
129
|
(void *)errors
|
124
|
-
|
130
|
+
);
|
125
131
|
#endif
|
126
132
|
|
127
133
|
if (parse_options_int & XML_PARSE_NONET) {
|
@@ -138,12 +144,13 @@ static VALUE read_memory(int argc, VALUE *argv, VALUE klass)
|
|
138
144
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
139
145
|
xmlSchemaFreeParserCtxt(ctx);
|
140
146
|
|
141
|
-
if(NULL == schema) {
|
147
|
+
if (NULL == schema) {
|
142
148
|
xmlErrorPtr error = xmlGetLastError();
|
143
|
-
if(error)
|
149
|
+
if (error) {
|
144
150
|
Nokogiri_error_raise(NULL, error);
|
145
|
-
else
|
151
|
+
} else {
|
146
152
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
153
|
+
}
|
147
154
|
|
148
155
|
return Qnil;
|
149
156
|
}
|
@@ -160,24 +167,25 @@ static VALUE read_memory(int argc, VALUE *argv, VALUE klass)
|
|
160
167
|
* out from under the VALUE pointer. This function checks to see if any of
|
161
168
|
* those nodes have been exposed to Ruby, and if so we should raise an exception.
|
162
169
|
*/
|
163
|
-
static int
|
170
|
+
static int
|
171
|
+
has_blank_nodes_p(VALUE cache)
|
164
172
|
{
|
165
|
-
|
173
|
+
long i;
|
166
174
|
|
167
|
-
|
168
|
-
|
169
|
-
|
175
|
+
if (NIL_P(cache)) {
|
176
|
+
return 0;
|
177
|
+
}
|
170
178
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
}
|
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;
|
178
185
|
}
|
186
|
+
}
|
179
187
|
|
180
|
-
|
188
|
+
return 0;
|
181
189
|
}
|
182
190
|
|
183
191
|
/*
|
@@ -186,7 +194,8 @@ static int has_blank_nodes_p(VALUE cache)
|
|
186
194
|
*
|
187
195
|
* Create a new Schema from the Nokogiri::XML::Document +doc+
|
188
196
|
*/
|
189
|
-
static VALUE
|
197
|
+
static VALUE
|
198
|
+
from_document(int argc, VALUE *argv, VALUE klass)
|
190
199
|
{
|
191
200
|
VALUE document;
|
192
201
|
VALUE parse_options;
|
@@ -205,7 +214,7 @@ static VALUE from_document(int argc, VALUE *argv, VALUE klass)
|
|
205
214
|
doc = doc->doc; /* In case someone passes us a node. ugh. */
|
206
215
|
|
207
216
|
if (scanned_args == 1) {
|
208
|
-
parse_options =
|
217
|
+
parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA"));
|
209
218
|
}
|
210
219
|
parse_options_int = (int)NUM2INT(rb_funcall(parse_options, rb_intern("to_i"), 0));
|
211
220
|
|
@@ -240,12 +249,13 @@ static VALUE from_document(int argc, VALUE *argv, VALUE klass)
|
|
240
249
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
241
250
|
xmlSchemaFreeParserCtxt(ctx);
|
242
251
|
|
243
|
-
if(NULL == schema) {
|
252
|
+
if (NULL == schema) {
|
244
253
|
xmlErrorPtr error = xmlGetLastError();
|
245
|
-
if(error)
|
254
|
+
if (error) {
|
246
255
|
Nokogiri_error_raise(NULL, error);
|
247
|
-
else
|
256
|
+
} else {
|
248
257
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
258
|
+
}
|
249
259
|
|
250
260
|
return Qnil;
|
251
261
|
}
|
@@ -259,18 +269,14 @@ static VALUE from_document(int argc, VALUE *argv, VALUE klass)
|
|
259
269
|
return Qnil;
|
260
270
|
}
|
261
271
|
|
262
|
-
|
263
|
-
|
272
|
+
void
|
273
|
+
noko_init_xml_schema()
|
264
274
|
{
|
265
|
-
|
266
|
-
VALUE xml = rb_define_module_under(nokogiri, "XML");
|
267
|
-
VALUE klass = rb_define_class_under(xml, "Schema", rb_cObject);
|
268
|
-
|
269
|
-
cNokogiriXmlSchema = klass;
|
275
|
+
cNokogiriXmlSchema = rb_define_class_under(mNokogiriXml, "Schema", rb_cObject);
|
270
276
|
|
271
|
-
rb_define_singleton_method(
|
272
|
-
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);
|
273
279
|
|
274
|
-
rb_define_private_method(
|
275
|
-
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);
|
276
282
|
}
|