nokogiri 1.16.8-x86_64-linux → 1.17.0-x86_64-linux
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +11 -21
- data/README.md +4 -0
- data/dependencies.yml +6 -6
- data/ext/nokogiri/extconf.rb +191 -137
- data/ext/nokogiri/gumbo.c +69 -53
- data/ext/nokogiri/html4_document.c +10 -4
- data/ext/nokogiri/html4_element_description.c +18 -18
- data/ext/nokogiri/html4_sax_parser.c +40 -0
- data/ext/nokogiri/html4_sax_parser_context.c +48 -58
- data/ext/nokogiri/html4_sax_push_parser.c +25 -24
- data/ext/nokogiri/include/libexslt/exsltconfig.h +3 -3
- data/ext/nokogiri/include/libxml2/libxml/HTMLparser.h +12 -19
- data/ext/nokogiri/include/libxml2/libxml/c14n.h +1 -12
- data/ext/nokogiri/include/libxml2/libxml/debugXML.h +1 -1
- data/ext/nokogiri/include/libxml2/libxml/encoding.h +9 -0
- data/ext/nokogiri/include/libxml2/libxml/entities.h +12 -1
- data/ext/nokogiri/include/libxml2/libxml/hash.h +19 -0
- data/ext/nokogiri/include/libxml2/libxml/list.h +2 -2
- data/ext/nokogiri/include/libxml2/libxml/nanohttp.h +17 -0
- data/ext/nokogiri/include/libxml2/libxml/parser.h +60 -54
- data/ext/nokogiri/include/libxml2/libxml/parserInternals.h +9 -1
- data/ext/nokogiri/include/libxml2/libxml/pattern.h +6 -0
- data/ext/nokogiri/include/libxml2/libxml/tree.h +32 -12
- data/ext/nokogiri/include/libxml2/libxml/uri.h +11 -0
- data/ext/nokogiri/include/libxml2/libxml/valid.h +29 -2
- data/ext/nokogiri/include/libxml2/libxml/xinclude.h +7 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlIO.h +21 -4
- data/ext/nokogiri/include/libxml2/libxml/xmlerror.h +14 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlexports.h +111 -15
- data/ext/nokogiri/include/libxml2/libxml/xmlmemory.h +8 -45
- data/ext/nokogiri/include/libxml2/libxml/xmlreader.h +2 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlsave.h +5 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlunicode.h +165 -1
- data/ext/nokogiri/include/libxml2/libxml/xmlversion.h +7 -171
- data/ext/nokogiri/include/libxml2/libxml/xmlwriter.h +1 -0
- data/ext/nokogiri/include/libxml2/libxml/xpath.h +4 -0
- data/ext/nokogiri/include/libxslt/xsltInternals.h +3 -0
- data/ext/nokogiri/include/libxslt/xsltconfig.h +4 -37
- data/ext/nokogiri/libxml2_polyfill.c +114 -0
- data/ext/nokogiri/nokogiri.c +9 -2
- data/ext/nokogiri/nokogiri.h +18 -33
- data/ext/nokogiri/xml_attr.c +1 -1
- data/ext/nokogiri/xml_cdata.c +2 -10
- data/ext/nokogiri/xml_comment.c +3 -8
- data/ext/nokogiri/xml_document.c +163 -156
- data/ext/nokogiri/xml_document_fragment.c +10 -25
- data/ext/nokogiri/xml_dtd.c +1 -1
- data/ext/nokogiri/xml_element_content.c +9 -9
- data/ext/nokogiri/xml_encoding_handler.c +4 -4
- data/ext/nokogiri/xml_namespace.c +6 -6
- data/ext/nokogiri/xml_node.c +130 -104
- data/ext/nokogiri/xml_node_set.c +46 -44
- data/ext/nokogiri/xml_reader.c +54 -58
- data/ext/nokogiri/xml_relax_ng.c +35 -56
- data/ext/nokogiri/xml_sax_parser.c +156 -88
- data/ext/nokogiri/xml_sax_parser_context.c +213 -131
- data/ext/nokogiri/xml_sax_push_parser.c +68 -49
- data/ext/nokogiri/xml_schema.c +50 -85
- data/ext/nokogiri/xml_syntax_error.c +19 -11
- data/ext/nokogiri/xml_text.c +2 -4
- data/ext/nokogiri/xml_xpath_context.c +2 -2
- data/ext/nokogiri/xslt_stylesheet.c +8 -8
- data/lib/nokogiri/3.0/nokogiri.so +0 -0
- data/lib/nokogiri/3.1/nokogiri.so +0 -0
- data/lib/nokogiri/3.2/nokogiri.so +0 -0
- data/lib/nokogiri/3.3/nokogiri.so +0 -0
- data/lib/nokogiri/class_resolver.rb +1 -1
- data/lib/nokogiri/css/node.rb +6 -2
- data/lib/nokogiri/css/parser.rb +6 -4
- data/lib/nokogiri/css/parser.y +2 -2
- data/lib/nokogiri/css/parser_extras.rb +6 -66
- data/lib/nokogiri/css/selector_cache.rb +38 -0
- data/lib/nokogiri/css/tokenizer.rb +4 -4
- data/lib/nokogiri/css/tokenizer.rex +9 -8
- data/lib/nokogiri/css/xpath_visitor.rb +42 -6
- data/lib/nokogiri/css.rb +86 -20
- data/lib/nokogiri/decorators/slop.rb +3 -5
- data/lib/nokogiri/encoding_handler.rb +2 -2
- data/lib/nokogiri/html4/document.rb +44 -23
- data/lib/nokogiri/html4/document_fragment.rb +124 -12
- data/lib/nokogiri/html4/encoding_reader.rb +1 -1
- data/lib/nokogiri/html4/sax/parser.rb +23 -38
- data/lib/nokogiri/html4/sax/parser_context.rb +4 -9
- data/lib/nokogiri/html4.rb +9 -14
- data/lib/nokogiri/html5/builder.rb +40 -0
- data/lib/nokogiri/html5/document.rb +61 -30
- data/lib/nokogiri/html5/document_fragment.rb +130 -20
- data/lib/nokogiri/html5/node.rb +4 -4
- data/lib/nokogiri/html5.rb +114 -72
- data/lib/nokogiri/version/constant.rb +1 -1
- data/lib/nokogiri/xml/builder.rb +8 -1
- data/lib/nokogiri/xml/document.rb +70 -26
- data/lib/nokogiri/xml/document_fragment.rb +84 -13
- data/lib/nokogiri/xml/node.rb +82 -11
- data/lib/nokogiri/xml/node_set.rb +9 -7
- data/lib/nokogiri/xml/parse_options.rb +1 -1
- data/lib/nokogiri/xml/pp/node.rb +6 -1
- data/lib/nokogiri/xml/reader.rb +46 -13
- data/lib/nokogiri/xml/relax_ng.rb +57 -20
- data/lib/nokogiri/xml/sax/document.rb +174 -83
- data/lib/nokogiri/xml/sax/parser.rb +115 -41
- data/lib/nokogiri/xml/sax/parser_context.rb +116 -8
- data/lib/nokogiri/xml/sax/push_parser.rb +3 -0
- data/lib/nokogiri/xml/sax.rb +48 -0
- data/lib/nokogiri/xml/schema.rb +112 -45
- data/lib/nokogiri/xml/searchable.rb +6 -8
- data/lib/nokogiri/xml/syntax_error.rb +22 -0
- data/lib/nokogiri/xml.rb +13 -24
- data/lib/nokogiri/xslt.rb +3 -9
- data/lib/xsd/xmlparser/nokogiri.rb +3 -4
- metadata +8 -4
- data/ext/nokogiri/libxml2_backwards_compat.c +0 -121
@@ -6,14 +6,16 @@ static void
|
|
6
6
|
xml_sax_push_parser_free(void *data)
|
7
7
|
{
|
8
8
|
xmlParserCtxtPtr ctx = data;
|
9
|
-
if (ctx
|
10
|
-
|
9
|
+
if (ctx->myDoc) {
|
10
|
+
xmlFreeDoc(ctx->myDoc);
|
11
|
+
}
|
12
|
+
if (ctx) {
|
11
13
|
xmlFreeParserCtxt(ctx);
|
12
14
|
}
|
13
15
|
}
|
14
16
|
|
15
17
|
static const rb_data_type_t xml_sax_push_parser_type = {
|
16
|
-
.wrap_struct_name = "
|
18
|
+
.wrap_struct_name = "xmlParserCtxt",
|
17
19
|
.function = {
|
18
20
|
.dfree = xml_sax_push_parser_free,
|
19
21
|
},
|
@@ -21,7 +23,7 @@ static const rb_data_type_t xml_sax_push_parser_type = {
|
|
21
23
|
};
|
22
24
|
|
23
25
|
static VALUE
|
24
|
-
|
26
|
+
xml_sax_push_parser_allocate(VALUE klass)
|
25
27
|
{
|
26
28
|
return TypedData_Wrap_Struct(klass, &xml_sax_push_parser_type, NULL);
|
27
29
|
}
|
@@ -35,19 +37,15 @@ noko_xml_sax_push_parser_unwrap(VALUE rb_parser)
|
|
35
37
|
}
|
36
38
|
|
37
39
|
/*
|
38
|
-
* call-seq:
|
39
|
-
* native_write(chunk, last_chunk)
|
40
|
-
*
|
41
40
|
* Write +chunk+ to PushParser. +last_chunk+ triggers the end_document handle
|
42
41
|
*/
|
43
42
|
static VALUE
|
44
|
-
|
43
|
+
noko_xml_sax_push_parser__native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
|
45
44
|
{
|
46
45
|
xmlParserCtxtPtr ctx;
|
47
46
|
const char *chunk = NULL;
|
48
47
|
int size = 0;
|
49
48
|
|
50
|
-
|
51
49
|
ctx = noko_xml_sax_push_parser_unwrap(self);
|
52
50
|
|
53
51
|
if (Qnil != _chunk) {
|
@@ -58,9 +56,9 @@ native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
|
|
58
56
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
59
57
|
|
60
58
|
if (xmlParseChunk(ctx, chunk, size, Qtrue == _last_chunk ? 1 : 0)) {
|
61
|
-
if (!(ctx
|
59
|
+
if (!(xmlCtxtGetOptions(ctx) & XML_PARSE_RECOVER)) {
|
62
60
|
xmlErrorConstPtr e = xmlCtxtGetLastError(ctx);
|
63
|
-
|
61
|
+
noko__error_raise(NULL, e);
|
64
62
|
}
|
65
63
|
}
|
66
64
|
|
@@ -74,13 +72,13 @@ native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
|
|
74
72
|
* Initialize the push parser with +xml_sax+ using +filename+
|
75
73
|
*/
|
76
74
|
static VALUE
|
77
|
-
|
75
|
+
noko_xml_sax_push_parser__initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename)
|
78
76
|
{
|
79
77
|
xmlSAXHandlerPtr sax;
|
80
78
|
const char *filename = NULL;
|
81
79
|
xmlParserCtxtPtr ctx;
|
82
80
|
|
83
|
-
sax =
|
81
|
+
sax = noko_xml_sax_parser_unwrap(_xml_sax);
|
84
82
|
|
85
83
|
if (_filename != Qnil) { filename = StringValueCStr(_filename); }
|
86
84
|
|
@@ -95,32 +93,34 @@ initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename)
|
|
95
93
|
rb_raise(rb_eRuntimeError, "Could not create a parser context");
|
96
94
|
}
|
97
95
|
|
98
|
-
ctx->userData =
|
96
|
+
ctx->userData = ctx;
|
97
|
+
ctx->_private = (void *)_xml_sax;
|
99
98
|
|
100
|
-
ctx->sax2 = 1;
|
101
99
|
DATA_PTR(self) = ctx;
|
102
100
|
return self;
|
103
101
|
}
|
104
102
|
|
105
103
|
static VALUE
|
106
|
-
|
104
|
+
noko_xml_sax_push_parser__options_get(VALUE self)
|
107
105
|
{
|
108
106
|
xmlParserCtxtPtr ctx;
|
109
107
|
|
110
108
|
ctx = noko_xml_sax_push_parser_unwrap(self);
|
111
109
|
|
112
|
-
return INT2NUM(ctx
|
110
|
+
return INT2NUM(xmlCtxtGetOptions(ctx));
|
113
111
|
}
|
114
112
|
|
115
113
|
static VALUE
|
116
|
-
|
114
|
+
noko_xml_sax_push_parser__options_set(VALUE self, VALUE options)
|
117
115
|
{
|
116
|
+
int error;
|
118
117
|
xmlParserCtxtPtr ctx;
|
119
118
|
|
120
119
|
ctx = noko_xml_sax_push_parser_unwrap(self);
|
121
120
|
|
122
|
-
|
123
|
-
|
121
|
+
error = xmlCtxtSetOptions(ctx, (int)NUM2INT(options));
|
122
|
+
if (error) {
|
123
|
+
rb_raise(rb_eRuntimeError, "Cannot set XML parser context options (%x)", error);
|
124
124
|
}
|
125
125
|
|
126
126
|
return Qnil;
|
@@ -128,43 +128,56 @@ set_options(VALUE self, VALUE options)
|
|
128
128
|
|
129
129
|
/*
|
130
130
|
* call-seq:
|
131
|
-
*
|
131
|
+
* replace_entities
|
132
|
+
*
|
133
|
+
* See Document@Entity+Handling for an explanation of the behavior controlled by this flag.
|
134
|
+
*
|
135
|
+
* [Returns] (Boolean) Value of the parse option. (Default +false+)
|
132
136
|
*
|
133
|
-
*
|
134
|
-
*
|
137
|
+
* This option is perhaps misnamed by the libxml2 author, since it controls resolution and not
|
138
|
+
* replacement.
|
135
139
|
*/
|
136
140
|
static VALUE
|
137
|
-
|
141
|
+
noko_xml_sax_push_parser__replace_entities_get(VALUE self)
|
138
142
|
{
|
139
|
-
xmlParserCtxtPtr
|
140
|
-
|
141
|
-
ctx = noko_xml_sax_push_parser_unwrap(self);
|
143
|
+
xmlParserCtxtPtr ctxt = noko_xml_sax_push_parser_unwrap(self);
|
142
144
|
|
143
|
-
if (
|
144
|
-
return Qfalse;
|
145
|
-
} else {
|
145
|
+
if (xmlCtxtGetOptions(ctxt) & XML_PARSE_NOENT) {
|
146
146
|
return Qtrue;
|
147
|
+
} else {
|
148
|
+
return Qfalse;
|
147
149
|
}
|
148
150
|
}
|
149
151
|
|
150
152
|
/*
|
151
153
|
* call-seq:
|
152
|
-
*
|
154
|
+
* replace_entities=(value)
|
155
|
+
*
|
156
|
+
* See Document@Entity+Handling for an explanation of the behavior controlled by this flag.
|
157
|
+
*
|
158
|
+
* [Parameters]
|
159
|
+
* - +value+ (Boolean) Whether external parsed entities will be resolved.
|
153
160
|
*
|
154
|
-
*
|
155
|
-
*
|
161
|
+
* ⚠ <b>It is UNSAFE to set this option to +true+</b> when parsing untrusted documents. The option
|
162
|
+
* defaults to +false+ for this reason.
|
163
|
+
*
|
164
|
+
* This option is perhaps misnamed by the libxml2 author, since it controls resolution and not
|
165
|
+
* replacement.
|
156
166
|
*/
|
157
167
|
static VALUE
|
158
|
-
|
168
|
+
noko_xml_sax_push_parser__replace_entities_set(VALUE self, VALUE value)
|
159
169
|
{
|
160
|
-
|
170
|
+
int error;
|
171
|
+
xmlParserCtxtPtr ctxt = noko_xml_sax_push_parser_unwrap(self);
|
161
172
|
|
162
|
-
|
163
|
-
|
164
|
-
if (Qfalse == value) {
|
165
|
-
ctx->replaceEntities = 0;
|
173
|
+
if (RB_TEST(value)) {
|
174
|
+
error = xmlCtxtSetOptions(ctxt, xmlCtxtGetOptions(ctxt) | XML_PARSE_NOENT);
|
166
175
|
} else {
|
167
|
-
|
176
|
+
error = xmlCtxtSetOptions(ctxt, xmlCtxtGetOptions(ctxt) & ~XML_PARSE_NOENT);
|
177
|
+
}
|
178
|
+
|
179
|
+
if (error) {
|
180
|
+
rb_raise(rb_eRuntimeError, "failed to set parser context options (%x)", error);
|
168
181
|
}
|
169
182
|
|
170
183
|
return value;
|
@@ -175,13 +188,19 @@ noko_init_xml_sax_push_parser(void)
|
|
175
188
|
{
|
176
189
|
cNokogiriXmlSaxPushParser = rb_define_class_under(mNokogiriXmlSax, "PushParser", rb_cObject);
|
177
190
|
|
178
|
-
rb_define_alloc_func(cNokogiriXmlSaxPushParser,
|
179
|
-
|
180
|
-
rb_define_method(cNokogiriXmlSaxPushParser, "options",
|
181
|
-
|
182
|
-
rb_define_method(cNokogiriXmlSaxPushParser, "
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
191
|
+
rb_define_alloc_func(cNokogiriXmlSaxPushParser, xml_sax_push_parser_allocate);
|
192
|
+
|
193
|
+
rb_define_method(cNokogiriXmlSaxPushParser, "options",
|
194
|
+
noko_xml_sax_push_parser__options_get, 0);
|
195
|
+
rb_define_method(cNokogiriXmlSaxPushParser, "options=",
|
196
|
+
noko_xml_sax_push_parser__options_set, 1);
|
197
|
+
rb_define_method(cNokogiriXmlSaxPushParser, "replace_entities",
|
198
|
+
noko_xml_sax_push_parser__replace_entities_get, 0);
|
199
|
+
rb_define_method(cNokogiriXmlSaxPushParser, "replace_entities=",
|
200
|
+
noko_xml_sax_push_parser__replace_entities_set, 1);
|
201
|
+
|
202
|
+
rb_define_private_method(cNokogiriXmlSaxPushParser, "initialize_native",
|
203
|
+
noko_xml_sax_push_parser__initialize_native, 2);
|
204
|
+
rb_define_private_method(cNokogiriXmlSaxPushParser, "native_write",
|
205
|
+
noko_xml_sax_push_parser__native_write, 2);
|
187
206
|
}
|
data/ext/nokogiri/xml_schema.c
CHANGED
@@ -10,21 +10,15 @@ xml_schema_deallocate(void *data)
|
|
10
10
|
}
|
11
11
|
|
12
12
|
static const rb_data_type_t xml_schema_type = {
|
13
|
-
.wrap_struct_name = "
|
13
|
+
.wrap_struct_name = "xmlSchema",
|
14
14
|
.function = {
|
15
15
|
.dfree = xml_schema_deallocate,
|
16
16
|
},
|
17
17
|
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
18
18
|
};
|
19
19
|
|
20
|
-
/*
|
21
|
-
* call-seq:
|
22
|
-
* validate_document(document)
|
23
|
-
*
|
24
|
-
* Validate a Nokogiri::XML::Document against this Schema.
|
25
|
-
*/
|
26
20
|
static VALUE
|
27
|
-
|
21
|
+
noko_xml_schema__validate_document(VALUE self, VALUE document)
|
28
22
|
{
|
29
23
|
xmlDocPtr doc;
|
30
24
|
xmlSchemaPtr schema;
|
@@ -43,29 +37,27 @@ validate_document(VALUE self, VALUE document)
|
|
43
37
|
rb_raise(rb_eRuntimeError, "Could not create a validation context");
|
44
38
|
}
|
45
39
|
|
46
|
-
#ifdef HAVE_XMLSCHEMASETVALIDSTRUCTUREDERRORS
|
47
40
|
xmlSchemaSetValidStructuredErrors(
|
48
41
|
valid_ctxt,
|
49
|
-
|
42
|
+
noko__error_array_pusher,
|
50
43
|
(void *)errors
|
51
44
|
);
|
52
|
-
#endif
|
53
45
|
|
54
|
-
xmlSchemaValidateDoc(valid_ctxt, doc);
|
46
|
+
int status = xmlSchemaValidateDoc(valid_ctxt, doc);
|
55
47
|
|
56
48
|
xmlSchemaFreeValidCtxt(valid_ctxt);
|
57
49
|
|
50
|
+
if (status != 0) {
|
51
|
+
if (RARRAY_LEN(errors) == 0) {
|
52
|
+
rb_ary_push(errors, rb_str_new2("Could not validate document"));
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
58
56
|
return errors;
|
59
57
|
}
|
60
58
|
|
61
|
-
/*
|
62
|
-
* call-seq:
|
63
|
-
* validate_file(filename)
|
64
|
-
*
|
65
|
-
* Validate a file against this Schema.
|
66
|
-
*/
|
67
59
|
static VALUE
|
68
|
-
|
60
|
+
noko_xml_schema__validate_file(VALUE self, VALUE rb_filename)
|
69
61
|
{
|
70
62
|
xmlSchemaPtr schema;
|
71
63
|
xmlSchemaValidCtxtPtr valid_ctxt;
|
@@ -84,33 +76,34 @@ validate_file(VALUE self, VALUE rb_filename)
|
|
84
76
|
rb_raise(rb_eRuntimeError, "Could not create a validation context");
|
85
77
|
}
|
86
78
|
|
87
|
-
#ifdef HAVE_XMLSCHEMASETVALIDSTRUCTUREDERRORS
|
88
79
|
xmlSchemaSetValidStructuredErrors(
|
89
80
|
valid_ctxt,
|
90
|
-
|
81
|
+
noko__error_array_pusher,
|
91
82
|
(void *)errors
|
92
83
|
);
|
93
|
-
#endif
|
94
84
|
|
95
|
-
xmlSchemaValidateFile(valid_ctxt, filename, 0);
|
85
|
+
int status = xmlSchemaValidateFile(valid_ctxt, filename, 0);
|
96
86
|
|
97
87
|
xmlSchemaFreeValidCtxt(valid_ctxt);
|
98
88
|
|
89
|
+
if (status != 0) {
|
90
|
+
if (RARRAY_LEN(errors) == 0) {
|
91
|
+
rb_ary_push(errors, rb_str_new2("Could not validate file."));
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
99
95
|
return errors;
|
100
96
|
}
|
101
97
|
|
102
98
|
static VALUE
|
103
99
|
xml_schema_parse_schema(
|
104
|
-
VALUE
|
100
|
+
VALUE rb_class,
|
105
101
|
xmlSchemaParserCtxtPtr c_parser_context,
|
106
102
|
VALUE rb_parse_options
|
107
103
|
)
|
108
104
|
{
|
109
|
-
|
110
|
-
|
111
|
-
xmlSchemaPtr c_schema;
|
112
|
-
xmlExternalEntityLoader old_loader = 0;
|
113
|
-
VALUE rb_schema;
|
105
|
+
xmlExternalEntityLoader saved_loader = 0;
|
106
|
+
libxmlStructuredErrorHandlerState handler_state;
|
114
107
|
|
115
108
|
if (NIL_P(rb_parse_options)) {
|
116
109
|
rb_parse_options = rb_const_get_at(
|
@@ -118,45 +111,41 @@ xml_schema_parse_schema(
|
|
118
111
|
rb_intern("DEFAULT_SCHEMA")
|
119
112
|
);
|
120
113
|
}
|
114
|
+
int c_parse_options = (int)NUM2INT(rb_funcall(rb_parse_options, rb_intern("to_i"), 0));
|
121
115
|
|
122
|
-
rb_errors = rb_ary_new();
|
123
|
-
|
116
|
+
VALUE rb_errors = rb_ary_new();
|
117
|
+
noko__structured_error_func_save_and_set(&handler_state, (void *)rb_errors, noko__error_array_pusher);
|
124
118
|
|
125
|
-
#ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS
|
126
119
|
xmlSchemaSetParserStructuredErrors(
|
127
120
|
c_parser_context,
|
128
|
-
|
121
|
+
noko__error_array_pusher,
|
129
122
|
(void *)rb_errors
|
130
123
|
);
|
131
|
-
#endif
|
132
124
|
|
133
|
-
|
134
|
-
|
135
|
-
old_loader = xmlGetExternalEntityLoader();
|
125
|
+
if (c_parse_options & XML_PARSE_NONET) {
|
126
|
+
saved_loader = xmlGetExternalEntityLoader();
|
136
127
|
xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
|
137
128
|
}
|
138
129
|
|
139
|
-
c_schema = xmlSchemaParse(c_parser_context);
|
130
|
+
xmlSchemaPtr c_schema = xmlSchemaParse(c_parser_context);
|
140
131
|
|
141
|
-
if (
|
142
|
-
xmlSetExternalEntityLoader(
|
132
|
+
if (saved_loader) {
|
133
|
+
xmlSetExternalEntityLoader(saved_loader);
|
143
134
|
}
|
144
135
|
|
145
|
-
xmlSetStructuredErrorFunc(NULL, NULL);
|
146
136
|
xmlSchemaFreeParserCtxt(c_parser_context);
|
137
|
+
noko__structured_error_func_restore(&handler_state);
|
147
138
|
|
148
139
|
if (NULL == c_schema) {
|
149
|
-
|
150
|
-
if (
|
151
|
-
|
140
|
+
VALUE exception = rb_funcall(cNokogiriXmlSyntaxError, rb_intern("aggregate"), 1, rb_errors);
|
141
|
+
if (RB_TEST(exception)) {
|
142
|
+
rb_exc_raise(exception);
|
152
143
|
} else {
|
153
144
|
rb_raise(rb_eRuntimeError, "Could not parse document");
|
154
145
|
}
|
155
|
-
|
156
|
-
return Qnil;
|
157
146
|
}
|
158
147
|
|
159
|
-
rb_schema = TypedData_Wrap_Struct(
|
148
|
+
VALUE rb_schema = TypedData_Wrap_Struct(rb_class, &xml_schema_type, c_schema);
|
160
149
|
rb_iv_set(rb_schema, "@errors", rb_errors);
|
161
150
|
rb_iv_set(rb_schema, "@parse_options", rb_parse_options);
|
162
151
|
|
@@ -164,47 +153,24 @@ xml_schema_parse_schema(
|
|
164
153
|
}
|
165
154
|
|
166
155
|
/*
|
167
|
-
* call-seq:
|
168
|
-
*
|
169
|
-
*
|
170
|
-
* Create a new schema parsed from the contents of +string+
|
171
|
-
*
|
172
|
-
* [Parameters]
|
173
|
-
* - +string+: String containing XML to be parsed as a schema
|
174
|
-
*
|
175
|
-
* [Returns] Nokogiri::XML::Schema
|
176
|
-
*/
|
177
|
-
static VALUE
|
178
|
-
read_memory(int argc, VALUE *argv, VALUE klass)
|
179
|
-
{
|
180
|
-
VALUE rb_content;
|
181
|
-
VALUE rb_parse_options;
|
182
|
-
xmlSchemaParserCtxtPtr c_parser_context;
|
183
|
-
|
184
|
-
rb_scan_args(argc, argv, "11", &rb_content, &rb_parse_options);
|
185
|
-
|
186
|
-
c_parser_context = xmlSchemaNewMemParserCtxt(
|
187
|
-
(const char *)StringValuePtr(rb_content),
|
188
|
-
(int)RSTRING_LEN(rb_content)
|
189
|
-
);
|
190
|
-
|
191
|
-
return xml_schema_parse_schema(klass, c_parser_context, rb_parse_options);
|
192
|
-
}
|
193
|
-
|
194
|
-
/*
|
195
|
-
* call-seq:
|
196
|
-
* from_document(document) → Nokogiri::XML::Schema
|
156
|
+
* :call-seq:
|
157
|
+
* from_document(input) → Nokogiri::XML::Schema
|
158
|
+
* from_document(input, parse_options) → Nokogiri::XML::Schema
|
197
159
|
*
|
198
|
-
*
|
160
|
+
* Parse an \XSD schema definition from a Document to create a new Nokogiri::XML::Schema
|
199
161
|
*
|
200
162
|
* [Parameters]
|
201
|
-
* - +
|
163
|
+
* - +input+ (XML::Document) A document containing the \XSD schema definition
|
164
|
+
* - +parse_options+ (Nokogiri::XML::ParseOptions)
|
165
|
+
* Defaults to Nokogiri::XML::ParseOptions::DEFAULT_SCHEMA
|
202
166
|
*
|
203
167
|
* [Returns] Nokogiri::XML::Schema
|
204
168
|
*/
|
205
169
|
static VALUE
|
206
|
-
|
170
|
+
noko_xml_schema_s_from_document(int argc, VALUE *argv, VALUE rb_class)
|
207
171
|
{
|
172
|
+
/* TODO: deprecate this method and put file-or-string logic into .new so that becomes the
|
173
|
+
* preferred entry point, and this can become a private method */
|
208
174
|
VALUE rb_document;
|
209
175
|
VALUE rb_parse_options;
|
210
176
|
VALUE rb_schema;
|
@@ -236,7 +202,7 @@ rb_xml_schema_s_from_document(int argc, VALUE *argv, VALUE klass)
|
|
236
202
|
}
|
237
203
|
|
238
204
|
c_parser_context = xmlSchemaNewDocParserCtxt(c_document);
|
239
|
-
rb_schema = xml_schema_parse_schema(
|
205
|
+
rb_schema = xml_schema_parse_schema(rb_class, c_parser_context, rb_parse_options);
|
240
206
|
|
241
207
|
if (defensive_copy_p) {
|
242
208
|
xmlFreeDoc(c_document);
|
@@ -253,9 +219,8 @@ noko_init_xml_schema(void)
|
|
253
219
|
|
254
220
|
rb_undef_alloc_func(cNokogiriXmlSchema);
|
255
221
|
|
256
|
-
rb_define_singleton_method(cNokogiriXmlSchema, "
|
257
|
-
rb_define_singleton_method(cNokogiriXmlSchema, "from_document", rb_xml_schema_s_from_document, -1);
|
222
|
+
rb_define_singleton_method(cNokogiriXmlSchema, "from_document", noko_xml_schema_s_from_document, -1);
|
258
223
|
|
259
|
-
rb_define_private_method(cNokogiriXmlSchema, "validate_document",
|
260
|
-
rb_define_private_method(cNokogiriXmlSchema, "validate_file",
|
224
|
+
rb_define_private_method(cNokogiriXmlSchema, "validate_document", noko_xml_schema__validate_document, 1);
|
225
|
+
rb_define_private_method(cNokogiriXmlSchema, "validate_file", noko_xml_schema__validate_file, 1);
|
261
226
|
}
|
@@ -3,7 +3,7 @@
|
|
3
3
|
VALUE cNokogiriXmlSyntaxError;
|
4
4
|
|
5
5
|
void
|
6
|
-
|
6
|
+
noko__structured_error_func_save(libxmlStructuredErrorHandlerState *handler_state)
|
7
7
|
{
|
8
8
|
/* this method is tightly coupled to the implementation of xmlSetStructuredErrorFunc */
|
9
9
|
handler_state->user_data = xmlStructuredErrorContext;
|
@@ -11,37 +11,40 @@ Nokogiri_structured_error_func_save(libxmlStructuredErrorHandlerState *handler_s
|
|
11
11
|
}
|
12
12
|
|
13
13
|
void
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
noko__structured_error_func_save_and_set(
|
15
|
+
libxmlStructuredErrorHandlerState *handler_state,
|
16
|
+
void *user_data,
|
17
|
+
xmlStructuredErrorFunc handler
|
18
|
+
)
|
17
19
|
{
|
18
|
-
|
20
|
+
noko__structured_error_func_save(handler_state);
|
19
21
|
xmlSetStructuredErrorFunc(user_data, handler);
|
20
22
|
}
|
21
23
|
|
22
24
|
void
|
23
|
-
|
25
|
+
noko__structured_error_func_restore(libxmlStructuredErrorHandlerState *handler_state)
|
24
26
|
{
|
25
27
|
xmlSetStructuredErrorFunc(handler_state->user_data, handler_state->handler);
|
26
28
|
}
|
27
29
|
|
28
30
|
void
|
29
|
-
|
31
|
+
noko__error_array_pusher(void *ctx, xmlErrorConstPtr error)
|
30
32
|
{
|
31
33
|
VALUE list = (VALUE)ctx;
|
32
34
|
Check_Type(list, T_ARRAY);
|
33
|
-
rb_ary_push(list,
|
35
|
+
rb_ary_push(list, noko_xml_syntax_error__wrap(error));
|
34
36
|
}
|
35
37
|
|
36
38
|
void
|
37
|
-
|
39
|
+
noko__error_raise(void *ctx, xmlErrorConstPtr error)
|
38
40
|
{
|
39
|
-
rb_exc_raise(
|
41
|
+
rb_exc_raise(noko_xml_syntax_error__wrap(error));
|
40
42
|
}
|
41
43
|
|
42
44
|
VALUE
|
43
|
-
|
45
|
+
noko_xml_syntax_error__wrap(xmlErrorConstPtr error)
|
44
46
|
{
|
47
|
+
xmlChar *c_path ;
|
45
48
|
VALUE msg, e, klass;
|
46
49
|
|
47
50
|
klass = cNokogiriXmlSyntaxError;
|
@@ -59,16 +62,21 @@ Nokogiri_wrap_xml_syntax_error(xmlErrorConstPtr error)
|
|
59
62
|
);
|
60
63
|
|
61
64
|
if (error) {
|
65
|
+
c_path = xmlGetNodePath(error->node);
|
66
|
+
|
62
67
|
rb_iv_set(e, "@domain", INT2NUM(error->domain));
|
63
68
|
rb_iv_set(e, "@code", INT2NUM(error->code));
|
64
69
|
rb_iv_set(e, "@level", INT2NUM((short)error->level));
|
65
70
|
rb_iv_set(e, "@file", RBSTR_OR_QNIL(error->file));
|
66
71
|
rb_iv_set(e, "@line", INT2NUM(error->line));
|
72
|
+
rb_iv_set(e, "@path", RBSTR_OR_QNIL(c_path));
|
67
73
|
rb_iv_set(e, "@str1", RBSTR_OR_QNIL(error->str1));
|
68
74
|
rb_iv_set(e, "@str2", RBSTR_OR_QNIL(error->str2));
|
69
75
|
rb_iv_set(e, "@str3", RBSTR_OR_QNIL(error->str3));
|
70
76
|
rb_iv_set(e, "@int1", INT2NUM(error->int1));
|
71
77
|
rb_iv_set(e, "@column", INT2NUM(error->int2));
|
78
|
+
|
79
|
+
xmlFree(c_path);
|
72
80
|
}
|
73
81
|
|
74
82
|
return e;
|
data/ext/nokogiri/xml_text.c
CHANGED
@@ -20,6 +20,7 @@ rb_xml_text_s_new(int argc, VALUE *argv, VALUE klass)
|
|
20
20
|
|
21
21
|
rb_scan_args(argc, argv, "2*", &rb_string, &rb_document, &rb_rest);
|
22
22
|
|
23
|
+
Check_Type(rb_string, T_STRING);
|
23
24
|
if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlNode)) {
|
24
25
|
rb_raise(rb_eTypeError,
|
25
26
|
"expected second parameter to be a Nokogiri::XML::Document, received %"PRIsVALUE,
|
@@ -35,11 +36,8 @@ rb_xml_text_s_new(int argc, VALUE *argv, VALUE klass)
|
|
35
36
|
c_document = noko_xml_document_unwrap(rb_document);
|
36
37
|
}
|
37
38
|
|
38
|
-
c_node =
|
39
|
-
c_node->doc = c_document;
|
40
|
-
|
39
|
+
c_node = xmlNewDocText(c_document, (xmlChar *)StringValueCStr(rb_string));
|
41
40
|
noko_xml_document_pin_node(c_node);
|
42
|
-
|
43
41
|
rb_node = noko_xml_node_wrap(klass, c_node) ;
|
44
42
|
rb_obj_call_init(rb_node, argc, argv);
|
45
43
|
|
@@ -19,7 +19,7 @@ xml_xpath_context_deallocate(void *data)
|
|
19
19
|
}
|
20
20
|
|
21
21
|
static const rb_data_type_t xml_xpath_context_type = {
|
22
|
-
.wrap_struct_name = "
|
22
|
+
.wrap_struct_name = "xmlXPathContext",
|
23
23
|
.function = {
|
24
24
|
.dfree = xml_xpath_context_deallocate,
|
25
25
|
},
|
@@ -397,7 +397,7 @@ rb_xml_xpath_context_evaluate(int argc, VALUE *argv, VALUE rb_context)
|
|
397
397
|
);
|
398
398
|
}
|
399
399
|
|
400
|
-
xmlSetStructuredErrorFunc((void *)errors,
|
400
|
+
xmlSetStructuredErrorFunc((void *)errors, noko__error_array_pusher);
|
401
401
|
xmlSetGenericErrorFunc((void *)errors, generic_exception_pusher);
|
402
402
|
|
403
403
|
xpath = xmlXPathEvalExpression(query, c_context);
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#include <nokogiri.h>
|
2
2
|
|
3
|
-
VALUE cNokogiriXsltStylesheet
|
3
|
+
VALUE cNokogiriXsltStylesheet;
|
4
4
|
|
5
5
|
static void
|
6
6
|
mark(void *data)
|
@@ -18,8 +18,8 @@ dealloc(void *data)
|
|
18
18
|
ruby_xfree(wrapper);
|
19
19
|
}
|
20
20
|
|
21
|
-
static const rb_data_type_t
|
22
|
-
.wrap_struct_name = "
|
21
|
+
static const rb_data_type_t nokogiri_xslt_stylesheet_tuple_type = {
|
22
|
+
.wrap_struct_name = "nokogiriXsltStylesheetTuple",
|
23
23
|
.function = {
|
24
24
|
.dmark = mark,
|
25
25
|
.dfree = dealloc,
|
@@ -56,7 +56,7 @@ Nokogiri_wrap_xslt_stylesheet(xsltStylesheetPtr ss)
|
|
56
56
|
self = TypedData_Make_Struct(
|
57
57
|
cNokogiriXsltStylesheet,
|
58
58
|
nokogiriXsltStylesheetTuple,
|
59
|
-
&
|
59
|
+
&nokogiri_xslt_stylesheet_tuple_type,
|
60
60
|
wrapper
|
61
61
|
);
|
62
62
|
|
@@ -124,7 +124,7 @@ rb_xslt_stylesheet_serialize(VALUE self, VALUE xmlobj)
|
|
124
124
|
TypedData_Get_Struct(
|
125
125
|
self,
|
126
126
|
nokogiriXsltStylesheetTuple,
|
127
|
-
&
|
127
|
+
&nokogiri_xslt_stylesheet_tuple_type,
|
128
128
|
wrapper
|
129
129
|
);
|
130
130
|
xsltSaveResultToString(&doc_ptr, &doc_len, xml, wrapper->ss);
|
@@ -273,7 +273,7 @@ rb_xslt_stylesheet_transform(int argc, VALUE *argv, VALUE self)
|
|
273
273
|
Check_Type(rb_param, T_ARRAY);
|
274
274
|
|
275
275
|
c_document = noko_xml_document_unwrap(rb_document);
|
276
|
-
TypedData_Get_Struct(self, nokogiriXsltStylesheetTuple, &
|
276
|
+
TypedData_Get_Struct(self, nokogiriXsltStylesheetTuple, &nokogiri_xslt_stylesheet_tuple_type, wrapper);
|
277
277
|
|
278
278
|
param_len = RARRAY_LEN(rb_param);
|
279
279
|
params = ruby_xcalloc((size_t)param_len + 1, sizeof(char *));
|
@@ -362,7 +362,7 @@ initFunc(xsltTransformContextPtr ctxt, const xmlChar *uri)
|
|
362
362
|
TypedData_Get_Struct(
|
363
363
|
(VALUE)ctxt->style->_private,
|
364
364
|
nokogiriXsltStylesheetTuple,
|
365
|
-
&
|
365
|
+
&nokogiri_xslt_stylesheet_tuple_type,
|
366
366
|
wrapper
|
367
367
|
);
|
368
368
|
inst = rb_class_new_instance(0, NULL, obj);
|
@@ -380,7 +380,7 @@ shutdownFunc(xsltTransformContextPtr ctxt,
|
|
380
380
|
TypedData_Get_Struct(
|
381
381
|
(VALUE)ctxt->style->_private,
|
382
382
|
nokogiriXsltStylesheetTuple,
|
383
|
-
&
|
383
|
+
&nokogiri_xslt_stylesheet_tuple_type,
|
384
384
|
wrapper
|
385
385
|
);
|
386
386
|
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -18,7 +18,7 @@ module Nokogiri
|
|
18
18
|
#
|
19
19
|
module ClassResolver
|
20
20
|
# #related_class restricts matching namespaces to those matching this set.
|
21
|
-
VALID_NAMESPACES = Set.new(["HTML", "HTML4", "HTML5", "XML"])
|
21
|
+
VALID_NAMESPACES = Set.new(["HTML", "HTML4", "HTML5", "XML", "SAX"])
|
22
22
|
|
23
23
|
# :call-seq:
|
24
24
|
# related_class(class_name) → Class
|