nokogiri-maglev- 1.5.0.1

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 (225) hide show
  1. data/.autotest +26 -0
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.ja.rdoc +544 -0
  4. data/CHANGELOG.rdoc +532 -0
  5. data/Manifest.txt +283 -0
  6. data/README.ja.rdoc +106 -0
  7. data/README.rdoc +174 -0
  8. data/Rakefile +171 -0
  9. data/bin/nokogiri +53 -0
  10. data/ext/nokogiri/depend +358 -0
  11. data/ext/nokogiri/extconf.rb +124 -0
  12. data/ext/nokogiri/html_document.c +154 -0
  13. data/ext/nokogiri/html_document.h +10 -0
  14. data/ext/nokogiri/html_element_description.c +276 -0
  15. data/ext/nokogiri/html_element_description.h +10 -0
  16. data/ext/nokogiri/html_entity_lookup.c +32 -0
  17. data/ext/nokogiri/html_entity_lookup.h +8 -0
  18. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  19. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  20. data/ext/nokogiri/nokogiri.c +115 -0
  21. data/ext/nokogiri/nokogiri.h +160 -0
  22. data/ext/nokogiri/st.c +576 -0
  23. data/ext/nokogiri/xml_attr.c +94 -0
  24. data/ext/nokogiri/xml_attr.h +9 -0
  25. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  26. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  27. data/ext/nokogiri/xml_cdata.c +56 -0
  28. data/ext/nokogiri/xml_cdata.h +9 -0
  29. data/ext/nokogiri/xml_comment.c +54 -0
  30. data/ext/nokogiri/xml_comment.h +9 -0
  31. data/ext/nokogiri/xml_document.c +478 -0
  32. data/ext/nokogiri/xml_document.h +23 -0
  33. data/ext/nokogiri/xml_document_fragment.c +48 -0
  34. data/ext/nokogiri/xml_document_fragment.h +10 -0
  35. data/ext/nokogiri/xml_dtd.c +202 -0
  36. data/ext/nokogiri/xml_dtd.h +10 -0
  37. data/ext/nokogiri/xml_element_content.c +123 -0
  38. data/ext/nokogiri/xml_element_content.h +10 -0
  39. data/ext/nokogiri/xml_element_decl.c +69 -0
  40. data/ext/nokogiri/xml_element_decl.h +9 -0
  41. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  42. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  43. data/ext/nokogiri/xml_entity_decl.c +110 -0
  44. data/ext/nokogiri/xml_entity_decl.h +10 -0
  45. data/ext/nokogiri/xml_entity_reference.c +52 -0
  46. data/ext/nokogiri/xml_entity_reference.h +9 -0
  47. data/ext/nokogiri/xml_io.c +56 -0
  48. data/ext/nokogiri/xml_io.h +11 -0
  49. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  50. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  51. data/ext/nokogiri/xml_namespace.c +84 -0
  52. data/ext/nokogiri/xml_namespace.h +13 -0
  53. data/ext/nokogiri/xml_node.c +1397 -0
  54. data/ext/nokogiri/xml_node.h +13 -0
  55. data/ext/nokogiri/xml_node_set.c +418 -0
  56. data/ext/nokogiri/xml_node_set.h +9 -0
  57. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  58. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  59. data/ext/nokogiri/xml_reader.c +684 -0
  60. data/ext/nokogiri/xml_reader.h +10 -0
  61. data/ext/nokogiri/xml_relax_ng.c +162 -0
  62. data/ext/nokogiri/xml_relax_ng.h +9 -0
  63. data/ext/nokogiri/xml_sax_parser.c +293 -0
  64. data/ext/nokogiri/xml_sax_parser.h +39 -0
  65. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  66. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  67. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  68. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  69. data/ext/nokogiri/xml_schema.c +205 -0
  70. data/ext/nokogiri/xml_schema.h +9 -0
  71. data/ext/nokogiri/xml_syntax_error.c +58 -0
  72. data/ext/nokogiri/xml_syntax_error.h +13 -0
  73. data/ext/nokogiri/xml_text.c +50 -0
  74. data/ext/nokogiri/xml_text.h +9 -0
  75. data/ext/nokogiri/xml_xpath_context.c +315 -0
  76. data/ext/nokogiri/xml_xpath_context.h +9 -0
  77. data/ext/nokogiri/xslt_stylesheet.c +265 -0
  78. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  79. data/lib/nokogiri.rb +127 -0
  80. data/lib/nokogiri/css.rb +27 -0
  81. data/lib/nokogiri/css/node.rb +99 -0
  82. data/lib/nokogiri/css/parser.rb +677 -0
  83. data/lib/nokogiri/css/parser.y +237 -0
  84. data/lib/nokogiri/css/parser_extras.rb +91 -0
  85. data/lib/nokogiri/css/syntax_error.rb +7 -0
  86. data/lib/nokogiri/css/tokenizer.rb +152 -0
  87. data/lib/nokogiri/css/tokenizer.rex +55 -0
  88. data/lib/nokogiri/css/xpath_visitor.rb +171 -0
  89. data/lib/nokogiri/decorators/slop.rb +35 -0
  90. data/lib/nokogiri/html.rb +36 -0
  91. data/lib/nokogiri/html/builder.rb +35 -0
  92. data/lib/nokogiri/html/document.rb +213 -0
  93. data/lib/nokogiri/html/document_fragment.rb +41 -0
  94. data/lib/nokogiri/html/element_description.rb +23 -0
  95. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  96. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  97. data/lib/nokogiri/html/sax/parser.rb +52 -0
  98. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  99. data/lib/nokogiri/syntax_error.rb +4 -0
  100. data/lib/nokogiri/version.rb +88 -0
  101. data/lib/nokogiri/xml.rb +67 -0
  102. data/lib/nokogiri/xml/attr.rb +14 -0
  103. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  104. data/lib/nokogiri/xml/builder.rb +426 -0
  105. data/lib/nokogiri/xml/cdata.rb +11 -0
  106. data/lib/nokogiri/xml/character_data.rb +7 -0
  107. data/lib/nokogiri/xml/document.rb +234 -0
  108. data/lib/nokogiri/xml/document_fragment.rb +98 -0
  109. data/lib/nokogiri/xml/dtd.rb +22 -0
  110. data/lib/nokogiri/xml/element_content.rb +36 -0
  111. data/lib/nokogiri/xml/element_decl.rb +13 -0
  112. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  113. data/lib/nokogiri/xml/namespace.rb +13 -0
  114. data/lib/nokogiri/xml/node.rb +915 -0
  115. data/lib/nokogiri/xml/node/save_options.rb +61 -0
  116. data/lib/nokogiri/xml/node_set.rb +357 -0
  117. data/lib/nokogiri/xml/notation.rb +6 -0
  118. data/lib/nokogiri/xml/parse_options.rb +93 -0
  119. data/lib/nokogiri/xml/pp.rb +2 -0
  120. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  121. data/lib/nokogiri/xml/pp/node.rb +56 -0
  122. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  123. data/lib/nokogiri/xml/reader.rb +112 -0
  124. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  125. data/lib/nokogiri/xml/sax.rb +4 -0
  126. data/lib/nokogiri/xml/sax/document.rb +164 -0
  127. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  128. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  129. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  130. data/lib/nokogiri/xml/schema.rb +63 -0
  131. data/lib/nokogiri/xml/syntax_error.rb +47 -0
  132. data/lib/nokogiri/xml/text.rb +9 -0
  133. data/lib/nokogiri/xml/xpath.rb +10 -0
  134. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  135. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  136. data/lib/nokogiri/xslt.rb +52 -0
  137. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  138. data/lib/xsd/xmlparser/nokogiri.rb +90 -0
  139. data/nokogiri_help_responses.md +40 -0
  140. data/tasks/cross_compile.rb +152 -0
  141. data/tasks/nokogiri.org.rb +18 -0
  142. data/tasks/test.rb +94 -0
  143. data/test/css/test_nthiness.rb +159 -0
  144. data/test/css/test_parser.rb +303 -0
  145. data/test/css/test_tokenizer.rb +198 -0
  146. data/test/css/test_xpath_visitor.rb +85 -0
  147. data/test/decorators/test_slop.rb +16 -0
  148. data/test/files/2ch.html +108 -0
  149. data/test/files/address_book.rlx +12 -0
  150. data/test/files/address_book.xml +10 -0
  151. data/test/files/bar/bar.xsd +4 -0
  152. data/test/files/dont_hurt_em_why.xml +422 -0
  153. data/test/files/encoding.html +82 -0
  154. data/test/files/encoding.xhtml +84 -0
  155. data/test/files/exslt.xml +8 -0
  156. data/test/files/exslt.xslt +35 -0
  157. data/test/files/foo/foo.xsd +4 -0
  158. data/test/files/metacharset.html +10 -0
  159. data/test/files/noencoding.html +47 -0
  160. data/test/files/po.xml +32 -0
  161. data/test/files/po.xsd +66 -0
  162. data/test/files/shift_jis.html +10 -0
  163. data/test/files/shift_jis.xml +5 -0
  164. data/test/files/snuggles.xml +3 -0
  165. data/test/files/staff.dtd +10 -0
  166. data/test/files/staff.xml +59 -0
  167. data/test/files/staff.xslt +32 -0
  168. data/test/files/tlm.html +850 -0
  169. data/test/files/valid_bar.xml +2 -0
  170. data/test/helper.rb +173 -0
  171. data/test/html/sax/test_parser.rb +139 -0
  172. data/test/html/sax/test_parser_context.rb +48 -0
  173. data/test/html/test_builder.rb +165 -0
  174. data/test/html/test_document.rb +472 -0
  175. data/test/html/test_document_encoding.rb +138 -0
  176. data/test/html/test_document_fragment.rb +255 -0
  177. data/test/html/test_element_description.rb +101 -0
  178. data/test/html/test_named_characters.rb +14 -0
  179. data/test/html/test_node.rb +193 -0
  180. data/test/html/test_node_encoding.rb +27 -0
  181. data/test/test_convert_xpath.rb +135 -0
  182. data/test/test_css_cache.rb +45 -0
  183. data/test/test_encoding_handler.rb +46 -0
  184. data/test/test_memory_leak.rb +72 -0
  185. data/test/test_nokogiri.rb +133 -0
  186. data/test/test_reader.rb +425 -0
  187. data/test/test_soap4r_sax.rb +52 -0
  188. data/test/test_xslt_transforms.rb +193 -0
  189. data/test/xml/node/test_save_options.rb +28 -0
  190. data/test/xml/node/test_subclass.rb +44 -0
  191. data/test/xml/sax/test_parser.rb +338 -0
  192. data/test/xml/sax/test_parser_context.rb +113 -0
  193. data/test/xml/sax/test_push_parser.rb +156 -0
  194. data/test/xml/test_attr.rb +65 -0
  195. data/test/xml/test_attribute_decl.rb +86 -0
  196. data/test/xml/test_builder.rb +227 -0
  197. data/test/xml/test_cdata.rb +50 -0
  198. data/test/xml/test_comment.rb +29 -0
  199. data/test/xml/test_document.rb +697 -0
  200. data/test/xml/test_document_encoding.rb +26 -0
  201. data/test/xml/test_document_fragment.rb +192 -0
  202. data/test/xml/test_dtd.rb +107 -0
  203. data/test/xml/test_dtd_encoding.rb +33 -0
  204. data/test/xml/test_element_content.rb +56 -0
  205. data/test/xml/test_element_decl.rb +73 -0
  206. data/test/xml/test_entity_decl.rb +122 -0
  207. data/test/xml/test_entity_reference.rb +21 -0
  208. data/test/xml/test_namespace.rb +70 -0
  209. data/test/xml/test_node.rb +917 -0
  210. data/test/xml/test_node_attributes.rb +34 -0
  211. data/test/xml/test_node_encoding.rb +107 -0
  212. data/test/xml/test_node_reparenting.rb +334 -0
  213. data/test/xml/test_node_set.rb +742 -0
  214. data/test/xml/test_parse_options.rb +52 -0
  215. data/test/xml/test_processing_instruction.rb +30 -0
  216. data/test/xml/test_reader_encoding.rb +126 -0
  217. data/test/xml/test_relax_ng.rb +60 -0
  218. data/test/xml/test_schema.rb +94 -0
  219. data/test/xml/test_syntax_error.rb +12 -0
  220. data/test/xml/test_text.rb +47 -0
  221. data/test/xml/test_unparented_node.rb +381 -0
  222. data/test/xml/test_xpath.rb +237 -0
  223. data/test/xslt/test_custom_functions.rb +94 -0
  224. data/test/xslt/test_exception_handling.rb +37 -0
  225. metadata +548 -0
