nokogiri 1.2.3-x86-mswin32-60 → 1.4.5-x86-mswin32-60

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 (319) hide show
  1. data/.autotest +18 -7
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.ja.rdoc +297 -3
  4. data/CHANGELOG.rdoc +289 -0
  5. data/Manifest.txt +148 -37
  6. data/README.ja.rdoc +20 -20
  7. data/README.rdoc +53 -22
  8. data/Rakefile +127 -211
  9. data/bin/nokogiri +54 -0
  10. data/ext/nokogiri/depend +358 -0
  11. data/ext/nokogiri/extconf.rb +89 -54
  12. data/ext/nokogiri/html_document.c +34 -27
  13. data/ext/nokogiri/html_document.h +1 -1
  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 +7 -5
  17. data/ext/nokogiri/html_entity_lookup.h +1 -1
  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/{native.c → nokogiri.c} +31 -7
  21. data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
  22. data/ext/nokogiri/xml_attr.c +20 -9
  23. data/ext/nokogiri/xml_attr.h +1 -1
  24. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  25. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  26. data/ext/nokogiri/xml_cdata.c +21 -9
  27. data/ext/nokogiri/xml_cdata.h +1 -1
  28. data/ext/nokogiri/xml_comment.c +18 -6
  29. data/ext/nokogiri/xml_comment.h +1 -1
  30. data/ext/nokogiri/xml_document.c +247 -68
  31. data/ext/nokogiri/xml_document.h +5 -3
  32. data/ext/nokogiri/xml_document_fragment.c +15 -7
  33. data/ext/nokogiri/xml_document_fragment.h +1 -1
  34. data/ext/nokogiri/xml_dtd.c +110 -10
  35. data/ext/nokogiri/xml_dtd.h +3 -1
  36. data/ext/nokogiri/xml_element_content.c +123 -0
  37. data/ext/nokogiri/xml_element_content.h +10 -0
  38. data/ext/nokogiri/xml_element_decl.c +69 -0
  39. data/ext/nokogiri/xml_element_decl.h +9 -0
  40. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  41. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  42. data/ext/nokogiri/xml_entity_decl.c +110 -0
  43. data/ext/nokogiri/xml_entity_decl.h +10 -0
  44. data/ext/nokogiri/xml_entity_reference.c +16 -5
  45. data/ext/nokogiri/xml_entity_reference.h +1 -1
  46. data/ext/nokogiri/xml_io.c +40 -8
  47. data/ext/nokogiri/xml_io.h +2 -1
  48. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  49. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  50. data/ext/nokogiri/xml_namespace.c +84 -0
  51. data/ext/nokogiri/xml_namespace.h +13 -0
  52. data/ext/nokogiri/xml_node.c +782 -225
  53. data/ext/nokogiri/xml_node.h +2 -4
  54. data/ext/nokogiri/xml_node_set.c +253 -34
  55. data/ext/nokogiri/xml_node_set.h +2 -2
  56. data/ext/nokogiri/xml_processing_instruction.c +17 -5
  57. data/ext/nokogiri/xml_processing_instruction.h +1 -1
  58. data/ext/nokogiri/xml_reader.c +277 -85
  59. data/ext/nokogiri/xml_reader.h +1 -1
  60. data/ext/nokogiri/xml_relax_ng.c +168 -0
  61. data/ext/nokogiri/xml_relax_ng.h +9 -0
  62. data/ext/nokogiri/xml_sax_parser.c +183 -111
  63. data/ext/nokogiri/xml_sax_parser.h +30 -1
  64. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  65. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  66. data/ext/nokogiri/xml_sax_push_parser.c +42 -12
  67. data/ext/nokogiri/xml_sax_push_parser.h +1 -1
  68. data/ext/nokogiri/xml_schema.c +205 -0
  69. data/ext/nokogiri/xml_schema.h +9 -0
  70. data/ext/nokogiri/xml_syntax_error.c +28 -173
  71. data/ext/nokogiri/xml_syntax_error.h +2 -1
  72. data/ext/nokogiri/xml_text.c +16 -6
  73. data/ext/nokogiri/xml_text.h +1 -1
  74. data/ext/nokogiri/xml_xpath_context.c +104 -47
  75. data/ext/nokogiri/xml_xpath_context.h +1 -1
  76. data/ext/nokogiri/xslt_stylesheet.c +161 -19
  77. data/ext/nokogiri/xslt_stylesheet.h +1 -1
  78. data/lib/nokogiri.rb +47 -8
  79. data/lib/nokogiri/1.8/nokogiri.so +0 -0
  80. data/lib/nokogiri/1.9/nokogiri.so +0 -0
  81. data/lib/nokogiri/css.rb +6 -3
  82. data/lib/nokogiri/css/node.rb +14 -12
  83. data/lib/nokogiri/css/parser.rb +665 -62
  84. data/lib/nokogiri/css/parser.y +20 -10
  85. data/lib/nokogiri/css/parser_extras.rb +91 -0
  86. data/lib/nokogiri/css/tokenizer.rb +148 -5
  87. data/lib/nokogiri/css/tokenizer.rex +10 -9
  88. data/lib/nokogiri/css/xpath_visitor.rb +47 -44
  89. data/lib/nokogiri/decorators/slop.rb +8 -4
  90. data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
  91. data/lib/nokogiri/ffi/html/document.rb +28 -0
  92. data/lib/nokogiri/ffi/html/element_description.rb +81 -0
  93. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  94. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  95. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  96. data/lib/nokogiri/ffi/libxml.rb +420 -0
  97. data/lib/nokogiri/ffi/structs/common_node.rb +38 -0
  98. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  99. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  100. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  101. data/lib/nokogiri/ffi/structs/xml_attr.rb +20 -0
  102. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  103. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  104. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
  105. data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
  106. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  107. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  108. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  109. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  110. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  111. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  112. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  113. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  114. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  115. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +20 -0
  116. data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -0
  117. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  118. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  119. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +124 -0
  120. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  121. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  122. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  123. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +38 -0
  124. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  125. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  126. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  127. data/lib/nokogiri/ffi/weak_bucket.rb +40 -0
  128. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  129. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  130. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  131. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  132. data/lib/nokogiri/ffi/xml/document.rb +174 -0
  133. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  134. data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
  135. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  136. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  137. data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
  138. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  139. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  140. data/lib/nokogiri/ffi/xml/node.rb +559 -0
  141. data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
  142. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  143. data/lib/nokogiri/ffi/xml/reader.rb +236 -0
  144. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  145. data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
  146. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
  147. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
  148. data/lib/nokogiri/ffi/xml/schema.rb +109 -0
  149. data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
  150. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  151. data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
  152. data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
  153. data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
  154. data/lib/nokogiri/html.rb +13 -47
  155. data/lib/nokogiri/html/builder.rb +27 -1
  156. data/lib/nokogiri/html/document.rb +201 -7
  157. data/lib/nokogiri/html/document_fragment.rb +41 -0
  158. data/lib/nokogiri/html/element_description.rb +23 -0
  159. data/lib/nokogiri/html/entity_lookup.rb +2 -0
  160. data/lib/nokogiri/html/sax/parser.rb +34 -3
  161. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  162. data/lib/nokogiri/nokogiri.rb +1 -0
  163. data/lib/nokogiri/version.rb +40 -1
  164. data/lib/nokogiri/version_warning.rb +14 -0
  165. data/lib/nokogiri/xml.rb +32 -53
  166. data/lib/nokogiri/xml/attr.rb +5 -0
  167. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  168. data/lib/nokogiri/xml/builder.rb +349 -29
  169. data/lib/nokogiri/xml/cdata.rb +3 -1
  170. data/lib/nokogiri/xml/character_data.rb +7 -0
  171. data/lib/nokogiri/xml/document.rb +166 -14
  172. data/lib/nokogiri/xml/document_fragment.rb +76 -1
  173. data/lib/nokogiri/xml/dtd.rb +16 -3
  174. data/lib/nokogiri/xml/element_content.rb +36 -0
  175. data/lib/nokogiri/xml/element_decl.rb +13 -0
  176. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  177. data/lib/nokogiri/xml/namespace.rb +13 -0
  178. data/lib/nokogiri/xml/node.rb +561 -166
  179. data/lib/nokogiri/xml/node/save_options.rb +22 -2
  180. data/lib/nokogiri/xml/node_set.rb +202 -40
  181. data/lib/nokogiri/xml/parse_options.rb +93 -0
  182. data/lib/nokogiri/xml/pp.rb +2 -0
  183. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  184. data/lib/nokogiri/xml/pp/node.rb +56 -0
  185. data/lib/nokogiri/xml/processing_instruction.rb +2 -0
  186. data/lib/nokogiri/xml/reader.rb +93 -8
  187. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  188. data/lib/nokogiri/xml/sax.rb +1 -7
  189. data/lib/nokogiri/xml/sax/document.rb +107 -2
  190. data/lib/nokogiri/xml/sax/parser.rb +57 -7
  191. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  192. data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
  193. data/lib/nokogiri/xml/schema.rb +63 -0
  194. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  195. data/lib/nokogiri/xml/text.rb +4 -1
  196. data/lib/nokogiri/xml/xpath.rb +1 -1
  197. data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
  198. data/lib/nokogiri/xml/xpath_context.rb +2 -0
  199. data/lib/nokogiri/xslt.rb +26 -2
  200. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  201. data/lib/xsd/xmlparser/nokogiri.rb +45 -9
  202. data/tasks/cross_compile.rb +173 -0
  203. data/tasks/test.rb +25 -69
  204. data/test/css/test_nthiness.rb +3 -4
  205. data/test/css/test_parser.rb +75 -20
  206. data/test/css/test_tokenizer.rb +23 -1
  207. data/test/css/test_xpath_visitor.rb +10 -1
  208. data/test/decorators/test_slop.rb +16 -0
  209. data/test/ffi/test_document.rb +35 -0
  210. data/test/files/2ch.html +108 -0
  211. data/test/files/address_book.rlx +12 -0
  212. data/test/files/address_book.xml +10 -0
  213. data/test/files/bar/bar.xsd +4 -0
  214. data/test/files/encoding.html +82 -0
  215. data/test/files/encoding.xhtml +84 -0
  216. data/test/files/foo/foo.xsd +4 -0
  217. data/test/files/po.xml +32 -0
  218. data/test/files/po.xsd +66 -0
  219. data/test/files/shift_jis.html +10 -0
  220. data/test/files/shift_jis.xml +5 -0
  221. data/test/files/snuggles.xml +3 -0
  222. data/test/files/staff.dtd +10 -0
  223. data/test/files/valid_bar.xml +2 -0
  224. data/test/helper.rb +101 -23
  225. data/test/html/sax/test_parser.rb +81 -2
  226. data/test/html/sax/test_parser_context.rb +48 -0
  227. data/test/html/test_builder.rb +39 -8
  228. data/test/html/test_document.rb +186 -23
  229. data/test/html/test_document_encoding.rb +78 -1
  230. data/test/html/test_document_fragment.rb +253 -0
  231. data/test/html/test_element_description.rb +98 -0
  232. data/test/html/test_named_characters.rb +1 -1
  233. data/test/html/test_node.rb +124 -36
  234. data/test/html/test_node_encoding.rb +27 -0
  235. data/test/test_convert_xpath.rb +1 -52
  236. data/test/test_css_cache.rb +2 -13
  237. data/test/test_encoding_handler.rb +46 -0
  238. data/test/test_memory_leak.rb +88 -19
  239. data/test/test_nokogiri.rb +38 -5
  240. data/test/test_reader.rb +188 -6
  241. data/test/test_soap4r_sax.rb +52 -0
  242. data/test/test_xslt_transforms.rb +183 -83
  243. data/test/xml/node/test_save_options.rb +1 -1
  244. data/test/xml/node/test_subclass.rb +44 -0
  245. data/test/xml/sax/test_parser.rb +175 -4
  246. data/test/xml/sax/test_parser_context.rb +113 -0
  247. data/test/xml/sax/test_push_parser.rb +90 -2
  248. data/test/xml/test_attr.rb +35 -1
  249. data/test/xml/test_attribute_decl.rb +82 -0
  250. data/test/xml/test_builder.rb +186 -1
  251. data/test/xml/test_cdata.rb +32 -1
  252. data/test/xml/test_comment.rb +13 -1
  253. data/test/xml/test_document.rb +415 -43
  254. data/test/xml/test_document_encoding.rb +1 -1
  255. data/test/xml/test_document_fragment.rb +173 -5
  256. data/test/xml/test_dtd.rb +61 -6
  257. data/test/xml/test_dtd_encoding.rb +3 -1
  258. data/test/xml/test_element_content.rb +56 -0
  259. data/test/xml/test_element_decl.rb +73 -0
  260. data/test/xml/test_entity_decl.rb +120 -0
  261. data/test/xml/test_entity_reference.rb +5 -1
  262. data/test/xml/test_namespace.rb +68 -0
  263. data/test/xml/test_node.rb +546 -201
  264. data/test/xml/test_node_attributes.rb +34 -0
  265. data/test/xml/test_node_encoding.rb +33 -3
  266. data/test/xml/test_node_reparenting.rb +321 -0
  267. data/test/xml/test_node_set.rb +538 -2
  268. data/test/xml/test_parse_options.rb +52 -0
  269. data/test/xml/test_processing_instruction.rb +6 -1
  270. data/test/xml/test_reader_encoding.rb +1 -1
  271. data/test/xml/test_relax_ng.rb +60 -0
  272. data/test/xml/test_schema.rb +94 -0
  273. data/test/xml/test_syntax_error.rb +12 -0
  274. data/test/xml/test_text.rb +35 -1
  275. data/test/xml/test_unparented_node.rb +5 -5
  276. data/test/xml/test_xpath.rb +142 -11
  277. data/test/xslt/test_custom_functions.rb +94 -0
  278. metadata +328 -92
  279. data/ext/nokogiri/html_sax_parser.c +0 -57
  280. data/ext/nokogiri/html_sax_parser.h +0 -11
  281. data/ext/nokogiri/iconv.dll +0 -0
  282. data/ext/nokogiri/libexslt.dll +0 -0
  283. data/ext/nokogiri/libxml2.dll +0 -0
  284. data/ext/nokogiri/libxslt.dll +0 -0
  285. data/ext/nokogiri/native.so +0 -0
  286. data/ext/nokogiri/xml_xpath.c +0 -53
  287. data/ext/nokogiri/xml_xpath.h +0 -11
  288. data/ext/nokogiri/zlib1.dll +0 -0
  289. data/lib/action-nokogiri.rb +0 -30
  290. data/lib/nokogiri/css/generated_parser.rb +0 -713
  291. data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
  292. data/lib/nokogiri/decorators.rb +0 -2
  293. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  294. data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
  295. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
  296. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
  297. data/lib/nokogiri/hpricot.rb +0 -51
  298. data/lib/nokogiri/xml/comment.rb +0 -6
  299. data/lib/nokogiri/xml/element.rb +0 -6
  300. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  301. data/lib/nokogiri/xml/fragment_handler.rb +0 -34
  302. data/test/hpricot/files/basic.xhtml +0 -17
  303. data/test/hpricot/files/boingboing.html +0 -2266
  304. data/test/hpricot/files/cy0.html +0 -3653
  305. data/test/hpricot/files/immob.html +0 -400
  306. data/test/hpricot/files/pace_application.html +0 -1320
  307. data/test/hpricot/files/tenderlove.html +0 -16
  308. data/test/hpricot/files/uswebgen.html +0 -220
  309. data/test/hpricot/files/utf8.html +0 -1054
  310. data/test/hpricot/files/week9.html +0 -1723
  311. data/test/hpricot/files/why.xml +0 -19
  312. data/test/hpricot/load_files.rb +0 -11
  313. data/test/hpricot/test_alter.rb +0 -68
  314. data/test/hpricot/test_builder.rb +0 -20
  315. data/test/hpricot/test_parser.rb +0 -426
  316. data/test/hpricot/test_paths.rb +0 -15
  317. data/test/hpricot/test_preserved.rb +0 -77
  318. data/test/hpricot/test_xml.rb +0 -30
  319. data/test/test_gc.rb +0 -15
