nokogiri 1.2.3 → 1.3.0

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 (200) hide show
  1. data/.autotest +14 -2
  2. data/CHANGELOG.ja.rdoc +38 -0
  3. data/CHANGELOG.rdoc +43 -0
  4. data/Manifest.txt +80 -5
  5. data/README.ja.rdoc +12 -11
  6. data/README.rdoc +4 -2
  7. data/Rakefile +103 -173
  8. data/bin/nokogiri +47 -0
  9. data/ext/nokogiri/extconf.rb +19 -13
  10. data/ext/nokogiri/html_document.c +39 -3
  11. data/ext/nokogiri/html_document.h +1 -1
  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.h +1 -1
  15. data/ext/nokogiri/html_sax_parser.h +1 -1
  16. data/ext/nokogiri/{native.c → nokogiri.c} +11 -3
  17. data/ext/nokogiri/{native.h → nokogiri.h} +18 -4
  18. data/ext/nokogiri/xml_attr.c +14 -5
  19. data/ext/nokogiri/xml_attr.h +1 -1
  20. data/ext/nokogiri/xml_cdata.c +15 -6
  21. data/ext/nokogiri/xml_cdata.h +1 -1
  22. data/ext/nokogiri/xml_comment.c +13 -4
  23. data/ext/nokogiri/xml_comment.h +1 -1
  24. data/ext/nokogiri/xml_document.c +50 -41
  25. data/ext/nokogiri/xml_document.h +1 -1
  26. data/ext/nokogiri/xml_document_fragment.c +12 -4
  27. data/ext/nokogiri/xml_document_fragment.h +1 -1
  28. data/ext/nokogiri/xml_dtd.c +1 -1
  29. data/ext/nokogiri/xml_dtd.h +1 -1
  30. data/ext/nokogiri/xml_entity_reference.c +13 -4
  31. data/ext/nokogiri/xml_entity_reference.h +1 -1
  32. data/ext/nokogiri/xml_io.h +1 -1
  33. data/ext/nokogiri/xml_namespace.c +69 -0
  34. data/ext/nokogiri/xml_namespace.h +12 -0
  35. data/ext/nokogiri/xml_node.c +232 -124
  36. data/ext/nokogiri/xml_node.h +3 -4
  37. data/ext/nokogiri/xml_node_set.c +206 -19
  38. data/ext/nokogiri/xml_node_set.h +1 -1
  39. data/ext/nokogiri/xml_processing_instruction.c +14 -4
  40. data/ext/nokogiri/xml_processing_instruction.h +1 -1
  41. data/ext/nokogiri/xml_reader.c +87 -7
  42. data/ext/nokogiri/xml_reader.h +1 -1
  43. data/ext/nokogiri/xml_relax_ng.c +106 -0
  44. data/ext/nokogiri/xml_relax_ng.h +9 -0
  45. data/ext/nokogiri/xml_sax_parser.c +122 -2
  46. data/ext/nokogiri/xml_sax_parser.h +1 -1
  47. data/ext/nokogiri/xml_sax_push_parser.c +1 -0
  48. data/ext/nokogiri/xml_sax_push_parser.h +1 -1
  49. data/ext/nokogiri/xml_schema.c +107 -0
  50. data/ext/nokogiri/xml_schema.h +9 -0
  51. data/ext/nokogiri/xml_syntax_error.h +1 -1
  52. data/ext/nokogiri/xml_text.c +10 -3
  53. data/ext/nokogiri/xml_text.h +1 -1
  54. data/ext/nokogiri/xml_xpath.h +1 -1
  55. data/ext/nokogiri/xml_xpath_context.h +1 -1
  56. data/ext/nokogiri/xslt_stylesheet.c +29 -16
  57. data/ext/nokogiri/xslt_stylesheet.h +1 -1
  58. data/lib/action-nokogiri.rb +7 -1
  59. data/lib/nokogiri.rb +21 -5
  60. data/lib/nokogiri/css/generated_parser.rb +49 -14
  61. data/lib/nokogiri/css/generated_tokenizer.rb +2 -2
  62. data/lib/nokogiri/css/node.rb +13 -3
  63. data/lib/nokogiri/css/parser.rb +8 -0
  64. data/lib/nokogiri/css/parser.y +7 -7
  65. data/lib/nokogiri/css/tokenizer.rb +2 -0
  66. data/lib/nokogiri/css/xpath_visitor.rb +10 -6
  67. data/lib/nokogiri/decorators/hpricot/node.rb +1 -1
  68. data/lib/nokogiri/decorators/hpricot/node_set.rb +2 -2
  69. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +2 -0
  70. data/lib/nokogiri/decorators/slop.rb +3 -1
  71. data/lib/nokogiri/ffi/html/document.rb +37 -0
  72. data/lib/nokogiri/ffi/html/element_description.rb +85 -0
  73. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  74. data/lib/nokogiri/ffi/html/sax/parser.rb +21 -0
  75. data/lib/nokogiri/ffi/io_callbacks.rb +32 -0
  76. data/lib/nokogiri/ffi/libxml.rb +314 -0
  77. data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
  78. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  79. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  80. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  81. data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
  82. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  83. data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
  84. data/lib/nokogiri/ffi/structs/xml_dtd.rb +26 -0
  85. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  86. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  87. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  88. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  89. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  90. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  91. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +14 -0
  92. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  93. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  94. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  95. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
  96. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  97. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  98. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  99. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  100. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  101. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  102. data/lib/nokogiri/ffi/xml/document.rb +107 -0
  103. data/lib/nokogiri/ffi/xml/document_fragment.rb +26 -0
  104. data/lib/nokogiri/ffi/xml/dtd.rb +42 -0
  105. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  106. data/lib/nokogiri/ffi/xml/namespace.rb +38 -0
  107. data/lib/nokogiri/ffi/xml/node.rb +380 -0
  108. data/lib/nokogiri/ffi/xml/node_set.rb +130 -0
  109. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  110. data/lib/nokogiri/ffi/xml/reader.rb +217 -0
  111. data/lib/nokogiri/ffi/xml/relax_ng.rb +51 -0
  112. data/lib/nokogiri/ffi/xml/sax/parser.rb +148 -0
  113. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +38 -0
  114. data/lib/nokogiri/ffi/xml/schema.rb +55 -0
  115. data/lib/nokogiri/ffi/xml/syntax_error.rb +76 -0
  116. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  117. data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
  118. data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
  119. data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
  120. data/lib/nokogiri/hpricot.rb +14 -3
  121. data/lib/nokogiri/html.rb +11 -46
  122. data/lib/nokogiri/html/builder.rb +27 -1
  123. data/lib/nokogiri/html/document.rb +62 -6
  124. data/lib/nokogiri/html/document_fragment.rb +15 -0
  125. data/lib/nokogiri/html/element_description.rb +23 -0
  126. data/lib/nokogiri/html/entity_lookup.rb +2 -0
  127. data/lib/nokogiri/html/sax/parser.rb +27 -1
  128. data/lib/nokogiri/version.rb +26 -1
  129. data/lib/nokogiri/version_warning.rb +11 -0
  130. data/lib/nokogiri/xml.rb +25 -51
  131. data/lib/nokogiri/xml/builder.rb +166 -10
  132. data/lib/nokogiri/xml/cdata.rb +3 -1
  133. data/lib/nokogiri/xml/document.rb +39 -6
  134. data/lib/nokogiri/xml/document_fragment.rb +41 -1
  135. data/lib/nokogiri/xml/dtd.rb +3 -1
  136. data/lib/nokogiri/xml/entity_declaration.rb +3 -1
  137. data/lib/nokogiri/xml/fragment_handler.rb +24 -3
  138. data/lib/nokogiri/xml/namespace.rb +7 -0
  139. data/lib/nokogiri/xml/node.rb +314 -65
  140. data/lib/nokogiri/xml/node/save_options.rb +12 -2
  141. data/lib/nokogiri/xml/node_set.rb +58 -8
  142. data/lib/nokogiri/xml/parse_options.rb +80 -0
  143. data/lib/nokogiri/xml/processing_instruction.rb +2 -0
  144. data/lib/nokogiri/xml/reader.rb +42 -3
  145. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  146. data/lib/nokogiri/xml/sax.rb +0 -7
  147. data/lib/nokogiri/xml/sax/document.rb +84 -0
  148. data/lib/nokogiri/xml/sax/parser.rb +38 -2
  149. data/lib/nokogiri/xml/sax/push_parser.rb +12 -0
  150. data/lib/nokogiri/xml/schema.rb +65 -0
  151. data/lib/nokogiri/xml/syntax_error.rb +11 -0
  152. data/lib/nokogiri/xml/xpath.rb +1 -1
  153. data/lib/nokogiri/xml/xpath_context.rb +2 -0
  154. data/lib/nokogiri/xslt.rb +21 -1
  155. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  156. data/lib/xsd/xmlparser/nokogiri.rb +12 -2
  157. data/tasks/test.rb +42 -19
  158. data/test/css/test_parser.rb +29 -0
  159. data/test/ffi/test_document.rb +35 -0
  160. data/test/files/address_book.rlx +12 -0
  161. data/test/files/address_book.xml +10 -0
  162. data/test/files/po.xml +32 -0
  163. data/test/files/po.xsd +66 -0
  164. data/test/helper.rb +38 -8
  165. data/test/html/sax/test_parser.rb +12 -0
  166. data/test/html/test_builder.rb +25 -2
  167. data/test/html/test_document.rb +91 -20
  168. data/test/html/test_document_fragment.rb +97 -0
  169. data/test/html/test_element_description.rb +95 -0
  170. data/test/html/test_node.rb +66 -3
  171. data/test/test_convert_xpath.rb +1 -1
  172. data/test/test_memory_leak.rb +57 -18
  173. data/test/test_nokogiri.rb +24 -2
  174. data/test/test_reader.rb +77 -0
  175. data/test/test_xslt_transforms.rb +120 -82
  176. data/test/xml/node/test_subclass.rb +44 -0
  177. data/test/xml/sax/test_parser.rb +9 -0
  178. data/test/xml/sax/test_push_parser.rb +24 -0
  179. data/test/xml/test_attr.rb +7 -0
  180. data/test/xml/test_builder.rb +48 -0
  181. data/test/xml/test_cdata.rb +19 -0
  182. data/test/xml/test_comment.rb +6 -0
  183. data/test/xml/test_document.rb +101 -2
  184. data/test/xml/test_document_fragment.rb +55 -3
  185. data/test/xml/test_entity_reference.rb +4 -0
  186. data/test/xml/test_namespace.rb +43 -0
  187. data/test/xml/test_node.rb +255 -8
  188. data/test/xml/test_node_attributes.rb +34 -0
  189. data/test/xml/test_node_encoding.rb +9 -2
  190. data/test/xml/test_node_set.rb +197 -1
  191. data/test/xml/test_parse_options.rb +52 -0
  192. data/test/xml/test_processing_instruction.rb +5 -0
  193. data/test/xml/test_relax_ng.rb +60 -0
  194. data/test/xml/test_schema.rb +65 -0
  195. data/test/xml/test_text.rb +5 -0
  196. data/test/xml/test_unparented_node.rb +3 -3
  197. metadata +128 -12
  198. data/lib/nokogiri/xml/comment.rb +0 -6
  199. data/lib/nokogiri/xml/element.rb +0 -6
  200. data/lib/nokogiri/xml/text.rb +0 -6
