nokogiri 1.3.0-x86-mswin32
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 +27 -0
- data/CHANGELOG.ja.rdoc +233 -0
- data/CHANGELOG.rdoc +222 -0
- data/Manifest.txt +247 -0
- data/README.ja.rdoc +103 -0
- data/README.rdoc +117 -0
- data/Rakefile +205 -0
- data/bin/nokogiri +47 -0
- data/ext/nokogiri/extconf.rb +89 -0
- data/ext/nokogiri/html_document.c +183 -0
- data/ext/nokogiri/html_document.h +10 -0
- data/ext/nokogiri/html_element_description.c +272 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.c +30 -0
- data/ext/nokogiri/html_entity_lookup.h +8 -0
- data/ext/nokogiri/html_sax_parser.c +57 -0
- data/ext/nokogiri/html_sax_parser.h +11 -0
- data/ext/nokogiri/iconv.dll +0 -0
- data/ext/nokogiri/libexslt.dll +0 -0
- data/ext/nokogiri/libxml2.dll +0 -0
- data/ext/nokogiri/libxslt.dll +0 -0
- data/ext/nokogiri/nokogiri.c +81 -0
- data/ext/nokogiri/nokogiri.h +149 -0
- data/ext/nokogiri/xml_attr.c +92 -0
- data/ext/nokogiri/xml_attr.h +9 -0
- data/ext/nokogiri/xml_cdata.c +53 -0
- data/ext/nokogiri/xml_cdata.h +9 -0
- data/ext/nokogiri/xml_comment.c +51 -0
- data/ext/nokogiri/xml_comment.h +9 -0
- data/ext/nokogiri/xml_document.c +308 -0
- data/ext/nokogiri/xml_document.h +21 -0
- data/ext/nokogiri/xml_document_fragment.c +48 -0
- data/ext/nokogiri/xml_document_fragment.h +10 -0
- data/ext/nokogiri/xml_dtd.c +102 -0
- data/ext/nokogiri/xml_dtd.h +8 -0
- data/ext/nokogiri/xml_entity_reference.c +50 -0
- data/ext/nokogiri/xml_entity_reference.h +9 -0
- data/ext/nokogiri/xml_io.c +24 -0
- data/ext/nokogiri/xml_io.h +10 -0
- data/ext/nokogiri/xml_namespace.c +69 -0
- data/ext/nokogiri/xml_namespace.h +12 -0
- data/ext/nokogiri/xml_node.c +928 -0
- data/ext/nokogiri/xml_node.h +14 -0
- data/ext/nokogiri/xml_node_set.c +386 -0
- data/ext/nokogiri/xml_node_set.h +9 -0
- data/ext/nokogiri/xml_processing_instruction.c +54 -0
- data/ext/nokogiri/xml_processing_instruction.h +9 -0
- data/ext/nokogiri/xml_reader.c +572 -0
- data/ext/nokogiri/xml_reader.h +10 -0
- 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 +336 -0
- data/ext/nokogiri/xml_sax_parser.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +86 -0
- data/ext/nokogiri/xml_sax_push_parser.h +9 -0
- data/ext/nokogiri/xml_schema.c +107 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +203 -0
- data/ext/nokogiri/xml_syntax_error.h +12 -0
- data/ext/nokogiri/xml_text.c +47 -0
- data/ext/nokogiri/xml_text.h +9 -0
- data/ext/nokogiri/xml_xpath.c +53 -0
- data/ext/nokogiri/xml_xpath.h +11 -0
- data/ext/nokogiri/xml_xpath_context.c +252 -0
- data/ext/nokogiri/xml_xpath_context.h +9 -0
- data/ext/nokogiri/xslt_stylesheet.c +131 -0
- data/ext/nokogiri/xslt_stylesheet.h +9 -0
- data/ext/nokogiri/zlib1.dll +0 -0
- data/lib/action-nokogiri.rb +36 -0
- data/lib/nokogiri.rb +110 -0
- data/lib/nokogiri/1.8/nokogiri.so +0 -0
- data/lib/nokogiri/1.9/nokogiri.so +0 -0
- data/lib/nokogiri/css.rb +25 -0
- data/lib/nokogiri/css/generated_parser.rb +748 -0
- data/lib/nokogiri/css/generated_tokenizer.rb +144 -0
- data/lib/nokogiri/css/node.rb +107 -0
- data/lib/nokogiri/css/parser.rb +82 -0
- data/lib/nokogiri/css/parser.y +227 -0
- data/lib/nokogiri/css/syntax_error.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rb +11 -0
- data/lib/nokogiri/css/tokenizer.rex +54 -0
- data/lib/nokogiri/css/xpath_visitor.rb +172 -0
- data/lib/nokogiri/decorators.rb +2 -0
- data/lib/nokogiri/decorators/hpricot.rb +3 -0
- data/lib/nokogiri/decorators/hpricot/node.rb +56 -0
- data/lib/nokogiri/decorators/hpricot/node_set.rb +54 -0
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +30 -0
- data/lib/nokogiri/decorators/slop.rb +33 -0
- 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 +62 -0
- data/lib/nokogiri/html.rb +34 -0
- data/lib/nokogiri/html/builder.rb +35 -0
- data/lib/nokogiri/html/document.rb +71 -0
- 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 +13 -0
- data/lib/nokogiri/html/sax/parser.rb +47 -0
- data/lib/nokogiri/nokogiri.rb +1 -0
- data/lib/nokogiri/syntax_error.rb +4 -0
- data/lib/nokogiri/version.rb +29 -0
- data/lib/nokogiri/version_warning.rb +11 -0
- data/lib/nokogiri/xml.rb +62 -0
- data/lib/nokogiri/xml/attr.rb +9 -0
- data/lib/nokogiri/xml/builder.rb +254 -0
- data/lib/nokogiri/xml/cdata.rb +11 -0
- data/lib/nokogiri/xml/document.rb +100 -0
- data/lib/nokogiri/xml/document_fragment.rb +49 -0
- data/lib/nokogiri/xml/dtd.rb +11 -0
- data/lib/nokogiri/xml/entity_declaration.rb +11 -0
- data/lib/nokogiri/xml/fragment_handler.rb +55 -0
- data/lib/nokogiri/xml/namespace.rb +7 -0
- data/lib/nokogiri/xml/node.rb +745 -0
- data/lib/nokogiri/xml/node/save_options.rb +42 -0
- data/lib/nokogiri/xml/node_set.rb +238 -0
- data/lib/nokogiri/xml/notation.rb +6 -0
- data/lib/nokogiri/xml/parse_options.rb +80 -0
- data/lib/nokogiri/xml/processing_instruction.rb +8 -0
- data/lib/nokogiri/xml/reader.rb +66 -0
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +3 -0
- data/lib/nokogiri/xml/sax/document.rb +143 -0
- data/lib/nokogiri/xml/sax/parser.rb +101 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
- data/lib/nokogiri/xml/schema.rb +65 -0
- data/lib/nokogiri/xml/syntax_error.rb +34 -0
- data/lib/nokogiri/xml/xpath.rb +10 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +8 -0
- data/lib/nokogiri/xml/xpath_context.rb +16 -0
- data/lib/nokogiri/xslt.rb +48 -0
- data/lib/nokogiri/xslt/stylesheet.rb +25 -0
- data/lib/xsd/xmlparser/nokogiri.rb +64 -0
- data/tasks/test.rb +161 -0
- data/test/css/test_nthiness.rb +160 -0
- data/test/css/test_parser.rb +277 -0
- data/test/css/test_tokenizer.rb +176 -0
- data/test/css/test_xpath_visitor.rb +76 -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/dont_hurt_em_why.xml +422 -0
- data/test/files/exslt.xml +8 -0
- data/test/files/exslt.xslt +35 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/staff.xml +59 -0
- data/test/files/staff.xslt +32 -0
- data/test/files/tlm.html +850 -0
- data/test/helper.rb +123 -0
- data/test/hpricot/files/basic.xhtml +17 -0
- data/test/hpricot/files/boingboing.html +2266 -0
- data/test/hpricot/files/cy0.html +3653 -0
- data/test/hpricot/files/immob.html +400 -0
- data/test/hpricot/files/pace_application.html +1320 -0
- data/test/hpricot/files/tenderlove.html +16 -0
- data/test/hpricot/files/uswebgen.html +220 -0
- data/test/hpricot/files/utf8.html +1054 -0
- data/test/hpricot/files/week9.html +1723 -0
- data/test/hpricot/files/why.xml +19 -0
- data/test/hpricot/load_files.rb +11 -0
- data/test/hpricot/test_alter.rb +68 -0
- data/test/hpricot/test_builder.rb +20 -0
- data/test/hpricot/test_parser.rb +426 -0
- data/test/hpricot/test_paths.rb +15 -0
- data/test/hpricot/test_preserved.rb +77 -0
- data/test/hpricot/test_xml.rb +30 -0
- data/test/html/sax/test_parser.rb +52 -0
- data/test/html/test_builder.rb +156 -0
- data/test/html/test_document.rb +361 -0
- data/test/html/test_document_encoding.rb +46 -0
- data/test/html/test_document_fragment.rb +97 -0
- data/test/html/test_element_description.rb +95 -0
- data/test/html/test_named_characters.rb +14 -0
- data/test/html/test_node.rb +165 -0
- data/test/test_convert_xpath.rb +186 -0
- data/test/test_css_cache.rb +56 -0
- data/test/test_gc.rb +15 -0
- data/test/test_memory_leak.rb +77 -0
- data/test/test_nokogiri.rb +127 -0
- data/test/test_reader.rb +316 -0
- data/test/test_xslt_transforms.rb +131 -0
- data/test/xml/node/test_save_options.rb +20 -0
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +169 -0
- data/test/xml/sax/test_push_parser.rb +92 -0
- data/test/xml/test_attr.rb +38 -0
- data/test/xml/test_builder.rb +73 -0
- data/test/xml/test_cdata.rb +38 -0
- data/test/xml/test_comment.rb +23 -0
- data/test/xml/test_document.rb +397 -0
- data/test/xml/test_document_encoding.rb +26 -0
- data/test/xml/test_document_fragment.rb +76 -0
- data/test/xml/test_dtd.rb +42 -0
- data/test/xml/test_dtd_encoding.rb +31 -0
- data/test/xml/test_entity_reference.rb +21 -0
- data/test/xml/test_namespace.rb +43 -0
- data/test/xml/test_node.rb +808 -0
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +84 -0
- data/test/xml/test_node_set.rb +368 -0
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +30 -0
- data/test/xml/test_reader_encoding.rb +126 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +65 -0
- data/test/xml/test_text.rb +18 -0
- data/test/xml/test_unparented_node.rb +381 -0
- data/test/xml/test_xpath.rb +106 -0
- metadata +409 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XML
|
3
|
+
class XPathContext
|
4
|
+
|
5
|
+
###
|
6
|
+
# Register namespaces in +namespaces+
|
7
|
+
def register_namespaces(namespaces)
|
8
|
+
namespaces.each do |k, v|
|
9
|
+
k = k.gsub(/.*:/,'') # strip off 'xmlns:' or 'xml:'
|
10
|
+
register_ns(k, v)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'nokogiri/xslt/stylesheet'
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
class << self
|
5
|
+
###
|
6
|
+
# Create a Nokogiri::XSLT::Stylesheet with +stylesheet+.
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
# xslt = Nokogiri::XSLT(File.read(ARGV[0]))
|
11
|
+
#
|
12
|
+
def XSLT stylesheet
|
13
|
+
XSLT.parse(stylesheet)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
###
|
18
|
+
# See Nokogiri::XSLT::Stylesheet for creating and maniuplating
|
19
|
+
# Stylesheet object.
|
20
|
+
module XSLT
|
21
|
+
class << self
|
22
|
+
###
|
23
|
+
# Parse the stylesheet in +string+
|
24
|
+
def parse string
|
25
|
+
Stylesheet.parse_stylesheet_doc(XML.parse(string))
|
26
|
+
end
|
27
|
+
|
28
|
+
###
|
29
|
+
# Quote parameters in +params+ for stylesheet safety
|
30
|
+
def quote_params params
|
31
|
+
parray = (params.instance_of?(Hash) ? params.to_a.flatten : params).dup
|
32
|
+
parray.each_with_index do |v,i|
|
33
|
+
if i % 2 > 0
|
34
|
+
parray[i]=
|
35
|
+
if v =~ /'/
|
36
|
+
"concat('#{ v.gsub(/'/, %q{', "'", '}) }')"
|
37
|
+
else
|
38
|
+
"'#{v}'";
|
39
|
+
end
|
40
|
+
else
|
41
|
+
parray[i] = v.to_s
|
42
|
+
end
|
43
|
+
end
|
44
|
+
parray.flatten
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XSLT
|
3
|
+
###
|
4
|
+
# A Stylesheet represents an XSLT Stylesheet object. Stylesheet creation
|
5
|
+
# is done through Nokogiri.XSLT. Here is an example of transforming
|
6
|
+
# an XML::Document with a Stylesheet:
|
7
|
+
#
|
8
|
+
# doc = Nokogiri::XML(File.read('some_file.xml'))
|
9
|
+
# xslt = Nokogir::XSLT(File.read('some_transformer.xslt'))
|
10
|
+
#
|
11
|
+
# puts xslt.transform(doc)
|
12
|
+
#
|
13
|
+
# See Nokogiri::XSLT::Stylesheet#transform for more transformation
|
14
|
+
# information.
|
15
|
+
class Stylesheet
|
16
|
+
###
|
17
|
+
# Apply an XSLT stylesheet to an XML::Document.
|
18
|
+
# +params+ is an array of strings used as XSLT parameters.
|
19
|
+
# returns serialized document
|
20
|
+
def apply_to document, params = []
|
21
|
+
serialize(transform(document, params))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module XSD # :nodoc:
|
4
|
+
module XMLParser # :nodoc:
|
5
|
+
###
|
6
|
+
# Nokogiri XML parser for soap4r.
|
7
|
+
#
|
8
|
+
# Nokogiri may be used as the XML parser in soap4r. Simply require
|
9
|
+
# 'xsd/xmlparser/nokogiri' in your soap4r applications, and soap4r
|
10
|
+
# will use Nokogiri as it's XML parser. No other changes should be
|
11
|
+
# required to use Nokogiri as the XML parser.
|
12
|
+
#
|
13
|
+
# Example (using UW ITS Web Services):
|
14
|
+
#
|
15
|
+
# require 'rubygems'
|
16
|
+
# gem 'soap4r'
|
17
|
+
# require 'nokogiri'
|
18
|
+
# require 'xsd/xmlparser/nokogiri'
|
19
|
+
# require 'defaultDriver'
|
20
|
+
#
|
21
|
+
# obj = AvlPortType.new
|
22
|
+
# obj.getLatestByRoute(obj.getAgencies, 8).each do |event|
|
23
|
+
# ...
|
24
|
+
# end
|
25
|
+
class Nokogiri < XSD::XMLParser::Parser
|
26
|
+
###
|
27
|
+
# Create a new XSD parser with +host+ and +opt+
|
28
|
+
def initialize host, opt = {}
|
29
|
+
super
|
30
|
+
@parser = ::Nokogiri::XML::SAX::Parser.new(self, @charset || 'UTF-8')
|
31
|
+
end
|
32
|
+
|
33
|
+
###
|
34
|
+
# Start parsing +string_or_readable+
|
35
|
+
def do_parse string_or_readable
|
36
|
+
@parser.parse(string_or_readable)
|
37
|
+
end
|
38
|
+
|
39
|
+
###
|
40
|
+
# Handle the start_element event with +name+ and +attrs+
|
41
|
+
def start_element name, attrs = []
|
42
|
+
super(name, Hash[*attrs])
|
43
|
+
end
|
44
|
+
|
45
|
+
###
|
46
|
+
# Handle errors with message +msg+
|
47
|
+
def error msg
|
48
|
+
raise ParseError.new(msg)
|
49
|
+
end
|
50
|
+
alias :warning :error
|
51
|
+
|
52
|
+
###
|
53
|
+
# Handle cdata_blocks containing +string+
|
54
|
+
def cdata_block string
|
55
|
+
characters string
|
56
|
+
end
|
57
|
+
|
58
|
+
%w{ start_document end_document comment }.each do |name|
|
59
|
+
class_eval %{ def #{name}(*args); end }
|
60
|
+
end
|
61
|
+
add_factory(self)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/tasks/test.rb
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
# partial-loads-ok and undef-value-errors necessary to ignore
|
2
|
+
# spurious (and eminently ignorable) warnings from the ruby
|
3
|
+
# interpreter
|
4
|
+
VALGRIND_BASIC_OPTS = "--num-callers=50 --error-limit=no --partial-loads-ok=yes --undef-value-errors=no"
|
5
|
+
|
6
|
+
class NokogiriTestTask < Rake::TestTask
|
7
|
+
def initialize *args
|
8
|
+
super
|
9
|
+
%w[ ext lib bin test ].each do |dir|
|
10
|
+
self.libs << dir
|
11
|
+
end
|
12
|
+
self.test_files = FileList['test/**/test_*.rb'] +
|
13
|
+
FileList['test/**/*_test.rb']
|
14
|
+
self.verbose = "verbose"
|
15
|
+
self.warning = true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "run test suite under valgrind with basic ruby options"
|
20
|
+
NokogiriTestTask.new('test:valgrind').extend(Module.new {
|
21
|
+
def ruby *args
|
22
|
+
run_with_env "valgrind #{VALGRIND_BASIC_OPTS} #{RUBY} #{args.join(' ')} test/test_nokogiri.rb --verbose=verbose"
|
23
|
+
end
|
24
|
+
})
|
25
|
+
|
26
|
+
desc "run test suite under valgrind with memory-fill ruby options"
|
27
|
+
NokogiriTestTask.new('test:valgrind_mem').extend(Module.new {
|
28
|
+
def ruby *args
|
29
|
+
run_with_env "valgrind #{VALGRIND_BASIC_OPTS} --freelist-vol=100000000 --malloc-fill=6D --free-fill=66 #{RUBY} #{args.join(' ')} test/test_nokogiri.rb --verbose=verbose"
|
30
|
+
end
|
31
|
+
})
|
32
|
+
|
33
|
+
desc "run test suite under valgrind with memory-zero ruby options"
|
34
|
+
NokogiriTestTask.new('test:valgrind_mem0').extend(Module.new {
|
35
|
+
def ruby *args
|
36
|
+
run_with_env "valgrind #{VALGRIND_BASIC_OPTS} --freelist-vol=100000000 --malloc-fill=00 --free-fill=00 #{RUBY} #{args.join(' ')} test/test_nokogiri.rb --verbose=verbose"
|
37
|
+
end
|
38
|
+
})
|
39
|
+
|
40
|
+
desc "run test suite under gdb"
|
41
|
+
NokogiriTestTask.new('test:gdb').extend(Module.new {
|
42
|
+
def ruby *args
|
43
|
+
run_with_env "gdb --args #{RUBY} #{args.join(' ')}"
|
44
|
+
end
|
45
|
+
})
|
46
|
+
|
47
|
+
desc "test coverage"
|
48
|
+
NokogiriTestTask.new('test:coverage').extend(Module.new {
|
49
|
+
def ruby *args
|
50
|
+
rm_rf "coverage"
|
51
|
+
run_with_env "rcov -x Library -I lib:ext:test #{args.join(' ')}"
|
52
|
+
end
|
53
|
+
})
|
54
|
+
|
55
|
+
desc "run test suite with verbose output"
|
56
|
+
NokogiriTestTask.new('test:verbose').extend(Module.new {
|
57
|
+
def ruby *args
|
58
|
+
run_with_env "#{RUBY} #{args.join(' ')} test/test_nokogiri.rb --verbose=verbose"
|
59
|
+
end
|
60
|
+
})
|
61
|
+
|
62
|
+
def run_with_env(cmd)
|
63
|
+
cmd = "LD_LIBRARY_PATH='#{ENV['LD_LIBRARY_PATH']}' #{cmd}"
|
64
|
+
puts "=> #{cmd}"
|
65
|
+
system cmd
|
66
|
+
end
|
67
|
+
|
68
|
+
namespace :test do
|
69
|
+
desc "run test suite with aggressive GC"
|
70
|
+
task :gc => :build do
|
71
|
+
ENV['NOKOGIRI_GC'] = "true"
|
72
|
+
Rake::Task["test"].invoke
|
73
|
+
end
|
74
|
+
|
75
|
+
desc "find call-seq in the rdoc"
|
76
|
+
task :rdoc_call_seq => 'docs' do
|
77
|
+
Dir['doc/**/*.html'].each { |docfile|
|
78
|
+
next if docfile =~ /\.src/
|
79
|
+
puts "FAIL: #{docfile}" if File.read(docfile) =~ /call-seq/
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
desc "find all undocumented things"
|
84
|
+
task :rdoc => 'docs' do
|
85
|
+
base = File.expand_path(File.join(File.dirname(__FILE__), '..', 'doc'))
|
86
|
+
require 'test/unit'
|
87
|
+
test = Class.new(Test::Unit::TestCase)
|
88
|
+
Dir["#{base}/**/*.html"].each { |docfile|
|
89
|
+
test.class_eval(<<-eotest)
|
90
|
+
def test_#{docfile.sub("#{base}/", '').gsub(/[\/\.-]/, '_')}
|
91
|
+
assert_no_match(
|
92
|
+
/Not documented/,
|
93
|
+
File.read('#{docfile}'),
|
94
|
+
'#{docfile} has undocumented things'
|
95
|
+
)
|
96
|
+
end
|
97
|
+
eotest
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
desc "Test against multiple versions of libxml2 (MULTIXML2_DIR=directory)"
|
102
|
+
task :multixml2 do
|
103
|
+
MULTI_XML = File.join(ENV['HOME'], '.multixml2')
|
104
|
+
unless File.exists?(MULTI_XML)
|
105
|
+
%w{ versions install build }.each { |x|
|
106
|
+
FileUtils.mkdir_p(File.join(MULTI_XML, x))
|
107
|
+
}
|
108
|
+
Dir.chdir File.join(MULTI_XML, 'versions') do
|
109
|
+
require 'net/ftp'
|
110
|
+
ftp = Net::FTP.new('xmlsoft.org')
|
111
|
+
ftp.login('anonymous', 'anonymous')
|
112
|
+
ftp.chdir('libxml2')
|
113
|
+
ftp.list('libxml2-2.*.tar.gz').each do |x|
|
114
|
+
file = x[/[^\s]*$/]
|
115
|
+
puts "Downloading #{file}"
|
116
|
+
ftp.getbinaryfile(file)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Build any libxml2 versions in $HOME/.multixml2/versions that
|
122
|
+
# haven't been built yet
|
123
|
+
Dir[File.join(MULTI_XML, 'versions','*.tar.gz')].each do |f|
|
124
|
+
filename = File.basename(f, '.tar.gz')
|
125
|
+
|
126
|
+
install_dir = File.join(MULTI_XML, 'install', filename)
|
127
|
+
next if File.exists?(install_dir)
|
128
|
+
|
129
|
+
Dir.chdir File.join(MULTI_XML, 'versions') do
|
130
|
+
system "tar zxvf #{f} -C #{File.join(MULTI_XML, 'build')}"
|
131
|
+
end
|
132
|
+
|
133
|
+
Dir.chdir File.join(MULTI_XML, 'build', filename) do
|
134
|
+
system "./configure --prefix=#{install_dir}"
|
135
|
+
system "make && make install"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
test_results = {}
|
140
|
+
libxslt = Dir[File.join(MULTI_XML, 'install', 'libxslt*')].first
|
141
|
+
|
142
|
+
directories = ENV['MULTIXML2_DIR'] ? [ENV['MULTIXML2_DIR']] : Dir[File.join(MULTI_XML, 'install', '*')]
|
143
|
+
directories.sort.reverse.each do |xml2_version|
|
144
|
+
next unless xml2_version =~ /libxml2/
|
145
|
+
extopts = "--with-xml2-include=#{xml2_version}/include/libxml2 --with-xml2-lib=#{xml2_version}/lib --with-xslt-dir=#{libxslt}"
|
146
|
+
cmd = "#{$0} clean test EXTOPTS='#{extopts}' LD_LIBRARY_PATH='#{xml2_version}/lib'"
|
147
|
+
|
148
|
+
version = File.basename(xml2_version)
|
149
|
+
result = system(cmd)
|
150
|
+
test_results[version] = {
|
151
|
+
:result => result,
|
152
|
+
:cmd => cmd
|
153
|
+
}
|
154
|
+
end
|
155
|
+
test_results.sort_by { |k,v| k }.each do |k,v|
|
156
|
+
passed = v[:result]
|
157
|
+
puts "#{k}: #{passed ? 'PASS' : 'FAIL'}"
|
158
|
+
puts "repro: #{v[:cmd]}" unless passed
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module CSS
|
5
|
+
class TestNthiness < Nokogiri::TestCase
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
doc = <<EOF
|
9
|
+
<html>
|
10
|
+
<table>
|
11
|
+
<tr><td>row1 </td></tr>
|
12
|
+
<tr><td>row2 </td></tr>
|
13
|
+
<tr><td>row3 </td></tr>
|
14
|
+
<tr><td>row4 </td></tr>
|
15
|
+
<tr><td>row5 </td></tr>
|
16
|
+
<tr><td>row6 </td></tr>
|
17
|
+
<tr><td>row7 </td></tr>
|
18
|
+
<tr><td>row8 </td></tr>
|
19
|
+
<tr><td>row9 </td></tr>
|
20
|
+
<tr><td>row10 </td></tr>
|
21
|
+
<tr><td>row11 </td></tr>
|
22
|
+
<tr><td>row12 </td></tr>
|
23
|
+
<tr><td>row13 </td></tr>
|
24
|
+
<tr><td>row14 </td></tr>
|
25
|
+
</table>
|
26
|
+
<div>
|
27
|
+
<b>bold1 </b>
|
28
|
+
<i>italic1 </i>
|
29
|
+
<b>bold2 </b>
|
30
|
+
<i>italic2 </i>
|
31
|
+
<p>para1 </p>
|
32
|
+
<b>bold3 </b>
|
33
|
+
</div>
|
34
|
+
<div>
|
35
|
+
<p>para2 </p>
|
36
|
+
<p>para3 </p>
|
37
|
+
</div>
|
38
|
+
<div>
|
39
|
+
<p>para4 </p>
|
40
|
+
</div>
|
41
|
+
<p class='empty'></p>
|
42
|
+
<p class='not-empty'><b></b></p>
|
43
|
+
</html>
|
44
|
+
EOF
|
45
|
+
@parser = Nokogiri.Hpricot doc
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def test_even
|
50
|
+
assert_result_rows [2,4,6,8,10,12,14], @parser.search("table/tr:nth(even)")
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_odd
|
54
|
+
assert_result_rows [1,3,5,7,9,11,13], @parser.search("table/tr:nth(odd)")
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_2n
|
58
|
+
assert_equal @parser.search("table/tr:nth(even)").inner_text, @parser.search("table/tr:nth(2n)").inner_text
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_2np1
|
62
|
+
assert_equal @parser.search("table/tr:nth(odd)").inner_text, @parser.search("table/tr:nth(2n+1)").inner_text
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_4np3
|
66
|
+
assert_result_rows [3,7,11], @parser.search("table/tr:nth(4n+3)")
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_3np4
|
70
|
+
assert_result_rows [4,7,10,13], @parser.search("table/tr:nth(3n+4)")
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_mnp3
|
74
|
+
assert_result_rows [1,2,3], @parser.search("table/tr:nth(-n+3)")
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_np3
|
78
|
+
assert_result_rows [3,4,5,6,7,8,9,10,11,12,13,14], @parser.search("table/tr:nth(n+3)")
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_first
|
82
|
+
assert_result_rows [1], @parser.search("table/tr:first")
|
83
|
+
assert_result_rows [1], @parser.search("table/tr:first()")
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_last
|
87
|
+
assert_result_rows [14], @parser.search("table/tr:last")
|
88
|
+
assert_result_rows [14], @parser.search("table/tr:last()")
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_first_child
|
92
|
+
assert_result_rows [1], @parser.search("div/b:first-child"), "bold"
|
93
|
+
assert_result_rows [1], @parser.search("table/tr:first-child")
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_last_child
|
97
|
+
assert_result_rows [3], @parser.search("div/b:last-child"), "bold"
|
98
|
+
assert_result_rows [14], @parser.search("table/tr:last-child")
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_first_of_type
|
102
|
+
assert_result_rows [1], @parser.search("table/tr:first-of-type")
|
103
|
+
assert_result_rows [1], @parser.search("div/b:first-of-type"), "bold"
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_last_of_type
|
107
|
+
assert_result_rows [14], @parser.search("table/tr:last-of-type")
|
108
|
+
assert_result_rows [3], @parser.search("div/b:last-of-type"), "bold"
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_only_of_type
|
112
|
+
assert_result_rows [1,4], @parser.search("div/p:only-of-type"), "para"
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_only_child
|
116
|
+
assert_result_rows [4], @parser.search("div/p:only-child"), "para"
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_empty
|
120
|
+
result = @parser.search("p:empty")
|
121
|
+
assert_equal 1, result.size, "unexpected number of rows returned: '#{result.inner_text}'"
|
122
|
+
assert_equal 'empty', result.first['class']
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_parent
|
126
|
+
result = @parser.search("p:parent")
|
127
|
+
assert_equal 5, result.size
|
128
|
+
0.upto(3) do |j|
|
129
|
+
assert_equal "para#{j+1} ", result[j].inner_text
|
130
|
+
end
|
131
|
+
assert_equal "not-empty", result[4]['class']
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_siblings
|
135
|
+
doc = <<-EOF
|
136
|
+
<html><body><div>
|
137
|
+
<p id="1">p1 </p>
|
138
|
+
<p id="2">p2 </p>
|
139
|
+
<p id="3">p3 </p>
|
140
|
+
<p id="4">p4 </p>
|
141
|
+
<p id="5">p5 </p>
|
142
|
+
EOF
|
143
|
+
parser = Nokogiri.Hpricot doc
|
144
|
+
|
145
|
+
assert_equal 2, parser.search("#3 ~ p").size
|
146
|
+
assert_equal "p4 p5 ", parser.search("#3 ~ p").inner_text
|
147
|
+
assert_equal 0, parser.search("#5 ~ p").size
|
148
|
+
|
149
|
+
assert_equal 1, parser.search("#3 + p").size
|
150
|
+
assert_equal "p4 ", parser.search("#3 + p").inner_text
|
151
|
+
assert_equal 0, parser.search("#5 + p").size
|
152
|
+
end
|
153
|
+
|
154
|
+
def assert_result_rows intarray, result, word="row"
|
155
|
+
assert_equal intarray.size, result.size, "unexpected number of rows returned: '#{result.inner_text}'"
|
156
|
+
assert_equal intarray.map{|j| "#{word}#{j}"}.join(' '), result.inner_text.strip, result.inner_text
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|