nokogiri-backupify 1.5.0.beta.4

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 (275) hide show
  1. data/.autotest +26 -0
  2. data/CHANGELOG.ja.rdoc +509 -0
  3. data/CHANGELOG.rdoc +490 -0
  4. data/Manifest.txt +274 -0
  5. data/README.ja.rdoc +106 -0
  6. data/README.rdoc +150 -0
  7. data/Rakefile +217 -0
  8. data/bin/nokogiri +54 -0
  9. data/deps.rip +5 -0
  10. data/ext/java/nokogiri/EncodingHandler.java +124 -0
  11. data/ext/java/nokogiri/HtmlDocument.java +146 -0
  12. data/ext/java/nokogiri/HtmlElementDescription.java +145 -0
  13. data/ext/java/nokogiri/HtmlEntityLookup.java +79 -0
  14. data/ext/java/nokogiri/HtmlSaxParserContext.java +256 -0
  15. data/ext/java/nokogiri/NokogiriService.java +466 -0
  16. data/ext/java/nokogiri/XmlAttr.java +183 -0
  17. data/ext/java/nokogiri/XmlAttributeDecl.java +130 -0
  18. data/ext/java/nokogiri/XmlCdata.java +89 -0
  19. data/ext/java/nokogiri/XmlComment.java +84 -0
  20. data/ext/java/nokogiri/XmlDocument.java +514 -0
  21. data/ext/java/nokogiri/XmlDocumentFragment.java +216 -0
  22. data/ext/java/nokogiri/XmlDtd.java +464 -0
  23. data/ext/java/nokogiri/XmlElement.java +221 -0
  24. data/ext/java/nokogiri/XmlElementContent.java +382 -0
  25. data/ext/java/nokogiri/XmlElementDecl.java +147 -0
  26. data/ext/java/nokogiri/XmlEntityDecl.java +161 -0
  27. data/ext/java/nokogiri/XmlEntityReference.java +75 -0
  28. data/ext/java/nokogiri/XmlNamespace.java +127 -0
  29. data/ext/java/nokogiri/XmlNode.java +1392 -0
  30. data/ext/java/nokogiri/XmlNodeSet.java +284 -0
  31. data/ext/java/nokogiri/XmlProcessingInstruction.java +103 -0
  32. data/ext/java/nokogiri/XmlReader.java +409 -0
  33. data/ext/java/nokogiri/XmlRelaxng.java +199 -0
  34. data/ext/java/nokogiri/XmlSaxParserContext.java +353 -0
  35. data/ext/java/nokogiri/XmlSaxPushParser.java +182 -0
  36. data/ext/java/nokogiri/XmlSchema.java +175 -0
  37. data/ext/java/nokogiri/XmlSyntaxError.java +114 -0
  38. data/ext/java/nokogiri/XmlText.java +135 -0
  39. data/ext/java/nokogiri/XmlXpathContext.java +175 -0
  40. data/ext/java/nokogiri/XsltStylesheet.java +181 -0
  41. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +205 -0
  42. data/ext/java/nokogiri/internals/NokogiriDocumentCache.java +73 -0
  43. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +80 -0
  44. data/ext/java/nokogiri/internals/NokogiriHandler.java +326 -0
  45. data/ext/java/nokogiri/internals/NokogiriHelpers.java +583 -0
  46. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +170 -0
  47. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +118 -0
  48. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +73 -0
  49. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +121 -0
  50. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +78 -0
  51. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +120 -0
  52. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +56 -0
  53. data/ext/java/nokogiri/internals/ParserContext.java +278 -0
  54. data/ext/java/nokogiri/internals/PushInputStream.java +411 -0
  55. data/ext/java/nokogiri/internals/ReaderNode.java +473 -0
  56. data/ext/java/nokogiri/internals/SaveContext.java +282 -0
  57. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +68 -0
  58. data/ext/java/nokogiri/internals/XmlDeclHandler.java +42 -0
  59. data/ext/java/nokogiri/internals/XmlDomParser.java +77 -0
  60. data/ext/java/nokogiri/internals/XmlDomParserContext.java +233 -0
  61. data/ext/java/nokogiri/internals/XmlSaxParser.java +65 -0
  62. data/ext/java/nokogiri/internals/XsltExtensionFunction.java +72 -0
  63. data/ext/nokogiri/depend +358 -0
  64. data/ext/nokogiri/extconf.rb +124 -0
  65. data/ext/nokogiri/html_document.c +154 -0
  66. data/ext/nokogiri/html_document.h +10 -0
  67. data/ext/nokogiri/html_element_description.c +276 -0
  68. data/ext/nokogiri/html_element_description.h +10 -0
  69. data/ext/nokogiri/html_entity_lookup.c +32 -0
  70. data/ext/nokogiri/html_entity_lookup.h +8 -0
  71. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  72. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  73. data/ext/nokogiri/nokogiri.c +92 -0
  74. data/ext/nokogiri/nokogiri.h +160 -0
  75. data/ext/nokogiri/xml_attr.c +94 -0
  76. data/ext/nokogiri/xml_attr.h +9 -0
  77. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  78. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  79. data/ext/nokogiri/xml_cdata.c +56 -0
  80. data/ext/nokogiri/xml_cdata.h +9 -0
  81. data/ext/nokogiri/xml_comment.c +54 -0
  82. data/ext/nokogiri/xml_comment.h +9 -0
  83. data/ext/nokogiri/xml_document.c +478 -0
  84. data/ext/nokogiri/xml_document.h +23 -0
  85. data/ext/nokogiri/xml_document_fragment.c +48 -0
  86. data/ext/nokogiri/xml_document_fragment.h +10 -0
  87. data/ext/nokogiri/xml_dtd.c +202 -0
  88. data/ext/nokogiri/xml_dtd.h +10 -0
  89. data/ext/nokogiri/xml_element_content.c +123 -0
  90. data/ext/nokogiri/xml_element_content.h +10 -0
  91. data/ext/nokogiri/xml_element_decl.c +69 -0
  92. data/ext/nokogiri/xml_element_decl.h +9 -0
  93. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  94. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  95. data/ext/nokogiri/xml_entity_decl.c +110 -0
  96. data/ext/nokogiri/xml_entity_decl.h +10 -0
  97. data/ext/nokogiri/xml_entity_reference.c +52 -0
  98. data/ext/nokogiri/xml_entity_reference.h +9 -0
  99. data/ext/nokogiri/xml_io.c +31 -0
  100. data/ext/nokogiri/xml_io.h +11 -0
  101. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  102. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  103. data/ext/nokogiri/xml_namespace.c +84 -0
  104. data/ext/nokogiri/xml_namespace.h +13 -0
  105. data/ext/nokogiri/xml_node.c +1384 -0
  106. data/ext/nokogiri/xml_node.h +13 -0
  107. data/ext/nokogiri/xml_node_set.c +418 -0
  108. data/ext/nokogiri/xml_node_set.h +9 -0
  109. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  110. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  111. data/ext/nokogiri/xml_reader.c +684 -0
  112. data/ext/nokogiri/xml_reader.h +10 -0
  113. data/ext/nokogiri/xml_relax_ng.c +161 -0
  114. data/ext/nokogiri/xml_relax_ng.h +9 -0
  115. data/ext/nokogiri/xml_sax_parser.c +288 -0
  116. data/ext/nokogiri/xml_sax_parser.h +39 -0
  117. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  118. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  119. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  120. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  121. data/ext/nokogiri/xml_schema.c +205 -0
  122. data/ext/nokogiri/xml_schema.h +9 -0
  123. data/ext/nokogiri/xml_syntax_error.c +58 -0
  124. data/ext/nokogiri/xml_syntax_error.h +13 -0
  125. data/ext/nokogiri/xml_text.c +50 -0
  126. data/ext/nokogiri/xml_text.h +9 -0
  127. data/ext/nokogiri/xml_xpath_context.c +309 -0
  128. data/ext/nokogiri/xml_xpath_context.h +9 -0
  129. data/ext/nokogiri/xslt_stylesheet.c +258 -0
  130. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  131. data/lib/isorelax.jar +0 -0
  132. data/lib/jing.jar +0 -0
  133. data/lib/nekodtd.jar +0 -0
  134. data/lib/nekohtml.jar +0 -0
  135. data/lib/nokogiri.rb +143 -0
  136. data/lib/nokogiri/css.rb +23 -0
  137. data/lib/nokogiri/css/node.rb +99 -0
  138. data/lib/nokogiri/css/parser.rb +677 -0
  139. data/lib/nokogiri/css/parser.y +237 -0
  140. data/lib/nokogiri/css/parser_extras.rb +91 -0
  141. data/lib/nokogiri/css/syntax_error.rb +7 -0
  142. data/lib/nokogiri/css/tokenizer.rb +152 -0
  143. data/lib/nokogiri/css/tokenizer.rex +55 -0
  144. data/lib/nokogiri/css/xpath_visitor.rb +171 -0
  145. data/lib/nokogiri/decorators/slop.rb +35 -0
  146. data/lib/nokogiri/html.rb +36 -0
  147. data/lib/nokogiri/html/builder.rb +35 -0
  148. data/lib/nokogiri/html/document.rb +221 -0
  149. data/lib/nokogiri/html/document_fragment.rb +41 -0
  150. data/lib/nokogiri/html/element_description.rb +23 -0
  151. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  152. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  153. data/lib/nokogiri/html/sax/parser.rb +52 -0
  154. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  155. data/lib/nokogiri/syntax_error.rb +4 -0
  156. data/lib/nokogiri/version.rb +35 -0
  157. data/lib/nokogiri/xml.rb +67 -0
  158. data/lib/nokogiri/xml/attr.rb +14 -0
  159. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  160. data/lib/nokogiri/xml/builder.rb +418 -0
  161. data/lib/nokogiri/xml/cdata.rb +11 -0
  162. data/lib/nokogiri/xml/character_data.rb +7 -0
  163. data/lib/nokogiri/xml/document.rb +218 -0
  164. data/lib/nokogiri/xml/document_fragment.rb +84 -0
  165. data/lib/nokogiri/xml/dtd.rb +22 -0
  166. data/lib/nokogiri/xml/element_content.rb +36 -0
  167. data/lib/nokogiri/xml/element_decl.rb +13 -0
  168. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  169. data/lib/nokogiri/xml/namespace.rb +13 -0
  170. data/lib/nokogiri/xml/node.rb +907 -0
  171. data/lib/nokogiri/xml/node/save_options.rb +45 -0
  172. data/lib/nokogiri/xml/node_set.rb +350 -0
  173. data/lib/nokogiri/xml/notation.rb +6 -0
  174. data/lib/nokogiri/xml/parse_options.rb +85 -0
  175. data/lib/nokogiri/xml/pp.rb +2 -0
  176. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  177. data/lib/nokogiri/xml/pp/node.rb +56 -0
  178. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  179. data/lib/nokogiri/xml/reader.rb +112 -0
  180. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  181. data/lib/nokogiri/xml/sax.rb +4 -0
  182. data/lib/nokogiri/xml/sax/document.rb +164 -0
  183. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  184. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  185. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  186. data/lib/nokogiri/xml/schema.rb +57 -0
  187. data/lib/nokogiri/xml/syntax_error.rb +47 -0
  188. data/lib/nokogiri/xml/text.rb +9 -0
  189. data/lib/nokogiri/xml/xpath.rb +10 -0
  190. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  191. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  192. data/lib/nokogiri/xslt.rb +52 -0
  193. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  194. data/lib/xercesImpl.jar +0 -0
  195. data/lib/xsd/xmlparser/nokogiri.rb +90 -0
  196. data/tasks/cross_compile.rb +177 -0
  197. data/tasks/test.rb +94 -0
  198. data/test/css/test_nthiness.rb +159 -0
  199. data/test/css/test_parser.rb +303 -0
  200. data/test/css/test_tokenizer.rb +198 -0
  201. data/test/css/test_xpath_visitor.rb +85 -0
  202. data/test/decorators/test_slop.rb +16 -0
  203. data/test/files/2ch.html +108 -0
  204. data/test/files/address_book.rlx +12 -0
  205. data/test/files/address_book.xml +10 -0
  206. data/test/files/bar/bar.xsd +4 -0
  207. data/test/files/dont_hurt_em_why.xml +422 -0
  208. data/test/files/exslt.xml +8 -0
  209. data/test/files/exslt.xslt +35 -0
  210. data/test/files/foo/foo.xsd +4 -0
  211. data/test/files/po.xml +32 -0
  212. data/test/files/po.xsd +66 -0
  213. data/test/files/shift_jis.html +10 -0
  214. data/test/files/shift_jis.xml +5 -0
  215. data/test/files/snuggles.xml +3 -0
  216. data/test/files/staff.dtd +10 -0
  217. data/test/files/staff.xml +59 -0
  218. data/test/files/staff.xslt +32 -0
  219. data/test/files/tlm.html +850 -0
  220. data/test/files/valid_bar.xml +2 -0
  221. data/test/helper.rb +171 -0
  222. data/test/html/sax/test_parser.rb +136 -0
  223. data/test/html/sax/test_parser_context.rb +48 -0
  224. data/test/html/test_builder.rb +164 -0
  225. data/test/html/test_document.rb +457 -0
  226. data/test/html/test_document_encoding.rb +123 -0
  227. data/test/html/test_document_fragment.rb +255 -0
  228. data/test/html/test_element_description.rb +100 -0
  229. data/test/html/test_named_characters.rb +14 -0
  230. data/test/html/test_node.rb +190 -0
  231. data/test/html/test_node_encoding.rb +27 -0
  232. data/test/test_convert_xpath.rb +135 -0
  233. data/test/test_css_cache.rb +45 -0
  234. data/test/test_encoding_handler.rb +46 -0
  235. data/test/test_memory_leak.rb +52 -0
  236. data/test/test_nokogiri.rb +132 -0
  237. data/test/test_reader.rb +403 -0
  238. data/test/test_soap4r_sax.rb +52 -0
  239. data/test/test_xslt_transforms.rb +189 -0
  240. data/test/xml/node/test_save_options.rb +20 -0
  241. data/test/xml/node/test_subclass.rb +44 -0
  242. data/test/xml/sax/test_parser.rb +338 -0
  243. data/test/xml/sax/test_parser_context.rb +113 -0
  244. data/test/xml/sax/test_push_parser.rb +156 -0
  245. data/test/xml/test_attr.rb +65 -0
  246. data/test/xml/test_attribute_decl.rb +86 -0
  247. data/test/xml/test_builder.rb +210 -0
  248. data/test/xml/test_cdata.rb +50 -0
  249. data/test/xml/test_comment.rb +29 -0
  250. data/test/xml/test_document.rb +675 -0
  251. data/test/xml/test_document_encoding.rb +26 -0
  252. data/test/xml/test_document_fragment.rb +192 -0
  253. data/test/xml/test_dtd.rb +107 -0
  254. data/test/xml/test_dtd_encoding.rb +33 -0
  255. data/test/xml/test_element_content.rb +56 -0
  256. data/test/xml/test_element_decl.rb +73 -0
  257. data/test/xml/test_entity_decl.rb +122 -0
  258. data/test/xml/test_entity_reference.rb +21 -0
  259. data/test/xml/test_namespace.rb +70 -0
  260. data/test/xml/test_node.rb +899 -0
  261. data/test/xml/test_node_attributes.rb +34 -0
  262. data/test/xml/test_node_encoding.rb +107 -0
  263. data/test/xml/test_node_reparenting.rb +321 -0
  264. data/test/xml/test_node_set.rb +708 -0
  265. data/test/xml/test_parse_options.rb +52 -0
  266. data/test/xml/test_processing_instruction.rb +30 -0
  267. data/test/xml/test_reader_encoding.rb +126 -0
  268. data/test/xml/test_relax_ng.rb +60 -0
  269. data/test/xml/test_schema.rb +89 -0
  270. data/test/xml/test_syntax_error.rb +12 -0
  271. data/test/xml/test_text.rb +47 -0
  272. data/test/xml/test_unparented_node.rb +381 -0
  273. data/test/xml/test_xpath.rb +237 -0
  274. data/test/xslt/test_custom_functions.rb +94 -0
  275. metadata +525 -0
