caring-nokogiri 1.4.1.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (270) hide show
  1. data/.autotest +27 -0
  2. data/CHANGELOG.ja.rdoc +330 -0
  3. data/CHANGELOG.rdoc +324 -0
  4. data/Manifest.txt +269 -0
  5. data/README.ja.rdoc +105 -0
  6. data/README.rdoc +118 -0
  7. data/Rakefile +248 -0
  8. data/bin/nokogiri +49 -0
  9. data/ext/nokogiri/extconf.rb +147 -0
  10. data/ext/nokogiri/html_document.c +145 -0
  11. data/ext/nokogiri/html_document.h +10 -0
  12. data/ext/nokogiri/html_element_description.c +272 -0
  13. data/ext/nokogiri/html_element_description.h +10 -0
  14. data/ext/nokogiri/html_entity_lookup.c +32 -0
  15. data/ext/nokogiri/html_entity_lookup.h +8 -0
  16. data/ext/nokogiri/html_sax_parser_context.c +92 -0
  17. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  18. data/ext/nokogiri/nokogiri.c +95 -0
  19. data/ext/nokogiri/nokogiri.h +145 -0
  20. data/ext/nokogiri/xml_attr.c +92 -0
  21. data/ext/nokogiri/xml_attr.h +9 -0
  22. data/ext/nokogiri/xml_attribute_decl.c +67 -0
  23. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  24. data/ext/nokogiri/xml_cdata.c +54 -0
  25. data/ext/nokogiri/xml_cdata.h +9 -0
  26. data/ext/nokogiri/xml_comment.c +52 -0
  27. data/ext/nokogiri/xml_comment.h +9 -0
  28. data/ext/nokogiri/xml_document.c +388 -0
  29. data/ext/nokogiri/xml_document.h +24 -0
  30. data/ext/nokogiri/xml_document_fragment.c +46 -0
  31. data/ext/nokogiri/xml_document_fragment.h +10 -0
  32. data/ext/nokogiri/xml_dtd.c +192 -0
  33. data/ext/nokogiri/xml_dtd.h +10 -0
  34. data/ext/nokogiri/xml_element_content.c +123 -0
  35. data/ext/nokogiri/xml_element_content.h +10 -0
  36. data/ext/nokogiri/xml_element_decl.c +69 -0
  37. data/ext/nokogiri/xml_element_decl.h +9 -0
  38. data/ext/nokogiri/xml_entity_decl.c +97 -0
  39. data/ext/nokogiri/xml_entity_decl.h +10 -0
  40. data/ext/nokogiri/xml_entity_reference.c +50 -0
  41. data/ext/nokogiri/xml_entity_reference.h +9 -0
  42. data/ext/nokogiri/xml_io.c +31 -0
  43. data/ext/nokogiri/xml_io.h +11 -0
  44. data/ext/nokogiri/xml_namespace.c +74 -0
  45. data/ext/nokogiri/xml_namespace.h +12 -0
  46. data/ext/nokogiri/xml_node.c +1060 -0
  47. data/ext/nokogiri/xml_node.h +13 -0
  48. data/ext/nokogiri/xml_node_set.c +397 -0
  49. data/ext/nokogiri/xml_node_set.h +9 -0
  50. data/ext/nokogiri/xml_processing_instruction.c +54 -0
  51. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  52. data/ext/nokogiri/xml_reader.c +593 -0
  53. data/ext/nokogiri/xml_reader.h +10 -0
  54. data/ext/nokogiri/xml_relax_ng.c +159 -0
  55. data/ext/nokogiri/xml_relax_ng.h +9 -0
  56. data/ext/nokogiri/xml_sax_parser.c +286 -0
  57. data/ext/nokogiri/xml_sax_parser.h +43 -0
  58. data/ext/nokogiri/xml_sax_parser_context.c +155 -0
  59. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  60. data/ext/nokogiri/xml_sax_push_parser.c +91 -0
  61. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  62. data/ext/nokogiri/xml_schema.c +156 -0
  63. data/ext/nokogiri/xml_schema.h +9 -0
  64. data/ext/nokogiri/xml_syntax_error.c +261 -0
  65. data/ext/nokogiri/xml_syntax_error.h +13 -0
  66. data/ext/nokogiri/xml_text.c +48 -0
  67. data/ext/nokogiri/xml_text.h +9 -0
  68. data/ext/nokogiri/xml_xpath.c +53 -0
  69. data/ext/nokogiri/xml_xpath.h +11 -0
  70. data/ext/nokogiri/xml_xpath_context.c +239 -0
  71. data/ext/nokogiri/xml_xpath_context.h +9 -0
  72. data/ext/nokogiri/xslt_stylesheet.c +131 -0
  73. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  74. data/lib/nokogiri.rb +116 -0
  75. data/lib/nokogiri/css.rb +25 -0
  76. data/lib/nokogiri/css/generated_parser.rb +646 -0
  77. data/lib/nokogiri/css/generated_tokenizer.rb +143 -0
  78. data/lib/nokogiri/css/node.rb +99 -0
  79. data/lib/nokogiri/css/parser.rb +82 -0
  80. data/lib/nokogiri/css/parser.y +227 -0
  81. data/lib/nokogiri/css/syntax_error.rb +7 -0
  82. data/lib/nokogiri/css/tokenizer.rb +7 -0
  83. data/lib/nokogiri/css/tokenizer.rex +54 -0
  84. data/lib/nokogiri/css/xpath_visitor.rb +162 -0
  85. data/lib/nokogiri/decorators/slop.rb +33 -0
  86. data/lib/nokogiri/ffi/html/document.rb +28 -0
  87. data/lib/nokogiri/ffi/html/element_description.rb +85 -0
  88. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  89. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  90. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  91. data/lib/nokogiri/ffi/libxml.rb +356 -0
  92. data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
  93. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  94. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  95. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  96. data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
  97. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  98. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  99. data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
  100. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  101. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  102. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  103. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  104. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  105. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  106. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  107. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  108. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  109. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +19 -0
  110. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  111. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  112. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +15 -0
  113. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  114. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  115. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  116. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
  117. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  118. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  119. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  120. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  121. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  122. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  123. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  124. data/lib/nokogiri/ffi/xml/document.rb +135 -0
  125. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  126. data/lib/nokogiri/ffi/xml/dtd.rb +69 -0
  127. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  128. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  129. data/lib/nokogiri/ffi/xml/entity_decl.rb +27 -0
  130. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  131. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  132. data/lib/nokogiri/ffi/xml/node.rb +444 -0
  133. data/lib/nokogiri/ffi/xml/node_set.rb +133 -0
  134. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  135. data/lib/nokogiri/ffi/xml/reader.rb +227 -0
  136. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  137. data/lib/nokogiri/ffi/xml/sax/parser.rb +142 -0
  138. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +67 -0
  139. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +39 -0
  140. data/lib/nokogiri/ffi/xml/schema.rb +92 -0
  141. data/lib/nokogiri/ffi/xml/syntax_error.rb +91 -0
  142. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  143. data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
  144. data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
  145. data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
  146. data/lib/nokogiri/html.rb +35 -0
  147. data/lib/nokogiri/html/builder.rb +35 -0
  148. data/lib/nokogiri/html/document.rb +88 -0
  149. data/lib/nokogiri/html/document_fragment.rb +15 -0
  150. data/lib/nokogiri/html/element_description.rb +23 -0
  151. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  152. data/lib/nokogiri/html/sax/parser.rb +48 -0
  153. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  154. data/lib/nokogiri/syntax_error.rb +4 -0
  155. data/lib/nokogiri/version.rb +33 -0
  156. data/lib/nokogiri/version_warning.rb +11 -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 +405 -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 +131 -0
  164. data/lib/nokogiri/xml/document_fragment.rb +73 -0
  165. data/lib/nokogiri/xml/dtd.rb +11 -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 +15 -0
  169. data/lib/nokogiri/xml/fragment_handler.rb +73 -0
  170. data/lib/nokogiri/xml/namespace.rb +13 -0
  171. data/lib/nokogiri/xml/node.rb +665 -0
  172. data/lib/nokogiri/xml/node/save_options.rb +42 -0
  173. data/lib/nokogiri/xml/node_set.rb +307 -0
  174. data/lib/nokogiri/xml/notation.rb +6 -0
  175. data/lib/nokogiri/xml/parse_options.rb +85 -0
  176. data/lib/nokogiri/xml/pp.rb +2 -0
  177. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  178. data/lib/nokogiri/xml/pp/node.rb +56 -0
  179. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  180. data/lib/nokogiri/xml/reader.rb +74 -0
  181. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  182. data/lib/nokogiri/xml/sax.rb +4 -0
  183. data/lib/nokogiri/xml/sax/document.rb +160 -0
  184. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  185. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  186. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  187. data/lib/nokogiri/xml/schema.rb +61 -0
  188. data/lib/nokogiri/xml/syntax_error.rb +38 -0
  189. data/lib/nokogiri/xml/xpath.rb +10 -0
  190. data/lib/nokogiri/xml/xpath/syntax_error.rb +8 -0
  191. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  192. data/lib/nokogiri/xslt.rb +48 -0
  193. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  194. data/lib/xsd/xmlparser/nokogiri.rb +71 -0
  195. data/tasks/test.rb +100 -0
  196. data/test/css/test_nthiness.rb +159 -0
  197. data/test/css/test_parser.rb +277 -0
  198. data/test/css/test_tokenizer.rb +183 -0
  199. data/test/css/test_xpath_visitor.rb +76 -0
  200. data/test/ffi/test_document.rb +35 -0
  201. data/test/files/2ch.html +108 -0
  202. data/test/files/address_book.rlx +12 -0
  203. data/test/files/address_book.xml +10 -0
  204. data/test/files/bar/bar.xsd +4 -0
  205. data/test/files/dont_hurt_em_why.xml +422 -0
  206. data/test/files/exslt.xml +8 -0
  207. data/test/files/exslt.xslt +35 -0
  208. data/test/files/foo/foo.xsd +4 -0
  209. data/test/files/po.xml +32 -0
  210. data/test/files/po.xsd +66 -0
  211. data/test/files/shift_jis.html +10 -0
  212. data/test/files/shift_jis.xml +5 -0
  213. data/test/files/snuggles.xml +3 -0
  214. data/test/files/staff.dtd +10 -0
  215. data/test/files/staff.xml +59 -0
  216. data/test/files/staff.xslt +32 -0
  217. data/test/files/tlm.html +850 -0
  218. data/test/files/valid_bar.xml +2 -0
  219. data/test/helper.rb +136 -0
  220. data/test/html/sax/test_parser.rb +64 -0
  221. data/test/html/sax/test_parser_context.rb +48 -0
  222. data/test/html/test_builder.rb +164 -0
  223. data/test/html/test_document.rb +390 -0
  224. data/test/html/test_document_encoding.rb +77 -0
  225. data/test/html/test_document_fragment.rb +142 -0
  226. data/test/html/test_element_description.rb +94 -0
  227. data/test/html/test_named_characters.rb +14 -0
  228. data/test/html/test_node.rb +228 -0
  229. data/test/html/test_node_encoding.rb +27 -0
  230. data/test/test_convert_xpath.rb +135 -0
  231. data/test/test_css_cache.rb +45 -0
  232. data/test/test_gc.rb +15 -0
  233. data/test/test_memory_leak.rb +77 -0
  234. data/test/test_nokogiri.rb +138 -0
  235. data/test/test_reader.rb +358 -0
  236. data/test/test_xslt_transforms.rb +131 -0
  237. data/test/xml/node/test_save_options.rb +20 -0
  238. data/test/xml/node/test_subclass.rb +44 -0
  239. data/test/xml/sax/test_parser.rb +307 -0
  240. data/test/xml/sax/test_parser_context.rb +56 -0
  241. data/test/xml/sax/test_push_parser.rb +106 -0
  242. data/test/xml/test_attr.rb +38 -0
  243. data/test/xml/test_attribute_decl.rb +82 -0
  244. data/test/xml/test_builder.rb +167 -0
  245. data/test/xml/test_cdata.rb +38 -0
  246. data/test/xml/test_comment.rb +29 -0
  247. data/test/xml/test_document.rb +607 -0
  248. data/test/xml/test_document_encoding.rb +26 -0
  249. data/test/xml/test_document_fragment.rb +144 -0
  250. data/test/xml/test_dtd.rb +82 -0
  251. data/test/xml/test_dtd_encoding.rb +33 -0
  252. data/test/xml/test_element_content.rb +56 -0
  253. data/test/xml/test_element_decl.rb +73 -0
  254. data/test/xml/test_entity_decl.rb +83 -0
  255. data/test/xml/test_entity_reference.rb +21 -0
  256. data/test/xml/test_namespace.rb +68 -0
  257. data/test/xml/test_node.rb +889 -0
  258. data/test/xml/test_node_attributes.rb +34 -0
  259. data/test/xml/test_node_encoding.rb +107 -0
  260. data/test/xml/test_node_set.rb +531 -0
  261. data/test/xml/test_parse_options.rb +52 -0
  262. data/test/xml/test_processing_instruction.rb +30 -0
  263. data/test/xml/test_reader_encoding.rb +126 -0
  264. data/test/xml/test_relax_ng.rb +60 -0
  265. data/test/xml/test_schema.rb +89 -0
  266. data/test/xml/test_syntax_error.rb +27 -0
  267. data/test/xml/test_text.rb +30 -0
  268. data/test/xml/test_unparented_node.rb +381 -0
  269. data/test/xml/test_xpath.rb +106 -0
  270. metadata +428 -0