@@ -4,16 +4,34 @@ module Nokogiri
4
4
  ###
5
5
  # Save options for serializing nodes
6
6
  class SaveOptions
7
- FORMAT = 1 # Format serialized xml
8
- NO_DECLARATION = 2 # Do not include delcarations
7
+ # Format serialized xml
8
+ FORMAT = 1
9
+ # Do not include delcarations
10
+ NO_DECLARATION = 2
11
+ # Do not include empty tags
9
12
  NO_EMPTY_TAGS = 4
13
+ # Do not save XHTML
10
14
  NO_XHTML = 8
15
+ # Save as XHTML
11
16
  AS_XHTML = 16
17
+ # Save as XML
12
18
  AS_XML = 32
19
+ # Save as HTML
13
20
  AS_HTML = 64
14
21
 
22
+ # the default for XML documents
23
+ DEFAULT_XML = FORMAT | AS_XML
24
+ # the default for HTML document
25
+ DEFAULT_HTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML
26
+ # the default for XHTML document
27
+ DEFAULT_XHTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_XHTML
28
+
29
+ # Integer representation of the SaveOptions
15
30
  attr_reader :options
31
+
32
+ # Create a new SaveOptions object with +options+
16
33
  def initialize options = 0; @options = options; end
34
+
17
35
  constants.each do |constant|
