superfeedr-nokogiri 1.4.0.20091116183308

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 (270) hide show
  1. data/.autotest +27 -0
  2. data/CHANGELOG.ja.rdoc +330 -0
  3. data/CHANGELOG.rdoc +314 -0
  4. data/Manifest.txt +269 -0
  5. data/README.ja.rdoc +105 -0
  6. data/README.rdoc +118 -0
  7. data/Rakefile +244 -0
  8. data/bin/nokogiri +49 -0
  9. data/ext/nokogiri/extconf.rb +145 -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 +89 -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 +114 -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 +142 -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 +69 -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 +71 -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 +132 -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 +134 -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 +131 -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 +138 -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 +430 -0
@@ -0,0 +1,15 @@
1
+ module Nokogiri
2
+ # :stopdoc:
3
+ module LibXML
4
+ class XmlSaxPushParserContext < FFI::ManagedStruct
5
+
6
+ layout :dummy, :int, 0 # to avoid @layout warnings
7
+
8
+ def self.release ptr
9
+ LibXML.xmlFreeParserCtxt(ptr)
10
+ end
11
+ end
12
+
13
+ end
14
+ # :startdoc:
15
+ end
@@ -0,0 +1,13 @@
1
+ module Nokogiri
2
+ module LibXML # :nodoc:
3
+ class XmlSchema < FFI::ManagedStruct # :nodoc:
4
+
5
+ layout :dummy, :int, 0 # to avoid @layout warnings
6
+
7
+ def self.release ptr
8
+ LibXML.xmlSchemaFree(ptr)
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ module Nokogiri
2
+ module LibXML # :nodoc:
3
+ class XmlSyntaxError < FFI::ManagedStruct # :nodoc:
4
+
5
+ layout(
6
+ :domain, :int,
7
+ :code, :int,
8
+ :message, :pointer,
9
+ :level, :int,
10
+ :file, :string,
11
+ :line, :int,
12
+ :str1, :string,
13
+ :str2, :string,
14
+ :str3, :string,
15
+ :int1, :int,
16
+ :int2, :int,
17
+ :ctxt, :pointer,
18
+ :node, :pointer
19
+ )
20
+
21
+ def self.allocate
22
+ LibXML.calloc(1, LibXML::XmlSyntaxError.size)
23
+ end
24
+
25
+ def self.release(ptr)
26
+ LibXML.free(ptr)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,12 @@
1
+ module Nokogiri
2
+ module LibXML # :nodoc:
3
+ class XmlTextReader < FFI::ManagedStruct # :nodoc:
4
+
5
+ layout :dummy, :int # to avoid @layout warnings
6
+
7
+ def self.release ptr
8
+ LibXML.xmlFreeTextReader(ptr)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,37 @@
1
+ module Nokogiri
2
+ module LibXML # :nodoc:
3
+ module XmlXpathContextMixin # :nodoc:
4
+ def self.included(base)
5
+ base.class_eval do
6
+
7
+ layout(
8
+ :doc, :pointer,
9
+ :node, :pointer
10
+ )
11
+
12
+ end
13
+ end
14
+
15
+ def node
16
+ LibXML::XmlNode.new(self[:node])
17
+ end
18
+
19
+ def doc
20
+ LibXML::XmlDocumentCast.new(self[:doc])
21
+ end
22
+ end
23
+
24
+ class XmlXpathContext < FFI::ManagedStruct # :nodoc:
25
+ include XmlXpathContextMixin
26
+
27
+ def self.release ptr
28
+ LibXML.xmlXPathFreeContext(ptr)
29
+ end
30
+ end
31
+
32
+ class XmlXpathContextCast < FFI::Struct # :nodoc:
33
+ include XmlXpathContextMixin
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ module Nokogiri
2
+ module LibXML # :nodoc:
3
+
4
+ class XmlXpathObject < FFI::ManagedStruct # :nodoc:
5
+
6
+ XPATH_UNDEFINED = 0
7
+ XPATH_NODESET = 1
8
+ XPATH_BOOLEAN = 2
9
+ XPATH_NUMBER = 3
10
+ XPATH_STRING = 4
11
+ XPATH_POINT = 5
12
+ XPATH_RANGE = 6
13
+ XPATH_LOCATIONSET = 7
14
+ XPATH_USERS = 8
15
+ XPATH_XSLT_TREE = 9
16
+
17
+ layout(
18
+ :type, :int,
19
+ :nodesetval, :pointer,
20
+ :boolval, :int,
21
+ :floatval, :double,
22
+ :stringval, :string,
23
+ :user, :pointer,
24
+ :index, :int,
25
+ :user2, :pointer,
26
+ :index2, :int
27
+ )
28
+
29
+ def self.release ptr
30
+ LibXML.xmlXPathFreeNodeSetList(ptr) # despite the name, this frees the xpath but not the contained node set
31
+ end
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ module Nokogiri
2
+ module LibXML # :nodoc:
3
+
4
+ class XmlXpathParserContext < FFI::Struct # :nodoc:
5
+
6
+ layout(
7
+ :cur, :pointer,
8
+ :base, :pointer,
9
+ :error, :int,
10
+ :context, :pointer
11
+ )
12
+
13
+ def context
14
+ p = self[:context]
15
+ LibXML::XmlXpathContextCast.new(p)
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ module Nokogiri
2
+ module LibXML # :nodoc:
3
+ class XsltStylesheet < FFI::ManagedStruct # :nodoc:
4
+
5
+ layout :dummy, :int, 0 # to avoid @layout warnings
6
+
7
+ def self.release ptr
8
+ LibXML.xsltFreeStylesheet(ptr)
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,41 @@
1
+ module Nokogiri
2
+ module XML
3
+ class Attr < Node
4
+
5
+ def self.new(document, name, *rest) # :nodoc:
6
+ node_ptr = LibXML.xmlNewDocProp(document.cstruct, name.to_s, nil)
7
+ node_cstruct = LibXML::XmlNode.new(node_ptr)
8
+ node_cstruct.keep_reference_from_document!
9
+
10
+ node = Node.wrap(node_cstruct, self)
11
+ node.send :initialize, document, name, *rest
12
+ yield node if block_given?
13
+ node
14
+ end
15
+
16
+ def value=(content) # :nodoc:
17
+ unless cstruct[:children].null?
18
+ LibXML.xmlFreeNodeList(cstruct[:children])
19
+ end
20
+ cstruct[:children] = cstruct[:last] = nil
21
+ return unless content
22
+
23
+ char_ptr = LibXML.xmlEncodeEntitiesReentrant(cstruct[:doc], content)
24
+
25
+ cstruct[:children] = LibXML.xmlStringGetNodeList(cstruct[:doc], char_ptr)
26
+ child_cstruct = cstruct[:children]
27
+ while ! child_cstruct.null?
28
+ child = Node.wrap(child_cstruct)
29
+ child.cstruct[:parent] = cstruct
30
+ child.cstruct[:doc] = cstruct[:doc]
31
+ cstruct[:last] = child.cstruct
32
+ child_cstruct = child.cstruct[:next]
33
+ end
34
+ LibXML.xmlFree(char_ptr)
35
+
36
+ content
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,27 @@
1
+ module Nokogiri
2
+ module XML
3
+ # :stopdoc:
4
+ class AttributeDecl < Nokogiri::XML::Node
5
+ def enumeration
6
+ list = []
7
+ return list if cstruct[:tree].null?
8
+ head = LibXML::XmlEnumeration.new cstruct[:tree]
9
+ loop do
10
+ list << head[:name]
11
+ break if head[:next].null?
12
+ head = LibXML::XmlEnumeration.new head[:next]
13
+ end
14
+ list
15
+ end
16
+
17
+ def attribute_type
18
+ cstruct[:atype]
19
+ end
20
+
21
+ def default
22
+ cstruct[:default_value]
23
+ end
24
+ end
25
+ # :startdoc:
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ module Nokogiri
2
+ module XML
3
+ class CDATA < Text
4
+
5
+ def self.new(document, content, *rest) # :nodoc:
6
+ length = content.nil? ? 0 : content.length
7
+ node_ptr = LibXML.xmlNewCDataBlock(document.cstruct[:doc], content, length)
8
+ node_cstruct = LibXML::XmlNode.new(node_ptr)
9
+ node_cstruct.keep_reference_from_document!
10
+
11
+ node = Node.wrap(node_cstruct, self)
12
+ node.send :initialize, document, content, *rest
13
+ yield node if block_given?
14
+ node
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module Nokogiri
2
+ module XML
3
+ class Comment < CharacterData
4
+
5
+ def self.new(document, content, *rest) # :nodoc:
6
+ node_ptr = LibXML.xmlNewDocComment(document.cstruct, content)
7
+ node_cstruct = LibXML::XmlNode.new(node_ptr)
8
+ node_cstruct.keep_reference_from_document!
9
+
10
+ node = Node.wrap(node_ptr, self)
11
+ node.send :initialize, document, content, *rest
12
+ yield node if block_given?
13
+ node
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,135 @@
1
+ # :stopdoc:
2
+ module Nokogiri
3
+ module XML
4
+ class Document < Node
5
+
6
+ attr_accessor :cstruct
7
+
8
+ def url
9
+ cstruct[:URL]
10
+ end
11
+
12
+ def root= new_root
13
+ old_root = nil
14
+ if new_root.cstruct[:doc] != cstruct[:doc]
15
+ old_root_ptr = LibXML.xmlDocGetRootElement(cstruct)
16
+ new_root_ptr = LibXML.xmlDocCopyNode(new_root.cstruct, cstruct, 1)
17
+ raise RuntimeError "Could not reparent node (xmlDocCopyNode)" if new_root_ptr.null?
18
+ new_root = Node.wrap(new_root_ptr)
19
+ end
20
+ LibXML.xmlDocSetRootElement(cstruct, new_root.cstruct)
21
+ if old_root_ptr && ! old_root_ptr.null?
22
+ LibXML::XmlNode.new(old_root_ptr).keep_reference_from_document!
23
+ end
24
+ new_root
25
+ end
26
+
27
+ def root
28
+ ptr = LibXML.xmlDocGetRootElement(cstruct)
29
+ ptr.null? ? nil : Node.wrap(LibXML::XmlNode.new(ptr))
30
+ end
31
+
32
+ def encoding= encoding
33
+ # TODO: if :encoding is already set, then it's probably getting leaked.
34
+ cstruct[:encoding] = LibXML.xmlStrdup(encoding)
35
+ end
36
+
37
+ def encoding
38
+ ptr = cstruct[:encoding]
39
+ ptr.null? ? nil : ptr.read_string
40
+ end
41
+
42
+ def version
43
+ cstruct[:version]
44
+ end
45
+
46
+ def self.read_io io, url, encoding, options
47
+ wrap_with_error_handling do
48
+ LibXML.xmlReadIO(IoCallbacks.reader(io), nil, nil, url, encoding, options)
49
+ end
50
+ end
51
+
52
+ def self.read_memory(string, url, encoding, options)
53
+ wrap_with_error_handling do
54
+ LibXML.xmlReadMemory(string, string.length, url, encoding, options)
55
+ end
56
+ end
57
+
58
+ def dup deep = 1
59
+ dup_ptr = LibXML.xmlCopyDoc(cstruct, deep)
60
+ return nil if dup_ptr.null?
61
+
62
+ # xmlCopyDoc does not preserve document type. wtf?
63
+ cstruct = LibXML::XmlDocumentCast.new(dup_ptr)
64
+ cstruct[:type] = self.type
65
+
66
+ self.class.wrap(dup_ptr)
67
+ end
68
+
69
+ def remove_namespaces!
70
+ self.class.recursively_remove_namespaces_from_node(root)
71
+ end
72
+
73
+ class << self
74
+ def new(*args)
75
+ version = args.first || "1.0"
76
+ doc = wrap(LibXML.xmlNewDoc(version))
77
+ doc.send :initialize, *args
78
+ doc
79
+ end
80
+
81
+ def wrap doc_struct
82
+ if doc_struct.is_a?(FFI::Pointer)
83
+ # cast native pointers up into a doc cstruct
84
+ return nil if doc_struct.null?
85
+ doc_struct = LibXML::XmlDocument.new(doc_struct)
86
+ end
87
+
88
+ doc = self.allocate
89
+ doc.cstruct = doc_struct
90
+ doc.cstruct.ruby_doc = doc
91
+ doc.instance_eval { @decorators = nil; @node_cache = [] }
92
+ doc.send :initialize
93
+ doc
94
+ end
95
+ end
96
+
97
+ private
98
+
99
+ class << self
100
+ def wrap_with_error_handling(&block)
101
+ error_list = []
102
+ LibXML.xmlInitParser()
103
+ LibXML.xmlResetLastError()
104
+ LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(error_list))
105
+
106
+ ptr = yield
107
+
108
+ LibXML.xmlSetStructuredErrorFunc(nil, nil)
109
+
110
+ if ptr.null?
111
+ error = LibXML.xmlGetLastError()
112
+ if error
113
+ raise SyntaxError.wrap(error)
114
+ else
115
+ raise RuntimeError, "Could not parse document"
116
+ end
117
+ end
118
+
119
+ document = wrap(ptr)
120
+ document.errors = error_list
121
+ return document
122
+ end
123
+
124
+ def recursively_remove_namespaces_from_node(node)
125
+ node.cstruct[:ns] = nil
126
+ node.children.each do |child|
127
+ recursively_remove_namespaces_from_node(child)
128
+ end
129
+ end
130
+ end
131
+
132
+ end
133
+ end
134
+ end
135
+ # :startdoc:
@@ -0,0 +1,21 @@
1
+ module Nokogiri
2
+ module XML
3
+ class DocumentFragment < Node
4
+
5
+ def self.new(document, *rest) # :nodoc:
6
+ node_ptr = LibXML.xmlNewDocFragment(document.cstruct)
7
+ node_cstruct = LibXML::XmlNode.new(node_ptr)
8
+ node_cstruct.keep_reference_from_document!
9
+
10
+ node = Node.wrap(node_cstruct, self)
11
+
12
+ node.send :initialize, document, *rest
13
+ yield node if block_given?
14
+
15
+ node
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+