@@ -0,0 +1,42 @@
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
+ constants.each do |constant|
28
+ class_eval %{
29
+ def #{constant.downcase}
30
+ @options |= #{constant}
31
+ self
32
+ end
33
+
34
+ def #{constant.downcase}?
35
+ #{constant} & @options == #{constant}
36
+ end
37
+ }
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,307 @@
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
+ list.each { |x| self << x }
17
+ yield self if block_given?
18
+ end
19
+
20
+ ###
21
+ # Get the first element of the NodeSet.
22
+ def first n = nil
23
+ return self[0] unless n
24
+ list = []
25
+ 0.upto(n - 1) do |i|
26
+ list << self[i]
27
+ end
28
+ list
29
+ end
30
+
31
+ ###
32
+ # Get the last element of the NodeSet.
33
+ def last
34
+ self[length - 1]
35
+ end
36
+
37
+ ###
38
+ # Is this NodeSet empty?
39
+ def empty?
40
+ length == 0
41
+ end
42
+
43
+ ###
44
+ # Returns the index of the first node in self that is == to +node+. Returns nil if no match is found.
45
+ def index(node)
46
+ each_with_index { |member, j| return j if member == node }
47
+ nil
48
+ end
49
+
50
+ ###
51
+ # Insert +datum+ before the first Node in this NodeSet
52
+ def before datum
53
+ first.before datum
54
+ end
55
+
56
+ ###
57
+ # Insert +datum+ after the last Node in this NodeSet
58
+ def after datum
59
+ last.after datum
60
+ end
61
+
62
+ alias :<< :push
63
+ alias :remove :unlink
64
+
65
+ ###
66
+ # Search this document for +paths+
67
+ #
68
+ # For more information see Nokogiri::XML::Node#css and
69
+ # Nokogiri::XML::Node#xpath
70
+ def search *paths
71
+ handler = ![
72
+ Hash, String, Symbol
73
+ ].include?(paths.last.class) ? paths.pop : nil
74
+
75
+ ns = paths.last.is_a?(Hash) ? paths.pop : nil
76
+
77
+ sub_set = NodeSet.new(document)
78
+
79
+ paths.each do |path|
80
+ sub_set += send(
81
+ path =~ /^(\.\/|\/)/ ? :xpath : :css,
82
+ *(paths + [ns, handler]).compact
83
+ )
84
+ end
85
+
86
+ document.decorate(sub_set)
87
+ sub_set
88
+ end
89
+ alias :/ :search
90
+
91
+ ###
92
+ # Search this NodeSet for css +paths+
93
+ #
94
+ # For more information see Nokogiri::XML::Node#css
95
+ def css *paths
96
+ handler = ![
97
+ Hash, String, Symbol
98
+ ].include?(paths.last.class) ? paths.pop : nil
99
+
100
+ ns = paths.last.is_a?(Hash) ? paths.pop : nil
101
+
102
+ sub_set = NodeSet.new(document)
103
+
104
+ each do |node|
105
+ doc = node.document
106
+ search_ns = ns || doc.root ? doc.root.namespaces : {}
107
+
108
+ xpaths = paths.map { |rule|
109
+ [
110
+ CSS.xpath_for(rule.to_s, :prefix => ".//", :ns => search_ns),
111
+ CSS.xpath_for(rule.to_s, :prefix => "self::", :ns => search_ns)
112
+ ].join(' | ')
113
+ }
114
+
115
+ sub_set += node.xpath(*(xpaths + [search_ns, handler].compact))
116
+ end
117
+ document.decorate(sub_set)
118
+ sub_set
119
+ end
120
+
121
+ ###
122
+ # Search this NodeSet for XPath +paths+
123
+ #
124
+ # For more information see Nokogiri::XML::Node#xpath
125
+ def xpath *paths
126
+ handler = ![
127
+ Hash, String, Symbol
128
+ ].include?(paths.last.class) ? paths.pop : nil
129
+
130
+ ns = paths.last.is_a?(Hash) ? paths.pop : nil
131
+
132
+ sub_set = NodeSet.new(document)
133
+ each do |node|
134
+ sub_set += node.xpath(*(paths + [ns, handler].compact))
135
+ end
136
+ document.decorate(sub_set)
137
+ sub_set
138
+ end
139
+
140
+ ###
141
+ # If path is a string, search this document for +path+ returning the
142
+ # first Node. Otherwise, index in to the array with +path+.
143
+ def at path, ns = document.root ? document.root.namespaces : {}
144
+ return self[path] if path.is_a?(Numeric)
145
+ search(path, ns).first
146
+ end
147
+ alias :% :at
148
+
149
+ ###
150
+ # Append the class attribute +name+ to all Node objects in the NodeSet.
151
+ def add_class name
152
+ each do |el|
153
+ classes = el['class'].to_s.split(/\s+/)
154
+ el['class'] = classes.push(name).uniq.join " "
155
+ end
156
+ self
157
+ end
158
+
159
+ ###
160
+ # Remove the class attribute +name+ from all Node objects in the NodeSet.
161
+ # If +name+ is nil, remove the class attribute from all Nodes in the
162
+ # NodeSet.
163
+ def remove_class name = nil
164
+ each do |el|
165
+ if name
166
+ classes = el['class'].to_s.split(/\s+/)
167
+ if classes.empty?
168
+ el.delete 'class'
169
+ else
170
+ el['class'] = (classes - [name]).uniq.join " "
171
+ end
172
+ else
173
+ el.delete "class"
174
+ end
175
+ end
176
+ self
177
+ end
178
+
179
+ ###
180
+ # Set the attribute +key+ to +value+ or the return value of +blk+
181
+ # on all Node objects in the NodeSet.
182
+ def attr key, value = nil, &blk
183
+ unless Hash === key || key && (value || blk)
184
+ return first.attribute(key)
185
+ end
186
+
187
+ hash = key.is_a?(Hash) ? key : { key => value }
188
+
189
+ hash.each { |k,v| each { |el| el[k] = v || blk[el] } }
190
+
191
+ self
192
+ end
193
+ alias :set :attr
194
+ alias :attribute :attr
195
+
196
+ ###
197
+ # Remove the attributed named +name+ from all Node objects in the NodeSet
198
+ def remove_attr name
199
+ each { |el| el.delete name }
200
+ self
201
+ end
202
+
203
+ ###
204
+ # Iterate over each node, yielding to +block+
205
+ def each(&block)
206
+ 0.upto(length - 1) do |x|
207
+ yield self[x]
208
+ end
209
+ end
210
+
211
+ ###
212
+ # Get the inner text of all contained Node objects
213
+ def inner_text
214
+ collect{|j| j.inner_text}.join('')
215
+ end
216
+ alias :text :inner_text
217
+
218
+ ###
219
+ # Get the inner html of all contained Node objects
220
+ def inner_html
221
+ collect{|j| j.inner_html}.join('')
222
+ end
223
+
224
+ ###
225
+ # Wrap this NodeSet with +html+ or the results of the builder in +blk+
226
+ def wrap(html, &blk)
227
+ each do |j|
228
+ new_parent = Nokogiri.make(html, &blk)
229
+ j.add_next_sibling(new_parent)
230
+ new_parent.add_child(j)
231
+ end
232
+ self
233
+ end
234
+
235
+ ###
236
+ # Convert this NodeSet to a string.
237
+ def to_s
238
+ map { |x| x.to_s }.join
239
+ end
240
+
241
+ ###
242
+ # Convert this NodeSet to HTML
243
+ def to_html *args
244
+ map { |x| x.to_html(*args) }.join
245
+ end
246
+
247
+ ###
248
+ # Convert this NodeSet to XHTML
249
+ def to_xhtml *args
250
+ map { |x| x.to_xhtml(*args) }.join
251
+ end
252
+
253
+ ###
254
+ # Convert this NodeSet to XML
255
+ def to_xml *args
256
+ map { |x| x.to_xml(*args) }.join
257
+ end
258
+
259
+ alias :size :length
260
+ alias :to_ary :to_a
261
+
262
+ ###
263
+ # Removes the last element from set and returns it, or +nil+ if
264
+ # the set is empty
265
+ def pop
266
+ return nil if length == 0
267
+ delete last
268
+ end
269
+
270
+ ###
271
+ # Returns the first element of the NodeSet and removes it. Returns
272
+ # +nil+ if the set is empty.
273
+ def shift
274
+ return nil if length == 0
275
+ delete first
276
+ end
277
+
278
+ ###
279
+ # Equality -- Two NodeSets are equal if the contain the same number
280
+ # of elements and if each element is equal to the corresponding
281
+ # element in the other NodeSet
282
+ def == other
283
+ return false unless other.is_a?(Nokogiri::XML::NodeSet)
284
+ return false unless length == other.length
285
+ each_with_index do |node, i|
286
+ return false unless node == other[i]
287
+ end
288
+ true
289
+ end
290
+
291
+ ###
292
+ # Returns a new NodeSet containing all the children of all the nodes in
293
+ # the NodeSet
294
+ def children
295
+ inject(NodeSet.new(document)) { |set, node| set += node.children }
296
+ end
297
+
298
+ ###
299
+ # Return a nicely formated string representation
300
+ def inspect
301
+ "[#{map { |c| c.inspect }.join ', '}]"
302
+ end
303
+
304
+ alias :+ :|
305
+ end
306
+ end
307
+ 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
@@ -0,0 +1,2 @@
1
+ require 'nokogiri/xml/pp/node'
2
+ require 'nokogiri/xml/pp/character_data'
@@ -0,0 +1,18 @@
1
+ module Nokogiri
2
+ module XML
3
+ module PP
4
+ module CharacterData
5
+ def pretty_print pp # :nodoc:
6
+ nice_name = self.class.name.split('::').last
7
+ pp.group(2, "#(#{nice_name} ", ')') do
8
+ pp.pp text
9
+ end
10
+ end
11
+
12
+ def inspect # :nodoc:
13
+ "#<#{self.class.name}:#{sprintf("0x%x",object_id)} #{text.inspect}>"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end