nokogiri 1.4.7 → 1.5.0.beta.1
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/CHANGELOG.ja.rdoc +8 -83
- data/CHANGELOG.rdoc +6 -80
- data/Manifest.txt +4 -74
- data/README.ja.rdoc +5 -1
- data/README.rdoc +8 -22
- data/Rakefile +79 -60
- data/bin/nokogiri +1 -6
- data/deps.rip +5 -0
- data/ext/nokogiri/extconf.rb +32 -53
- data/ext/nokogiri/nokogiri.c +0 -2
- data/ext/nokogiri/nokogiri.h +0 -9
- data/ext/nokogiri/xml_document.c +0 -14
- data/ext/nokogiri/xml_dtd.c +2 -2
- data/ext/nokogiri/xml_io.c +7 -32
- data/ext/nokogiri/xml_node.c +31 -103
- data/ext/nokogiri/xml_node_set.c +8 -8
- data/ext/nokogiri/xml_reader.c +1 -20
- data/ext/nokogiri/xml_sax_parser.c +3 -5
- data/ext/nokogiri/xml_sax_parser_context.c +0 -40
- data/ext/nokogiri/xml_xpath_context.c +2 -35
- data/ext/nokogiri/xslt_stylesheet.c +6 -124
- data/lib/nokogiri.rb +7 -3
- data/lib/nokogiri/css.rb +3 -6
- data/lib/nokogiri/css/generated_parser.rb +669 -0
- data/lib/nokogiri/css/generated_tokenizer.rb +145 -0
- data/lib/nokogiri/css/parser.rb +70 -665
- data/lib/nokogiri/css/parser.y +1 -6
- data/lib/nokogiri/css/tokenizer.rb +3 -148
- data/lib/nokogiri/css/tokenizer.rex +1 -1
- data/lib/nokogiri/css/xpath_visitor.rb +14 -16
- data/lib/nokogiri/decorators/slop.rb +3 -5
- data/lib/nokogiri/html.rb +3 -2
- data/lib/nokogiri/html/document.rb +18 -134
- data/lib/nokogiri/html/document_fragment.rb +21 -26
- data/lib/nokogiri/html/element_description_defaults.rb +671 -0
- data/lib/nokogiri/html/sax/parser.rb +2 -6
- data/lib/nokogiri/version.rb +4 -9
- data/lib/nokogiri/xml/attribute_decl.rb +1 -1
- data/lib/nokogiri/xml/builder.rb +1 -1
- data/lib/nokogiri/xml/document.rb +3 -27
- data/lib/nokogiri/xml/document_fragment.rb +2 -9
- data/lib/nokogiri/xml/dtd.rb +1 -12
- data/lib/nokogiri/xml/element_decl.rb +1 -1
- data/lib/nokogiri/xml/entity_decl.rb +1 -1
- data/lib/nokogiri/xml/node.rb +75 -172
- data/lib/nokogiri/xml/node/save_options.rb +0 -10
- data/lib/nokogiri/xml/node_set.rb +3 -28
- data/lib/nokogiri/xml/parse_options.rb +0 -8
- data/lib/nokogiri/xml/reader.rb +6 -44
- data/lib/nokogiri/xml/sax/document.rb +5 -9
- data/lib/nokogiri/xml/schema.rb +1 -7
- data/lib/nokogiri/xslt.rb +5 -9
- data/tasks/cross_compile.rb +12 -27
- data/tasks/test.rb +0 -0
- data/test/css/test_parser.rb +19 -40
- data/test/css/test_tokenizer.rb +0 -8
- data/test/helper.rb +1 -4
- data/test/html/sax/test_parser.rb +21 -47
- data/test/html/sax/test_parser_context.rb +2 -2
- data/test/html/test_document.rb +3 -58
- data/test/html/test_document_encoding.rb +0 -53
- data/test/html/test_document_fragment.rb +13 -82
- data/test/html/test_element_description.rb +4 -2
- data/test/html/test_node.rb +0 -9
- data/test/test_memory_leak.rb +2 -57
- data/test/test_nokogiri.rb +14 -20
- data/test/test_reader.rb +7 -47
- data/test/test_xslt_transforms.rb +5 -8
- data/test/xml/sax/test_parser.rb +17 -34
- data/test/xml/sax/test_parser_context.rb +0 -50
- data/test/xml/sax/test_push_parser.rb +1 -18
- data/test/xml/test_attr.rb +4 -31
- data/test/xml/test_attribute_decl.rb +7 -3
- data/test/xml/test_builder.rb +5 -5
- data/test/xml/test_cdata.rb +3 -3
- data/test/xml/test_document.rb +18 -15
- data/test/xml/test_document_fragment.rb +20 -19
- data/test/xml/test_dtd.rb +13 -18
- data/test/xml/test_element_content.rb +1 -1
- data/test/xml/test_element_decl.rb +1 -1
- data/test/xml/test_entity_decl.rb +12 -10
- data/test/xml/test_namespace.rb +7 -5
- data/test/xml/test_node.rb +15 -54
- data/test/xml/test_node_reparenting.rb +42 -85
- data/test/xml/test_node_set.rb +2 -61
- data/test/xml/test_schema.rb +0 -5
- data/test/xml/test_text.rb +2 -11
- data/test/xml/test_unparented_node.rb +1 -1
- data/test/xml/test_xpath.rb +7 -43
- metadata +131 -155
- data/.gemtest +0 -0
- data/ext/nokogiri/depend +0 -358
- data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
- data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
- data/lib/nokogiri/css/parser_extras.rb +0 -91
- data/lib/nokogiri/ffi/encoding_handler.rb +0 -42
- data/lib/nokogiri/ffi/html/document.rb +0 -28
- data/lib/nokogiri/ffi/html/element_description.rb +0 -81
- data/lib/nokogiri/ffi/html/entity_lookup.rb +0 -16
- data/lib/nokogiri/ffi/html/sax/parser_context.rb +0 -38
- data/lib/nokogiri/ffi/io_callbacks.rb +0 -42
- data/lib/nokogiri/ffi/libxml.rb +0 -420
- data/lib/nokogiri/ffi/structs/common_node.rb +0 -38
- data/lib/nokogiri/ffi/structs/html_elem_desc.rb +0 -24
- data/lib/nokogiri/ffi/structs/html_entity_desc.rb +0 -13
- data/lib/nokogiri/ffi/structs/xml_alloc.rb +0 -16
- data/lib/nokogiri/ffi/structs/xml_attr.rb +0 -20
- data/lib/nokogiri/ffi/structs/xml_attribute.rb +0 -27
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +0 -16
- data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +0 -11
- data/lib/nokogiri/ffi/structs/xml_document.rb +0 -117
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +0 -28
- data/lib/nokogiri/ffi/structs/xml_element.rb +0 -26
- data/lib/nokogiri/ffi/structs/xml_element_content.rb +0 -17
- data/lib/nokogiri/ffi/structs/xml_entity.rb +0 -32
- data/lib/nokogiri/ffi/structs/xml_enumeration.rb +0 -12
- data/lib/nokogiri/ffi/structs/xml_node.rb +0 -28
- data/lib/nokogiri/ffi/structs/xml_node_set.rb +0 -53
- data/lib/nokogiri/ffi/structs/xml_notation.rb +0 -11
- data/lib/nokogiri/ffi/structs/xml_ns.rb +0 -15
- data/lib/nokogiri/ffi/structs/xml_parser_context.rb +0 -20
- data/lib/nokogiri/ffi/structs/xml_parser_input.rb +0 -19
- data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +0 -14
- data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +0 -51
- data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +0 -124
- data/lib/nokogiri/ffi/structs/xml_schema.rb +0 -13
- data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +0 -31
- data/lib/nokogiri/ffi/structs/xml_text_reader.rb +0 -12
- data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +0 -38
- data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +0 -35
- data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +0 -20
- data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +0 -13
- data/lib/nokogiri/ffi/weak_bucket.rb +0 -40
- data/lib/nokogiri/ffi/xml/attr.rb +0 -41
- data/lib/nokogiri/ffi/xml/attribute_decl.rb +0 -27
- data/lib/nokogiri/ffi/xml/cdata.rb +0 -19
- data/lib/nokogiri/ffi/xml/comment.rb +0 -18
- data/lib/nokogiri/ffi/xml/document.rb +0 -174
- data/lib/nokogiri/ffi/xml/document_fragment.rb +0 -21
- data/lib/nokogiri/ffi/xml/dtd.rb +0 -67
- data/lib/nokogiri/ffi/xml/element_content.rb +0 -43
- data/lib/nokogiri/ffi/xml/element_decl.rb +0 -19
- data/lib/nokogiri/ffi/xml/entity_decl.rb +0 -36
- data/lib/nokogiri/ffi/xml/entity_reference.rb +0 -19
- data/lib/nokogiri/ffi/xml/namespace.rb +0 -44
- data/lib/nokogiri/ffi/xml/node.rb +0 -559
- data/lib/nokogiri/ffi/xml/node_set.rb +0 -150
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +0 -20
- data/lib/nokogiri/ffi/xml/reader.rb +0 -236
- data/lib/nokogiri/ffi/xml/relax_ng.rb +0 -85
- data/lib/nokogiri/ffi/xml/sax/parser.rb +0 -143
- data/lib/nokogiri/ffi/xml/sax/parser_context.rb +0 -79
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +0 -51
- data/lib/nokogiri/ffi/xml/schema.rb +0 -109
- data/lib/nokogiri/ffi/xml/syntax_error.rb +0 -98
- data/lib/nokogiri/ffi/xml/text.rb +0 -18
- data/lib/nokogiri/ffi/xml/xpath.rb +0 -9
- data/lib/nokogiri/ffi/xml/xpath_context.rb +0 -153
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +0 -77
- data/test/decorators/test_slop.rb +0 -16
- data/test/ffi/test_document.rb +0 -35
- data/test/files/encoding.html +0 -82
- data/test/files/encoding.xhtml +0 -84
- data/test/xslt/test_custom_functions.rb +0 -94
@@ -1,143 +0,0 @@
|
|
1
|
-
module Nokogiri
|
2
|
-
module XML
|
3
|
-
module SAX
|
4
|
-
class Parser
|
5
|
-
# :stopdoc:
|
6
|
-
|
7
|
-
attr_accessor :cstruct
|
8
|
-
|
9
|
-
def self.new(doc = XML::SAX::Document.new, encoding = 'UTF-8')
|
10
|
-
parser = allocate
|
11
|
-
parser.document = doc
|
12
|
-
parser.encoding = encoding
|
13
|
-
parser.cstruct = LibXML::XmlSaxHandler.allocate
|
14
|
-
parser.send(:setup_lambdas)
|
15
|
-
parser.instance_variable_set(:@ctxt, nil)
|
16
|
-
parser
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def setup_lambdas
|
22
|
-
@closures = {} # we need to keep references to the closures to avoid GC
|
23
|
-
|
24
|
-
[ :startDocument, :endDocument, :startElement, :endElement, :characters,
|
25
|
-
:comment, :warning, :error, :cdataBlock, :startElementNs, :endElementNs ].each do |sym|
|
26
|
-
@closures[sym] = lambda { |*args| send("__internal__#{sym}", *args) } # "i'm your private dancer", etc.
|
27
|
-
end
|
28
|
-
|
29
|
-
@closures.each { |k,v| cstruct[k] = v }
|
30
|
-
|
31
|
-
cstruct[:initialized] = Nokogiri::LibXML::XmlSaxHandler::XML_SAX2_MAGIC
|
32
|
-
end
|
33
|
-
|
34
|
-
def __internal__startDocument(_)
|
35
|
-
if @ctxt && @ctxt[:html] == 0 && @ctxt[:standalone] != -1
|
36
|
-
standalone = {
|
37
|
-
0 => 'no',
|
38
|
-
1 => 'yes',
|
39
|
-
}[@ctxt[:standalone]]
|
40
|
-
|
41
|
-
@document.xmldecl @ctxt[:version], @ctxt[:encoding], standalone
|
42
|
-
end
|
43
|
-
@document.start_document
|
44
|
-
end
|
45
|
-
|
46
|
-
def __internal__endDocument(_)
|
47
|
-
@document.end_document
|
48
|
-
end
|
49
|
-
|
50
|
-
def __internal__startElement(_, name, attributes)
|
51
|
-
attrs = []
|
52
|
-
offset = 0
|
53
|
-
if ! attributes.null?
|
54
|
-
while ! attributes.get_pointer(LibXML.pointer_offset(offset)).null? do
|
55
|
-
cons = attributes.get_array_of_string(LibXML.pointer_offset(offset), 2)
|
56
|
-
attrs << cons
|
57
|
-
offset += 2
|
58
|
-
end
|
59
|
-
end
|
60
|
-
@document.start_element name, attrs
|
61
|
-
end
|
62
|
-
|
63
|
-
def __internal__endElement(_, name)
|
64
|
-
@document.end_element name
|
65
|
-
end
|
66
|
-
|
67
|
-
def __internal__characters(_, data, data_length)
|
68
|
-
@document.characters data.slice(0, data_length)
|
69
|
-
end
|
70
|
-
|
71
|
-
def __internal__comment(_, data)
|
72
|
-
@document.comment data
|
73
|
-
end
|
74
|
-
|
75
|
-
def __internal__warning(_, msg)
|
76
|
-
# TODO: vasprintf here
|
77
|
-
@document.warning(msg)
|
78
|
-
end
|
79
|
-
|
80
|
-
def __internal__error(_, msg)
|
81
|
-
# TODO: vasprintf here
|
82
|
-
@document.error(msg)
|
83
|
-
end
|
84
|
-
|
85
|
-
def __internal__cdataBlock(_, data, data_length)
|
86
|
-
@document.cdata_block data.slice(0, data_length)
|
87
|
-
end
|
88
|
-
|
89
|
-
def __internal__startElementNs(_, localname, prefix, uri, nb_namespaces, namespaces, nb_attributes, nb_defaulted, attributes)
|
90
|
-
localname = localname.null? ? nil : localname.read_string
|
91
|
-
prefix = prefix .null? ? nil : prefix .read_string
|
92
|
-
uri = uri .null? ? nil : uri .read_string
|
93
|
-
|
94
|
-
attr_list = []
|
95
|
-
ns_list = []
|
96
|
-
|
97
|
-
if ! attributes.null?
|
98
|
-
# Each attribute is an array of [localname, prefix, URI, value, end]
|
99
|
-
(0..(nb_attributes-1)*5).step(5) do |j|
|
100
|
-
key = attributes.get_pointer(LibXML.pointer_offset(j)).read_string
|
101
|
-
attr_prefix = attributes.get_pointer(LibXML.pointer_offset(j + 1))
|
102
|
-
attr_prefix = attr_prefix.null? ? nil : attr_prefix.read_string
|
103
|
-
attr_uri = attributes.get_pointer(LibXML.pointer_offset(j + 2))
|
104
|
-
attr_uri = attr_uri.null? ? nil : attr_uri.read_string
|
105
|
-
value_length = attributes.get_pointer(LibXML.pointer_offset(j+4)).address \
|
106
|
-
- attributes.get_pointer(LibXML.pointer_offset(j+3)).address
|
107
|
-
value = attributes.get_pointer(LibXML.pointer_offset(j+3)).get_string(0, value_length)
|
108
|
-
attr_list << Attribute.new(key, attr_prefix, attr_uri, value)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
if ! namespaces.null?
|
113
|
-
(0..(nb_namespaces-1)*2).step(2) do |j|
|
114
|
-
key = namespaces.get_pointer(LibXML.pointer_offset(j))
|
115
|
-
key = key.null? ? nil : key.read_string
|
116
|
-
value = namespaces.get_pointer(LibXML.pointer_offset(j+1))
|
117
|
-
value = value.null? ? nil : value.read_string
|
118
|
-
ns_list << [key, value]
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
@document.start_element_namespace(
|
123
|
-
localname,
|
124
|
-
attr_list,
|
125
|
-
prefix,
|
126
|
-
uri,
|
127
|
-
ns_list
|
128
|
-
)
|
129
|
-
end
|
130
|
-
|
131
|
-
def __internal__endElementNs(_, localname, prefix, uri)
|
132
|
-
localname = localname.null? ? nil : localname.read_string
|
133
|
-
prefix = prefix .null? ? nil : prefix .read_string
|
134
|
-
uri = uri .null? ? nil : uri .read_string
|
135
|
-
|
136
|
-
@document.end_element_namespace(localname, prefix, uri)
|
137
|
-
end
|
138
|
-
|
139
|
-
# :startdoc:
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# :stopdoc:
|
2
|
-
module Nokogiri
|
3
|
-
module XML
|
4
|
-
module SAX
|
5
|
-
class ParserContext
|
6
|
-
attr_accessor :cstruct
|
7
|
-
attr_accessor :reader_callback
|
8
|
-
|
9
|
-
def self.memory data
|
10
|
-
raise(ArgumentError, 'data cannot be nil') if data.nil?
|
11
|
-
raise('data cannot be empty') if data.length == 0
|
12
|
-
ctx = LibXML::XmlParserContext.new(
|
13
|
-
LibXML.xmlCreateMemoryParserCtxt data, data.length
|
14
|
-
)
|
15
|
-
pc = allocate
|
16
|
-
pc.cstruct = ctx
|
17
|
-
pc
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.io io, encoding
|
21
|
-
reader_callback = IoCallbacks.reader(io) # keep a reference to prevent it from being GC'd
|
22
|
-
sax_ctx = LibXML.xmlCreateIOParserCtxt(
|
23
|
-
nil,
|
24
|
-
nil,
|
25
|
-
reader_callback,
|
26
|
-
nil,
|
27
|
-
nil,
|
28
|
-
encoding
|
29
|
-
)
|
30
|
-
pc = allocate
|
31
|
-
pc.cstruct = LibXML::XmlParserContext.new sax_ctx
|
32
|
-
pc.reader_callback = reader_callback
|
33
|
-
pc
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.file filename
|
37
|
-
ctx = LibXML.xmlCreateFileParserCtxt filename
|
38
|
-
pc = allocate
|
39
|
-
pc.cstruct = LibXML::XmlParserContext.new ctx
|
40
|
-
pc
|
41
|
-
end
|
42
|
-
|
43
|
-
def line
|
44
|
-
return nil if cstruct[:input].null?
|
45
|
-
input = LibXML::XmlParserInput.new cstruct[:input]
|
46
|
-
input[:line]
|
47
|
-
end
|
48
|
-
|
49
|
-
def column
|
50
|
-
return nil if cstruct[:input].null?
|
51
|
-
input = LibXML::XmlParserInput.new cstruct[:input]
|
52
|
-
input[:col]
|
53
|
-
end
|
54
|
-
|
55
|
-
def parse_with sax_handler, type = :xml
|
56
|
-
raise ArgumentError unless XML::SAX::Parser === sax_handler
|
57
|
-
sax = sax_handler.cstruct
|
58
|
-
cstruct[:sax] = sax
|
59
|
-
|
60
|
-
sax_handler.instance_variable_set(:@ctxt, cstruct)
|
61
|
-
|
62
|
-
LibXML.send(:"#{type}ParseDocument", cstruct)
|
63
|
-
|
64
|
-
cstruct[:sax] = nil
|
65
|
-
LibXML.xmlFreeDoc cstruct[:myDoc] unless cstruct[:myDoc].null?
|
66
|
-
end
|
67
|
-
|
68
|
-
def replace_entities=(value)
|
69
|
-
self.cstruct[:replaceEntities] = value ? 1 : 0
|
70
|
-
end
|
71
|
-
|
72
|
-
def replace_entities
|
73
|
-
self.cstruct[:replaceEntities] == 0 ? false : true
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
# :startdoc:
|
@@ -1,51 +0,0 @@
|
|
1
|
-
module Nokogiri
|
2
|
-
module XML
|
3
|
-
module SAX
|
4
|
-
class PushParser
|
5
|
-
|
6
|
-
attr_accessor :cstruct # :nodoc:
|
7
|
-
|
8
|
-
def options
|
9
|
-
cstruct[:options]
|
10
|
-
end
|
11
|
-
|
12
|
-
def options=(user_options)
|
13
|
-
if LibXML.xmlCtxtUseOptions(cstruct, user_options) != 0
|
14
|
-
raise RuntimeError, "Cannot set XML parser context options"
|
15
|
-
end
|
16
|
-
nil
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def native_write(chunk, last_chunk) # :nodoc:
|
22
|
-
size = 0
|
23
|
-
unless chunk.nil?
|
24
|
-
chunk = chunk.to_s
|
25
|
-
size = chunk.length
|
26
|
-
end
|
27
|
-
|
28
|
-
if LibXML.xmlParseChunk(cstruct, chunk, size, last_chunk ? 1 : 0) != 0
|
29
|
-
if (cstruct[:options] & XML::ParseOptions::RECOVER) == 0
|
30
|
-
error = LibXML.xmlCtxtGetLastError(cstruct)
|
31
|
-
raise Nokogiri::XML::SyntaxError.wrap(error)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
self
|
36
|
-
end
|
37
|
-
|
38
|
-
def initialize_native(sax, filename) # :nodoc:
|
39
|
-
filename = filename.to_s unless filename.nil?
|
40
|
-
ctx_ptr = LibXML.xmlCreatePushParserCtxt(
|
41
|
-
sax.cstruct, nil, nil, 0, filename
|
42
|
-
)
|
43
|
-
raise(RuntimeError, "Could not create a parser context") if ctx_ptr.null?
|
44
|
-
self.cstruct = LibXML::XmlSaxPushParserContext.new(ctx_ptr) ;
|
45
|
-
self
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,109 +0,0 @@
|
|
1
|
-
module Nokogiri
|
2
|
-
module XML
|
3
|
-
class Schema
|
4
|
-
# :stopdoc:
|
5
|
-
|
6
|
-
attr_accessor :cstruct
|
7
|
-
|
8
|
-
def validate_document document
|
9
|
-
errors = []
|
10
|
-
|
11
|
-
ctx = LibXML.xmlSchemaNewValidCtxt(cstruct)
|
12
|
-
raise RuntimeError.new("Could not create a validation context") if ctx.null?
|
13
|
-
|
14
|
-
LibXML.xmlSchemaSetValidStructuredErrors(ctx,
|
15
|
-
SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
|
16
|
-
|
17
|
-
LibXML.xmlSchemaValidateDoc(ctx, document.cstruct)
|
18
|
-
|
19
|
-
LibXML.xmlSchemaFreeValidCtxt(ctx)
|
20
|
-
|
21
|
-
errors
|
22
|
-
end
|
23
|
-
private :validate_document
|
24
|
-
|
25
|
-
def validate_file filename
|
26
|
-
errors = []
|
27
|
-
|
28
|
-
ctx = LibXML.xmlSchemaNewValidCtxt(cstruct)
|
29
|
-
raise RuntimeError.new("Could not create a validation context") if ctx.null?
|
30
|
-
|
31
|
-
LibXML.xmlSchemaSetValidStructuredErrors(ctx,
|
32
|
-
SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
|
33
|
-
|
34
|
-
LibXML.xmlSchemaValidateFile(ctx, filename, 0)
|
35
|
-
|
36
|
-
LibXML.xmlSchemaFreeValidCtxt(ctx)
|
37
|
-
|
38
|
-
errors
|
39
|
-
end
|
40
|
-
private :validate_document
|
41
|
-
|
42
|
-
def self.read_memory content
|
43
|
-
content_copy = FFI::MemoryPointer.from_string(content)
|
44
|
-
ctx = LibXML.xmlSchemaNewMemParserCtxt(content_copy, content.length)
|
45
|
-
|
46
|
-
errors = []
|
47
|
-
|
48
|
-
LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(errors))
|
49
|
-
LibXML.xmlSchemaSetParserStructuredErrors(ctx, SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
|
50
|
-
|
51
|
-
schema_ptr = LibXML.xmlSchemaParse(ctx)
|
52
|
-
|
53
|
-
LibXML.xmlSetStructuredErrorFunc(nil, nil)
|
54
|
-
LibXML.xmlSchemaFreeParserCtxt(ctx)
|
55
|
-
|
56
|
-
if schema_ptr.null?
|
57
|
-
error = LibXML.xmlGetLastError
|
58
|
-
if error
|
59
|
-
raise SyntaxError.wrap(error)
|
60
|
-
else
|
61
|
-
raise RuntimeError, "Could not parse document"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
schema = allocate
|
66
|
-
schema.cstruct = LibXML::XmlSchema.new schema_ptr
|
67
|
-
schema.errors = errors
|
68
|
-
schema
|
69
|
-
end
|
70
|
-
|
71
|
-
def self.from_document document
|
72
|
-
ctx = LibXML.xmlSchemaNewDocParserCtxt(document.document.cstruct)
|
73
|
-
|
74
|
-
errors = []
|
75
|
-
|
76
|
-
LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(errors))
|
77
|
-
unless Nokogiri.is_2_6_16?
|
78
|
-
LibXML.xmlSchemaSetParserStructuredErrors(
|
79
|
-
ctx,
|
80
|
-
SyntaxError.error_array_pusher(errors),
|
81
|
-
nil
|
82
|
-
)
|
83
|
-
end
|
84
|
-
|
85
|
-
schema_ptr = LibXML.xmlSchemaParse(ctx)
|
86
|
-
|
87
|
-
LibXML.xmlSetStructuredErrorFunc(nil, nil)
|
88
|
-
LibXML.xmlSchemaFreeParserCtxt(ctx)
|
89
|
-
|
90
|
-
if schema_ptr.null?
|
91
|
-
error = LibXML.xmlGetLastError
|
92
|
-
if error
|
93
|
-
raise SyntaxError.wrap(error)
|
94
|
-
else
|
95
|
-
raise RuntimeError, "Could not parse document"
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
schema = allocate
|
100
|
-
schema.cstruct = LibXML::XmlSchema.new schema_ptr
|
101
|
-
schema.errors = errors
|
102
|
-
schema
|
103
|
-
end
|
104
|
-
|
105
|
-
# :startdoc:
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
@@ -1,98 +0,0 @@
|
|
1
|
-
# :stopdoc:
|
2
|
-
module Nokogiri
|
3
|
-
module XML
|
4
|
-
class SyntaxError < ::Nokogiri::SyntaxError
|
5
|
-
|
6
|
-
attr_accessor :cstruct
|
7
|
-
|
8
|
-
def initialize(message)
|
9
|
-
self.cstruct = LibXML::XmlSyntaxError.new(LibXML::XmlSyntaxError.allocate())
|
10
|
-
self.cstruct[:message] = LibXML.xmlStrdup(message)
|
11
|
-
end
|
12
|
-
|
13
|
-
def domain
|
14
|
-
cstruct[:domain]
|
15
|
-
end
|
16
|
-
|
17
|
-
def code
|
18
|
-
cstruct[:code]
|
19
|
-
end
|
20
|
-
|
21
|
-
def message
|
22
|
-
val = cstruct[:message]
|
23
|
-
val.null? ? nil : val.read_string.chomp
|
24
|
-
end
|
25
|
-
undef_method :inspect
|
26
|
-
alias_method :inspect, :message
|
27
|
-
undef_method :to_s
|
28
|
-
alias_method :to_s, :message
|
29
|
-
|
30
|
-
def message=(string)
|
31
|
-
unless cstruct[:message].null?
|
32
|
-
LibXML.xmlFree(cstruct[:message])
|
33
|
-
end
|
34
|
-
cstruct[:message] = LibXML.xmlStrdup(string)
|
35
|
-
string
|
36
|
-
end
|
37
|
-
|
38
|
-
def initialize_copy(other)
|
39
|
-
raise ArgumentError, "node must be a Nokogiri::XML::SyntaxError" unless other.is_a?(Nokogiri::XML::SyntaxError)
|
40
|
-
LibXML.xmlCopyError(other.cstruct, cstruct)
|
41
|
-
self
|
42
|
-
end
|
43
|
-
|
44
|
-
def level
|
45
|
-
cstruct[:level]
|
46
|
-
end
|
47
|
-
|
48
|
-
def file
|
49
|
-
cstruct[:file].null? ? nil : cstruct[:file]
|
50
|
-
end
|
51
|
-
|
52
|
-
def line
|
53
|
-
cstruct[:line]
|
54
|
-
end
|
55
|
-
|
56
|
-
def str1
|
57
|
-
cstruct[:str1]
|
58
|
-
end
|
59
|
-
|
60
|
-
def str2
|
61
|
-
cstruct[:str]
|
62
|
-
end
|
63
|
-
|
64
|
-
def str3
|
65
|
-
cstruct[:str3]
|
66
|
-
end
|
67
|
-
|
68
|
-
def int1
|
69
|
-
cstruct[:int1]
|
70
|
-
end
|
71
|
-
|
72
|
-
def column
|
73
|
-
cstruct[:int2]
|
74
|
-
end
|
75
|
-
alias_method :int2, :column
|
76
|
-
|
77
|
-
class << self
|
78
|
-
def error_array_pusher(array)
|
79
|
-
Proc.new do |_ignored_, error|
|
80
|
-
array << wrap(error) if array
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def wrap(error_ptr)
|
85
|
-
error_struct = LibXML::XmlSyntaxError.allocate
|
86
|
-
LibXML.xmlCopyError(error_ptr, error_struct)
|
87
|
-
error_cstruct = LibXML::XmlSyntaxError.new(error_struct)
|
88
|
-
error = self.allocate # will generate XML::XPath::SyntaxError or XML::SyntaxError
|
89
|
-
error.cstruct = error_cstruct
|
90
|
-
error
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
# :startdoc:
|