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.

Files changed (164) hide show
  1. data/CHANGELOG.ja.rdoc +8 -83
  2. data/CHANGELOG.rdoc +6 -80
  3. data/Manifest.txt +4 -74
  4. data/README.ja.rdoc +5 -1
  5. data/README.rdoc +8 -22
  6. data/Rakefile +79 -60
  7. data/bin/nokogiri +1 -6
  8. data/deps.rip +5 -0
  9. data/ext/nokogiri/extconf.rb +32 -53
  10. data/ext/nokogiri/nokogiri.c +0 -2
  11. data/ext/nokogiri/nokogiri.h +0 -9
  12. data/ext/nokogiri/xml_document.c +0 -14
  13. data/ext/nokogiri/xml_dtd.c +2 -2
  14. data/ext/nokogiri/xml_io.c +7 -32
  15. data/ext/nokogiri/xml_node.c +31 -103
  16. data/ext/nokogiri/xml_node_set.c +8 -8
  17. data/ext/nokogiri/xml_reader.c +1 -20
  18. data/ext/nokogiri/xml_sax_parser.c +3 -5
  19. data/ext/nokogiri/xml_sax_parser_context.c +0 -40
  20. data/ext/nokogiri/xml_xpath_context.c +2 -35
  21. data/ext/nokogiri/xslt_stylesheet.c +6 -124
  22. data/lib/nokogiri.rb +7 -3
  23. data/lib/nokogiri/css.rb +3 -6
  24. data/lib/nokogiri/css/generated_parser.rb +669 -0
  25. data/lib/nokogiri/css/generated_tokenizer.rb +145 -0
  26. data/lib/nokogiri/css/parser.rb +70 -665
  27. data/lib/nokogiri/css/parser.y +1 -6
  28. data/lib/nokogiri/css/tokenizer.rb +3 -148
  29. data/lib/nokogiri/css/tokenizer.rex +1 -1
  30. data/lib/nokogiri/css/xpath_visitor.rb +14 -16
  31. data/lib/nokogiri/decorators/slop.rb +3 -5
  32. data/lib/nokogiri/html.rb +3 -2
  33. data/lib/nokogiri/html/document.rb +18 -134
  34. data/lib/nokogiri/html/document_fragment.rb +21 -26
  35. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  36. data/lib/nokogiri/html/sax/parser.rb +2 -6
  37. data/lib/nokogiri/version.rb +4 -9
  38. data/lib/nokogiri/xml/attribute_decl.rb +1 -1
  39. data/lib/nokogiri/xml/builder.rb +1 -1
  40. data/lib/nokogiri/xml/document.rb +3 -27
  41. data/lib/nokogiri/xml/document_fragment.rb +2 -9
  42. data/lib/nokogiri/xml/dtd.rb +1 -12
  43. data/lib/nokogiri/xml/element_decl.rb +1 -1
  44. data/lib/nokogiri/xml/entity_decl.rb +1 -1
  45. data/lib/nokogiri/xml/node.rb +75 -172
  46. data/lib/nokogiri/xml/node/save_options.rb +0 -10
  47. data/lib/nokogiri/xml/node_set.rb +3 -28
  48. data/lib/nokogiri/xml/parse_options.rb +0 -8
  49. data/lib/nokogiri/xml/reader.rb +6 -44
  50. data/lib/nokogiri/xml/sax/document.rb +5 -9
  51. data/lib/nokogiri/xml/schema.rb +1 -7
  52. data/lib/nokogiri/xslt.rb +5 -9
  53. data/tasks/cross_compile.rb +12 -27
  54. data/tasks/test.rb +0 -0
  55. data/test/css/test_parser.rb +19 -40
  56. data/test/css/test_tokenizer.rb +0 -8
  57. data/test/helper.rb +1 -4
  58. data/test/html/sax/test_parser.rb +21 -47
  59. data/test/html/sax/test_parser_context.rb +2 -2
  60. data/test/html/test_document.rb +3 -58
  61. data/test/html/test_document_encoding.rb +0 -53
  62. data/test/html/test_document_fragment.rb +13 -82
  63. data/test/html/test_element_description.rb +4 -2
  64. data/test/html/test_node.rb +0 -9
  65. data/test/test_memory_leak.rb +2 -57
  66. data/test/test_nokogiri.rb +14 -20
  67. data/test/test_reader.rb +7 -47
  68. data/test/test_xslt_transforms.rb +5 -8
  69. data/test/xml/sax/test_parser.rb +17 -34
  70. data/test/xml/sax/test_parser_context.rb +0 -50
  71. data/test/xml/sax/test_push_parser.rb +1 -18
  72. data/test/xml/test_attr.rb +4 -31
  73. data/test/xml/test_attribute_decl.rb +7 -3
  74. data/test/xml/test_builder.rb +5 -5
  75. data/test/xml/test_cdata.rb +3 -3
  76. data/test/xml/test_document.rb +18 -15
  77. data/test/xml/test_document_fragment.rb +20 -19
  78. data/test/xml/test_dtd.rb +13 -18
  79. data/test/xml/test_element_content.rb +1 -1
  80. data/test/xml/test_element_decl.rb +1 -1
  81. data/test/xml/test_entity_decl.rb +12 -10
  82. data/test/xml/test_namespace.rb +7 -5
  83. data/test/xml/test_node.rb +15 -54
  84. data/test/xml/test_node_reparenting.rb +42 -85
  85. data/test/xml/test_node_set.rb +2 -61
  86. data/test/xml/test_schema.rb +0 -5
  87. data/test/xml/test_text.rb +2 -11
  88. data/test/xml/test_unparented_node.rb +1 -1
  89. data/test/xml/test_xpath.rb +7 -43
  90. metadata +131 -155
  91. data/.gemtest +0 -0
  92. data/ext/nokogiri/depend +0 -358
  93. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  94. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  95. data/lib/nokogiri/css/parser_extras.rb +0 -91
  96. data/lib/nokogiri/ffi/encoding_handler.rb +0 -42
  97. data/lib/nokogiri/ffi/html/document.rb +0 -28
  98. data/lib/nokogiri/ffi/html/element_description.rb +0 -81
  99. data/lib/nokogiri/ffi/html/entity_lookup.rb +0 -16
  100. data/lib/nokogiri/ffi/html/sax/parser_context.rb +0 -38
  101. data/lib/nokogiri/ffi/io_callbacks.rb +0 -42
  102. data/lib/nokogiri/ffi/libxml.rb +0 -420
  103. data/lib/nokogiri/ffi/structs/common_node.rb +0 -38
  104. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +0 -24
  105. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +0 -13
  106. data/lib/nokogiri/ffi/structs/xml_alloc.rb +0 -16
  107. data/lib/nokogiri/ffi/structs/xml_attr.rb +0 -20
  108. data/lib/nokogiri/ffi/structs/xml_attribute.rb +0 -27
  109. data/lib/nokogiri/ffi/structs/xml_buffer.rb +0 -16
  110. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +0 -11
  111. data/lib/nokogiri/ffi/structs/xml_document.rb +0 -117
  112. data/lib/nokogiri/ffi/structs/xml_dtd.rb +0 -28
  113. data/lib/nokogiri/ffi/structs/xml_element.rb +0 -26
  114. data/lib/nokogiri/ffi/structs/xml_element_content.rb +0 -17
  115. data/lib/nokogiri/ffi/structs/xml_entity.rb +0 -32
  116. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +0 -12
  117. data/lib/nokogiri/ffi/structs/xml_node.rb +0 -28
  118. data/lib/nokogiri/ffi/structs/xml_node_set.rb +0 -53
  119. data/lib/nokogiri/ffi/structs/xml_notation.rb +0 -11
  120. data/lib/nokogiri/ffi/structs/xml_ns.rb +0 -15
  121. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +0 -20
  122. data/lib/nokogiri/ffi/structs/xml_parser_input.rb +0 -19
  123. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +0 -14
  124. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +0 -51
  125. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +0 -124
  126. data/lib/nokogiri/ffi/structs/xml_schema.rb +0 -13
  127. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +0 -31
  128. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +0 -12
  129. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +0 -38
  130. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +0 -35
  131. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +0 -20
  132. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +0 -13
  133. data/lib/nokogiri/ffi/weak_bucket.rb +0 -40
  134. data/lib/nokogiri/ffi/xml/attr.rb +0 -41
  135. data/lib/nokogiri/ffi/xml/attribute_decl.rb +0 -27
  136. data/lib/nokogiri/ffi/xml/cdata.rb +0 -19
  137. data/lib/nokogiri/ffi/xml/comment.rb +0 -18
  138. data/lib/nokogiri/ffi/xml/document.rb +0 -174
  139. data/lib/nokogiri/ffi/xml/document_fragment.rb +0 -21
  140. data/lib/nokogiri/ffi/xml/dtd.rb +0 -67
  141. data/lib/nokogiri/ffi/xml/element_content.rb +0 -43
  142. data/lib/nokogiri/ffi/xml/element_decl.rb +0 -19
  143. data/lib/nokogiri/ffi/xml/entity_decl.rb +0 -36
  144. data/lib/nokogiri/ffi/xml/entity_reference.rb +0 -19
  145. data/lib/nokogiri/ffi/xml/namespace.rb +0 -44
  146. data/lib/nokogiri/ffi/xml/node.rb +0 -559
  147. data/lib/nokogiri/ffi/xml/node_set.rb +0 -150
  148. data/lib/nokogiri/ffi/xml/processing_instruction.rb +0 -20
  149. data/lib/nokogiri/ffi/xml/reader.rb +0 -236
  150. data/lib/nokogiri/ffi/xml/relax_ng.rb +0 -85
  151. data/lib/nokogiri/ffi/xml/sax/parser.rb +0 -143
  152. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +0 -79
  153. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +0 -51
  154. data/lib/nokogiri/ffi/xml/schema.rb +0 -109
  155. data/lib/nokogiri/ffi/xml/syntax_error.rb +0 -98
  156. data/lib/nokogiri/ffi/xml/text.rb +0 -18
  157. data/lib/nokogiri/ffi/xml/xpath.rb +0 -9
  158. data/lib/nokogiri/ffi/xml/xpath_context.rb +0 -153
  159. data/lib/nokogiri/ffi/xslt/stylesheet.rb +0 -77
  160. data/test/decorators/test_slop.rb +0 -16
  161. data/test/ffi/test_document.rb +0 -35
  162. data/test/files/encoding.html +0 -82
  163. data/test/files/encoding.xhtml +0 -84
  164. data/test/xslt/test_custom_functions.rb +0 -94
