nokogiri 1.4.3.1-java → 1.5.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. data/.gemtest +0 -0
  2. data/CHANGELOG.ja.rdoc +113 -0
  3. data/CHANGELOG.rdoc +113 -1
  4. data/Manifest.txt +72 -68
  5. data/README.ja.rdoc +4 -4
  6. data/README.rdoc +31 -7
  7. data/Rakefile +110 -132
  8. data/bin/nokogiri +7 -3
  9. data/ext/java/nokogiri/EncodingHandler.java +124 -0
  10. data/ext/java/nokogiri/HtmlDocument.java +119 -0
  11. data/ext/java/nokogiri/HtmlElementDescription.java +145 -0
  12. data/ext/java/nokogiri/HtmlEntityLookup.java +79 -0
  13. data/ext/java/nokogiri/HtmlSaxParserContext.java +259 -0
  14. data/ext/java/nokogiri/NokogiriService.java +590 -0
  15. data/ext/java/nokogiri/XmlAttr.java +180 -0
  16. data/ext/java/nokogiri/XmlAttributeDecl.java +130 -0
  17. data/ext/java/nokogiri/XmlCdata.java +84 -0
  18. data/ext/java/nokogiri/XmlComment.java +86 -0
  19. data/ext/java/nokogiri/XmlDocument.java +519 -0
  20. data/ext/java/nokogiri/XmlDocumentFragment.java +223 -0
  21. data/ext/java/nokogiri/XmlDtd.java +469 -0
  22. data/ext/java/nokogiri/XmlElement.java +195 -0
  23. data/ext/java/nokogiri/XmlElementContent.java +382 -0
  24. data/ext/java/nokogiri/XmlElementDecl.java +152 -0
  25. data/ext/java/nokogiri/XmlEntityDecl.java +162 -0
  26. data/ext/java/nokogiri/XmlEntityReference.java +97 -0
  27. data/ext/java/nokogiri/XmlNamespace.java +183 -0
  28. data/ext/java/nokogiri/XmlNode.java +1378 -0
  29. data/ext/java/nokogiri/XmlNodeSet.java +267 -0
  30. data/ext/java/nokogiri/XmlProcessingInstruction.java +99 -0
  31. data/ext/java/nokogiri/XmlReader.java +408 -0
  32. data/ext/java/nokogiri/XmlRelaxng.java +144 -0
  33. data/ext/java/nokogiri/XmlSaxParserContext.java +367 -0
  34. data/ext/java/nokogiri/XmlSaxPushParser.java +184 -0
  35. data/ext/java/nokogiri/XmlSchema.java +324 -0
  36. data/ext/java/nokogiri/XmlSyntaxError.java +119 -0
  37. data/ext/java/nokogiri/XmlText.java +119 -0
  38. data/ext/java/nokogiri/XmlXpathContext.java +199 -0
  39. data/ext/java/nokogiri/XsltStylesheet.java +197 -0
  40. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +204 -0
  41. data/ext/java/nokogiri/internals/NokogiriDocumentCache.java +73 -0
  42. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +86 -0
  43. data/ext/java/nokogiri/internals/NokogiriHandler.java +327 -0
  44. data/ext/java/nokogiri/internals/NokogiriHelpers.java +639 -0
  45. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +167 -0
  46. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +130 -0
  47. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +74 -0
  48. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +121 -0
  49. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +79 -0
  50. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +141 -0
  51. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +73 -0
  52. data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +67 -0
  53. data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +86 -0
  54. data/ext/java/nokogiri/internals/ParserContext.java +276 -0
  55. data/ext/java/nokogiri/internals/PushInputStream.java +411 -0
  56. data/ext/java/nokogiri/internals/ReaderNode.java +531 -0
  57. data/ext/java/nokogiri/internals/SaveContextVisitor.java +567 -0
  58. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +76 -0
  59. data/ext/java/nokogiri/internals/XmlDeclHandler.java +42 -0
  60. data/ext/java/nokogiri/internals/XmlDomParser.java +76 -0
  61. data/ext/java/nokogiri/internals/XmlDomParserContext.java +244 -0
  62. data/ext/java/nokogiri/internals/XmlSaxParser.java +65 -0
  63. data/ext/java/nokogiri/internals/XsltExtensionFunction.java +72 -0
  64. data/ext/nokogiri/depend +358 -32
  65. data/ext/nokogiri/extconf.rb +10 -6
  66. data/ext/nokogiri/nokogiri.c +23 -3
  67. data/ext/nokogiri/nokogiri.h +7 -2
  68. data/ext/nokogiri/xml_document.c +9 -0
  69. data/ext/nokogiri/xml_dtd.c +2 -2
  70. data/ext/nokogiri/xml_io.c +32 -7
  71. data/ext/nokogiri/xml_node.c +45 -25
  72. data/ext/nokogiri/xml_node_set.c +1 -1
  73. data/ext/nokogiri/xml_relax_ng.c +0 -7
  74. data/ext/nokogiri/xml_sax_parser.c +14 -7
  75. data/ext/nokogiri/xml_sax_parser_context.c +40 -0
  76. data/ext/nokogiri/xml_xpath_context.c +33 -2
  77. data/ext/nokogiri/xslt_stylesheet.c +128 -6
  78. data/lib/isorelax.jar +0 -0
  79. data/lib/jing.jar +0 -0
  80. data/lib/nekodtd.jar +0 -0
  81. data/lib/nekohtml.jar +0 -0
  82. data/lib/nokogiri/css/parser.rb +665 -70
  83. data/lib/nokogiri/css/parser.y +3 -1
  84. data/lib/nokogiri/css/parser_extras.rb +91 -0
  85. data/lib/nokogiri/css/tokenizer.rb +148 -3
  86. data/lib/nokogiri/css/tokenizer.rex +1 -1
  87. data/lib/nokogiri/css/xpath_visitor.rb +15 -7
  88. data/lib/nokogiri/css.rb +5 -3
  89. data/lib/nokogiri/decorators/slop.rb +5 -3
  90. data/lib/nokogiri/html/document.rb +142 -19
  91. data/lib/nokogiri/html/document_fragment.rb +19 -17
  92. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  93. data/lib/nokogiri/html/sax/parser.rb +6 -2
  94. data/lib/nokogiri/html.rb +1 -0
  95. data/lib/nokogiri/nokogiri.jar +0 -0
  96. data/lib/nokogiri/version.rb +76 -26
  97. data/lib/nokogiri/xml/attribute_decl.rb +1 -1
  98. data/lib/nokogiri/xml/builder.rb +7 -0
  99. data/lib/nokogiri/xml/document.rb +43 -2
  100. data/lib/nokogiri/xml/document_fragment.rb +16 -2
  101. data/lib/nokogiri/xml/dtd.rb +12 -1
  102. data/lib/nokogiri/xml/element_decl.rb +1 -1
  103. data/lib/nokogiri/xml/entity_decl.rb +1 -1
  104. data/lib/nokogiri/xml/node/save_options.rb +20 -1
  105. data/lib/nokogiri/xml/node.rb +198 -78
  106. data/lib/nokogiri/xml/node_set.rb +10 -3
  107. data/lib/nokogiri/xml/parse_options.rb +8 -0
  108. data/lib/nokogiri/xml/reader.rb +42 -6
  109. data/lib/nokogiri/xml/sax/document.rb +4 -2
  110. data/lib/nokogiri/xml/schema.rb +7 -1
  111. data/lib/nokogiri/xslt/stylesheet.rb +1 -1
  112. data/lib/nokogiri/xslt.rb +9 -5
  113. data/lib/nokogiri.rb +19 -25
  114. data/lib/xercesImpl.jar +0 -0
  115. data/nokogiri_help_responses.md +40 -0
  116. data/tasks/cross_compile.rb +130 -136
  117. data/tasks/nokogiri.org.rb +18 -0
  118. data/tasks/test.rb +2 -2
  119. data/test/css/test_parser.rb +29 -18
  120. data/test/css/test_tokenizer.rb +8 -0
  121. data/test/decorators/test_slop.rb +16 -0
  122. data/test/files/encoding.html +82 -0
  123. data/test/files/encoding.xhtml +84 -0
  124. data/test/files/metacharset.html +10 -0
  125. data/test/files/noencoding.html +47 -0
  126. data/test/helper.rb +5 -1
  127. data/test/html/sax/test_parser.rb +65 -3
  128. data/test/html/test_document.rb +75 -1
  129. data/test/html/test_document_encoding.rb +61 -0
  130. data/test/html/test_document_fragment.rb +50 -5
  131. data/test/html/test_element_description.rb +4 -2
  132. data/test/html/test_node.rb +9 -0
  133. data/test/test_memory_leak.rb +20 -35
  134. data/test/test_nokogiri.rb +14 -20
  135. data/test/test_reader.rb +23 -6
  136. data/test/test_xslt_transforms.rb +6 -2
  137. data/test/xml/node/test_save_options.rb +10 -2
  138. data/test/xml/sax/test_parser.rb +39 -8
  139. data/test/xml/sax/test_parser_context.rb +50 -0
  140. data/test/xml/sax/test_push_parser.rb +18 -1
  141. data/test/xml/test_attribute_decl.rb +7 -3
  142. data/test/xml/test_builder.rb +17 -0
  143. data/test/xml/test_document.rb +34 -5
  144. data/test/xml/test_document_fragment.rb +14 -2
  145. data/test/xml/test_dtd.rb +28 -3
  146. data/test/xml/test_element_content.rb +1 -1
  147. data/test/xml/test_element_decl.rb +1 -1
  148. data/test/xml/test_entity_decl.rb +12 -10
  149. data/test/xml/test_namespace.rb +7 -5
  150. data/test/xml/test_node.rb +65 -13
  151. data/test/xml/test_node_reparenting.rb +72 -31
  152. data/test/xml/test_node_set.rb +57 -0
  153. data/test/xml/test_schema.rb +5 -0
  154. data/test/xml/test_xpath.rb +32 -0
  155. data/test/xslt/test_custom_functions.rb +94 -0
  156. data/test/xslt/test_exception_handling.rb +37 -0
  157. metadata +512 -517
  158. data/deps.rip +0 -5
  159. data/ext/nokogiri/libcharset-1.dll +0 -0
  160. data/ext/nokogiri/libexslt.dll +0 -0
  161. data/ext/nokogiri/libiconv-2.dll +0 -0
  162. data/ext/nokogiri/libxml2.dll +0 -0
  163. data/ext/nokogiri/libxslt.dll +0 -0
  164. data/ext/nokogiri/zlib1.dll +0 -0
  165. data/lib/nokogiri/css/generated_parser.rb +0 -676
  166. data/lib/nokogiri/css/generated_tokenizer.rb +0 -146
  167. data/lib/nokogiri/ffi/encoding_handler.rb +0 -42
  168. data/lib/nokogiri/ffi/html/document.rb +0 -28
  169. data/lib/nokogiri/ffi/html/element_description.rb +0 -81
  170. data/lib/nokogiri/ffi/html/entity_lookup.rb +0 -16
  171. data/lib/nokogiri/ffi/html/sax/parser_context.rb +0 -38
  172. data/lib/nokogiri/ffi/io_callbacks.rb +0 -42
  173. data/lib/nokogiri/ffi/libxml.rb +0 -411
  174. data/lib/nokogiri/ffi/structs/common_node.rb +0 -38
  175. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +0 -24
  176. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +0 -13
  177. data/lib/nokogiri/ffi/structs/xml_alloc.rb +0 -16
  178. data/lib/nokogiri/ffi/structs/xml_attr.rb +0 -19
  179. data/lib/nokogiri/ffi/structs/xml_attribute.rb +0 -27
  180. data/lib/nokogiri/ffi/structs/xml_buffer.rb +0 -16
  181. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +0 -11
  182. data/lib/nokogiri/ffi/structs/xml_document.rb +0 -117
  183. data/lib/nokogiri/ffi/structs/xml_dtd.rb +0 -28
  184. data/lib/nokogiri/ffi/structs/xml_element.rb +0 -26
  185. data/lib/nokogiri/ffi/structs/xml_element_content.rb +0 -17
  186. data/lib/nokogiri/ffi/structs/xml_entity.rb +0 -32
  187. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +0 -12
  188. data/lib/nokogiri/ffi/structs/xml_node.rb +0 -28
  189. data/lib/nokogiri/ffi/structs/xml_node_set.rb +0 -53
  190. data/lib/nokogiri/ffi/structs/xml_notation.rb +0 -11
  191. data/lib/nokogiri/ffi/structs/xml_ns.rb +0 -15
  192. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +0 -19
  193. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +0 -14
  194. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +0 -51
  195. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +0 -124
  196. data/lib/nokogiri/ffi/structs/xml_schema.rb +0 -13
  197. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +0 -31
  198. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +0 -12
  199. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +0 -38
  200. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +0 -35
  201. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +0 -20
  202. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +0 -13
  203. data/lib/nokogiri/ffi/weak_bucket.rb +0 -40
  204. data/lib/nokogiri/ffi/xml/attr.rb +0 -41
  205. data/lib/nokogiri/ffi/xml/attribute_decl.rb +0 -27
  206. data/lib/nokogiri/ffi/xml/cdata.rb +0 -19
  207. data/lib/nokogiri/ffi/xml/comment.rb +0 -18
  208. data/lib/nokogiri/ffi/xml/document.rb +0 -166
  209. data/lib/nokogiri/ffi/xml/document_fragment.rb +0 -21
  210. data/lib/nokogiri/ffi/xml/dtd.rb +0 -67
  211. data/lib/nokogiri/ffi/xml/element_content.rb +0 -43
  212. data/lib/nokogiri/ffi/xml/element_decl.rb +0 -19
  213. data/lib/nokogiri/ffi/xml/entity_decl.rb +0 -36
  214. data/lib/nokogiri/ffi/xml/entity_reference.rb +0 -19
  215. data/lib/nokogiri/ffi/xml/namespace.rb +0 -44
  216. data/lib/nokogiri/ffi/xml/node.rb +0 -554
  217. data/lib/nokogiri/ffi/xml/node_set.rb +0 -149
  218. data/lib/nokogiri/ffi/xml/processing_instruction.rb +0 -20
  219. data/lib/nokogiri/ffi/xml/reader.rb +0 -236
  220. data/lib/nokogiri/ffi/xml/relax_ng.rb +0 -85
  221. data/lib/nokogiri/ffi/xml/sax/parser.rb +0 -135
  222. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +0 -67
  223. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +0 -51
  224. data/lib/nokogiri/ffi/xml/schema.rb +0 -109
  225. data/lib/nokogiri/ffi/xml/syntax_error.rb +0 -98
  226. data/lib/nokogiri/ffi/xml/text.rb +0 -18
  227. data/lib/nokogiri/ffi/xml/xpath.rb +0 -9
  228. data/lib/nokogiri/ffi/xml/xpath_context.rb +0 -148
  229. data/lib/nokogiri/ffi/xslt/stylesheet.rb +0 -53
  230. data/lib/nokogiri/version_warning.rb +0 -14
  231. data/test/ffi/test_document.rb +0 -35