18
36
  class_eval %{
19
37
  def #{constant.downcase}
@@ -26,6 +44,8 @@ module Nokogiri
26
44
  end
27
45
  }
28
46
  end
47
+
48
+ alias :to_i :options
29
49
  end
30
50
  end
31
51
  end
@@ -13,14 +13,20 @@ module Nokogiri
13
13
  # Create a NodeSet with +document+ defaulting to +list+
14
14
  def initialize document, list = []
15
15
  @document = document
16
+ document.decorate(self)
16
17
  list.each { |x| self << x }
17
18
  yield self if block_given?
18
19
  end
19
20
 
20
21
  ###
21
22
  # Get the first element of the NodeSet.
22
- def first
23
- self[0]
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
24
30
  end
25
31
 
26
32
  ###
@@ -35,6 +41,13 @@ module Nokogiri
35
41
  length == 0
36
42
  end
37
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
+
38
51
  ###
39
52
  # Insert +datum+ before the first Node in this NodeSet
40
53
  def before datum
@@ -56,19 +69,81 @@ module Nokogiri
56
69
  # For more information see Nokogiri::XML::Node#css and
57
70
  # Nokogiri::XML::Node#xpath
58
71
  def search *paths
59
- ns = paths.last.is_a?(Hash) ? paths.pop : document.root.namespaces
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
+
60
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
+
61
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
+
62
105
  each do |node|