@@ -0,0 +1,45 @@
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 delcarations
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
+ # Integer representation of the SaveOptions
23
+ attr_reader :options
24
+
25
+ # Create a new SaveOptions object with +options+
26
+ def initialize options = 0; @options = options; end
27
+
28
+ constants.each do |constant|
29
+ class_eval %{
30
+ def #{constant.downcase}
31
+ @options |= #{constant}
32
+ self
33
+ end
34
+
35
+ def #{constant.downcase}?
36
+ #{constant} & @options == #{constant}
37
+ end
38
+ }
39
+ end
40
+
41
+ alias :to_i :options
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,350 @@
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
+ map { |x| x.to_html(*args) }.join
277
+ end
278
+
279
+ ###
280
+ # Convert this NodeSet to XHTML
281
+ def to_xhtml *args
282
+ map { |x| x.to_xhtml(*args) }.join
283
+ end
284
+
285
+ ###
286
+ # Convert this NodeSet to XML
287
+ def to_xml *args
288
+ map { |x| x.to_xml(*args) }.join
289
+ end
290
+
291
+ alias :size :length
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 :+ :|
348
+ end
349
+ end
350
+ 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,85 @@
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
+
41
+ # the default options used for parsing XML documents
42
+ DEFAULT_XML = RECOVER
43
+ # the default options used for parsing HTML documents
44
+ DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET
45
+
46
+ attr_accessor :options
47
+ def initialize options = STRICT
48
+ @options = options
49
+ end
50
+
51
+ constants.each do |constant|
52
+ next if constant.to_sym == :STRICT
53
+ class_eval %{
54
+ def #{constant.downcase}
55
+ @options |= #{constant}
56
+ self
57
+ end
58
+
59
+ def #{constant.downcase}?
60
+ #{constant} & @options == #{constant}
61
+ end
62
+ }
63
+ end
64
+
65
+ def strict
66
+ @options &= ~RECOVER
67
+ self
68
+ end
69
+
70
+ def strict?
71
+ @options & RECOVER == STRICT
72
+ end
73
+
74
+ alias :to_i :options
75
+
76
+ def inspect
77
+ options = []
78
+ self.class.constants.each do |k|
79
+ options << k.downcase if send(:"#{k.downcase}?")
80
+ end
81
+ super.sub(/>$/, " " + options.join(', ') + ">")
82
+ end
83
+ end
84
+ end
85
+ end