nokogiri 1.6.2.rc1-x64-mingw32

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 (263) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +26 -0
  3. data/.editorconfig +17 -0
  4. data/.gemtest +0 -0
  5. data/.travis.yml +25 -0
  6. data/CHANGELOG.ja.rdoc +857 -0
  7. data/CHANGELOG.rdoc +880 -0
  8. data/C_CODING_STYLE.rdoc +33 -0
  9. data/Gemfile +21 -0
  10. data/Manifest.txt +371 -0
  11. data/README.ja.rdoc +112 -0
  12. data/README.rdoc +180 -0
  13. data/ROADMAP.md +89 -0
  14. data/Rakefile +351 -0
  15. data/STANDARD_RESPONSES.md +47 -0
  16. data/Y_U_NO_GEMSPEC.md +155 -0
  17. data/bin/nokogiri +78 -0
  18. data/build_all +130 -0
  19. data/dependencies.yml +4 -0
  20. data/ext/nokogiri/depend +358 -0
  21. data/ext/nokogiri/extconf.rb +453 -0
  22. data/ext/nokogiri/html_document.c +170 -0
  23. data/ext/nokogiri/html_document.h +10 -0
  24. data/ext/nokogiri/html_element_description.c +279 -0
  25. data/ext/nokogiri/html_element_description.h +10 -0
  26. data/ext/nokogiri/html_entity_lookup.c +32 -0
  27. data/ext/nokogiri/html_entity_lookup.h +8 -0
  28. data/ext/nokogiri/html_sax_parser_context.c +116 -0
  29. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  30. data/ext/nokogiri/html_sax_push_parser.c +87 -0
  31. data/ext/nokogiri/html_sax_push_parser.h +9 -0
  32. data/ext/nokogiri/nokogiri.c +148 -0
  33. data/ext/nokogiri/nokogiri.h +164 -0
  34. data/ext/nokogiri/xml_attr.c +94 -0
  35. data/ext/nokogiri/xml_attr.h +9 -0
  36. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  37. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  38. data/ext/nokogiri/xml_cdata.c +56 -0
  39. data/ext/nokogiri/xml_cdata.h +9 -0
  40. data/ext/nokogiri/xml_comment.c +54 -0
  41. data/ext/nokogiri/xml_comment.h +9 -0
  42. data/ext/nokogiri/xml_document.c +577 -0
  43. data/ext/nokogiri/xml_document.h +23 -0
  44. data/ext/nokogiri/xml_document_fragment.c +48 -0
  45. data/ext/nokogiri/xml_document_fragment.h +10 -0
  46. data/ext/nokogiri/xml_dtd.c +202 -0
  47. data/ext/nokogiri/xml_dtd.h +10 -0
  48. data/ext/nokogiri/xml_element_content.c +123 -0
  49. data/ext/nokogiri/xml_element_content.h +10 -0
  50. data/ext/nokogiri/xml_element_decl.c +69 -0
  51. data/ext/nokogiri/xml_element_decl.h +9 -0
  52. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  53. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  54. data/ext/nokogiri/xml_entity_decl.c +110 -0
  55. data/ext/nokogiri/xml_entity_decl.h +10 -0
  56. data/ext/nokogiri/xml_entity_reference.c +52 -0
  57. data/ext/nokogiri/xml_entity_reference.h +9 -0
  58. data/ext/nokogiri/xml_io.c +56 -0
  59. data/ext/nokogiri/xml_io.h +11 -0
  60. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  61. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  62. data/ext/nokogiri/xml_namespace.c +78 -0
  63. data/ext/nokogiri/xml_namespace.h +13 -0
  64. data/ext/nokogiri/xml_node.c +1541 -0
  65. data/ext/nokogiri/xml_node.h +13 -0
  66. data/ext/nokogiri/xml_node_set.c +467 -0
  67. data/ext/nokogiri/xml_node_set.h +14 -0
  68. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  69. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  70. data/ext/nokogiri/xml_reader.c +681 -0
  71. data/ext/nokogiri/xml_reader.h +10 -0
  72. data/ext/nokogiri/xml_relax_ng.c +161 -0
  73. data/ext/nokogiri/xml_relax_ng.h +9 -0
  74. data/ext/nokogiri/xml_sax_parser.c +312 -0
  75. data/ext/nokogiri/xml_sax_parser.h +39 -0
  76. data/ext/nokogiri/xml_sax_parser_context.c +262 -0
  77. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  78. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  79. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  80. data/ext/nokogiri/xml_schema.c +205 -0
  81. data/ext/nokogiri/xml_schema.h +9 -0
  82. data/ext/nokogiri/xml_syntax_error.c +63 -0
  83. data/ext/nokogiri/xml_syntax_error.h +13 -0
  84. data/ext/nokogiri/xml_text.c +52 -0
  85. data/ext/nokogiri/xml_text.h +9 -0
  86. data/ext/nokogiri/xml_xpath_context.c +307 -0
  87. data/ext/nokogiri/xml_xpath_context.h +10 -0
  88. data/ext/nokogiri/xslt_stylesheet.c +270 -0
  89. data/ext/nokogiri/xslt_stylesheet.h +14 -0
  90. data/lib/nokogiri.rb +137 -0
  91. data/lib/nokogiri/2.0/nokogiri.so +0 -0
  92. data/lib/nokogiri/2.1/nokogiri.so +0 -0
  93. data/lib/nokogiri/css.rb +27 -0
  94. data/lib/nokogiri/css/node.rb +52 -0
  95. data/lib/nokogiri/css/parser.rb +715 -0
  96. data/lib/nokogiri/css/parser.y +249 -0
  97. data/lib/nokogiri/css/parser_extras.rb +91 -0
  98. data/lib/nokogiri/css/syntax_error.rb +7 -0
  99. data/lib/nokogiri/css/tokenizer.rb +152 -0
  100. data/lib/nokogiri/css/tokenizer.rex +55 -0
  101. data/lib/nokogiri/css/xpath_visitor.rb +219 -0
  102. data/lib/nokogiri/decorators/slop.rb +35 -0
  103. data/lib/nokogiri/html.rb +37 -0
  104. data/lib/nokogiri/html/builder.rb +35 -0
  105. data/lib/nokogiri/html/document.rb +333 -0
  106. data/lib/nokogiri/html/document_fragment.rb +41 -0
  107. data/lib/nokogiri/html/element_description.rb +23 -0
  108. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  109. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  110. data/lib/nokogiri/html/sax/parser.rb +52 -0
  111. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  112. data/lib/nokogiri/html/sax/push_parser.rb +16 -0
  113. data/lib/nokogiri/syntax_error.rb +4 -0
  114. data/lib/nokogiri/version.rb +106 -0
  115. data/lib/nokogiri/xml.rb +73 -0
  116. data/lib/nokogiri/xml/attr.rb +14 -0
  117. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  118. data/lib/nokogiri/xml/builder.rb +443 -0
  119. data/lib/nokogiri/xml/cdata.rb +11 -0
  120. data/lib/nokogiri/xml/character_data.rb +7 -0
  121. data/lib/nokogiri/xml/document.rb +279 -0
  122. data/lib/nokogiri/xml/document_fragment.rb +112 -0
  123. data/lib/nokogiri/xml/dtd.rb +32 -0
  124. data/lib/nokogiri/xml/element_content.rb +36 -0
  125. data/lib/nokogiri/xml/element_decl.rb +13 -0
  126. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  127. data/lib/nokogiri/xml/namespace.rb +13 -0
  128. data/lib/nokogiri/xml/node.rb +982 -0
  129. data/lib/nokogiri/xml/node/save_options.rb +61 -0
  130. data/lib/nokogiri/xml/node_set.rb +355 -0
  131. data/lib/nokogiri/xml/notation.rb +6 -0
  132. data/lib/nokogiri/xml/parse_options.rb +98 -0
  133. data/lib/nokogiri/xml/pp.rb +2 -0
  134. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  135. data/lib/nokogiri/xml/pp/node.rb +56 -0
  136. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  137. data/lib/nokogiri/xml/reader.rb +112 -0
  138. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  139. data/lib/nokogiri/xml/sax.rb +4 -0
  140. data/lib/nokogiri/xml/sax/document.rb +171 -0
  141. data/lib/nokogiri/xml/sax/parser.rb +123 -0
  142. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  143. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  144. data/lib/nokogiri/xml/schema.rb +63 -0
  145. data/lib/nokogiri/xml/syntax_error.rb +47 -0
  146. data/lib/nokogiri/xml/text.rb +9 -0
  147. data/lib/nokogiri/xml/xpath.rb +10 -0
  148. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  149. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  150. data/lib/nokogiri/xslt.rb +56 -0
  151. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  152. data/lib/xsd/xmlparser/nokogiri.rb +102 -0
  153. data/suppressions/README.txt +1 -0
  154. data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
  155. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  156. data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
  157. data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
  158. data/tasks/nokogiri.org.rb +24 -0
  159. data/tasks/test.rb +95 -0
  160. data/test/css/test_nthiness.rb +222 -0
  161. data/test/css/test_parser.rb +358 -0
  162. data/test/css/test_tokenizer.rb +198 -0
  163. data/test/css/test_xpath_visitor.rb +96 -0
  164. data/test/decorators/test_slop.rb +16 -0
  165. data/test/files/2ch.html +108 -0
  166. data/test/files/address_book.rlx +12 -0
  167. data/test/files/address_book.xml +10 -0
  168. data/test/files/atom.xml +344 -0
  169. data/test/files/bar/bar.xsd +4 -0
  170. data/test/files/bogus.xml +0 -0
  171. data/test/files/dont_hurt_em_why.xml +422 -0
  172. data/test/files/encoding.html +82 -0
  173. data/test/files/encoding.xhtml +84 -0
  174. data/test/files/exslt.xml +8 -0
  175. data/test/files/exslt.xslt +35 -0
  176. data/test/files/foo/foo.xsd +4 -0
  177. data/test/files/metacharset.html +10 -0
  178. data/test/files/noencoding.html +47 -0
  179. data/test/files/po.xml +32 -0
  180. data/test/files/po.xsd +66 -0
  181. data/test/files/saml/saml20assertion_schema.xsd +283 -0
  182. data/test/files/saml/saml20protocol_schema.xsd +302 -0
  183. data/test/files/saml/xenc_schema.xsd +146 -0
  184. data/test/files/saml/xmldsig_schema.xsd +318 -0
  185. data/test/files/shift_jis.html +10 -0
  186. data/test/files/shift_jis.xml +5 -0
  187. data/test/files/shift_jis_no_charset.html +9 -0
  188. data/test/files/snuggles.xml +3 -0
  189. data/test/files/staff.dtd +10 -0
  190. data/test/files/staff.xml +59 -0
  191. data/test/files/staff.xslt +32 -0
  192. data/test/files/test_document_url/bar.xml +2 -0
  193. data/test/files/test_document_url/document.dtd +4 -0
  194. data/test/files/test_document_url/document.xml +6 -0
  195. data/test/files/tlm.html +850 -0
  196. data/test/files/to_be_xincluded.xml +2 -0
  197. data/test/files/valid_bar.xml +2 -0
  198. data/test/files/xinclude.xml +4 -0
  199. data/test/helper.rb +164 -0
  200. data/test/html/sax/test_parser.rb +141 -0
  201. data/test/html/sax/test_parser_context.rb +46 -0
  202. data/test/html/test_builder.rb +164 -0
  203. data/test/html/test_document.rb +619 -0
  204. data/test/html/test_document_encoding.rb +148 -0
  205. data/test/html/test_document_fragment.rb +261 -0
  206. data/test/html/test_element_description.rb +105 -0
  207. data/test/html/test_named_characters.rb +14 -0
  208. data/test/html/test_node.rb +196 -0
  209. data/test/html/test_node_encoding.rb +27 -0
  210. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +14 -0
  211. data/test/namespaces/test_namespaces_in_builder_doc.rb +75 -0
  212. data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
  213. data/test/namespaces/test_namespaces_in_created_doc.rb +75 -0
  214. data/test/namespaces/test_namespaces_in_parsed_doc.rb +66 -0
  215. data/test/test_convert_xpath.rb +135 -0
  216. data/test/test_css_cache.rb +45 -0
  217. data/test/test_encoding_handler.rb +46 -0
  218. data/test/test_memory_leak.rb +156 -0
  219. data/test/test_nokogiri.rb +138 -0
  220. data/test/test_reader.rb +558 -0
  221. data/test/test_soap4r_sax.rb +52 -0
  222. data/test/test_xslt_transforms.rb +279 -0
  223. data/test/xml/node/test_save_options.rb +28 -0
  224. data/test/xml/node/test_subclass.rb +44 -0
  225. data/test/xml/sax/test_parser.rb +382 -0
  226. data/test/xml/sax/test_parser_context.rb +115 -0
  227. data/test/xml/sax/test_push_parser.rb +157 -0
  228. data/test/xml/test_attr.rb +64 -0
  229. data/test/xml/test_attribute_decl.rb +86 -0
  230. data/test/xml/test_builder.rb +315 -0
  231. data/test/xml/test_c14n.rb +161 -0
  232. data/test/xml/test_cdata.rb +48 -0
  233. data/test/xml/test_comment.rb +29 -0
  234. data/test/xml/test_document.rb +934 -0
  235. data/test/xml/test_document_encoding.rb +28 -0
  236. data/test/xml/test_document_fragment.rb +228 -0
  237. data/test/xml/test_dtd.rb +187 -0
  238. data/test/xml/test_dtd_encoding.rb +33 -0
  239. data/test/xml/test_element_content.rb +56 -0
  240. data/test/xml/test_element_decl.rb +73 -0
  241. data/test/xml/test_entity_decl.rb +122 -0
  242. data/test/xml/test_entity_reference.rb +245 -0
  243. data/test/xml/test_namespace.rb +95 -0
  244. data/test/xml/test_node.rb +1155 -0
  245. data/test/xml/test_node_attributes.rb +113 -0
  246. data/test/xml/test_node_encoding.rb +107 -0
  247. data/test/xml/test_node_inheritance.rb +32 -0
  248. data/test/xml/test_node_reparenting.rb +374 -0
  249. data/test/xml/test_node_set.rb +755 -0
  250. data/test/xml/test_parse_options.rb +64 -0
  251. data/test/xml/test_processing_instruction.rb +30 -0
  252. data/test/xml/test_reader_encoding.rb +142 -0
  253. data/test/xml/test_relax_ng.rb +60 -0
  254. data/test/xml/test_schema.rb +129 -0
  255. data/test/xml/test_syntax_error.rb +12 -0
  256. data/test/xml/test_text.rb +45 -0
  257. data/test/xml/test_unparented_node.rb +422 -0
  258. data/test/xml/test_xinclude.rb +83 -0
  259. data/test/xml/test_xpath.rb +376 -0
  260. data/test/xslt/test_custom_functions.rb +133 -0
  261. data/test/xslt/test_exception_handling.rb +37 -0
  262. data/test_all +81 -0
  263. metadata +601 -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/sparklemotion/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,355 @@
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
+ n.times { |i| list << self[i] }
27
+ list
28
+ end
29
+
30
+ ###
31
+ # Get the last element of the NodeSet.
32
+ def last
33
+ self[-1]
34
+ end
35
+
36
+ ###
37
+ # Is this NodeSet empty?
38
+ def empty?
39
+ length == 0
40
+ end
41
+
42
+ ###
43
+ # Returns the index of the first node in self that is == to +node+. Returns nil if no match is found.
44
+ def index(node)
45
+ each_with_index { |member, j| return j if member == node }
46
+ nil
47
+ end
48
+
49
+ ###
50
+ # Insert +datum+ before the first Node in this NodeSet
51
+ def before datum
52
+ first.before datum
53
+ end
54
+
55
+ ###
56
+ # Insert +datum+ after the last Node in this NodeSet
57
+ def after datum
58
+ last.after datum
59
+ end
60
+
61
+ alias :<< :push
62
+ alias :remove :unlink
63
+
64
+ ###
65
+ # Search this document for +paths+
66
+ #
67
+ # For more information see Nokogiri::XML::Node#css and
68
+ # Nokogiri::XML::Node#xpath
69
+ def search *paths
70
+ handler = ![
71
+ Hash, String, Symbol
72
+ ].include?(paths.last.class) ? paths.pop : nil
73
+
74
+ ns = paths.last.is_a?(Hash) ? paths.pop : nil
75
+
76
+ sub_set = NodeSet.new(document)
77
+
78
+ paths.each do |path|
79
+ sub_set += send(
80
+ path =~ /^(\.\/|\/|\.\.|\.$)/ ? :xpath : :css,
81
+ *(paths + [ns, handler]).compact
82
+ )
83
+ end
84
+
85
+ document.decorate(sub_set)
86
+ sub_set
87
+ end
88
+ alias :/ :search
89
+
90
+ ###
91
+ # Search this NodeSet for css +paths+
92
+ #
93
+ # For more information see Nokogiri::XML::Node#css
94
+ def css *paths
95
+ handler = ![
96
+ Hash, String, Symbol
97
+ ].include?(paths.last.class) ? paths.pop : nil
98
+
99
+ ns = paths.last.is_a?(Hash) ? paths.pop : nil
100
+
101
+ sub_set = NodeSet.new(document)
102
+
103
+ each do |node|
104
+ doc = node.document
105
+ search_ns = ns || (doc.root ? doc.root.namespaces : {})
106
+
107
+ xpaths = paths.map { |rule|
108
+ [
109
+ CSS.xpath_for(rule.to_s, :prefix => ".//", :ns => search_ns),
110
+ CSS.xpath_for(rule.to_s, :prefix => "self::", :ns => search_ns)
111
+ ].join(' | ')
112
+ }
113
+
114
+ sub_set += node.xpath(*(xpaths + [search_ns, handler].compact))
115
+ end
116
+ document.decorate(sub_set)
117
+ sub_set
118
+ end
119
+
120
+ ###
121
+ # Search this NodeSet for XPath +paths+
122
+ #
123
+ # For more information see Nokogiri::XML::Node#xpath
124
+ def xpath *paths
125
+ handler = ![
126
+ Hash, String, Symbol
127
+ ].include?(paths.last.class) ? paths.pop : nil
128
+
129
+ ns = paths.last.is_a?(Hash) ? paths.pop : nil
130
+
131
+ sub_set = NodeSet.new(document)
132
+ each do |node|
133
+ sub_set += node.xpath(*(paths + [ns, handler].compact))
134
+ end
135
+ document.decorate(sub_set)
136
+ sub_set
137
+ end
138
+
139
+ ###
140
+ # Search this NodeSet's nodes' immediate children using CSS selector +selector+
141
+ def > selector
142
+ ns = document.root.namespaces
143
+ xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first
144
+ end
145
+
146
+ ###
147
+ # If path is a string, search this document for +path+ returning the
148
+ # first Node. Otherwise, index in to the array with +path+.
149
+ def at path, ns = document.root ? document.root.namespaces : {}
150
+ return self[path] if path.is_a?(Numeric)
151
+ search(path, ns).first
152
+ end
153
+ alias :% :at
154
+
155
+ ##
156
+ # Search this NodeSet for the first occurrence of XPath +paths+.
157
+ # Equivalent to <tt>xpath(paths).first</tt>
158
+ # See NodeSet#xpath for more information.
159
+ #
160
+ def at_xpath *paths
161
+ xpath(*paths).first
162
+ end
163
+
164
+ ##
165
+ # Search this NodeSet for the first occurrence of CSS +rules+.
166
+ # Equivalent to <tt>css(rules).first</tt>
167
+ # See NodeSet#css for more information.
168
+ #
169
+ def at_css *rules
170
+ css(*rules).first
171
+ end
172
+
173
+ ###
174
+ # Filter this list for nodes that match +expr+
175
+ def filter expr
176
+ find_all { |node| node.matches?(expr) }
177
+ end
178
+
179
+ ###
180
+ # Append the class attribute +name+ to all Node objects in the NodeSet.
181
+ def add_class name
182
+ each do |el|
183
+ classes = el['class'].to_s.split(/\s+/)
184
+ el['class'] = classes.push(name).uniq.join " "
185
+ end
186
+ self
187
+ end
188
+
189
+ ###
190
+ # Remove the class attribute +name+ from all Node objects in the NodeSet.
191
+ # If +name+ is nil, remove the class attribute from all Nodes in the
192
+ # NodeSet.
193
+ def remove_class name = nil
194
+ each do |el|
195
+ if name
196
+ classes = el['class'].to_s.split(/\s+/)
197
+ if classes.empty?
198
+ el.delete 'class'
199
+ else
200
+ el['class'] = (classes - [name]).uniq.join " "
201
+ end
202
+ else
203
+ el.delete "class"
204
+ end
205
+ end
206
+ self
207
+ end
208
+
209
+ ###
210
+ # Set the attribute +key+ to +value+ or the return value of +blk+
211
+ # on all Node objects in the NodeSet.
212
+ def attr key, value = nil, &blk
213
+ unless Hash === key || key && (value || blk)
214
+ return first.attribute(key)
215
+ end
216
+
217
+ hash = key.is_a?(Hash) ? key : { key => value }
218
+
219
+ hash.each { |k,v| each { |el| el[k] = v || blk[el] } }
220
+
221
+ self
222
+ end
223
+ alias :set :attr
224
+ alias :attribute :attr
225
+
226
+ ###
227
+ # Remove the attributed named +name+ from all Node objects in the NodeSet
228
+ def remove_attr name
229
+ each { |el| el.delete name }
230
+ self
231
+ end
232
+
233
+ ###
234
+ # Iterate over each node, yielding to +block+
235
+ def each(&block)
236
+ 0.upto(length - 1) do |x|
237
+ yield self[x]
238
+ end
239
+ end
240
+
241
+ ###
242
+ # Get the inner text of all contained Node objects
243
+ def inner_text
244
+ collect{|j| j.inner_text}.join('')
245
+ end
246
+ alias :text :inner_text
247
+
248
+ ###
249
+ # Get the inner html of all contained Node objects
250
+ def inner_html *args
251
+ collect{|j| j.inner_html(*args) }.join('')
252
+ end
253
+
254
+ ###
255
+ # Wrap this NodeSet with +html+ or the results of the builder in +blk+
256
+ def wrap(html, &blk)
257
+ each do |j|
258
+ new_parent = document.parse(html).first
259
+ j.add_next_sibling(new_parent)
260
+ new_parent.add_child(j)
261
+ end
262
+ self
263
+ end
264
+
265
+ ###
266
+ # Convert this NodeSet to a string.
267
+ def to_s
268
+ map { |x| x.to_s }.join
269
+ end
270
+
271
+ ###
272
+ # Convert this NodeSet to HTML
273
+ def to_html *args
274
+ if Nokogiri.jruby?
275
+ options = args.first.is_a?(Hash) ? args.shift : {}
276
+ if !options[:save_with]
277
+ options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
278
+ end
279
+ args.insert(0, options)
280
+ end
281
+ map { |x| x.to_html(*args) }.join
282
+ end
283
+
284
+ ###
285
+ # Convert this NodeSet to XHTML
286
+ def to_xhtml *args
287
+ map { |x| x.to_xhtml(*args) }.join
288
+ end
289
+
290
+ ###
291
+ # Convert this NodeSet to XML
292
+ def to_xml *args
293
+ map { |x| x.to_xml(*args) }.join
294
+ end
295
+
296
+ alias :size :length
297
+ alias :to_ary :to_a
298
+
299
+ ###
300
+ # Removes the last element from set and returns it, or +nil+ if
301
+ # the set is empty
302
+ def pop
303
+ return nil if length == 0
304
+ delete last
305
+ end
306
+
307
+ ###
308
+ # Returns the first element of the NodeSet and removes it. Returns
309
+ # +nil+ if the set is empty.
310
+ def shift
311
+ return nil if length == 0
312
+ delete first
313
+ end
314
+
315
+ ###
316
+ # Equality -- Two NodeSets are equal if the contain the same number
317
+ # of elements and if each element is equal to the corresponding
318
+ # element in the other NodeSet
319
+ def == other
320
+ return false unless other.is_a?(Nokogiri::XML::NodeSet)
321
+ return false unless length == other.length
322
+ each_with_index do |node, i|
323
+ return false unless node == other[i]
324
+ end
325
+ true
326
+ end
327
+
328
+ ###
329
+ # Returns a new NodeSet containing all the children of all the nodes in
330
+ # the NodeSet
331
+ def children
332
+ inject(NodeSet.new(document)) { |set, node| set += node.children }
333
+ end
334
+
335
+ ###
336
+ # Returns a new NodeSet containing all the nodes in the NodeSet
337
+ # in reverse order
338
+ def reverse
339
+ node_set = NodeSet.new(document)
340
+ (length - 1).downto(0) do |x|
341
+ node_set.push self[x]
342
+ end
343
+ node_set
344
+ end
345
+
346
+ ###
347
+ # Return a nicely formated string representation
348
+ def inspect
349
+ "[#{map { |c| c.inspect }.join ', '}]"
350
+ end
351
+
352
+ alias :+ :|
353
+ end
354
+ end
355
+ 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,98 @@
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 substitution
29
+ XINCLUDE = 1 << 10
30
+ # Forbid network access. Recommended for dealing with untrusted documents.
31
+ NONET = 1 << 11
32
+ # Do not reuse the context dictionary
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 | NONET
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 no#{constant.downcase}
68
+ @options &= ~#{constant}
69
+ self
70
+ end
71
+
72
+ def #{constant.downcase}?
73
+ #{constant} & @options == #{constant}
74
+ end
75
+ }
76
+ end
77
+
78
+ def strict
79
+ @options &= ~RECOVER
80
+ self
81
+ end
82
+
83
+ def strict?
84
+ @options & RECOVER == STRICT
85
+ end
86
+
87
+ alias :to_i :options
88
+
89
+ def inspect
90
+ options = []
91
+ self.class.constants.each do |k|
92
+ options << k.downcase if send(:"#{k.downcase}?")
93
+ end
94
+ super.sub(/>$/, " " + options.join(', ') + ">")
95
+ end
96
+ end
97
+ end
98
+ end