@@ -0,0 +1,61 @@
1
+ module Nokogiri
2
+ module XML
3
+ class Node
4
+ ###
5
+ # Save options for serializing nodes
6
+ class SaveOptions
7
+ # Format serialized xml
8
+ FORMAT = 1
9
+ # Do not include declarations
10
+ NO_DECLARATION = 2
11
+ # Do not include empty tags
12
+ NO_EMPTY_TAGS = 4
13
+ # Do not save XHTML
14
+ NO_XHTML = 8
15
+ # Save as XHTML
16
+ AS_XHTML = 16
17
+ # Save as XML
18
+ AS_XML = 32
19
+ # Save as HTML
20
+ AS_HTML = 64
21
+
22
+ if Nokogiri.jruby?
23
+ # Save builder created document
24
+ AS_BUILDER = 128
25
+ # the default for XML documents
26
+ DEFAULT_XML = AS_XML # https://github.com/tenderlove/nokogiri/issues/#issue/415
27
+ # the default for HTML document
28
+ DEFAULT_HTML = NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML
29
+ else
30
+ # the default for XML documents
31
+ DEFAULT_XML = FORMAT | AS_XML
32
+ # the default for HTML document
33
+ DEFAULT_HTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML
34
+ end
35
+ # the default for XHTML document
36
+ DEFAULT_XHTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_XHTML
37
+
38
+ # Integer representation of the SaveOptions
39
+ attr_reader :options
40
+
41
+ # Create a new SaveOptions object with +options+
42
+ def initialize options = 0; @options = options; end
43
+
44
+ constants.each do |constant|
45
+ class_eval %{
46
+ def #{constant.downcase}
47
+ @options |= #{constant}
48
+ self
49
+ end
50
+
51
+ def #{constant.downcase}?
52
+ #{constant} & @options == #{constant}
53
+ end
54
+ }
55
+ end
56
+
57
+ alias :to_i :options
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,357 @@
1
+ module Nokogiri
2
+ module XML
3
+ ####
4
+ # A NodeSet contains a list of Nokogiri::XML::Node objects. Typically
5
+ # a NodeSet is return as a result of searching a Document via
6
+ # Nokogiri::XML::Node#css or Nokogiri::XML::Node#xpath
7
+ class NodeSet
8
+ include Enumerable
9
+
10
+ # The Document this NodeSet is associated with
11
+ attr_accessor :document
12
+
13
+ # Create a NodeSet with +document+ defaulting to +list+
14
+ def initialize document, list = []
15
+ @document = document
16
+ document.decorate(self)
17
+ list.each { |x| self << x }
18
+ yield self if block_given?
19
+ end
20
+
21
+ ###
22
+ # Get the first element of the NodeSet.
23
+ def first n = nil
24
+ return self[0] unless n
25
+ list = []
26
+ 0.upto(n - 1) do |i|
27
+ list << self[i]
28
+ end
29
+ list
30
+ end
31
+
32
+ ###
33
+ # Get the last element of the NodeSet.
34
+ def last
35
+ self[length - 1]
36
+ end
37
+
38
+ ###
39
+ # Is this NodeSet empty?
40
+ def empty?
41
+ length == 0
42
+ end
43
+
44
+ ###
45
+ # Returns the index of the first node in self that is == to +node+. Returns nil if no match is found.
46
+ def index(node)
47
+ each_with_index { |member, j| return j if member == node }
48
+ nil
49
+ end
50
+
51
+ ###
52
+ # Insert +datum+ before the first Node in this NodeSet
53
+ def before datum
54
+ first.before datum
55
+ end
56
+
57
+ ###
58
+ # Insert +datum+ after the last Node in this NodeSet
59
+ def after datum
60
+ last.after datum
61
+ end
62
+
63
+ alias :<< :push
64
+ alias :remove :unlink
65
+
66
+ ###
67
+ # Search this document for +paths+
68
+ #
69
+ # For more information see Nokogiri::XML::Node#css and
70
+ # Nokogiri::XML::Node#xpath
71
+ def search *paths
72
+ handler = ![
73
+ Hash, String, Symbol
74
+ ].include?(paths.last.class) ? paths.pop : nil
75
+
76
+ ns = paths.last.is_a?(Hash) ? paths.pop : nil
77
+
78
+ sub_set = NodeSet.new(document)
79
+
80
+ paths.each do |path|
81
+ sub_set += send(
82
+ path =~ /^(\.\/|\/)/ ? :xpath : :css,
83
+ *(paths + [ns, handler]).compact
84
+ )
85
+ end
86
+
87
+ document.decorate(sub_set)
88
+ sub_set
89
+ end
90
+ alias :/ :search
91
+
92
+ ###
93
+ # Search this NodeSet for css +paths+
94
+ #
95
+ # For more information see Nokogiri::XML::Node#css
96
+ def css *paths
97
+ handler = ![
98
+ Hash, String, Symbol
99
+ ].include?(paths.last.class) ? paths.pop : nil
100
+
101
+ ns = paths.last.is_a?(Hash) ? paths.pop : nil
102
+
103
+ sub_set = NodeSet.new(document)
104
+
105
+ each do |node|
106
+ doc = node.document
107
+ search_ns = ns || (doc.root ? doc.root.namespaces : {})
108
+
109
+ xpaths = paths.map { |rule|
110
+ [
111
+ CSS.xpath_for(rule.to_s, :prefix => ".//", :ns => search_ns),
112
+ CSS.xpath_for(rule.to_s, :prefix => "self::", :ns => search_ns)
113
+ ].join(' | ')
114
+ }
115
+
116
+ sub_set += node.xpath(*(xpaths + [search_ns, handler].compact))
117
+ end
118
+ document.decorate(sub_set)
119
+ sub_set
120
+ end
121
+
122
+ ###
123
+ # Search this NodeSet for XPath +paths+
124
+ #
125
+ # For more information see Nokogiri::XML::Node#xpath
126
+ def xpath *paths
127
+ handler = ![
128
+ Hash, String, Symbol
129
+ ].include?(paths.last.class) ? paths.pop : nil
130
+
131
+ ns = paths.last.is_a?(Hash) ? paths.pop : nil
132
+
133
+ sub_set = NodeSet.new(document)
134
+ each do |node|
135
+ sub_set += node.xpath(*(paths + [ns, handler].compact))
136
+ end
137
+ document.decorate(sub_set)
138
+ sub_set
139
+ end
140
+
141
+ ###
142
+ # Search this NodeSet's nodes' immediate children using CSS selector +selector+
143
+ def > selector
144
+ ns = document.root.namespaces
145
+ xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first
146
+ end
147
+
148
+ ###
149
+ # If path is a string, search this document for +path+ returning the
150
+ # first Node. Otherwise, index in to the array with +path+.
151
+ def at path, ns = document.root ? document.root.namespaces : {}
152
+ return self[path] if path.is_a?(Numeric)
153
+ search(path, ns).first
154
+ end
155
+ alias :% :at
156
+
157
+ ##
158
+ # Search this NodeSet for the first occurrence of XPath +paths+.
159
+ # Equivalent to <tt>xpath(paths).first</tt>
160
+ # See NodeSet#xpath for more information.
161
+ #
162
+ def at_xpath *paths
163
+ xpath(*paths).first
164
+ end
165
+
166
+ ##
167
+ # Search this NodeSet for the first occurrence of CSS +rules+.
168
+ # Equivalent to <tt>css(rules).first</tt>
169
+ # See NodeSet#css for more information.
170
+ #
171
+ def at_css *rules
172
+ css(*rules).first
173
+ end
174
+
175
+ ###
176
+ # Filter this list for nodes that match +expr+
177
+ def filter expr
178
+ find_all { |node| node.matches?(expr) }
179
+ end
180
+
181
+ ###
182
+ # Append the class attribute +name+ to all Node objects in the NodeSet.
183
+ def add_class name
184
+ each do |el|
185
+ classes = el['class'].to_s.split(/\s+/)
186
+ el['class'] = classes.push(name).uniq.join " "
187
+ end
188
+ self
189
+ end
190
+
191
+ ###
192
+ # Remove the class attribute +name+ from all Node objects in the NodeSet.
193
+ # If +name+ is nil, remove the class attribute from all Nodes in the
194
+ # NodeSet.
195
+ def remove_class name = nil
196
+ each do |el|
197
+ if name
198
+ classes = el['class'].to_s.split(/\s+/)
199
+ if classes.empty?
200
+ el.delete 'class'
201
+ else
202
+ el['class'] = (classes - [name]).uniq.join " "
203
+ end
204
+ else
205
+ el.delete "class"
206
+ end
207
+ end
208
+ self
209
+ end
210
+
211
+ ###
212
+ # Set the attribute +key+ to +value+ or the return value of +blk+
213
+ # on all Node objects in the NodeSet.
214
+ def attr key, value = nil, &blk
215
+ unless Hash === key || key && (value || blk)
216
+ return first.attribute(key)
217
+ end
218
+
219
+ hash = key.is_a?(Hash) ? key : { key => value }
220
+
221
+ hash.each { |k,v| each { |el| el[k] = v || blk[el] } }
222
+
223
+ self
224
+ end
225
+ alias :set :attr
226
+ alias :attribute :attr
227
+
228
+ ###
229
+ # Remove the attributed named +name+ from all Node objects in the NodeSet
230
+ def remove_attr name
231
+ each { |el| el.delete name }
232
+ self
233
+ end
234
+
235
+ ###
236
+ # Iterate over each node, yielding to +block+
237
+ def each(&block)
238
+ 0.upto(length - 1) do |x|
239
+ yield self[x]
240
+ end
241
+ end
242
+
243
+ ###
244
+ # Get the inner text of all contained Node objects
245
+ def inner_text
246
+ collect{|j| j.inner_text}.join('')
247
+ end
248
+ alias :text :inner_text
249
+
250
+ ###
251
+ # Get the inner html of all contained Node objects
252
+ def inner_html *args
253
+ collect{|j| j.inner_html(*args) }.join('')
254
+ end
255
+
256
+ ###
257
+ # Wrap this NodeSet with +html+ or the results of the builder in +blk+
258
+ def wrap(html, &blk)
259
+ each do |j|
260
+ new_parent = document.parse(html).first
261
+ j.add_next_sibling(new_parent)
262
+ new_parent.add_child(j)
263
+ end
264
+ self
265
+ end
266
+
267
+ ###
268
+ # Convert this NodeSet to a string.
269
+ def to_s
270
+ map { |x| x.to_s }.join
271
+ end
272
+
273
+ ###
274
+ # Convert this NodeSet to HTML
275
+ def to_html *args
276
+ if Nokogiri.jruby?
277
+ options = args.first.is_a?(Hash) ? args.shift : {}
278
+ if !options[:save_with]
279
+ options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
280
+ end
281
+ args.insert(0, options)
282
+ end
283
+ map { |x| x.to_html(*args) }.join
284
+ end
285
+
286
+ ###
287
+ # Convert this NodeSet to XHTML
288
+ def to_xhtml *args
289
+ map { |x| x.to_xhtml(*args) }.join
290
+ end
291
+
292
+ ###
293
+ # Convert this NodeSet to XML
294
+ def to_xml *args
295
+ map { |x| x.to_xml(*args) }.join
296
+ end
297
+
298
+ alias :size :length
299
+ alias :to_ary :to_a
300
+
301
+ ###
302
+ # Removes the last element from set and returns it, or +nil+ if
303
+ # the set is empty
304
+ def pop
305
+ return nil if length == 0
306
+ delete last
307
+ end
308
+
309
+ ###
310
+ # Returns the first element of the NodeSet and removes it. Returns
311
+ # +nil+ if the set is empty.
312
+ def shift
313
+ return nil if length == 0
314
+ delete first
315
+ end
316
+
317
+ ###
318
+ # Equality -- Two NodeSets are equal if the contain the same number
319
+ # of elements and if each element is equal to the corresponding
320
+ # element in the other NodeSet
321
+ def == other
322
+ return false unless other.is_a?(Nokogiri::XML::NodeSet)
323
+ return false unless length == other.length
324
+ each_with_index do |node, i|
325
+ return false unless node == other[i]
326
+ end
327
+ true
328
+ end
329
+
330
+ ###
331
+ # Returns a new NodeSet containing all the children of all the nodes in
332
+ # the NodeSet
333
+ def children
334
+ inject(NodeSet.new(document)) { |set, node| set += node.children }
335
+ end
336
+
337
+ ###
338
+ # Returns a new NodeSet containing all the nodes in the NodeSet
339
+ # in reverse order
340
+ def reverse
341
+ node_set = NodeSet.new(document)
342
+ (length - 1).downto(0) do |x|
343
+ node_set.push self[x]
344
+ end
345
+ node_set
346
+ end
347
+
348
+ ###
349
+ # Return a nicely formated string representation
350
+ def inspect
351
+ "[#{map { |c| c.inspect }.join ', '}]"
352
+ end
353
+
354
+ alias :+ :|
355
+ end
356
+ end
357
+ end
@@ -0,0 +1,6 @@
1
+ module Nokogiri
2
+ module XML
3
+ class Notation < Struct.new(:name, :public_id, :system_id)
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,93 @@
1
+ module Nokogiri
2
+ module XML
3
+ ###
4
+ # Parse options for passing to Nokogiri.XML or Nokogiri.HTML
5
+ class ParseOptions
6
+ # Strict parsing
7
+ STRICT = 0
8
+ # Recover from errors
9
+ RECOVER = 1 << 0
10
+ # Substitute entities
11
+ NOENT = 1 << 1
12
+ # Load external subsets
13
+ DTDLOAD = 1 << 2
14
+ # Default DTD attributes
15
+ DTDATTR = 1 << 3
16
+ # validate with the DTD
17
+ DTDVALID = 1 << 4
18
+ # suppress error reports
19
+ NOERROR = 1 << 5
20
+ # suppress warning reports
21
+ NOWARNING = 1 << 6
22
+ # pedantic error reporting
23
+ PEDANTIC = 1 << 7
24
+ # remove blank nodes
25
+ NOBLANKS = 1 << 8
26
+ # use the SAX1 interface internally
27
+ SAX1 = 1 << 9
28
+ # Implement XInclude substitition
29
+ XINCLUDE = 1 << 10
30
+ # Forbid network access
31
+ NONET = 1 << 11
32
+ # Do not reuse the context dictionnary
33
+ NODICT = 1 << 12
34
+ # remove redundant namespaces declarations
35
+ NSCLEAN = 1 << 13
36
+ # merge CDATA as text nodes
37
+ NOCDATA = 1 << 14
38
+ # do not generate XINCLUDE START/END nodes
39
+ NOXINCNODE = 1 << 15
40
+ # compact small text nodes; no modification of the tree allowed afterwards (will possibly crash if you try to modify the tree)
41
+ COMPACT = 1 << 16
42
+ # parse using XML-1.0 before update 5
43
+ OLD10 = 1 << 17
44
+ # do not fixup XINCLUDE xml:base uris
45
+ NOBASEFIX = 1 << 18
46
+ # relax any hardcoded limit from the parser
47
+ HUGE = 1 << 19
48
+
49
+ # the default options used for parsing XML documents
50
+ DEFAULT_XML = RECOVER
51
+ # the default options used for parsing HTML documents
52
+ DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET
53
+
54
+ attr_accessor :options
55
+ def initialize options = STRICT
56
+ @options = options
57
+ end
58
+
59
+ constants.each do |constant|
60
+ next if constant.to_sym == :STRICT
61
+ class_eval %{
62
+ def #{constant.downcase}
63
+ @options |= #{constant}
64
+ self
65
+ end
66
+
67
+ def #{constant.downcase}?
68
+ #{constant} & @options == #{constant}
69
+ end
70
+ }
71
+ end
72
+
73
+ def strict
74
+ @options &= ~RECOVER
75
+ self
76
+ end
77
+
78
+ def strict?
79
+ @options & RECOVER == STRICT
80
+ end
81
+
82
+ alias :to_i :options
83
+
84
+ def inspect
85
+ options = []
86
+ self.class.constants.each do |k|
87
+ options << k.downcase if send(:"#{k.downcase}?")
88
+ end
89
+ super.sub(/>$/, " " + options.join(', ') + ">")
90
+ end
91
+ end
92
+ end
93
+ end