63
- node.search(*(paths + [ns])).each do |sub_node|
64
- sub_set << sub_node
65
- end
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))
66
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)
67
138
  sub_set
68
139
  end
69
- alias :/ :search
70
- alias :xpath :search
71
- alias :css :search
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
72
147
 
73
148
  ###
74
149
  # If path is a string, search this document for +path+ returning the
@@ -77,28 +152,57 @@ module Nokogiri
77
152
  return self[path] if path.is_a?(Numeric)
78
153
  search(path, ns).first
79
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
80
180
 
81
181
  ###
82
182
  # Append the class attribute +name+ to all Node objects in the NodeSet.
83
183
  def add_class name
84
184
  each do |el|
85
- next unless el.respond_to? :get_attribute
86
- classes = el.get_attribute('class').to_s.split(" ")
87
- el.set_attribute('class', classes.push(name).uniq.join(" "))
185
+ classes = el['class'].to_s.split(/\s+/)
186
+ el['class'] = classes.push(name).uniq.join " "
88
187
  end
89
188
  self
90
189
  end
91
190
 
92
191
  ###
93
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.
94
195
  def remove_class name = nil
95
196
  each do |el|
96
- next unless el.respond_to? :get_attribute
97
197
  if name
98
- classes = el.get_attribute('class').to_s.split(" ")
99
- el.set_attribute('class', (classes - [name]).uniq.join(" "))
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
100
204
  else
