nokogiri 1.2.3 → 1.3.0
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.
- data/.autotest +14 -2
- data/CHANGELOG.ja.rdoc +38 -0
- data/CHANGELOG.rdoc +43 -0
- data/Manifest.txt +80 -5
- data/README.ja.rdoc +12 -11
- data/README.rdoc +4 -2
- data/Rakefile +103 -173
- data/bin/nokogiri +47 -0
- data/ext/nokogiri/extconf.rb +19 -13
- data/ext/nokogiri/html_document.c +39 -3
- data/ext/nokogiri/html_document.h +1 -1
- data/ext/nokogiri/html_element_description.c +272 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.h +1 -1
- data/ext/nokogiri/html_sax_parser.h +1 -1
- data/ext/nokogiri/{native.c → nokogiri.c} +11 -3
- data/ext/nokogiri/{native.h → nokogiri.h} +18 -4
- data/ext/nokogiri/xml_attr.c +14 -5
- data/ext/nokogiri/xml_attr.h +1 -1
- data/ext/nokogiri/xml_cdata.c +15 -6
- data/ext/nokogiri/xml_cdata.h +1 -1
- data/ext/nokogiri/xml_comment.c +13 -4
- data/ext/nokogiri/xml_comment.h +1 -1
- data/ext/nokogiri/xml_document.c +50 -41
- data/ext/nokogiri/xml_document.h +1 -1
- data/ext/nokogiri/xml_document_fragment.c +12 -4
- data/ext/nokogiri/xml_document_fragment.h +1 -1
- data/ext/nokogiri/xml_dtd.c +1 -1
- data/ext/nokogiri/xml_dtd.h +1 -1
- data/ext/nokogiri/xml_entity_reference.c +13 -4
- data/ext/nokogiri/xml_entity_reference.h +1 -1
- data/ext/nokogiri/xml_io.h +1 -1
- data/ext/nokogiri/xml_namespace.c +69 -0
- data/ext/nokogiri/xml_namespace.h +12 -0
- data/ext/nokogiri/xml_node.c +232 -124
- data/ext/nokogiri/xml_node.h +3 -4
- data/ext/nokogiri/xml_node_set.c +206 -19
- data/ext/nokogiri/xml_node_set.h +1 -1
- data/ext/nokogiri/xml_processing_instruction.c +14 -4
- data/ext/nokogiri/xml_processing_instruction.h +1 -1
- data/ext/nokogiri/xml_reader.c +87 -7
- data/ext/nokogiri/xml_reader.h +1 -1
- data/ext/nokogiri/xml_relax_ng.c +106 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +122 -2
- data/ext/nokogiri/xml_sax_parser.h +1 -1
- data/ext/nokogiri/xml_sax_push_parser.c +1 -0
- data/ext/nokogiri/xml_sax_push_parser.h +1 -1
- data/ext/nokogiri/xml_schema.c +107 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.h +1 -1
- data/ext/nokogiri/xml_text.c +10 -3
- data/ext/nokogiri/xml_text.h +1 -1
- data/ext/nokogiri/xml_xpath.h +1 -1
- data/ext/nokogiri/xml_xpath_context.h +1 -1
- data/ext/nokogiri/xslt_stylesheet.c +29 -16
- data/ext/nokogiri/xslt_stylesheet.h +1 -1
- data/lib/action-nokogiri.rb +7 -1
- data/lib/nokogiri.rb +21 -5
- data/lib/nokogiri/css/generated_parser.rb +49 -14
- data/lib/nokogiri/css/generated_tokenizer.rb +2 -2
- data/lib/nokogiri/css/node.rb +13 -3
- data/lib/nokogiri/css/parser.rb +8 -0
- data/lib/nokogiri/css/parser.y +7 -7
- data/lib/nokogiri/css/tokenizer.rb +2 -0
- data/lib/nokogiri/css/xpath_visitor.rb +10 -6
- data/lib/nokogiri/decorators/hpricot/node.rb +1 -1
- data/lib/nokogiri/decorators/hpricot/node_set.rb +2 -2
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +2 -0
- data/lib/nokogiri/decorators/slop.rb +3 -1
- data/lib/nokogiri/ffi/html/document.rb +37 -0
- data/lib/nokogiri/ffi/html/element_description.rb +85 -0
- data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
- data/lib/nokogiri/ffi/html/sax/parser.rb +21 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +32 -0
- data/lib/nokogiri/ffi/libxml.rb +314 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
- data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
- data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +26 -0
- data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
- data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
- data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
- data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
- data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
- data/lib/nokogiri/ffi/xml/attr.rb +41 -0
- data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
- data/lib/nokogiri/ffi/xml/comment.rb +18 -0
- data/lib/nokogiri/ffi/xml/document.rb +107 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +26 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +42 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +38 -0
- data/lib/nokogiri/ffi/xml/node.rb +380 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +130 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +217 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +51 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +148 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +38 -0
- data/lib/nokogiri/ffi/xml/schema.rb +55 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +76 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
- data/lib/nokogiri/hpricot.rb +14 -3
- data/lib/nokogiri/html.rb +11 -46
- data/lib/nokogiri/html/builder.rb +27 -1
- data/lib/nokogiri/html/document.rb +62 -6
- data/lib/nokogiri/html/document_fragment.rb +15 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +2 -0
- data/lib/nokogiri/html/sax/parser.rb +27 -1
- data/lib/nokogiri/version.rb +26 -1
- data/lib/nokogiri/version_warning.rb +11 -0
- data/lib/nokogiri/xml.rb +25 -51
- data/lib/nokogiri/xml/builder.rb +166 -10
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/document.rb +39 -6
- data/lib/nokogiri/xml/document_fragment.rb +41 -1
- data/lib/nokogiri/xml/dtd.rb +3 -1
- data/lib/nokogiri/xml/entity_declaration.rb +3 -1
- data/lib/nokogiri/xml/fragment_handler.rb +24 -3
- data/lib/nokogiri/xml/namespace.rb +7 -0
- data/lib/nokogiri/xml/node.rb +314 -65
- data/lib/nokogiri/xml/node/save_options.rb +12 -2
- data/lib/nokogiri/xml/node_set.rb +58 -8
- data/lib/nokogiri/xml/parse_options.rb +80 -0
- data/lib/nokogiri/xml/processing_instruction.rb +2 -0
- data/lib/nokogiri/xml/reader.rb +42 -3
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +0 -7
- data/lib/nokogiri/xml/sax/document.rb +84 -0
- data/lib/nokogiri/xml/sax/parser.rb +38 -2
- data/lib/nokogiri/xml/sax/push_parser.rb +12 -0
- data/lib/nokogiri/xml/schema.rb +65 -0
- data/lib/nokogiri/xml/syntax_error.rb +11 -0
- data/lib/nokogiri/xml/xpath.rb +1 -1
- data/lib/nokogiri/xml/xpath_context.rb +2 -0
- data/lib/nokogiri/xslt.rb +21 -1
- data/lib/nokogiri/xslt/stylesheet.rb +19 -0
- data/lib/xsd/xmlparser/nokogiri.rb +12 -2
- data/tasks/test.rb +42 -19
- data/test/css/test_parser.rb +29 -0
- data/test/ffi/test_document.rb +35 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/helper.rb +38 -8
- data/test/html/sax/test_parser.rb +12 -0
- data/test/html/test_builder.rb +25 -2
- data/test/html/test_document.rb +91 -20
- data/test/html/test_document_fragment.rb +97 -0
- data/test/html/test_element_description.rb +95 -0
- data/test/html/test_node.rb +66 -3
- data/test/test_convert_xpath.rb +1 -1
- data/test/test_memory_leak.rb +57 -18
- data/test/test_nokogiri.rb +24 -2
- data/test/test_reader.rb +77 -0
- data/test/test_xslt_transforms.rb +120 -82
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +9 -0
- data/test/xml/sax/test_push_parser.rb +24 -0
- data/test/xml/test_attr.rb +7 -0
- data/test/xml/test_builder.rb +48 -0
- data/test/xml/test_cdata.rb +19 -0
- data/test/xml/test_comment.rb +6 -0
- data/test/xml/test_document.rb +101 -2
- data/test/xml/test_document_fragment.rb +55 -3
- data/test/xml/test_entity_reference.rb +4 -0
- data/test/xml/test_namespace.rb +43 -0
- data/test/xml/test_node.rb +255 -8
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +9 -2
- data/test/xml/test_node_set.rb +197 -1
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +5 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +65 -0
- data/test/xml/test_text.rb +5 -0
- data/test/xml/test_unparented_node.rb +3 -3
- metadata +128 -12
- data/lib/nokogiri/xml/comment.rb +0 -6
- data/lib/nokogiri/xml/element.rb +0 -6
- data/lib/nokogiri/xml/text.rb +0 -6
data/ext/nokogiri/xml_reader.h
CHANGED
@@ -0,0 +1,106 @@
|
|
1
|
+
#include <xml_relax_ng.h>
|
2
|
+
|
3
|
+
static void dealloc(xmlRelaxNGPtr schema)
|
4
|
+
{
|
5
|
+
NOKOGIRI_DEBUG_START(schema);
|
6
|
+
xmlRelaxNGFree(schema);
|
7
|
+
NOKOGIRI_DEBUG_END(schema);
|
8
|
+
}
|
9
|
+
|
10
|
+
/*
|
11
|
+
* call-seq:
|
12
|
+
* validate_document(document)
|
13
|
+
*
|
14
|
+
* Validate a Nokogiri::XML::Document against this RelaxNG schema.
|
15
|
+
*/
|
16
|
+
static VALUE validate_document(VALUE self, VALUE document)
|
17
|
+
{
|
18
|
+
xmlDocPtr doc;
|
19
|
+
xmlRelaxNGPtr schema;
|
20
|
+
|
21
|
+
Data_Get_Struct(self, xmlRelaxNG, schema);
|
22
|
+
Data_Get_Struct(document, xmlDoc, doc);
|
23
|
+
|
24
|
+
VALUE errors = rb_ary_new();
|
25
|
+
|
26
|
+
xmlRelaxNGValidCtxtPtr valid_ctxt = xmlRelaxNGNewValidCtxt(schema);
|
27
|
+
|
28
|
+
if(NULL == valid_ctxt) {
|
29
|
+
// we have a problem
|
30
|
+
rb_raise(rb_eRuntimeError, "Could not create a validation context");
|
31
|
+
}
|
32
|
+
|
33
|
+
if (! is_2_6_16()) {
|
34
|
+
xmlRelaxNGSetValidStructuredErrors(
|
35
|
+
valid_ctxt,
|
36
|
+
Nokogiri_error_array_pusher,
|
37
|
+
(void *)errors
|
38
|
+
);
|
39
|
+
}
|
40
|
+
|
41
|
+
xmlRelaxNGValidateDoc(valid_ctxt, doc);
|
42
|
+
|
43
|
+
xmlRelaxNGFreeValidCtxt(valid_ctxt);
|
44
|
+
|
45
|
+
return errors;
|
46
|
+
}
|
47
|
+
|
48
|
+
/*
|
49
|
+
* call-seq:
|
50
|
+
* read_memory(string)
|
51
|
+
*
|
52
|
+
* Create a new RelaxNG from the contents of +string+
|
53
|
+
*/
|
54
|
+
static VALUE read_memory(VALUE klass, VALUE content)
|
55
|
+
{
|
56
|
+
xmlRelaxNGParserCtxtPtr ctx = xmlRelaxNGNewMemParserCtxt(
|
57
|
+
(const char *)StringValuePtr(content),
|
58
|
+
RSTRING_LEN(content)
|
59
|
+
);
|
60
|
+
|
61
|
+
VALUE errors = rb_ary_new();
|
62
|
+
xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
|
63
|
+
|
64
|
+
if (! is_2_6_16()) {
|
65
|
+
xmlRelaxNGSetParserStructuredErrors(
|
66
|
+
ctx,
|
67
|
+
Nokogiri_error_array_pusher,
|
68
|
+
(void *)errors
|
69
|
+
);
|
70
|
+
}
|
71
|
+
|
72
|
+
xmlRelaxNGPtr schema = xmlRelaxNGParse(ctx);
|
73
|
+
|
74
|
+
xmlSetStructuredErrorFunc(NULL, NULL);
|
75
|
+
xmlRelaxNGFreeParserCtxt(ctx);
|
76
|
+
|
77
|
+
if(NULL == schema) {
|
78
|
+
xmlErrorPtr error = xmlGetLastError();
|
79
|
+
if(error)
|
80
|
+
rb_funcall(rb_mKernel, rb_intern("raise"), 1,
|
81
|
+
Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error)
|
82
|
+
);
|
83
|
+
else
|
84
|
+
rb_raise(rb_eRuntimeError, "Could not parse document");
|
85
|
+
|
86
|
+
return Qnil;
|
87
|
+
}
|
88
|
+
|
89
|
+
VALUE rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
|
90
|
+
rb_iv_set(rb_schema, "@errors", errors);
|
91
|
+
|
92
|
+
return rb_schema;
|
93
|
+
}
|
94
|
+
|
95
|
+
VALUE cNokogiriXmlRelaxNG;
|
96
|
+
void init_xml_relax_ng()
|
97
|
+
{
|
98
|
+
VALUE nokogiri = rb_define_module("Nokogiri");
|
99
|
+
VALUE xml = rb_define_module_under(nokogiri, "XML");
|
100
|
+
VALUE klass = rb_define_class_under(xml, "RelaxNG", cNokogiriXmlSchema);
|
101
|
+
|
102
|
+
cNokogiriXmlRelaxNG = klass;
|
103
|
+
|
104
|
+
rb_define_singleton_method(klass, "read_memory", read_memory, 1);
|
105
|
+
rb_define_private_method(klass, "validate_document", validate_document, 1);
|
106
|
+
}
|
@@ -1,5 +1,4 @@
|
|
1
|
-
#include <
|
2
|
-
#include <xml_sax_parser.h>
|
1
|
+
#include <nokogiri.h>
|
3
2
|
|
4
3
|
/*
|
5
4
|
* call-seq:
|
@@ -11,6 +10,9 @@ static VALUE parse_memory(VALUE self, VALUE data)
|
|
11
10
|
{
|
12
11
|
xmlSAXHandlerPtr handler;
|
13
12
|
Data_Get_Struct(self, xmlSAXHandler, handler);
|
13
|
+
|
14
|
+
if(Qnil == data) rb_raise(rb_eArgError, "data cannot be nil");
|
15
|
+
|
14
16
|
xmlSAXUserParseMemory( handler,
|
15
17
|
(void *)self,
|
16
18
|
StringValuePtr(data),
|
@@ -111,6 +113,121 @@ static void end_element(void * ctx, const xmlChar *name)
|
|
111
113
|
);
|
112
114
|
}
|
113
115
|
|
116
|
+
/**
|
117
|
+
* start_element_ns was borrowed heavily from libxml-ruby.
|
118
|
+
*/
|
119
|
+
static void
|
120
|
+
start_element_ns (
|
121
|
+
void * ctx,
|
122
|
+
const xmlChar * localname,
|
123
|
+
const xmlChar * prefix,
|
124
|
+
const xmlChar * URI,
|
125
|
+
int nb_namespaces,
|
126
|
+
const xmlChar ** namespaces,
|
127
|
+
int nb_attributes,
|
128
|
+
int nb_defaulted,
|
129
|
+
const xmlChar ** attributes)
|
130
|
+
{
|
131
|
+
VALUE self = (VALUE)ctx;
|
132
|
+
VALUE doc = rb_funcall(self, rb_intern("document"), 0);
|
133
|
+
VALUE MAYBE_UNUSED(enc) = rb_iv_get(self, "@encoding");
|
134
|
+
|
135
|
+
VALUE attrHash = rb_hash_new();
|
136
|
+
VALUE nsHash = rb_hash_new();
|
137
|
+
|
138
|
+
if (attributes)
|
139
|
+
{
|
140
|
+
/* Each attribute is an array of [localname, prefix, URI, value, end] */
|
141
|
+
int i;
|
142
|
+
for (i = 0; i < nb_attributes * 5; i += 5)
|
143
|
+
{
|
144
|
+
rb_hash_aset( attrHash,
|
145
|
+
NOKOGIRI_STR_NEW2((const char*)attributes[i+0], RTEST(enc) ? StringValuePtr(enc) : NULL),
|
146
|
+
NOKOGIRI_STR_NEW((const char*)attributes[i+3], (attributes[i+4] - attributes[i+3]), RTEST(enc) ? StringValuePtr(enc) : NULL));
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
if (namespaces)
|
151
|
+
{
|
152
|
+
int i;
|
153
|
+
for (i = 0; i < nb_namespaces * 2; i += 2)
|
154
|
+
{
|
155
|
+
rb_hash_aset( nsHash,
|
156
|
+
namespaces[i+0] ? NOKOGIRI_STR_NEW2((const char*)namespaces[i+0], RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil,
|
157
|
+
namespaces[i+1] ? NOKOGIRI_STR_NEW2((const char*)namespaces[i+1], RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil);
|
158
|
+
}
|
159
|
+
}
|
160
|
+
|
161
|
+
rb_funcall( doc,
|
162
|
+
rb_intern("start_element_ns"),
|
163
|
+
5,
|
164
|
+
NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL),
|
165
|
+
attrHash,
|
166
|
+
prefix ? NOKOGIRI_STR_NEW2(prefix, RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil,
|
167
|
+
URI ? NOKOGIRI_STR_NEW2(URI, RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil,
|
168
|
+
nsHash
|
169
|
+
);
|
170
|
+
|
171
|
+
/* Call start element if it's there' */
|
172
|
+
if (rb_respond_to(doc, rb_intern("start_element")))
|
173
|
+
{
|
174
|
+
VALUE name;
|
175
|
+
if (prefix)
|
176
|
+
{
|
177
|
+
name = NOKOGIRI_STR_NEW2(prefix, RTEST(enc) ? StringValuePtr(enc) : NULL);
|
178
|
+
rb_funcall(name, rb_intern("<<"), 1, NOKOGIRI_STR_NEW2(":", RTEST(enc) ? StringValuePtr(enc) : NULL));
|
179
|
+
rb_funcall(name, rb_intern("<<"), 1, NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL));
|
180
|
+
}
|
181
|
+
else
|
182
|
+
{
|
183
|
+
name = NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL);
|
184
|
+
}
|
185
|
+
VALUE attrArray = rb_funcall(attrHash, rb_intern("to_a"), 0);
|
186
|
+
attrArray = rb_funcall(attrArray, rb_intern("flatten"), 0);
|
187
|
+
rb_funcall(doc, rb_intern("start_element"), 2, name, attrArray);
|
188
|
+
}
|
189
|
+
|
190
|
+
}
|
191
|
+
|
192
|
+
/**
|
193
|
+
* end_element_ns was borrowed heavily from libxml-ruby.
|
194
|
+
*/
|
195
|
+
static void
|
196
|
+
end_element_ns (
|
197
|
+
void * ctx,
|
198
|
+
const xmlChar * localname,
|
199
|
+
const xmlChar * prefix,
|
200
|
+
const xmlChar * URI)
|
201
|
+
{
|
202
|
+
VALUE self = (VALUE)ctx;
|
203
|
+
VALUE doc = rb_funcall(self, rb_intern("document"), 0);
|
204
|
+
VALUE MAYBE_UNUSED(enc) = rb_iv_get(self, "@encoding");
|
205
|
+
|
206
|
+
rb_funcall(doc, rb_intern("end_element_ns"), 3,
|
207
|
+
NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL),
|
208
|
+
prefix ? NOKOGIRI_STR_NEW2(prefix, RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil,
|
209
|
+
URI ? NOKOGIRI_STR_NEW2(URI, RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil
|
210
|
+
);
|
211
|
+
|
212
|
+
/* Call end element for old-times sake */
|
213
|
+
if (rb_respond_to(doc, rb_intern("end_element")))
|
214
|
+
{
|
215
|
+
VALUE name;
|
216
|
+
if (prefix)
|
217
|
+
{
|
218
|
+
name = NOKOGIRI_STR_NEW2(prefix, RTEST(enc) ? StringValuePtr(enc) : NULL);
|
219
|
+
rb_funcall(name, rb_intern("<<"), 1, NOKOGIRI_STR_NEW2(":", RTEST(enc) ? StringValuePtr(enc) : NULL));
|
220
|
+
rb_funcall(name, rb_intern("<<"), 1, NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL));
|
221
|
+
}
|
222
|
+
else
|
223
|
+
{
|
224
|
+
name = NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL);
|
225
|
+
}
|
226
|
+
rb_funcall(doc, rb_intern("end_element"), 1, name);
|
227
|
+
}
|
228
|
+
|
229
|
+
}
|
230
|
+
|
114
231
|
static void characters_func(void * ctx, const xmlChar * ch, int len)
|
115
232
|
{
|
116
233
|
VALUE self = (VALUE)ctx;
|
@@ -190,11 +307,14 @@ static VALUE allocate(VALUE klass)
|
|
190
307
|
handler->endDocument = end_document;
|
191
308
|
handler->startElement = start_element;
|
192
309
|
handler->endElement = end_element;
|
310
|
+
handler->startElementNs = start_element_ns;
|
311
|
+
handler->endElementNs = end_element_ns;
|
193
312
|
handler->characters = characters_func;
|
194
313
|
handler->comment = comment_func;
|
195
314
|
handler->warning = warning_func;
|
196
315
|
handler->error = error_func;
|
197
316
|
handler->cdataBlock = cdata_block;
|
317
|
+
handler->initialized = XML_SAX2_MAGIC;
|
198
318
|
|
199
319
|
return Data_Wrap_Struct(klass, NULL, deallocate, handler);
|
200
320
|
}
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#include <xml_schema.h>
|
2
|
+
|
3
|
+
static void dealloc(xmlSchemaPtr schema)
|
4
|
+
{
|
5
|
+
NOKOGIRI_DEBUG_START(schema);
|
6
|
+
xmlSchemaFree(schema);
|
7
|
+
NOKOGIRI_DEBUG_END(schema);
|
8
|
+
}
|
9
|
+
|
10
|
+
/*
|
11
|
+
* call-seq:
|
12
|
+
* validate_document(document)
|
13
|
+
*
|
14
|
+
* Validate a Nokogiri::XML::Document against this Schema.
|
15
|
+
*/
|
16
|
+
static VALUE validate_document(VALUE self, VALUE document)
|
17
|
+
{
|
18
|
+
xmlDocPtr doc;
|
19
|
+
xmlSchemaPtr schema;
|
20
|
+
|
21
|
+
Data_Get_Struct(self, xmlSchema, schema);
|
22
|
+
Data_Get_Struct(document, xmlDoc, doc);
|
23
|
+
|
24
|
+
VALUE errors = rb_ary_new();
|
25
|
+
|
26
|
+
xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema);
|
27
|
+
|
28
|
+
if(NULL == valid_ctxt) {
|
29
|
+
// we have a problem
|
30
|
+
rb_raise(rb_eRuntimeError, "Could not create a validation context");
|
31
|
+
}
|
32
|
+
|
33
|
+
if (! is_2_6_16()) {
|
34
|
+
xmlSchemaSetValidStructuredErrors(
|
35
|
+
valid_ctxt,
|
36
|
+
Nokogiri_error_array_pusher,
|
37
|
+
(void *)errors
|
38
|
+
);
|
39
|
+
}
|
40
|
+
|
41
|
+
xmlSchemaValidateDoc(valid_ctxt, doc);
|
42
|
+
|
43
|
+
xmlSchemaFreeValidCtxt(valid_ctxt);
|
44
|
+
|
45
|
+
return errors;
|
46
|
+
}
|
47
|
+
|
48
|
+
/*
|
49
|
+
* call-seq:
|
50
|
+
* read_memory(string)
|
51
|
+
*
|
52
|
+
* Create a new Schema from the contents of +string+
|
53
|
+
*/
|
54
|
+
static VALUE read_memory(VALUE klass, VALUE content)
|
55
|
+
{
|
56
|
+
|
57
|
+
xmlSchemaParserCtxtPtr ctx = xmlSchemaNewMemParserCtxt(
|
58
|
+
(const char *)StringValuePtr(content),
|
59
|
+
RSTRING_LEN(content)
|
60
|
+
);
|
61
|
+
|
62
|
+
VALUE errors = rb_ary_new();
|
63
|
+
xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
|
64
|
+
|
65
|
+
if (! is_2_6_16()) {
|
66
|
+
xmlSchemaSetParserStructuredErrors(
|
67
|
+
ctx,
|
68
|
+
Nokogiri_error_array_pusher,
|
69
|
+
(void *)errors
|
70
|
+
);
|
71
|
+
}
|
72
|
+
|
73
|
+
xmlSchemaPtr schema = xmlSchemaParse(ctx);
|
74
|
+
|
75
|
+
xmlSetStructuredErrorFunc(NULL, NULL);
|
76
|
+
xmlSchemaFreeParserCtxt(ctx);
|
77
|
+
|
78
|
+
if(NULL == schema) {
|
79
|
+
xmlErrorPtr error = xmlGetLastError();
|
80
|
+
if(error)
|
81
|
+
rb_funcall(rb_mKernel, rb_intern("raise"), 1,
|
82
|
+
Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error)
|
83
|
+
);
|
84
|
+
else
|
85
|
+
rb_raise(rb_eRuntimeError, "Could not parse document");
|
86
|
+
|
87
|
+
return Qnil;
|
88
|
+
}
|
89
|
+
|
90
|
+
VALUE rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
|
91
|
+
rb_iv_set(rb_schema, "@errors", errors);
|
92
|
+
|
93
|
+
return rb_schema;
|
94
|
+
}
|
95
|
+
|
96
|
+
VALUE cNokogiriXmlSchema;
|
97
|
+
void init_xml_schema()
|
98
|
+
{
|
99
|
+
VALUE nokogiri = rb_define_module("Nokogiri");
|
100
|
+
VALUE xml = rb_define_module_under(nokogiri, "XML");
|
101
|
+
VALUE klass = rb_define_class_under(xml, "Schema", rb_cObject);
|
102
|
+
|
103
|
+
cNokogiriXmlSchema = klass;
|
104
|
+
|
105
|
+
rb_define_singleton_method(klass, "read_memory", read_memory, 1);
|
106
|
+
rb_define_private_method(klass, "validate_document", validate_document, 1);
|
107
|
+
}
|
data/ext/nokogiri/xml_text.c
CHANGED
@@ -6,15 +6,22 @@
|
|
6
6
|
*
|
7
7
|
* Create a new Text element on the +document+ with +content+
|
8
8
|
*/
|
9
|
-
static VALUE new(
|
9
|
+
static VALUE new(int argc, VALUE *argv, VALUE klass)
|
10
10
|
{
|
11
11
|
xmlDocPtr doc;
|
12
|
+
VALUE string;
|
13
|
+
VALUE document;
|
14
|
+
VALUE rest;
|
15
|
+
|
16
|
+
rb_scan_args(argc, argv, "2*", &string, &document, &rest);
|
17
|
+
|
12
18
|
Data_Get_Struct(document, xmlDoc, doc);
|
13
19
|
|
14
20
|
xmlNodePtr node = xmlNewText((xmlChar *)StringValuePtr(string));
|
15
21
|
node->doc = doc;
|
16
22
|
|
17
|
-
VALUE rb_node = Nokogiri_wrap_xml_node(node) ;
|
23
|
+
VALUE rb_node = Nokogiri_wrap_xml_node(klass, node) ;
|
24
|
+
rb_funcall2(rb_node, rb_intern("initialize"), argc, argv);
|
18
25
|
|
19
26
|
if(rb_block_given_p()) rb_yield(rb_node);
|
20
27
|
|
@@ -36,5 +43,5 @@ void init_xml_text()
|
|
36
43
|
|
37
44
|
cNokogiriXmlText = klass;
|
38
45
|
|
39
|
-
rb_define_singleton_method(klass, "new", new,
|
46
|
+
rb_define_singleton_method(klass, "new", new, -1);
|
40
47
|
}
|