@@ -1,554 +0,0 @@
1
- module Nokogiri
2
- module XML
3
- class Node
4
- # :stopdoc:
5
-
6
- attr_accessor :cstruct
7
-
8
- def pointer_id
9
- cstruct.pointer
10
- end
11
-
12
- def encode_special_chars(string)
13
- char_ptr = LibXML.xmlEncodeSpecialChars(self[:doc], string)
14
- encoded = char_ptr.read_string
15
- # TODO: encoding?
16
- LibXML.xmlFree(char_ptr)
17
- encoded
18
- end
19
-
20
- def internal_subset
21
- doc = cstruct.document
22
- dtd = LibXML.xmlGetIntSubset(doc)
23
- return nil if dtd.null?
24
- Node.wrap(dtd)
25
- end
26
-
27
- def external_subset
28
- doc = cstruct.document
29
- return nil if doc[:extSubset].null?
30
-
31
- Node.wrap(doc[:extSubset])
32
- end
33
-
34
- def create_internal_subset name, external_id, system_id
35
- raise("Document already has an internal subset") if internal_subset
36
-
37
- doc = cstruct.document
38
- dtd_ptr = LibXML.xmlCreateIntSubset doc, name, external_id, system_id
39
-
40
- return nil if dtd_ptr.null?
41
-
42
- Node.wrap dtd_ptr
43
- end
44
-
45
- def create_external_subset name, external_id, system_id
46
- raise("Document already has an external subset") if external_subset
47
-
48
- doc = cstruct.document
49
- dtd_ptr = LibXML.xmlNewDtd doc, name, external_id, system_id
50
-
51
- return nil if dtd_ptr.null?
52
-
53
- Node.wrap dtd_ptr
54
- end
55
-
56
- def dup(deep = 1)
57
- dup_ptr = LibXML.xmlDocCopyNode(cstruct, cstruct.document, deep)
58
- return nil if dup_ptr.null?
59
- Node.wrap(dup_ptr, self.class)
60
- end
61
-
62
- def unlink
63
- LibXML.xmlUnlinkNode(cstruct)
64
- cstruct.keep_reference_from_document!
65
- self
66
- end
67
-
68
- def blank?
69
- LibXML.xmlIsBlankNode(cstruct) == 1
70
- end
71
-
72
- def next_sibling
73
- cstruct_node_from :next
74
- end
75
-
76
- def previous_sibling
77
- cstruct_node_from :prev
78
- end
79
-
80
- def next_element
81
- LibXML.xmlNextElementSiblingHack self
82
- end
83
-
84
- def previous_element
85
- #
86
- # note that we don't use xmlPreviousElementSibling here because it's buggy pre-2.7.7.
87
- #
88
- sibling_ptr = cstruct[:prev]
89
-
90
- while ! sibling_ptr.null?
91
- sibling_cstruct = LibXML::XmlNode.new(sibling_ptr)
92
- break if sibling_cstruct[:type] == ELEMENT_NODE
93
- sibling_ptr = sibling_cstruct[:prev]
94
- end
95
-
96
- return sibling_ptr.null? ? nil : Node.wrap(sibling_ptr)
97
- end
98
-
99
- def replace_node new_node
100
- Node.reparent_node_with(self, new_node) do |pivot_struct, reparentee_struct|
101
- retval = LibXML.xmlReplaceNode(pivot_struct, reparentee_struct)
102
- retval = reparentee_struct if retval == pivot_struct.pointer # for reparent_node_with semantics
103
- retval = LibXML::XmlNode.new(retval) if retval.is_a?(FFI::Pointer)
104
- if retval[:type] == TEXT_NODE
105
- if !retval[:prev].null? && LibXML::XmlNode.new(retval[:prev])[:type] == TEXT_NODE
106
- retval = LibXML::XmlNode.new(LibXML.xmlTextMerge(retval[:prev], retval))
107
- end
108
- if !retval[:next].null? && LibXML::XmlNode.new(retval[:next])[:type] == TEXT_NODE
109
- retval = LibXML::XmlNode.new(LibXML.xmlTextMerge(retval, retval[:next]))
110
- end
111
- end
112
- retval
113
- end
114
- end
115
-
116
- def children
117
- return NodeSet.new(nil) if cstruct[:children].null?
118
- child = Node.wrap(cstruct[:children])
119
-
120
- set = NodeSet.wrap(LibXML.xmlXPathNodeSetCreate(child.cstruct), self.document)
121
- return set unless child
122
-
123
- child_ptr = child.cstruct[:next]
124
- while ! child_ptr.null?
125
- child = Node.wrap(child_ptr)
126
- LibXML.xmlXPathNodeSetAddUnique(set.cstruct, child.cstruct)
127
- child_ptr = child.cstruct[:next]
128
- end
129
-
130
- return set
131
- end
132
-
133
- def element_children
134
- child = LibXML.xmlFirstElementChildHack(self)
135
- return NodeSet.new(nil) if child.nil?
136
-
137
- set = NodeSet.wrap(LibXML.xmlXPathNodeSetCreate(child.cstruct), self.document)
138
- return set unless child
139
-
140
- next_sibling = LibXML.xmlNextElementSiblingHack(child)
141
- while ! next_sibling.nil?
142
- child = next_sibling
143
- LibXML.xmlXPathNodeSetAddUnique(set.cstruct, child.cstruct)
144
- next_sibling = LibXML.xmlNextElementSiblingHack(child)
145
- end
146
-
147
- return set
148
- end
149
-
150
- def child
151
- (val = cstruct[:children]).null? ? nil : Node.wrap(val)
152
- end
153
-
154
- def first_element_child
155
- LibXML.xmlFirstElementChildHack(self)
156
- end
157
-
158
- def last_element_child
159
- LibXML.xmlLastElementChildHack(self)
160
- end
161
-
162
- def key?(attribute)
163
- ! (prop = LibXML.xmlHasProp(cstruct, attribute.to_s)).null?
164
- end
165
-
166
- def namespaced_key?(attribute, namespace)
167
- prop = LibXML.xmlHasNsProp(cstruct, attribute.to_s,
168
- namespace.nil? ? nil : namespace.to_s)
169
- !prop.null?
170
- end
171
-
172
- def []=(property, value)
173
- LibXML.xmlSetProp(cstruct, property, value)
174
- value
175
- end
176
-
177
- def get(attribute)
178
- return nil unless attribute
179
- propstr = LibXML.xmlGetProp(cstruct, attribute.to_s)
180
- return nil if propstr.null?
181
- rval = propstr.read_string # TODO: encoding?
182
- LibXML.xmlFree(propstr)
183
- rval
184
- end
185
-
186
- def set_namespace(namespace)
187
- LibXML.xmlSetNs(cstruct, namespace ? namespace.cstruct : nil)
188
- self
189
- end
190
-
191
- def attribute(name)
192
- attribute_nodes.find { |x| x.name == name }
193
- end
194
-
195
- def attribute_with_ns(name, namespace)
196
- prop = LibXML.xmlHasNsProp(cstruct, name.to_s,
197
- namespace.nil? ? NULL : namespace.to_s)
198
- return prop if prop.null?
199
- Node.wrap(prop)
200
- end
201
-
202
- def attribute_nodes
203
- Node.node_properties cstruct
204
- end
205
-
206
- def namespace
207
- cstruct[:ns].null? ? nil : Namespace.wrap(cstruct.document, cstruct[:ns])
208
- end
209
-
210
- def namespace_definitions
211
- list = []
212
- ns_ptr = cstruct[:nsDef]
213
- return list if ns_ptr.null?
214
- while ! ns_ptr.null?
215
- ns = Namespace.wrap(cstruct.document, ns_ptr)
216
- list << ns
217
- ns_ptr = ns.cstruct[:next]
218
- end
219
- list
220
- end
221
-
222
- def namespace_scopes
223
- ns_list = LibXML.xmlGetNsList(self.cstruct[:doc], self.cstruct)
224
- return [] if ns_list.null?
225
-
226
- list = []
227
- until (ns_ptr = ns_list.get_pointer(LibXML.pointer_offset(list.length))).null?
228
- list << Namespace.wrap(cstruct.document, ns_ptr)
229
- end
230
-
231
- LibXML.xmlFree(ns_list)
232
- list
233
- end
234
-
235
- def node_type
236
- cstruct[:type]
237
- end
238
-
239
- def native_content=(content)
240
- child_ptr = cstruct[:children]
241
- while ! child_ptr.null?
242
- child = Node.wrap(child_ptr)
243
- next_ptr = child.cstruct[:next]
244
- LibXML.xmlUnlinkNode(child.cstruct)
245
- cstruct.keep_reference_from_document!
246
- child_ptr = next_ptr
247
- end
248
- LibXML.xmlNodeSetContent(cstruct, content)
249
- content
250
- end
251
-
252
- def content
253
- content_ptr = LibXML.xmlNodeGetContent(cstruct)
254
- return nil if content_ptr.null?
255
- content = content_ptr.read_string # TODO: encoding?
256
- LibXML.xmlFree(content_ptr)
257
- content
258
- end
259
-
260
- def add_child_node child
261
- Node.reparent_node_with(self, child) do |pivot_struct, reparentee_struct|
262
- LibXML.xmlAddChild(pivot_struct, reparentee_struct)
263
- end
264
- end
265
-
266
- def parent
267
- cstruct_node_from :parent
268
- end
269
-
270
- def node_name=(string)
271
- LibXML.xmlNodeSetName(cstruct, string)
272
- string
273
- end
274
-
275
- def node_name
276
- cstruct[:name] # TODO: encoding?
277
- end
278
-
279
- def path
280
- path_ptr = LibXML.xmlGetNodePath(cstruct)
281
- val = path_ptr.null? ? nil : path_ptr.read_string # TODO: encoding?
282
- LibXML.xmlFree(path_ptr)
283
- val
284
- end
285
-
286
- def add_next_sibling_node next_sibling
287
- Node.reparent_node_with(self, next_sibling) do |pivot_struct, reparentee_struct|
288
- LibXML.xmlAddNextSibling(pivot_struct, reparentee_struct)
289
- end
290
- end
291
-
292
- def add_previous_sibling_node prev_sibling
293
- Node.reparent_node_with(self, prev_sibling) do |pivot_struct, reparentee_struct|
294
- LibXML.xmlAddPrevSibling(pivot_struct, reparentee_struct)
295
- end
296
- end
297
-
298
- def native_write_to(io, encoding, indent_string, options)
299
- set_xml_indent_tree_output 1
300
- set_xml_tree_indent_string indent_string
301
- savectx = LibXML.xmlSaveToIO(IoCallbacks.writer(io), nil, nil, encoding, options)
302
- LibXML.xmlSaveTree(savectx, cstruct)
303
- LibXML.xmlSaveClose(savectx)
304
- io
305
- end
306
-
307
- def line
308
- cstruct[:line]
309
- end
310
-
311
- def add_namespace_definition(prefix, href)
312
- ns = LibXML.xmlSearchNs(cstruct.document, cstruct, prefix.nil? ? nil : prefix.to_s)
313
- namespacee = self
314
- if ns.null?
315
- namespacee = parent if type != ELEMENT_NODE
316
- ns = LibXML.xmlNewNs(namespacee.cstruct, href, prefix)
317
- end
318
- return nil if ns.null?
319
- LibXML.xmlSetNs(cstruct, ns) if (prefix.nil? || self != namespacee)
320
- Namespace.wrap(cstruct.document, ns)
321
- end
322
-
323
- def self.new(name, doc, *rest)
324
- ptr = LibXML.xmlNewNode(nil, name.to_s)
325
-
326
- node_cstruct = LibXML::XmlNode.new(ptr)
327
- node_cstruct[:doc] = doc.cstruct[:doc]
328
- node_cstruct.keep_reference_from_document!
329
-
330
- node = Node.wrap(
331
- node_cstruct,
332
- Node == self ? nil : self
333
- )
334
- node.send :initialize, name, doc, *rest
335
- yield node if block_given?
336
- node
337
- end
338
-
339
- def dump_html
340
- return to_xml if type == DOCUMENT_NODE
341
- buffer = LibXML::XmlBuffer.new(LibXML.xmlBufferCreate())
342
- LibXML.htmlNodeDump(buffer, cstruct[:doc], cstruct)
343
- buffer[:content] # TODO: encoding?
344
- end
345
-
346
- def compare(other)
347
- LibXML.xmlXPathCmpNodes(other.cstruct, self.cstruct)
348
- end
349
-
350
- def self.wrap(node_struct, klass=nil)
351
- if node_struct.is_a?(FFI::Pointer)
352
- # cast native pointers up into a node cstruct
353
- return nil if node_struct.null?
354
- node_struct = LibXML::XmlNode.new(node_struct)
355
- end
356
-
357
- raise "wrapping a node without a document" unless node_struct.document
358
-
359
- document_struct = node_struct.document
360
- document_obj = document_struct.nil? ? nil : document_struct.ruby_doc
361
- if node_struct[:type] == DOCUMENT_NODE || node_struct[:type] == HTML_DOCUMENT_NODE
362
- return document_obj
363
- end
364
-
365
- ruby_node = node_struct.ruby_node
366
- return ruby_node unless ruby_node.nil?
367
-
368
- klasses = case node_struct[:type]
369
- when ELEMENT_NODE then [XML::Element]
370
- when TEXT_NODE then [XML::Text]
371
- when ENTITY_REF_NODE then [XML::EntityReference]
372
- when ATTRIBUTE_DECL then [XML::AttributeDecl, LibXML::XmlAttribute]
373
- when ELEMENT_DECL then [XML::ElementDecl, LibXML::XmlElement]
374
- when COMMENT_NODE then [XML::Comment]
375
- when DOCUMENT_FRAG_NODE then [XML::DocumentFragment]
376
- when PI_NODE then [XML::ProcessingInstruction]
377
- when ATTRIBUTE_NODE then [XML::Attr]
378
- when ENTITY_DECL then [XML::EntityDecl, LibXML::XmlEntity]
379
- when CDATA_SECTION_NODE then [XML::CDATA]
380
- when DTD_NODE then [XML::DTD, LibXML::XmlDtd]
381
- else [XML::Node]
382
- end
383
-
384
- if klass
385
- node = klass.allocate
386
- else
387
- node = klasses.first.allocate
388
- end
389
- node.cstruct = klasses[1] ? klasses[1].new(node_struct.pointer) : node_struct
390
-
391
- node.cstruct.ruby_node = node
392
-
393
- if document_obj
394
- node.instance_variable_set(:@document, document_obj)
395
- cache = document_obj.instance_variable_get(:@node_cache)
396
- cache << node
397
- document_obj.decorate(node)
398
- end
399
-
400
- node
401
- end
402
-
403
- def document
404
- cstruct.document.ruby_doc
405
- end
406
-
407
- def in_context(string, options)
408
- raise RuntimeError, "no contextual parsing on unlinked nodes" if parent.nil?
409
-
410
- @errors = []
411
- LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(@errors))
412
- LibXML.htmlHandleOmittedElem(0)
413
-
414
- list_memory = FFI::MemoryPointer.new :pointer
415
- LibXML.xmlParseInNodeContext(cstruct, string, string.length, options, list_memory)
416
-
417
- LibXML.htmlHandleOmittedElem(1)
418
- LibXML.xmlSetStructuredErrorFunc(nil, nil)
419
-
420
- set = NodeSet.wrap(LibXML.xmlXPathNodeSetCreate(nil), document)
421
- list_ptr = list_memory.get_pointer(0)
422
- while ! list_ptr.null?
423
- list = Node.wrap(list_ptr)
424
- LibXML.xmlXPathNodeSetAddUnique(set.cstruct, list.cstruct)
425
- list_ptr = list.cstruct[:next]
426
- end
427
- set
428
- end
429
-
430
- class << self
431
- def node_properties(cstruct)
432
- attr = []
433
- prop_cstruct = cstruct[:properties]
434
- while ! prop_cstruct.null?
435
- prop = Node.wrap(prop_cstruct)
436
- attr << prop
437
- prop_cstruct = prop.cstruct[:next]
438
- end
439
- attr
440
- end
441
- end
442
-
443
- private
444
-
445
- def self.reparent_node_with(pivot, reparentee, &block)
446
- raise(ArgumentError, "node must be a Nokogiri::XML::Node") unless reparentee.is_a?(Nokogiri::XML::Node)
447
- raise(ArgumentError, "cannot reparent a document node") if reparentee.node_type == DOCUMENT_NODE || reparentee.node_type == HTML_DOCUMENT_NODE
448
-
449
- pivot_struct = pivot.cstruct
450
- reparentee_struct = reparentee.cstruct
451
-
452
- LibXML.xmlUnlinkNode(reparentee_struct)
453
-
454
- if reparentee_struct[:doc] != pivot_struct[:doc] || reparentee_struct[:type] == TEXT_NODE
455
- reparentee_struct.keep_reference_from_document!
456
- reparentee_struct = LibXML.xmlDocCopyNode(reparentee_struct, pivot_struct.document, 1)
457
- raise(RuntimeError, "Could not reparent node (xmlDocCopyNode)") unless reparentee_struct
458
- reparentee_struct = LibXML::XmlNode.new(reparentee_struct)
459
- end
460
-
461
- if reparentee_struct[:type] == TEXT_NODE && !pivot_struct[:next].null?
462
- next_text = Node.wrap(pivot_struct[:next])
463
- if next_text.cstruct[:type] == TEXT_NODE
464
- new_next_text = LibXML.xmlDocCopyNode(next_text.cstruct, pivot_struct[:doc], 1)
465
- LibXML.xmlUnlinkNode(next_text.cstruct)
466
- next_text.cstruct.keep_reference_from_document!
467
- LibXML.xmlAddNextSibling(pivot_struct, new_next_text);
468
- end
469
- end
470
-
471
- if reparentee_struct[:type] == TEXT_NODE && pivot_struct[:type] == TEXT_NODE && Nokogiri.is_2_6_16?
472
- pivot_struct.pointer.put_pointer(pivot_struct.offset_of(:content), LibXML.xmlStrdup(pivot_struct[:content]))
473
- end
474
-
475
- reparented_struct = block.call(pivot_struct, reparentee_struct)
476
- raise(RuntimeError, "Could not reparent node") unless reparented_struct
477
-
478
- reparented_struct = LibXML::XmlNode.new(reparented_struct) if reparented_struct.is_a?(FFI::Pointer)
479
- reparentee.cstruct = reparented_struct
480
-
481
- relink_namespace reparented_struct
482
-
483
- reparented = Node.wrap(reparented_struct)
484
- reparented.decorate!
485
- reparented
486
- end
487
-
488
- def self.relink_namespace(reparented_struct)
489
- return if reparented_struct[:parent].null?
490
-
491
- # Make sure that our reparented node has the correct namespaces
492
- if reparented_struct[:ns].null? && reparented_struct[:doc] != reparented_struct[:parent]
493
- LibXML.xmlSetNs(reparented_struct, LibXML::XmlNode.new(reparented_struct[:parent])[:ns])
494
- end
495
-
496
- # Search our parents for an existing definition
497
- if ! reparented_struct[:nsDef].null?
498
- curr = reparented_struct[:nsDef]
499
- prev = nil
500
-
501
- while (! curr.null?)
502
- curr_ns = LibXML::XmlNs.new(curr)
503
- ns = LibXML.xmlSearchNsByHref(
504
- reparented_struct[:doc],
505
- reparented_struct[:parent],
506
- curr_ns[:href]
507
- )
508
- # If we find the namespace is already declared, remove it from this
509
- # definition list.
510
- if (! ns.null? && ns != curr)
511
- if prev
512
- prev[:next] = curr_ns[:next]
513
- else
514
- reparented_struct[:nsDef] = curr_ns[:next]
515
- end
516
- curr_ns.keep_reference_from!(reparented_struct.document)
517
- else
518
- prev = curr_ns
519
- end
520
- curr = curr_ns[:next]
521
- end
522
- end
523
-
524
- # Only walk all children if there actually is a namespace we need to reparent.
525
- return if reparented_struct[:ns].null?
526
-
527
- # When a node gets reparented, walk it's children to make sure that
528
- # their namespaces are reparented as well.
529
- child_ptr = reparented_struct[:children]
530
- while ! child_ptr.null?
531
- child_struct = LibXML::XmlNode.new(child_ptr)
532
- relink_namespace child_struct
533
- child_ptr = child_struct[:next]
534
- end
535
- end
536
-
537
- def cstruct_node_from(sym)
538
- (val = cstruct[sym]).null? ? nil : Node.wrap(val)
539
- end
540
-
541
- def set_xml_indent_tree_output(value)
542
- LibXML.__xmlIndentTreeOutput.write_int(value)
543
- end
544
-
545
- def set_xml_tree_indent_string(value)
546
- LibXML.__xmlTreeIndentString.write_pointer(LibXML.xmlStrdup(value.to_s))
547
- end
548
-
549
- # :startdoc:
550
- end
551
- end
552
- end
553
- class Nokogiri::XML::Element < Nokogiri::XML::Node; end
554
- class Nokogiri::XML::CharacterData < Nokogiri::XML::Node; end
@@ -1,149 +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
- nodetab = cstruct.nodeTab
91
- cstruct[:nodeNr].times do |j|
92
- node_cstruct = LibXML::XmlNode.new(nodetab[j])
93
- if node_cstruct[:type] != XML::Node::NAMESPACE_DECL
94
- node = Node.wrap(node_cstruct)
95
- node.unlink
96
- nodetab[j] = node.cstruct.pointer
97
- end
98
- end
99
- cstruct.nodeTab = nodetab
100
- self
101
- end
102
-
103
- def self.new document, list = [] # :nodoc:
104
- set = NodeSet.wrap(LibXML.xmlXPathNodeSetCreate(nil), document)
105
- set.document = document
106
- list.each { |x| set << x }
107
- yield set if block_given?
108
- set
109
- end
110
-
111
- def self.wrap(ptr, document) # :nodoc:
112
- set = allocate
113
- set.cstruct = LibXML::XmlNodeSet.new(ptr)
114
- if document
115
- set.document = document
116
- document.decorate(set)
117
- end
118
- set
119
- end
120
-
121
- private
122
-
123
- def index_at(number) # :nodoc:
124
- return nil if (number >= cstruct[:nodeNr] || number.abs > cstruct[:nodeNr])
125
- number = number + cstruct[:nodeNr] if number < 0
126
- node_ptr = cstruct.nodeAt(number)
127
- node_cstruct = LibXML::XmlNode.new(node_ptr)
128
- if node_cstruct[:type] == XML::Node::NAMESPACE_DECL
129
- Namespace.wrap(document.cstruct, node_ptr)
130
- else
131
- Node.wrap(node_cstruct)
132
- end
133
- end
134
-
135
- def subseq(beg, len) # :nodoc:
136
- return nil if beg > cstruct[:nodeNr]
137
- return nil if beg < 0 || len < 0
138
- len = cstruct[:nodeNr] - beg if beg + len > cstruct[:nodeNr]
139
-
140
- set = NodeSet.wrap(LibXML.xmlXPathNodeSetCreate(nil), self.document)
141
- beg.upto(beg+len-1) do |j|
142
- LibXML.xmlXPathNodeSetAddUnique(set.cstruct, cstruct.nodeAt(j));
143
- end
144
- set
145
- end
146
-
147
- end
148
- end
149
- end