101
- el.remove_attribute("class")
205
+ el.delete "class"
102
206
  end
103
207
  end
104
208
  self
@@ -108,29 +212,24 @@ module Nokogiri
108
212
  # Set the attribute +key+ to +value+ or the return value of +blk+
109
213
  # on all Node objects in the NodeSet.
110
214
  def attr key, value = nil, &blk
111
- if value or blk
112
- each do |el|
113
- el.set_attribute(key, value || blk[el])
114
- end
115
- return self
116
- end
117
- if key.is_a? Hash
118
- key.each { |k,v| self.attr(k,v) }
119
- return self
120
- else
121
- return self[0].get_attribute(key)
215
+ unless Hash === key || key && (value || blk)
216
+ return first.attribute(key)
122
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
123
224
  end
124
- alias_method :set, :attr
225
+ alias :set :attr
226
+ alias :attribute :attr
125
227
 
126
228
  ###
127
229
  # Remove the attributed named +name+ from all Node objects in the NodeSet
128
230
  def remove_attr name
129
- each do |el|
130
- next unless el.respond_to? :remove_attribute
131
- el.remove_attribute(name)
132
- end
133
- self
231
+ each { |el| el.delete name }
232
+ self
134
233
  end
135
234
 
136
235
  ###
@@ -150,39 +249,102 @@ module Nokogiri
150
249
 