@@ -1,150 +0,0 @@
1
- module Nokogiri
2
- module XML
3
- class NodeSet
4
-
5
- attr_accessor :cstruct # :nodoc:
6
-
7
- def dup # :nodoc:
8
- dup = LibXML.xmlXPathNodeSetMerge(nil, self.cstruct)
9
- NodeSet.wrap(dup, self.document)
10
- end
11
-
12
- def length # :nodoc:
13
- cstruct.pointer.null? ? 0 : cstruct[:nodeNr]
14
- end
15
-
16
- def push(node) # :nodoc:
17
- raise(ArgumentError, "node must be a Nokogiri::XML::Node") unless node.is_a?(XML::Node) || node.is_a?(XML::Namespace)
18
- LibXML.xmlXPathNodeSetAdd(cstruct, node.cstruct)
19
- self
20
- end
21
-
22
- def |(node_set) # :nodoc:
23
- raise(ArgumentError, "node_set must be a Nokogiri::XML::NodeSet") unless node_set.is_a?(XML::NodeSet)
24
- new_set_ptr = LibXML::xmlXPathNodeSetMerge(nil, self.cstruct)
25
- new_set_ptr = LibXML::xmlXPathNodeSetMerge(new_set_ptr, node_set.cstruct)
26
-
27
- NodeSet.wrap(new_set_ptr, self.document)
28
- end
29
-
30
- def -(node_set) # :nodoc:
31
- raise(ArgumentError, "node_set must be a Nokogiri::XML::NodeSet") unless node_set.is_a?(XML::NodeSet)
32
- new_set_ptr = LibXML.xmlXPathNodeSetMerge(nil, self.cstruct)
33
-
34
- other_nodetab = node_set.cstruct.nodeTab
35
- node_set.cstruct[:nodeNr].times do |j|
36
- LibXML.xmlXPathNodeSetDel(new_set_ptr, other_nodetab[j])
37
- end
38
- NodeSet.wrap(new_set_ptr, self.document)
39
- end
40
-
41
- def delete(node) # :nodoc:
42
- raise(ArgumentError, "node must be a Nokogiri::XML::Node") unless node.is_a?(XML::Node) || node.is_a?(XML::Namespace)
43
- if LibXML.xmlXPathNodeSetContains(cstruct, node.cstruct) != 0
44
- LibXML.xmlXPathNodeSetDel(cstruct, node.cstruct)
45
- return node
46
- end
47
- return nil
48
- end
49
-
50
- def [](*args) # :nodoc:
51
- raise(ArgumentError, "got #{args.length} arguments, expected 1 (or 2)") if args.length > 2
52
-
53
- if args.length == 2
54
- beg = args[0]
55
- len = args[1]
56
- beg += cstruct[:nodeNr] if beg < 0
57
- return subseq(beg, len)
58
- end
59
- arg = args[0]
60
-
61
- return subseq(arg.first, arg.last-arg.first+1) if arg.is_a?(Range)
62
-
63
- index_at(arg)
64
- end
65
- alias_method :slice, :[]
66
-
67
- def &(node_set) # :nodoc:
68
- raise(ArgumentError, "node_set must be a Nokogiri::XML::NodeSet") unless node_set.is_a?(XML::NodeSet)
69
- new_set_ptr = LibXML.xmlXPathIntersection(cstruct, node_set.cstruct)
70
- NodeSet.wrap(new_set_ptr, self.document)
71
- end
72
-
73
- def include?(node) # :nodoc:
74
- raise(ArgumentError, "node must be a Nokogiri::XML::Node") unless node.is_a?(XML::Node) || node.is_a?(XML::Namespace)
75
- (LibXML.xmlXPathNodeSetContains(cstruct, node.cstruct) != 0) ? true : false
76
- end
77
-
78
- def to_a # :nodoc:
79
- cstruct.nodeTab.collect do |node|
80
- node_cstruct = LibXML::XmlNode.new(node)
81
- if node_cstruct[:type] == XML::Node::NAMESPACE_DECL
82
- Namespace.wrap(document.cstruct, node)
83
- else
84
- Node.wrap(node_cstruct)
85
- end
86
- end
87
- end
88
-
89
- def unlink # :nodoc:
90
- return if cstruct[:nodeNr] == 0
91
- nodetab = cstruct.nodeTab
92
- cstruct[:nodeNr].times do |j|
93
- node_cstruct = LibXML::XmlNode.new(nodetab[j])
94
- if node_cstruct[:type] != XML::Node::NAMESPACE_DECL
95
- node = Node.wrap(node_cstruct)
96
- node.unlink
97
- nodetab[j] = node.cstruct.pointer
98
- end
99
- end
100
- cstruct.nodeTab = nodetab
101
- self
102
- end
103
-
104
- def self.new document, list = [] # :nodoc:
105
- set = NodeSet.wrap(LibXML.xmlXPathNodeSetCreate(nil), document)
106
- set.document = document
107
- list.each { |x| set << x }
108
- yield set if block_given?
109
- set
110
- end
111
-
112
- def self.wrap(ptr, document) # :nodoc:
113
- set = allocate
114
- set.cstruct = LibXML::XmlNodeSet.new(ptr)
115
- if document
116
- set.document = document
117
- document.decorate(set)
118
- end
119
- set
120
- end
121
-
122
- private
123
-
124
- def index_at(number) # :nodoc:
125
- return nil if (number >= cstruct[:nodeNr] || number.abs > cstruct[:nodeNr])
126
- number = number + cstruct[:nodeNr] if number < 0
127
- node_ptr = cstruct.nodeAt(number)
128
- node_cstruct = LibXML::XmlNode.new(node_ptr)
129
- if node_cstruct[:type] == XML::Node::NAMESPACE_DECL
130
- Namespace.wrap(document.cstruct, node_ptr)
131
- else
132
- Node.wrap(node_cstruct)
133
- end
134
- end
135
-
136
- def subseq(beg, len) # :nodoc:
137
- return nil if beg > cstruct[:nodeNr]
138
- return nil if beg < 0 || len < 0
139
- len = cstruct[:nodeNr] - beg if beg + len > cstruct[:nodeNr]
140
-
141
- set = NodeSet.wrap(LibXML.xmlXPathNodeSetCreate(nil), self.document)
142
- beg.upto(beg+len-1) do |j|
143
- LibXML.xmlXPathNodeSetAddUnique(set.cstruct, cstruct.nodeAt(j));
144
- end
145
- set
146
- end
147
-
148
- end
149
- end
150
- end
@@ -1,20 +0,0 @@
1
- module Nokogiri
2
- module XML
3
- class ProcessingInstruction < Node
4
-
5
- attr_accessor :cstruct # :nodoc:
6
-
7
- def self.new(document, name, content, *rest) # :nodoc:
8
- node_ptr = LibXML.xmlNewDocPI(document.cstruct, name.to_s, content.to_s)
9
- node_cstruct = LibXML::XmlNode.new(node_ptr)
10
- node_cstruct.keep_reference_from_document!
11
-
12
- node = Node.wrap(node_cstruct, self)
13
- node.send :initialize, document, name, content, *rest
14
- yield node if block_given?
15
- node
16
- end
17
-
18
- end
19
- end
20
- end
@@ -1,236 +0,0 @@
1
- # :stopdoc:
2
- module Nokogiri
3
- module XML
4
- class Reader
5
-
6
- attr_accessor :cstruct
7
- attr_accessor :reader_callback
8
-
9
- def default?
10
- LibXML.xmlTextReaderIsDefault(cstruct) == 1
11
- end
12
-
13
- def value?
14
- LibXML.xmlTextReaderHasValue(cstruct) == 1
15
- end
16
-
17
- def attributes?
18
- # this implementation of xmlTextReaderHasAttributes explicitly includes
19
- # namespaces and properties, because some earlier versions ignore
20
- # namespaces.
21
- node_ptr = LibXML.xmlTextReaderCurrentNode(cstruct)
22
- return false if node_ptr.null?
23
- node = LibXML::XmlNode.new node_ptr
24
- node[:type] == Node::ELEMENT_NODE && (!node[:properties].null? || !node[:nsDef].null?)
25
- end
26
-
27
- def namespaces
28
- return {} unless attributes?
29
-
30
- ptr = LibXML.xmlTextReaderExpand(cstruct)
31
- return nil if ptr.null?
32
-
33
- Reader.node_namespaces(ptr)
34
- end
35
-
36
- def attr_nodes
37
- return {} unless attributes?
38
-
39
- ptr = LibXML.xmlTextReaderExpand(cstruct)
40
- return nil if ptr.null?
41
- node_struct = LibXML::XmlNode.new(ptr)
42
-
43
- Node.node_properties node_struct
44
- end
45
-
46
- def attribute_at(index)
47
- return nil if index.nil?
48
- index = index.to_i
49
- attr_ptr = LibXML.xmlTextReaderGetAttributeNo(cstruct, index)
50
- return nil if attr_ptr.null?
51
-
52
- attr = attr_ptr.read_string
53
- LibXML.xmlFree attr_ptr
54
- attr
55
- end
56
-
57
- def attribute(name)
58
- return nil if name.nil?
59
- attr_ptr = LibXML.xmlTextReaderGetAttribute(cstruct, name.to_s)
60
- if attr_ptr.null?
61
- # this section is an attempt to workaround older versions of libxml that
62
- # don't handle namespaces properly in all attribute-and-friends functions
63
- prefix_ptr = FFI::Buffer.new :pointer
64
- localname = LibXML.xmlSplitQName2(name, prefix_ptr)
65
- prefix = prefix_ptr.get_pointer(0)
66
- if ! localname.null?
67
- attr_ptr = LibXML.xmlTextReaderLookupNamespace(cstruct, localname.read_string)
68
- LibXML.xmlFree(localname)
69
- else
70
- if prefix.null? || prefix.read_string.length == 0
71
- attr_ptr = LibXML.xmlTextReaderLookupNamespace(cstruct, nil)
72
- else
73
- attr_ptr = LibXML.xmlTextReaderLookupNamespace(cstruct, prefix.read_string)
74
- end
75
- end
76
- LibXML.xmlFree(prefix)
77
- end
78
- return nil if attr_ptr.null?
79
-
80
- attr = attr_ptr.read_string
81
- LibXML.xmlFree(attr_ptr)
82
- attr
83
- end
84
-
85
- def attribute_count
86
- count = LibXML.xmlTextReaderAttributeCount(cstruct)
87
- count == -1 ? nil : count
88
- end
89
-
90
- def depth
91
- val = LibXML.xmlTextReaderDepth(cstruct)
92
- val == -1 ? nil : val
93
- end
94
-
95
- def xml_version
96
- val = LibXML.xmlTextReaderConstXmlVersion(cstruct)
97
- val.null? ? nil : val.read_string
98
- end
99
-
100
- def lang
101
- val = LibXML.xmlTextReaderConstXmlLang(cstruct)
102
- val.null? ? nil : val.read_string
103
- end
104
-
105
- def value
106
- val = LibXML.xmlTextReaderConstValue(cstruct)
107
- val.null? ? nil : val.read_string
108
- end
109
-
110
- def prefix
111
- val = LibXML.xmlTextReaderConstPrefix(cstruct)
112
- val.null? ? nil : val.read_string
113
- end
114
-
115
- def namespace_uri
116
- val = LibXML.xmlTextReaderConstNamespaceUri(cstruct)
117
- val.null? ? nil : val.read_string
118
- end
119
-
120
- def local_name
121
- val = LibXML.xmlTextReaderConstLocalName(cstruct)
122
- val.null? ? nil : val.read_string
123
- end
124
-
125
- def name
126
- val = LibXML.xmlTextReaderConstName(cstruct)
127
- val.null? ? nil : val.read_string
128
- end
129
-
130
- def base_uri
131
- val = LibXML.xmlTextReaderConstBaseUri(cstruct)
132
- val.null? ? nil : val.read_string
133
- end
134
-
135
- def state
136
- LibXML.xmlTextReaderReadState(cstruct)
137
- end
138
-
139
- def read
140
- error_list = self.errors
141
-
142
- LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(error_list))
143
- ret = LibXML.xmlTextReaderRead(cstruct)
144
- LibXML.xmlSetStructuredErrorFunc(nil, nil)
145
-
146
- return self if ret == 1
147
- return nil if ret == 0
148
-
149
- error = LibXML.xmlGetLastError()
150
- if error
151
- raise SyntaxError.wrap(error)
152
- else
153
- raise RuntimeError, "Error pulling: #{ret}"
154
- end
155
-
156
- nil
157
- end
158
-
159
- def inner_xml
160
- string_ptr = LibXML.xmlTextReaderReadInnerXml(cstruct)
161
- return nil if string_ptr.null?
162
- string = string_ptr.read_string
163
- LibXML.xmlFree(string_ptr)
164
- string
165
- end
166
-
167
- def outer_xml
168
- string_ptr = LibXML.xmlTextReaderReadOuterXml(cstruct)
169
- return nil if string_ptr.null?
170
- string = string_ptr.read_string
171
- LibXML.xmlFree(string_ptr)
172
- string
173
- end
174
-
175
- def node_type
176
- LibXML.xmlTextReaderNodeType(cstruct)
177
- end
178
-
179
- def empty_element?
180
- LibXML.xmlTextReaderIsEmptyElement(cstruct) != 0
181
- end
182
-
183
- def self.from_memory(buffer, url=nil, encoding=nil, options=0)
184
- raise(ArgumentError, "string cannot be nil") if buffer.nil?
185
-
186
- memory = FFI::MemoryPointer.new(buffer.length) # we need to manage native memory lifecycle
187
- memory.put_bytes(0, buffer)
188
- reader_ptr = LibXML.xmlReaderForMemory(memory, memory.total, url, encoding, options)
189
- raise(RuntimeError, "couldn't create a reader") if reader_ptr.null?
190
-
191
- reader = allocate
192
- reader.cstruct = LibXML::XmlTextReader.new(reader_ptr)
193
- reader.send(:initialize, memory, url, encoding)
194
- reader
195
- end
196
-
197
- def self.from_io(io, url=nil, encoding=nil, options=0)
198
- raise(ArgumentError, "io cannot be nil") if io.nil?
199
-
200
- cb = IoCallbacks.reader(io) # we will keep a reference to prevent it from being GC'd
201
- reader_ptr = LibXML.xmlReaderForIO(cb, nil, nil, url, encoding, options)
202
- raise "couldn't create a parser" if reader_ptr.null?
203
-
204
- reader = allocate
205
- reader.cstruct = LibXML::XmlTextReader.new(reader_ptr)
206
- reader.send(:initialize, io, url, encoding)
207
- reader.reader_callback = cb
208
- reader
209
- end
210
-
211
- private
212
-
213
- class << self
214
- def node_namespaces(ptr)
215
- cstruct = LibXML::XmlNode.new(ptr)
216
- ahash = {}
217
- return ahash unless cstruct[:type] == Node::ELEMENT_NODE
218
- ns = cstruct[:nsDef]
219
- while ! ns.null?
220
- ns_cstruct = LibXML::XmlNs.new(ns)
221
- prefix = ns_cstruct[:prefix]
222
- key = if prefix.nil? || prefix.empty?
223
- "xmlns"
224
- else
225
- "xmlns:#{prefix}"
226
- end
227
- ahash[key] = ns_cstruct[:href] # TODO: encoding?
228
- ns = ns_cstruct[:next] # TODO: encoding?
229
- end
230
- ahash
231
- end
232
- end
233
- end
234
- end
235
- end
236
- # :startdoc:
@@ -1,85 +0,0 @@
1
- module Nokogiri
2
- module XML
3
- class RelaxNG < Schema
4
- # :stopdoc:
5
- def validate_document document
6
- errors = []
7
-
8
- ctx = LibXML.xmlRelaxNGNewValidCtxt(cstruct)
9
- raise RuntimeError.new("Could not create a validation context") if ctx.null?
10
-
11
- LibXML.xmlRelaxNGSetValidStructuredErrors(ctx,
12
- SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
13
-
14
- LibXML.xmlRelaxNGValidateDoc(ctx, document.cstruct)
15
-
16
- LibXML.xmlRelaxNGFreeValidCtxt(ctx)
17
-
18
- errors
19
- end
20
- private :validate_document
21
-
22
- def self.read_memory content
23
- content_copy = FFI::MemoryPointer.from_string(content)
24
- ctx = LibXML.xmlRelaxNGNewMemParserCtxt(content_copy, content.length)
25
-
26
- errors = []
27
-
28
- LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(errors))
29
- LibXML.xmlRelaxNGSetParserStructuredErrors(
30
- ctx, SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
31
-
32
- schema_ptr = LibXML.xmlRelaxNGParse(ctx)
33
-
34
- LibXML.xmlSetStructuredErrorFunc(nil, nil)
35
- LibXML.xmlRelaxNGFreeParserCtxt(ctx)
36
-
37
- if schema_ptr.null?
38
- error = LibXML.xmlGetLastError
39
- if error
40
- raise SyntaxError.wrap(error)
41
- else
42
- raise RuntimeError, "Could not parse document"
43
- end
44
- end
45
-
46
- schema = allocate
47
- schema.cstruct = LibXML::XmlRelaxNG.new schema_ptr
48
- schema.errors = errors
49
- schema
50
- end
51
-
52
- def self.from_document document
53
- ctx = LibXML.xmlRelaxNGNewDocParserCtxt document.document.cstruct
54
-
55
- errors = []
56
-
57
- LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(errors))
58
- LibXML.xmlRelaxNGSetParserStructuredErrors(
59
- ctx, SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
60
-
61
- schema_ptr = LibXML.xmlRelaxNGParse(ctx)
62
-
63
- LibXML.xmlSetStructuredErrorFunc(nil, nil)
64
- LibXML.xmlRelaxNGFreeParserCtxt(ctx) unless Nokogiri.is_2_6_16?
65
-
66
- if schema_ptr.null?
67
- error = LibXML.xmlGetLastError
68
- if error
69
- raise SyntaxError.wrap(error)
70
- else
71
- raise RuntimeError, "Could not parse document"
72
- end
73
- end
74
-
75
- LibXML.xmlRelaxNGFreeParserCtxt(ctx) if Nokogiri.is_2_6_16?
76
-
77
- schema = allocate
78
- schema.cstruct = LibXML::XmlRelaxNG.new schema_ptr
79
- schema.errors = errors
80
- schema
81
- end
82
- # :startdoc:
83
- end
84
- end
85
- end