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.
- data/.autotest +14 -2
- data/CHANGELOG.ja.rdoc +38 -0
- data/CHANGELOG.rdoc +43 -0
- data/Manifest.txt +80 -5
- data/README.ja.rdoc +12 -11
- data/README.rdoc +4 -2
- data/Rakefile +103 -173
- data/bin/nokogiri +47 -0
- data/ext/nokogiri/extconf.rb +19 -13
- data/ext/nokogiri/html_document.c +39 -3
- data/ext/nokogiri/html_document.h +1 -1
- data/ext/nokogiri/html_element_description.c +272 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.h +1 -1
- data/ext/nokogiri/html_sax_parser.h +1 -1
- data/ext/nokogiri/{native.c → nokogiri.c} +11 -3
- data/ext/nokogiri/{native.h → nokogiri.h} +18 -4
- data/ext/nokogiri/xml_attr.c +14 -5
- data/ext/nokogiri/xml_attr.h +1 -1
- data/ext/nokogiri/xml_cdata.c +15 -6
- data/ext/nokogiri/xml_cdata.h +1 -1
- data/ext/nokogiri/xml_comment.c +13 -4
- data/ext/nokogiri/xml_comment.h +1 -1
- data/ext/nokogiri/xml_document.c +50 -41
- data/ext/nokogiri/xml_document.h +1 -1
- data/ext/nokogiri/xml_document_fragment.c +12 -4
- data/ext/nokogiri/xml_document_fragment.h +1 -1
- data/ext/nokogiri/xml_dtd.c +1 -1
- data/ext/nokogiri/xml_dtd.h +1 -1
- data/ext/nokogiri/xml_entity_reference.c +13 -4
- data/ext/nokogiri/xml_entity_reference.h +1 -1
- data/ext/nokogiri/xml_io.h +1 -1
- data/ext/nokogiri/xml_namespace.c +69 -0
- data/ext/nokogiri/xml_namespace.h +12 -0
- data/ext/nokogiri/xml_node.c +232 -124
- data/ext/nokogiri/xml_node.h +3 -4
- data/ext/nokogiri/xml_node_set.c +206 -19
- data/ext/nokogiri/xml_node_set.h +1 -1
- data/ext/nokogiri/xml_processing_instruction.c +14 -4
- data/ext/nokogiri/xml_processing_instruction.h +1 -1
- data/ext/nokogiri/xml_reader.c +87 -7
- data/ext/nokogiri/xml_reader.h +1 -1
- data/ext/nokogiri/xml_relax_ng.c +106 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +122 -2
- data/ext/nokogiri/xml_sax_parser.h +1 -1
- data/ext/nokogiri/xml_sax_push_parser.c +1 -0
- data/ext/nokogiri/xml_sax_push_parser.h +1 -1
- data/ext/nokogiri/xml_schema.c +107 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.h +1 -1
- data/ext/nokogiri/xml_text.c +10 -3
- data/ext/nokogiri/xml_text.h +1 -1
- data/ext/nokogiri/xml_xpath.h +1 -1
- data/ext/nokogiri/xml_xpath_context.h +1 -1
- data/ext/nokogiri/xslt_stylesheet.c +29 -16
- data/ext/nokogiri/xslt_stylesheet.h +1 -1
- data/lib/action-nokogiri.rb +7 -1
- data/lib/nokogiri.rb +21 -5
- data/lib/nokogiri/css/generated_parser.rb +49 -14
- data/lib/nokogiri/css/generated_tokenizer.rb +2 -2
- data/lib/nokogiri/css/node.rb +13 -3
- data/lib/nokogiri/css/parser.rb +8 -0
- data/lib/nokogiri/css/parser.y +7 -7
- data/lib/nokogiri/css/tokenizer.rb +2 -0
- data/lib/nokogiri/css/xpath_visitor.rb +10 -6
- data/lib/nokogiri/decorators/hpricot/node.rb +1 -1
- data/lib/nokogiri/decorators/hpricot/node_set.rb +2 -2
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +2 -0
- data/lib/nokogiri/decorators/slop.rb +3 -1
- data/lib/nokogiri/ffi/html/document.rb +37 -0
- data/lib/nokogiri/ffi/html/element_description.rb +85 -0
- data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
- data/lib/nokogiri/ffi/html/sax/parser.rb +21 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +32 -0
- data/lib/nokogiri/ffi/libxml.rb +314 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
- data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
- data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +26 -0
- data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
- data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
- data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
- data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
- data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
- data/lib/nokogiri/ffi/xml/attr.rb +41 -0
- data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
- data/lib/nokogiri/ffi/xml/comment.rb +18 -0
- data/lib/nokogiri/ffi/xml/document.rb +107 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +26 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +42 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +38 -0
- data/lib/nokogiri/ffi/xml/node.rb +380 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +130 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +217 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +51 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +148 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +38 -0
- data/lib/nokogiri/ffi/xml/schema.rb +55 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +76 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
- data/lib/nokogiri/hpricot.rb +14 -3
- data/lib/nokogiri/html.rb +11 -46
- data/lib/nokogiri/html/builder.rb +27 -1
- data/lib/nokogiri/html/document.rb +62 -6
- data/lib/nokogiri/html/document_fragment.rb +15 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +2 -0
- data/lib/nokogiri/html/sax/parser.rb +27 -1
- data/lib/nokogiri/version.rb +26 -1
- data/lib/nokogiri/version_warning.rb +11 -0
- data/lib/nokogiri/xml.rb +25 -51
- data/lib/nokogiri/xml/builder.rb +166 -10
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/document.rb +39 -6
- data/lib/nokogiri/xml/document_fragment.rb +41 -1
- data/lib/nokogiri/xml/dtd.rb +3 -1
- data/lib/nokogiri/xml/entity_declaration.rb +3 -1
- data/lib/nokogiri/xml/fragment_handler.rb +24 -3
- data/lib/nokogiri/xml/namespace.rb +7 -0
- data/lib/nokogiri/xml/node.rb +314 -65
- data/lib/nokogiri/xml/node/save_options.rb +12 -2
- data/lib/nokogiri/xml/node_set.rb +58 -8
- data/lib/nokogiri/xml/parse_options.rb +80 -0
- data/lib/nokogiri/xml/processing_instruction.rb +2 -0
- data/lib/nokogiri/xml/reader.rb +42 -3
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +0 -7
- data/lib/nokogiri/xml/sax/document.rb +84 -0
- data/lib/nokogiri/xml/sax/parser.rb +38 -2
- data/lib/nokogiri/xml/sax/push_parser.rb +12 -0
- data/lib/nokogiri/xml/schema.rb +65 -0
- data/lib/nokogiri/xml/syntax_error.rb +11 -0
- data/lib/nokogiri/xml/xpath.rb +1 -1
- data/lib/nokogiri/xml/xpath_context.rb +2 -0
- data/lib/nokogiri/xslt.rb +21 -1
- data/lib/nokogiri/xslt/stylesheet.rb +19 -0
- data/lib/xsd/xmlparser/nokogiri.rb +12 -2
- data/tasks/test.rb +42 -19
- data/test/css/test_parser.rb +29 -0
- data/test/ffi/test_document.rb +35 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/helper.rb +38 -8
- data/test/html/sax/test_parser.rb +12 -0
- data/test/html/test_builder.rb +25 -2
- data/test/html/test_document.rb +91 -20
- data/test/html/test_document_fragment.rb +97 -0
- data/test/html/test_element_description.rb +95 -0
- data/test/html/test_node.rb +66 -3
- data/test/test_convert_xpath.rb +1 -1
- data/test/test_memory_leak.rb +57 -18
- data/test/test_nokogiri.rb +24 -2
- data/test/test_reader.rb +77 -0
- data/test/test_xslt_transforms.rb +120 -82
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +9 -0
- data/test/xml/sax/test_push_parser.rb +24 -0
- data/test/xml/test_attr.rb +7 -0
- data/test/xml/test_builder.rb +48 -0
- data/test/xml/test_cdata.rb +19 -0
- data/test/xml/test_comment.rb +6 -0
- data/test/xml/test_document.rb +101 -2
- data/test/xml/test_document_fragment.rb +55 -3
- data/test/xml/test_entity_reference.rb +4 -0
- data/test/xml/test_namespace.rb +43 -0
- data/test/xml/test_node.rb +255 -8
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +9 -2
- data/test/xml/test_node_set.rb +197 -1
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +5 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +65 -0
- data/test/xml/test_text.rb +5 -0
- data/test/xml/test_unparented_node.rb +3 -3
- metadata +128 -12
- data/lib/nokogiri/xml/comment.rb +0 -6
- data/lib/nokogiri/xml/element.rb +0 -6
- 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
|
data/lib/nokogiri/hpricot.rb
CHANGED
@@ -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)
|
data/lib/nokogiri/html.rb
CHANGED
@@ -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.
|
9
|
-
|
10
|
-
|
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.
|
31
|
-
def parse
|
32
|
-
|
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
|
-
|
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
|