@@ -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, :string,
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,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 < Node
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,107 @@
1
+ module Nokogiri
2
+ module XML
3
+ class Document < Node
4
+
5
+ attr_accessor :cstruct # :nodoc:
6
+
7
+ def url # :nodoc:
8
+ cstruct[:URL]
9
+ end
10
+
11
+ def root=(node) # :nodoc:
12
+ LibXML.xmlDocSetRootElement(cstruct, node.cstruct)
13
+ node
14
+ end
15
+
16
+ def root # :nodoc:
17
+ ptr = LibXML.xmlDocGetRootElement(cstruct)
18
+ ptr.null? ? nil : Node.wrap(LibXML::XmlNode.new(ptr))
19
+ end
20
+
21
+ def encoding=(encoding) # :nodoc:
22
+ # TODO: if :encoding is already set, then it's probably getting leaked.
23
+ cstruct[:encoding] = LibXML.xmlStrdup(encoding)
24
+ end
25
+
26
+ def encoding # :nodoc:
27
+ cstruct[:encoding].read_string
28
+ end
29
+
30
+ def self.read_io(io, url, encoding, options) # :nodoc:
31
+ wrap_with_error_handling do
32
+ LibXML.xmlReadIO(IoCallbacks.reader(io), nil, nil, url, encoding, options)
33
+ end
34
+ end
35
+
36
+ def self.read_memory(string, url, encoding, options) # :nodoc:
37
+ wrap_with_error_handling do
38
+ LibXML.xmlReadMemory(string, string.length, url, encoding, options)
39
+ end
40
+ end
41
+
42
+ def dup(deep = 1) # :nodoc:
43
+ dup_ptr = LibXML.xmlCopyDoc(cstruct, deep)
44
+ return nil if dup_ptr.null?
45
+
46
+ # xmlCopyDoc does not preserve document type. wtf?
47
+ cstruct = LibXML::XmlDocumentCast.new(dup_ptr)
48
+ cstruct[:type] = self.type
49
+
50
+ self.class.wrap(dup_ptr)
51
+ end
52
+
53
+ class << self
54
+ def new(*args) # :nodoc:
55
+ version = args.first || "1.0"
56
+ doc = wrap(LibXML.xmlNewDoc(version))
57
+ doc.send :initialize, *args
58
+ doc
59
+ end
60
+
61
+ def wrap(doc_struct) # :nodoc: #
62
+ if doc_struct.is_a?(FFI::Pointer)
63
+ # cast native pointers up into a doc cstruct
64
+ return nil if doc_struct.null?
65
+ doc_struct = LibXML::XmlDocument.new(doc_struct)
66
+ end
67
+
68
+ doc = self.allocate
69
+ doc.cstruct = doc_struct
70
+ doc.cstruct.ruby_doc = doc
71
+ doc.instance_eval { @decorators = nil; @node_cache = [] }
72
+ doc.send :initialize
73
+ doc
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ class << self
80
+ def wrap_with_error_handling(&block) # :nodoc:
81
+ error_list = []
82
+ LibXML.xmlInitParser()
83
+ LibXML.xmlResetLastError()
84
+ LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(error_list))
85
+
86
+ ptr = yield
87
+
88
+ LibXML.xmlSetStructuredErrorFunc(nil, nil)
89
+
90
+ if ptr.null?
91
+ error = LibXML.xmlGetLastError()
92
+ if error
93
+ raise SyntaxError.wrap(error)
94
+ else
95
+ raise RuntimeError, "Could not parse document"
96
+ end
97
+ end
98
+
99
+ document = wrap(ptr)
100
+ document.errors = error_list
101
+ return document
102
+ end
103
+ end
104
+
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,26 @@
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
+ if node.document.child && node.document.child.node_type == ELEMENT_NODE
13
+ # TODO: node_type check should be ported into master, because of e.g. DTD nodes
14
+ node.cstruct[:ns] = node.document.children.first.cstruct[:ns]
15
+ end
16
+
17
+ node.send :initialize, document, *rest
18
+ yield node if block_given?
19
+
20
+ node
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,42 @@
1
+ module Nokogiri
2
+ module XML
3
+ class DTD < Node
4
+
5
+ def elements # :nodoc:
6
+ internal_attributes :elements
7
+ end
8
+
9
+ def entities # :nodoc:
10
+ internal_attributes :entities
11
+ end
12
+
13
+ def notations # :nodoc:
14
+ attr_ptr = cstruct[:notations]
15
+ return nil if attr_ptr.null?
16
+
17
+ ahash = {}
18
+ proc = lambda do |payload, data, name|
19
+ notation_cstruct = LibXML::XmlNotation.new(payload)
20
+ ahash[name] = Notation.new(notation_cstruct[:name], notation_cstruct[:PublicID],
21
+ notation_cstruct[:SystemID])
22
+ end
23
+ LibXML.xmlHashScan(attr_ptr, proc, nil)
24
+ ahash
25
+ end
26
+
27
+ private
28
+ def internal_attributes(attr_name) # :nodoc:
29
+ attr_ptr = cstruct[attr_name.to_sym]
30
+ return nil if attr_ptr.null?
31
+
32
+ ahash = {}
33
+ proc = lambda do |payload, data, name|
34
+ ahash[name] = Node.wrap(payload)
35
+ end
36
+ LibXML.xmlHashScan(attr_ptr, proc, nil)
37
+ ahash
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,19 @@
1
+ module Nokogiri
2
+ module XML
3
+ class EntityReference < Node
4
+
5
+ def self.new(document, name, *rest) # :nodoc:
6
+ node_ptr = LibXML.xmlNewReference(document.cstruct, name)
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
+ end
17
+ end
18
+ end
19
+