151
250
  ###
152
251
  # Get the inner html of all contained Node objects
153
- def inner_html
154
- collect{|j| j.inner_html}.join('')
252
+ def inner_html *args
253
+ collect{|j| j.inner_html(*args) }.join('')
155
254
  end
156
255
 
157
256
  ###
158
257
  # Wrap this NodeSet with +html+ or the results of the builder in +blk+
159
258
  def wrap(html, &blk)
160
259
  each do |j|
161
- new_parent = Nokogiri.make(html, &blk)
162
- j.parent.add_child(new_parent)
260
+ new_parent = document.parse(html).first
261
+ j.add_next_sibling(new_parent)
163
262
  new_parent.add_child(j)
164
263
  end
165
264
  self
166
265
  end
167
266
 
267
+ ###
268
+ # Convert this NodeSet to a string.
168
269
  def to_s
169
270
  map { |x| x.to_s }.join
170
271
  end
171
272
 
273
+ ###
274
+ # Convert this NodeSet to HTML
172
275
  def to_html *args
173
- map { |x| x.to_html(*args) }.join('')
276
+ map { |x| x.to_html(*args) }.join
174
277
  end
175
278
 
279
+ ###
280
+ # Convert this NodeSet to XHTML
176
281
  def to_xhtml *args
177
- map { |x| x.to_xhtml(*args) }.join('')
282
+ map { |x| x.to_xhtml(*args) }.join
178
283
  end
179
284
 
285
+ ###
286
+ # Convert this NodeSet to XML
180
287
  def to_xml *args
181
- map { |x| x.to_xml(*args) }.join('')
288
+ map { |x| x.to_xml(*args) }.join
182
289
  end
183
290
 
184
291
  alias :size :length
185
292
  alias :to_ary :to_a
293
+
294
+ ###
295
+ # Removes the last element from set and returns it, or +nil+ if
296
+ # the set is empty
297
+ def pop
298
+ return nil if length == 0
299
+ delete last
300
+ end
301
+
302
+ ###
303
+ # Returns the first element of the NodeSet and removes it. Returns
304
+ # +nil+ if the set is empty.
305
+ def shift
306
+ return nil if length == 0
307
+ delete first
308
+ end
309
+
310
+ ###
311
+ # Equality -- Two NodeSets are equal if the contain the same number
312
+ # of elements and if each element is equal to the corresponding
313
+ # element in the other NodeSet
314
+ def == other
315
+ return false unless other.is_a?(Nokogiri::XML::NodeSet)
316
+ return false unless length == other.length
317
+ each_with_index do |node, i|
318
+ return false unless node == other[i]
319
+ end
320
+ true
321
+ end
322
+
323
+ ###
324
+ # Returns a new NodeSet containing all the children of all the nodes in
325
+ # the NodeSet
326
+ def children
327
+ inject(NodeSet.new(document)) { |set, node| set += node.children }
328
+ end
329
+
330
+ ###
331
+ # Returns a new NodeSet containing all the nodes in the NodeSet
332
+ # in reverse order
333
+ def reverse
334
+ node_set = NodeSet.new(document)
335
+ (length - 1).downto(0) do |x|
336
+ node_set.push self[x]
337
+ end
338
+ node_set
339
+ end
340
+
341
+ ###
342
+ # Return a nicely formated string representation
343
+ def inspect
344
+ "[#{map { |c| c.inspect }.join ', '}]"
345
+ end
346
+
347
+ alias :+ :|
186
348
  end
187
349
  end
188
350
  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