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,55 @@
1
+ module Nokogiri
2
+ module XML
3
+ class Schema
4
+
5
+ attr_accessor :cstruct # :nodoc:
6
+
7
+ def validate_document(document) # :nodoc:
8
+ errors = []
9
+
10
+ ctx = LibXML.xmlSchemaNewValidCtxt(cstruct)
11
+ raise RuntimeError.new("Could not create a validation context") if ctx.null?
12
+
13
+ LibXML.xmlSchemaSetValidStructuredErrors(ctx,
14
+ SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
15
+
16
+ LibXML.xmlSchemaValidateDoc(ctx, document.cstruct)
17
+
18
+ LibXML.xmlSchemaFreeValidCtxt(ctx)
19
+
20
+ errors
21
+ end
22
+ private :validate_document
23
+
24
+ def self.read_memory(content) # :nodoc:
25
+ ctx = LibXML.xmlSchemaNewMemParserCtxt(content, content.length)
26
+
27
+ errors = []
28
+
29
+ LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(errors))
30
+ LibXML.xmlSchemaSetParserStructuredErrors(ctx, SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
31
+
32
+ schema_ptr = LibXML.xmlSchemaParse(ctx)
33
+
34
+ LibXML.xmlSetStructuredErrorFunc(nil, nil)
35
+ LibXML.xmlSchemaFreeParserCtxt(ctx)
36
+
37
+ if schema_ptr.null?
38
+ error = LibXML.xmlGetLastError
39
+ if error
40
+ raise SyntaxError.wrap(error)
41
+ else
42
+ raise RuntimeError, "Could not parse document"
43
+ end
44
+ end
45
+
46
+ schema = allocate
47
+ schema.cstruct = LibXML::XmlSchema.new schema_ptr
48
+ schema.errors = errors
49
+ schema
50
+ end
51
+
52
+ end
53
+ end
54
+ end
55
+
@@ -0,0 +1,76 @@
1
+ module Nokogiri
2
+ module XML
3
+ class SyntaxError < ::Nokogiri::SyntaxError
4
+
5
+ attr_accessor :cstruct # :nodoc:
6
+
7
+ def domain # :nodoc:
8
+ cstruct[:domain]
9
+ end
10
+
11
+ def code # :nodoc:
12
+ cstruct[:code]
13
+ end
14
+
15
+ def message # :nodoc:
16
+ cstruct[:message]
17
+ end
18
+ undef_method :inspect
19
+ alias_method :inspect, :message
20
+ undef_method :to_s
21
+ alias_method :to_s, :message
22
+
23
+ def level # :nodoc:
24
+ cstruct[:level]
25
+ end
26
+
27
+ def file # :nodoc:
28
+ cstruct[:file].null? ? nil : cstruct[:file]
29
+ end
30
+
31
+ def line # :nodoc:
32
+ cstruct[:line]
33
+ end
34
+
35
+ def str1 # :nodoc:
36
+ cstruct[:str1].null? ? nil : cstruct[:str1]
37
+ end
38
+
39
+ def str2 # :nodoc:
40
+ cstruct[:str].null? ? nil : cstruct[:str]
41
+ end
42
+
43
+ def str3 # :nodoc:
44
+ cstruct[:str3].null? ? nil : cstruct[:str3]
45
+ end
46
+
47
+ def int1 # :nodoc:
48
+ cstruct[:int1]
49
+ end
50
+
51
+ def column # :nodoc:
52
+ cstruct[:int2]
53
+ end
54
+ alias_method :int2, :column
55
+
56
+ class << self
57
+ def error_array_pusher(array) # :nodoc:
58
+ Proc.new do |_ignored_, error|
59
+ array << wrap(error) if array
60
+ end
61
+ end
62
+
63
+ def wrap(error_ptr) # :nodoc:
64
+ error_struct = LibXML::XmlSyntaxError.allocate
65
+ LibXML.xmlCopyError(error_ptr, error_struct)
66
+ error_cstruct = LibXML::XmlSyntaxError.new(error_struct)
67
+ error = self.new # will generate XML::XPath::SyntaxError or XML::SyntaxError
68
+ error.cstruct = error_cstruct
69
+ error
70
+ end
71
+ end
72
+
73
+ end
74
+ end
75
+
76
+ end
@@ -0,0 +1,18 @@
1
+ module Nokogiri
2
+ module XML
3
+ class Text < Node
4
+
5
+ def self.new(string, document, *rest) # :nodoc:
6
+ node_ptr = LibXML.xmlNewText(string)
7
+ node_cstruct = LibXML::XmlNode.new(node_ptr)
8
+ node_cstruct[:doc] = document.cstruct
9
+
10
+ node = Node.wrap(node_cstruct, self)
11
+ node.send :initialize, string, document, *rest
12
+ yield node if block_given?
13
+ node
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ module Nokogiri
2
+ module XML
3
+ class XPath
4
+
5
+ attr_accessor :cstruct # :nodoc:
6
+
7
+ def node_set # :nodoc:
8
+ ptr = cstruct[:nodesetval] if cstruct[:nodesetval]
9
+ ptr = LibXML.xmlXPathNodeSetCreate(nil) if ptr.null?
10
+
11
+ set = XML::NodeSet.new(@document)
12
+ set.cstruct = LibXML::XmlNodeSet.new(ptr)
13
+ set.document = @document
14
+ set
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,135 @@
1
+ module Nokogiri
2
+ module XML
3
+ class XPathContext
4
+
5
+ attr_accessor :cstruct # :nodoc:
6
+
7
+ def register_ns(prefix, uri) # :nodoc:
8
+ LibXML.xmlXPathRegisterNs(cstruct, prefix, uri)
9
+ end
10
+
11
+ def evaluate(search_path, xpath_handler=nil) # :nodoc:
12
+ lookup = nil # to keep lambda in scope long enough to avoid a possible GC tragedy
13
+ query = search_path.to_s
14
+
15
+ if xpath_handler
16
+ lookup = lambda do |ctx, name, uri|
17
+ return nil unless xpath_handler.respond_to?(name)
18
+ ruby_funcall name, xpath_handler
19
+ end
20
+ LibXML.xmlXPathRegisterFuncLookup(cstruct, lookup, nil);
21
+ end
22
+
23
+ exception_handler = lambda do |ctx, error|
24
+ raise XPath::SyntaxError.wrap(error)
25
+ end
26
+ LibXML.xmlResetLastError()
27
+ LibXML.xmlSetStructuredErrorFunc(nil, exception_handler)
28
+
29
+ generic_exception_handler = lambda do |ctx, msg|
30
+ raise RuntimeError.new(msg) # TODO: varargs
31
+ end
32
+ LibXML.xmlSetGenericErrorFunc(nil, generic_exception_handler)
33
+
34
+ xpath_ptr = LibXML.xmlXPathEvalExpression(query, cstruct)
35
+
36
+ LibXML.xmlSetStructuredErrorFunc(nil, nil)
37
+ LibXML.xmlSetGenericErrorFunc(nil, nil)
38
+
39
+ if xpath_ptr.null?
40
+ error = LibXML.xmlGetLastError()
41
+ raise XPath::SyntaxError.wrap(error)
42
+ end
43
+
44
+ xpath = XML::XPath.new
45
+ xpath.cstruct = LibXML::XmlXpathObject.new(xpath_ptr)
46
+ xpath.document = cstruct[:doc]
47
+ xpath
48
+ end
49
+
50
+ def self.new(node) # :nodoc:
51
+ LibXML.xmlXPathInit()
52
+
53
+ ptr = LibXML.xmlXPathNewContext(node.cstruct[:doc])
54
+
55
+ ctx = allocate
56
+ ctx.cstruct = LibXML::XmlXpathContext.new(ptr)
57
+ ctx.cstruct[:node] = node.cstruct
58
+ ctx
59
+ end
60
+
61
+ private
62
+
63
+ #
64
+ # returns a lambda that will call the handler function with marshalled parameters
65
+ #
66
+ def ruby_funcall(name, xpath_handler) # :nodoc:
67
+ lambda do |ctx, nargs|
68
+ parser_context = LibXML::XmlXpathParserContext.new(ctx)
69
+ context = parser_context.context
70
+ doc = context.doc.ruby_doc
71
+
72
+ params = []
73
+
74
+ nargs.times do |j|
75
+ obj = LibXML::XmlXpathObject.new(LibXML.valuePop(ctx))
76
+ case obj[:type]
77
+ when LibXML::XmlXpathObject::XPATH_STRING
78
+ params.unshift obj[:stringval]
79
+ when LibXML::XmlXpathObject::XPATH_BOOLEAN
80
+ params.unshift obj[:boolval] == 1
81
+ when LibXML::XmlXpathObject::XPATH_NUMBER
82
+ params.unshift obj[:floatval]
83
+ when LibXML::XmlXpathObject::XPATH_NODESET
84
+ ns_ptr = LibXML::XmlNodeSet.new(obj[:nodesetval])
85
+ set = NodeSet.allocate
86
+ set.cstruct = ns_ptr
87
+ params.unshift set
88
+ else
89
+ char_ptr = params.unshift LibXML.xmlXPathCastToString(obj)
90
+ string = char_ptr.read_string
91
+ LibXML.xmlFree(char_ptr)
92
+ string
93
+ end
94
+ end
95
+
96
+ result = xpath_handler.send(name, *params)
97
+
98
+ case result.class.to_s
99
+ when Fixnum.to_s, Float.to_s, Bignum.to_s
100
+ LibXML.xmlXPathReturnNumber(ctx, result)
101
+ when String.to_s
102
+ LibXML.xmlXPathReturnString(
103
+ ctx,
104
+ LibXML.xmlXPathWrapCString(result)
105
+ )
106
+ when TrueClass.to_s
107
+ LibXML.xmlXPathReturnTrue(ctx)
108
+ when FalseClass.to_s
109
+ LibXML.xmlXPathReturnFalse(ctx)
110
+ when NilClass.to_s
111
+ ;
112
+ when Array.to_s
113
+ node_set = XML::NodeSet.new(doc, result)
114
+ LibXML.xmlXPathReturnNodeSet(
115
+ ctx,
116
+ LibXML.xmlXPathNodeSetMerge(nil, node_set.cstruct)
117
+ )
118
+ else
119
+ if result.is_a?(XML::NodeSet)
120
+ LibXML.xmlXPathReturnNodeSet(
121
+ ctx,
122
+ LibXML.xmlXPathNodeSetMerge(nil, result.cstruct)
123
+ )
124
+ else
125
+ raise RuntimeError.new("Invalid return type #{result.class.inspect}")
126
+ end
127
+ end
128
+
129
+ nil
130
+ end # lambda
131
+ end # ruby_funcall
132
+
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,47 @@
1
+ module Nokogiri
2
+ module XSLT
3
+ class Stylesheet
4
+
5
+ attr_accessor :cstruct # :nodoc:
6
+
7
+ def self.parse_stylesheet_doc(document) # :nodoc:
8
+ LibXML.exsltRegisterAll
9
+
10
+ generic_exception_handler = lambda do |ctx, msg|
11
+ raise RuntimeError.new(msg) # TODO: varargs
12
+ end
13
+ LibXML.xsltSetGenericErrorFunc(nil, generic_exception_handler)
14
+
15
+ ss = LibXML.xsltParseStylesheetDoc(LibXML.xmlCopyDoc(document.cstruct, 1)) # 1 => recursive
16
+
17
+ LibXML.xsltSetGenericErrorFunc(nil, nil)
18
+
19
+ obj = allocate
20
+ obj.cstruct = LibXML::XsltStylesheet.new(ss)
21
+ obj
22
+ end
23
+
24
+ def serialize(document) # :nodoc:
25
+ buf_ptr = FFI::MemoryPointer.new :pointer
26
+ buf_len = FFI::MemoryPointer.new :int
27
+ LibXML.xsltSaveResultToString(buf_ptr, buf_len, document.cstruct, cstruct)
28
+ buf = Nokogiri::LibXML::XmlAlloc.new(buf_ptr.read_pointer)
29
+ buf.pointer.read_string(buf_len.read_int)
30
+ end
31
+
32
+ def transform(document, params=[]) # :nodoc:
33
+ param_arr = FFI::MemoryPointer.new(:pointer, params.length + 1)
34
+ params.each_with_index do |param, j|
35
+ param_arr[j].put_pointer(0, FFI::MemoryPointer.from_string(param.to_s))
36
+ end
37
+ param_arr[params.length].put_pointer(0,nil)
38
+
39
+ ptr = LibXML.xsltApplyStylesheet(cstruct, document.cstruct, param_arr)
40
+ raise(RuntimeError, "could not perform xslt transform on document") if ptr.null?
41
+
42
+ XML::Document.wrap(ptr)
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -2,25 +2,32 @@ require 'nokogiri'
2
2
 
3
3
  module Nokogiri
4
4
  module Hpricot
5
+ # STag compatibility proxy
5
6
  STag = String
7
+ # Elem compatibility proxy
6
8
  Elem = XML::Node
9
+ # NamedCharacters compatibility proxy
7
10
  NamedCharacters = Nokogiri::HTML::NamedCharacters
8
11
  class << self
12
+ # parse proxy
9
13
  def parse(*args)
10
14
  doc = Nokogiri.parse(*args)
11
15
  add_decorators(doc)
12
16
  end
13
17
 
18
+ # XML proxy
14
19
  def XML(string)
15
- doc = Nokogiri::XML.parse(string)
20
+ doc = Nokogiri::XML::Document.parse(string)
16
21
  add_decorators(doc)
17
22
  end
18
23
 
24
+ # HTML proxy
19
25
  def HTML(string)
20
- doc = Nokogiri::HTML.parse(string)
26
+ doc = Nokogiri::HTML::Document.parse(string)
21
27
  add_decorators(doc)
22
28
  end
23
29
 
30
+ # make proxy
24
31
  def make string
25
32
  doc = XML::Document.new
26
33
  ns = XML::NodeSet.new(doc)
@@ -28,6 +35,7 @@ module Nokogiri
28
35
  ns
29
36
  end
30
37
 
38
+ # Add compatibility decorators
31
39
  def add_decorators(doc)
32
40
  doc.decorators(XML::Node) << Decorators::Hpricot::Node
33
41
  doc.decorators(XML::NodeSet) << Decorators::Hpricot::NodeSet
@@ -36,8 +44,11 @@ module Nokogiri
36
44
  end
37
45
  end
38
46
  end
39
-
47
+
40
48
  class << self
49
+ ###
50
+ # Parse a document and apply the Hpricot decorators for Hpricot
51
+ # compatibility mode.
41
52
  def Hpricot(*args, &block)
42
53
  if block_given?
43
54
  builder = Nokogiri::HTML::Builder.new(&block)
@@ -1,69 +1,34 @@
1
1
  require 'nokogiri/html/entity_lookup'
2
2
  require 'nokogiri/html/document'
3
+ require 'nokogiri/html/document_fragment'
3
4
  require 'nokogiri/html/sax/parser'
5
+ require 'nokogiri/html/element_description'
4
6
 
5
7
  module Nokogiri
6
8
  class << self
7
9
  ###
8
- # Parse HTML. +thing+ may be a String, or any object that
9
- # responds to _read_ and _close_ such as an IO, or StringIO.
10
- # +url+ is resource where this document is located. +encoding+ is the
11
- # encoding that should be used when processing the document. +options+
12
- # is a number that sets options in the parser, such as
13
- # Nokogiri::XML::PARSE_RECOVER. See the constants in
14
- # Nokogiri::XML.
15
- def HTML thing, url = nil, encoding = nil, options = 2145
16
- Nokogiri::HTML.parse(thing, url, encoding, options)
10
+ # Parse HTML. Convenience method for Nokogiri::HTML::Document.parse
11
+ def HTML thing, url = nil, encoding = nil, options = 2145, &block
12
+ Nokogiri::HTML::Document.parse(thing, url, encoding, options, &block)
17
13
  end
18
14
  end
19
15
 
20
16
  module HTML
21
- # Parser options
22
- PARSE_NOERROR = 1 << 5 # No error reports
23
- PARSE_NOWARNING = 1 << 6 # No warnings
24
- PARSE_PEDANTIC = 1 << 7 # Pedantic errors
25
- PARSE_NOBLANKS = 1 << 8 # Remove blanks nodes
26
- PARSE_NONET = 1 << 11 # No network access
27
-
28
17
  class << self
29
18
  ###
30
- # Parse HTML. See Nokogiri.HTML.
31
- def parse string_or_io, url = nil, encoding = nil, options = 2145
32
- if string_or_io.respond_to?(:encoding)
33
- encoding ||= string_or_io.encoding.name
34
- end
35
-
36
- if string_or_io.respond_to?(:read)
37
- url ||= string_or_io.respond_to?(:path) ? string_or_io.path : nil
38
- return Document.read_io(string_or_io, url, encoding, options)
39
- end
40
-
41
- return Document.new if(string_or_io.length == 0)
42
- Document.read_memory(string_or_io, url, encoding, options)
19
+ # Parse HTML. Convenience method for Nokogiri::HTML::Document.parse
20
+ def parse thing, url = nil, encoding = nil, options = 2145, &block
21
+ Document.parse(thing, url, encoding, options, &block)
43
22
  end
44
23
 
45
24
  ####
46
25
  # Parse a fragment from +string+ in to a NodeSet.
47
26
  def fragment string
48
- doc = parse(string)
49
- fragment = XML::DocumentFragment.new(doc)
50
- finder = lambda { |c, f|
51
- c.each do |child|
52
- if string == child.content && child.name == 'text'
53
- fragment.add_child(child)
54
- end
55
- fragment.add_child(child) if string =~ /<#{child.name}/
56
- end
57
- return fragment if fragment.children.length > 0
58
-
59
- c.each do |child|
60
- finder.call(child.children, f)
61
- end
62
- }
63
- finder.call(doc.children, finder)
64
- fragment
27
+ HTML::DocumentFragment.parse(string)
65
28
  end
66
29
  end
30
+
31
+ # Instance of Nokogiri::HTML::EntityLookup
67
32
  NamedCharacters = EntityLookup.new
68
33
  end
69
34
  end