tenderlove-nokogiri 0.0.0-x86-mswin32-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +6 -0
- data/Manifest.txt +120 -0
- data/README.ja.txt +86 -0
- data/README.txt +87 -0
- data/Rakefile +264 -0
- data/ext/nokogiri/extconf.rb +59 -0
- data/ext/nokogiri/html_document.c +83 -0
- data/ext/nokogiri/html_document.h +10 -0
- data/ext/nokogiri/html_sax_parser.c +32 -0
- data/ext/nokogiri/html_sax_parser.h +11 -0
- data/ext/nokogiri/native.c +40 -0
- data/ext/nokogiri/native.h +51 -0
- data/ext/nokogiri/xml_cdata.c +52 -0
- data/ext/nokogiri/xml_cdata.h +9 -0
- data/ext/nokogiri/xml_document.c +159 -0
- data/ext/nokogiri/xml_document.h +10 -0
- data/ext/nokogiri/xml_dtd.c +117 -0
- data/ext/nokogiri/xml_dtd.h +8 -0
- data/ext/nokogiri/xml_node.c +709 -0
- data/ext/nokogiri/xml_node.h +15 -0
- data/ext/nokogiri/xml_node_set.c +124 -0
- data/ext/nokogiri/xml_node_set.h +9 -0
- data/ext/nokogiri/xml_reader.c +429 -0
- data/ext/nokogiri/xml_reader.h +10 -0
- data/ext/nokogiri/xml_sax_parser.c +174 -0
- data/ext/nokogiri/xml_sax_parser.h +10 -0
- data/ext/nokogiri/xml_syntax_error.c +194 -0
- data/ext/nokogiri/xml_syntax_error.h +11 -0
- data/ext/nokogiri/xml_text.c +29 -0
- data/ext/nokogiri/xml_text.h +9 -0
- data/ext/nokogiri/xml_xpath.c +46 -0
- data/ext/nokogiri/xml_xpath.h +11 -0
- data/ext/nokogiri/xml_xpath_context.c +81 -0
- data/ext/nokogiri/xml_xpath_context.h +9 -0
- data/ext/nokogiri/xslt_stylesheet.c +108 -0
- data/ext/nokogiri/xslt_stylesheet.h +9 -0
- data/lib/nokogiri/css/node.rb +95 -0
- data/lib/nokogiri/css/parser.rb +24 -0
- data/lib/nokogiri/css/parser.y +198 -0
- data/lib/nokogiri/css/tokenizer.rb +9 -0
- data/lib/nokogiri/css/tokenizer.rex +63 -0
- data/lib/nokogiri/css/xpath_visitor.rb +165 -0
- data/lib/nokogiri/css.rb +6 -0
- data/lib/nokogiri/decorators/hpricot/node.rb +58 -0
- data/lib/nokogiri/decorators/hpricot/node_set.rb +14 -0
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +17 -0
- data/lib/nokogiri/decorators/hpricot.rb +3 -0
- data/lib/nokogiri/decorators.rb +1 -0
- data/lib/nokogiri/hpricot.rb +47 -0
- data/lib/nokogiri/html/builder.rb +9 -0
- data/lib/nokogiri/html/document.rb +9 -0
- data/lib/nokogiri/html/sax/parser.rb +21 -0
- data/lib/nokogiri/html.rb +95 -0
- data/lib/nokogiri/version.rb +3 -0
- data/lib/nokogiri/xml/after_handler.rb +18 -0
- data/lib/nokogiri/xml/before_handler.rb +32 -0
- data/lib/nokogiri/xml/builder.rb +79 -0
- data/lib/nokogiri/xml/cdata.rb +9 -0
- data/lib/nokogiri/xml/document.rb +30 -0
- data/lib/nokogiri/xml/dtd.rb +6 -0
- data/lib/nokogiri/xml/node.rb +195 -0
- data/lib/nokogiri/xml/node_set.rb +183 -0
- data/lib/nokogiri/xml/notation.rb +6 -0
- data/lib/nokogiri/xml/reader.rb +14 -0
- data/lib/nokogiri/xml/sax/document.rb +59 -0
- data/lib/nokogiri/xml/sax/parser.rb +33 -0
- data/lib/nokogiri/xml/sax.rb +9 -0
- data/lib/nokogiri/xml/syntax_error.rb +21 -0
- data/lib/nokogiri/xml/text.rb +6 -0
- data/lib/nokogiri/xml/xpath.rb +6 -0
- data/lib/nokogiri/xml/xpath_context.rb +14 -0
- data/lib/nokogiri/xml.rb +67 -0
- data/lib/nokogiri/xslt/stylesheet.rb +6 -0
- data/lib/nokogiri/xslt.rb +11 -0
- data/lib/nokogiri.rb +51 -0
- data/nokogiri.gemspec +34 -0
- data/test/css/test_nthiness.rb +159 -0
- data/test/css/test_parser.rb +224 -0
- data/test/css/test_tokenizer.rb +162 -0
- data/test/css/test_xpath_visitor.rb +54 -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 +70 -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 +7 -0
- data/test/hpricot/test_alter.rb +67 -0
- data/test/hpricot/test_builder.rb +27 -0
- data/test/hpricot/test_parser.rb +423 -0
- data/test/hpricot/test_paths.rb +15 -0
- data/test/hpricot/test_preserved.rb +78 -0
- data/test/hpricot/test_xml.rb +30 -0
- data/test/html/sax/test_parser.rb +27 -0
- data/test/html/test_builder.rb +78 -0
- data/test/html/test_document.rb +86 -0
- data/test/test_convert_xpath.rb +180 -0
- data/test/test_nokogiri.rb +36 -0
- data/test/test_reader.rb +222 -0
- data/test/test_xslt_transforms.rb +29 -0
- data/test/xml/sax/test_parser.rb +93 -0
- data/test/xml/test_builder.rb +16 -0
- data/test/xml/test_cdata.rb +18 -0
- data/test/xml/test_document.rb +171 -0
- data/test/xml/test_dtd.rb +43 -0
- data/test/xml/test_node.rb +223 -0
- data/test/xml/test_node_set.rb +116 -0
- data/test/xml/test_text.rb +13 -0
- metadata +214 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', "helper"))
|
|
2
|
+
|
|
3
|
+
module Nokogiri
|
|
4
|
+
module HTML
|
|
5
|
+
module SAX
|
|
6
|
+
class TestParser < Nokogiri::SAX::TestCase
|
|
7
|
+
def setup
|
|
8
|
+
@parser = HTML::SAX::Parser.new(Doc.new)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_parse_file
|
|
12
|
+
@parser.parse_file(HTML_FILE)
|
|
13
|
+
assert_equal 1110, @parser.document.end_elements.length
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_parse_document
|
|
17
|
+
@parser.parse_memory(<<-eoxml)
|
|
18
|
+
<p>Paragraph 1</p>
|
|
19
|
+
<p>Paragraph 2</p>
|
|
20
|
+
eoxml
|
|
21
|
+
assert_equal([["html", []], ["body", []], ["p", []], ["p", []]],
|
|
22
|
+
@parser.document.start_elements)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
|
|
2
|
+
|
|
3
|
+
module Nokogiri
|
|
4
|
+
module HTML
|
|
5
|
+
class TestBuilder < Nokogiri::TestCase
|
|
6
|
+
def test_hash_as_attributes
|
|
7
|
+
builder = Nokogiri::HTML::Builder.new do
|
|
8
|
+
div(:id => 'awesome') {
|
|
9
|
+
h1 "america"
|
|
10
|
+
}
|
|
11
|
+
end
|
|
12
|
+
assert_equal('<div id="awesome"><h1>america</h1></div>',
|
|
13
|
+
builder.to_html.gsub(/\n/, ''))
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_has_ampersand
|
|
17
|
+
builder = Nokogiri::HTML::Builder.new do
|
|
18
|
+
div.rad.thing! {
|
|
19
|
+
text "<awe&some>"
|
|
20
|
+
b "hello & world"
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
assert_equal(
|
|
24
|
+
'<div class="rad" id="thing"><awe&some><b>hello & world</b></div>',
|
|
25
|
+
builder.to_html.gsub(/\n/, ''))
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_multi_tags
|
|
29
|
+
builder = Nokogiri::HTML::Builder.new do
|
|
30
|
+
div.rad.thing! {
|
|
31
|
+
text "<awesome>"
|
|
32
|
+
b "hello"
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
assert_equal(
|
|
36
|
+
'<div class="rad" id="thing"><awesome><b>hello</b></div>',
|
|
37
|
+
builder.doc.to_html.gsub(/\n/, ''))
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_attributes_plus_block
|
|
41
|
+
builder = Nokogiri::HTML::Builder.new do
|
|
42
|
+
div.rad.thing! {
|
|
43
|
+
text "<awesome>"
|
|
44
|
+
}
|
|
45
|
+
end
|
|
46
|
+
assert_equal('<div class="rad" id="thing"><awesome></div>',
|
|
47
|
+
builder.doc.to_html.chomp)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_builder_adds_attributes
|
|
51
|
+
builder = Nokogiri::HTML::Builder.new do
|
|
52
|
+
div.rad.thing! "tender div"
|
|
53
|
+
end
|
|
54
|
+
assert_equal('<div class="rad" id="thing">tender div</div>',
|
|
55
|
+
builder.doc.to_html.chomp)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_bold_tag
|
|
59
|
+
builder = Nokogiri::HTML::Builder.new do
|
|
60
|
+
b "bold tag"
|
|
61
|
+
end
|
|
62
|
+
assert_equal('<b>bold tag</b>', builder.doc.to_html.chomp)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_html_then_body_tag
|
|
66
|
+
builder = Nokogiri::HTML::Builder.new do
|
|
67
|
+
html {
|
|
68
|
+
body {
|
|
69
|
+
b "bold tag"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
end
|
|
73
|
+
assert_equal('<html><body><b>bold tag</b></body></html>',
|
|
74
|
+
builder.doc.to_html.chomp)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
|
|
2
|
+
|
|
3
|
+
module Nokogiri
|
|
4
|
+
module HTML
|
|
5
|
+
class TestDocument < Nokogiri::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
@html = Nokogiri::HTML.parse(File.read(HTML_FILE))
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_HTML_function
|
|
11
|
+
html = Nokogiri::HTML(File.read(HTML_FILE))
|
|
12
|
+
assert html.html?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_fragment
|
|
16
|
+
node_set = Nokogiri::HTML.fragment(<<-eohtml)
|
|
17
|
+
<div>
|
|
18
|
+
<b>Hello World</b>
|
|
19
|
+
</div>
|
|
20
|
+
eohtml
|
|
21
|
+
assert_equal 1, node_set.length
|
|
22
|
+
assert_equal 'div', node_set.first.name
|
|
23
|
+
assert_match(/Hello World/, node_set.to_html)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_relative_css_finder
|
|
27
|
+
doc = Nokogiri::HTML(<<-eohtml)
|
|
28
|
+
<html>
|
|
29
|
+
<body>
|
|
30
|
+
<div class="red">
|
|
31
|
+
<p>
|
|
32
|
+
inside red
|
|
33
|
+
</p>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="green">
|
|
36
|
+
<p>
|
|
37
|
+
inside green
|
|
38
|
+
</p>
|
|
39
|
+
</div>
|
|
40
|
+
</body>
|
|
41
|
+
</html>
|
|
42
|
+
eohtml
|
|
43
|
+
red_divs = doc.css('div.red')
|
|
44
|
+
assert_equal 1, red_divs.length
|
|
45
|
+
p_tags = red_divs.first.css('p')
|
|
46
|
+
assert_equal 1, p_tags.length
|
|
47
|
+
assert_equal 'inside red', p_tags.first.text.strip
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_find_classes
|
|
51
|
+
doc = Nokogiri::HTML(<<-eohtml)
|
|
52
|
+
<html>
|
|
53
|
+
<body>
|
|
54
|
+
<p class="red">RED</p>
|
|
55
|
+
<p class="awesome red">RED</p>
|
|
56
|
+
<p class="notred">GREEN</p>
|
|
57
|
+
<p class="green notred">GREEN</p>
|
|
58
|
+
</body>
|
|
59
|
+
</html>
|
|
60
|
+
eohtml
|
|
61
|
+
list = doc.css('.red')
|
|
62
|
+
assert_equal 2, list.length
|
|
63
|
+
assert_equal %w{ RED RED }, list.map { |x| x.text }
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_parse_can_take_io
|
|
67
|
+
html = nil
|
|
68
|
+
File.open(HTML_FILE, 'rb') { |f|
|
|
69
|
+
html = Nokogiri::HTML(f)
|
|
70
|
+
}
|
|
71
|
+
assert html.html?
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_html?
|
|
75
|
+
assert !@html.xml?
|
|
76
|
+
assert @html.html?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_serialize
|
|
80
|
+
assert @html.serialize
|
|
81
|
+
assert @html.to_html
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'rubygems'
|
|
5
|
+
require 'hpricot'
|
|
6
|
+
HAS_HPRICOT = true
|
|
7
|
+
rescue LoadError
|
|
8
|
+
HAS_HPRICOT = false
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class TestConvertXPath < Nokogiri::TestCase
|
|
12
|
+
|
|
13
|
+
def setup
|
|
14
|
+
@N = Nokogiri(File.read(HTML_FILE))
|
|
15
|
+
@NH = Nokogiri.Hpricot(File.read(HTML_FILE)) # decorated document
|
|
16
|
+
@H = Hpricot(File.read(HTML_FILE)) if HAS_HPRICOT
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def assert_syntactical_equivalence(hpath, xpath, match, &blk)
|
|
20
|
+
blk ||= lambda {|j| j.first}
|
|
21
|
+
assert_equal match, blk.call(@N.search(xpath)), "xpath result did not match"
|
|
22
|
+
if HAS_HPRICOT
|
|
23
|
+
assert_equal match, blk.call(@H.search(hpath)), "hpath result did not match"
|
|
24
|
+
end
|
|
25
|
+
assert_equal [xpath], @NH.convert_to_xpath(hpath), "converted hpath did not match xpath"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_ordinary_xpath_conversions
|
|
29
|
+
assert_equal(".//p", @NH.convert_to_xpath("p").first)
|
|
30
|
+
assert_equal(".//p", @NH.convert_to_xpath(:p).first)
|
|
31
|
+
assert_equal(".//p", @NH.convert_to_xpath("//p").first)
|
|
32
|
+
assert_equal(".//p", @NH.convert_to_xpath(".//p").first)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_child_tag
|
|
36
|
+
assert_syntactical_equivalence("h1[a]", ".//h1[child::a]", "Tender Lovemaking") do |j|
|
|
37
|
+
j.inner_text
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_child_tag_equals
|
|
42
|
+
assert_syntactical_equivalence("h1[a='Tender Lovemaking']", ".//h1[child::a = 'Tender Lovemaking']", "Tender Lovemaking") do |j|
|
|
43
|
+
j.inner_text
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_filter_contains
|
|
48
|
+
assert_syntactical_equivalence("title:contains('Tender')", ".//title[contains(., 'Tender')]",
|
|
49
|
+
"Tender Lovemaking ") do |j|
|
|
50
|
+
j.inner_text
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_filter_comment
|
|
55
|
+
assert_syntactical_equivalence("div comment()[2]", ".//div//comment()[position() = 2]", "<!-- end of header -->") do |j|
|
|
56
|
+
j.first.to_s
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_filter_text
|
|
61
|
+
assert_syntactical_equivalence("a[text()]", ".//a[normalize-space(child::text())]", "<a href=\"http://tenderlovemaking.com\">Tender Lovemaking</a>") do |j|
|
|
62
|
+
j.first.to_s
|
|
63
|
+
end
|
|
64
|
+
assert_syntactical_equivalence("a[text()='Tender Lovemaking']", ".//a[normalize-space(child::text()) = 'Tender Lovemaking']", "<a href=\"http://tenderlovemaking.com\">Tender Lovemaking</a>") do |j|
|
|
65
|
+
j.first.to_s
|
|
66
|
+
end
|
|
67
|
+
assert_syntactical_equivalence("a/text()", ".//a/child::text()", "Tender Lovemaking") do |j|
|
|
68
|
+
j.first.to_s
|
|
69
|
+
end
|
|
70
|
+
assert_syntactical_equivalence("h2//a[text()!='Back Home!']", ".//h2//a[normalize-space(child::text()) != 'Back Home!']", "Meow meow meow meow meow") do |j|
|
|
71
|
+
j.first.inner_text
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_filter_by_attr
|
|
76
|
+
assert_syntactical_equivalence("a[@href='http://blog.geminigeek.com/wordpress-theme']",
|
|
77
|
+
".//a[@href = 'http://blog.geminigeek.com/wordpress-theme']",
|
|
78
|
+
"http://blog.geminigeek.com/wordpress-theme") do |j|
|
|
79
|
+
j.first["href"]
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_css_id
|
|
84
|
+
assert_syntactical_equivalence("#linkcat-7", ".//*[@id = 'linkcat-7']", "linkcat-7") do |j|
|
|
85
|
+
j.first["id"]
|
|
86
|
+
end
|
|
87
|
+
assert_syntactical_equivalence("li#linkcat-7", ".//li[@id = 'linkcat-7']", "linkcat-7") do |j|
|
|
88
|
+
j.first["id"]
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def test_css_class
|
|
93
|
+
assert_syntactical_equivalence(".cat-item-15", ".//*[contains(concat(' ', @class, ' '), ' cat-item-15 ')]",
|
|
94
|
+
"cat-item cat-item-15") do |j|
|
|
95
|
+
j.first["class"]
|
|
96
|
+
end
|
|
97
|
+
assert_syntactical_equivalence("li.cat-item-15", ".//li[contains(concat(' ', @class, ' '), ' cat-item-15 ')]",
|
|
98
|
+
"cat-item cat-item-15") do |j|
|
|
99
|
+
j.first["class"]
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def test_css_tags
|
|
104
|
+
assert_syntactical_equivalence("div li a", ".//div//li//a", "http://brobinius.org/") do |j|
|
|
105
|
+
j.first.inner_text
|
|
106
|
+
end
|
|
107
|
+
assert_syntactical_equivalence("div li > a", ".//div//li/a", "http://brobinius.org/") do |j|
|
|
108
|
+
j.first.inner_text
|
|
109
|
+
end
|
|
110
|
+
assert_syntactical_equivalence("h1 ~ small", ".//small[preceding-sibling::h1]", "The act of making love, tenderly.") do |j|
|
|
111
|
+
j.first.inner_text
|
|
112
|
+
end
|
|
113
|
+
assert_syntactical_equivalence("h1 ~ small", ".//small[preceding-sibling::h1]", "The act of making love, tenderly.") do |j|
|
|
114
|
+
j.first.inner_text
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_positional
|
|
119
|
+
##
|
|
120
|
+
# we are intentionally NOT staying compatible with nth-and-friends, as Hpricot has an OB1 bug.
|
|
121
|
+
#
|
|
122
|
+
# assert_syntactical_equivalence("div > div:eq(0)", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n") do |j|
|
|
123
|
+
# j.first.inner_text
|
|
124
|
+
# end
|
|
125
|
+
# assert_syntactical_equivalence("div/div:eq(0)", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n") do |j|
|
|
126
|
+
# j.first.inner_text
|
|
127
|
+
# end
|
|
128
|
+
# assert_syntactical_equivalence("div/div:nth(0)", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n") do |j|
|
|
129
|
+
# j.first.inner_text
|
|
130
|
+
# end
|
|
131
|
+
# assert_syntactical_equivalence("div/div:nth-of-type(0)", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n") do |j|
|
|
132
|
+
# j.first.inner_text
|
|
133
|
+
# end
|
|
134
|
+
assert_syntactical_equivalence("div/div:first()", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n".gsub(/[\r\n]/, '')) do |j|
|
|
135
|
+
j.first.inner_text.gsub(/[\r\n]/, '')
|
|
136
|
+
end
|
|
137
|
+
assert_syntactical_equivalence("div/div:first", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n".gsub(/[\r\n]/, '')) do |j|
|
|
138
|
+
j.first.inner_text.gsub(/[\r\n]/, '')
|
|
139
|
+
end
|
|
140
|
+
assert_syntactical_equivalence("div//a:last()", ".//div//a[position() = last()]", "Wordpress") do |j|
|
|
141
|
+
j.last.inner_text
|
|
142
|
+
end
|
|
143
|
+
assert_syntactical_equivalence("div//a:last", ".//div//a[position() = last()]", "Wordpress") do |j|
|
|
144
|
+
j.last.inner_text
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_multiple_filters
|
|
149
|
+
assert_syntactical_equivalence("a[@rel='bookmark'][1]", ".//a[@rel = 'bookmark' and position() = 1]", "Back Home!") do |j|
|
|
150
|
+
j.first.inner_text
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
##
|
|
155
|
+
# 'and' is not supported by hpricot
|
|
156
|
+
# def test_and
|
|
157
|
+
# assert_syntactical_equivalence("div[h1 and small]", ".//div[h1 and small]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n") do |j|
|
|
158
|
+
# j.inner_text
|
|
159
|
+
# end
|
|
160
|
+
# end
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
# TODO:
|
|
165
|
+
# doc/'title ~ link' -> links that are siblings of title
|
|
166
|
+
# doc/'p[@class~="final"]' -> class includes string (whitespacy)
|
|
167
|
+
# doc/'p[text()*="final"]' -> class includes string (index) (broken: always returns true?)
|
|
168
|
+
# doc/'p[text()$="final"]' -> /final$/
|
|
169
|
+
# doc/'p[text()|="final"]' -> /^final$/
|
|
170
|
+
# doc/'p[text()^="final"]' -> string starts with 'final
|
|
171
|
+
# nth_first
|
|
172
|
+
# nth_last
|
|
173
|
+
# even
|
|
174
|
+
# odd
|
|
175
|
+
# first-child, nth-child, last-child, nth-last-child, nth-last-of-type
|
|
176
|
+
# only-of-type, only-child
|
|
177
|
+
# parent
|
|
178
|
+
# empty
|
|
179
|
+
# root
|
|
180
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
|
|
2
|
+
|
|
3
|
+
class TestNokogiri < Nokogiri::TestCase
|
|
4
|
+
def test_xml?
|
|
5
|
+
doc = Nokogiri.parse(File.read(XML_FILE))
|
|
6
|
+
assert doc.xml?
|
|
7
|
+
assert !doc.html?
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_html?
|
|
11
|
+
doc = Nokogiri.parse(File.read(HTML_FILE))
|
|
12
|
+
assert !doc.xml?
|
|
13
|
+
assert doc.html?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_nokogiri_method_with_html
|
|
17
|
+
doc1 = Nokogiri(File.read(HTML_FILE))
|
|
18
|
+
doc2 = Nokogiri.parse(File.read(HTML_FILE))
|
|
19
|
+
assert_equal doc1.serialize, doc2.serialize
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_nokogiri_method_with_block
|
|
23
|
+
doc = Nokogiri { b "bold tag" }
|
|
24
|
+
assert_equal('<b>bold tag</b>', doc.to_html.chomp)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_make_with_html
|
|
28
|
+
doc = Nokogiri.make("<b>bold tag</b>")
|
|
29
|
+
assert_equal('<b>bold tag</b>', doc.to_html.chomp)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_make_with_block
|
|
33
|
+
doc = Nokogiri.make { b "bold tag" }
|
|
34
|
+
assert_equal('<b>bold tag</b>', doc.to_html.chomp)
|
|
35
|
+
end
|
|
36
|
+
end
|
data/test/test_reader.rb
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
|
|
3
|
+
|
|
4
|
+
class TestReader < Nokogiri::TestCase
|
|
5
|
+
def test_default?
|
|
6
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
7
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
|
8
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
|
9
|
+
</x>
|
|
10
|
+
eoxml
|
|
11
|
+
assert_equal false, reader.default?
|
|
12
|
+
assert_equal [false, false, false, false, false, false, false],
|
|
13
|
+
reader.map { |x| x.default? }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_value?
|
|
17
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
18
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
|
19
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
|
20
|
+
</x>
|
|
21
|
+
eoxml
|
|
22
|
+
assert_equal false, reader.value?
|
|
23
|
+
assert_equal [false, true, false, true, false, true, false],
|
|
24
|
+
reader.map { |x| x.value? }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_attributes?
|
|
28
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
29
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
|
30
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
|
31
|
+
</x>
|
|
32
|
+
eoxml
|
|
33
|
+
assert_equal false, reader.attributes?
|
|
34
|
+
assert_equal [true, false, true, false, true, false, true],
|
|
35
|
+
reader.map { |x| x.attributes? }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_attributes
|
|
39
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
40
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'
|
|
41
|
+
xmlns='http://mothership.connection.com/'
|
|
42
|
+
>
|
|
43
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
|
44
|
+
</x>
|
|
45
|
+
eoxml
|
|
46
|
+
assert_equal({}, reader.attributes)
|
|
47
|
+
assert_equal [{'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
|
|
48
|
+
'xmlns'=>'http://mothership.connection.com/'},
|
|
49
|
+
{}, {"awesome"=>"true"}, {}, {"awesome"=>"true"}, {},
|
|
50
|
+
{'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
|
|
51
|
+
'xmlns'=>'http://mothership.connection.com/'}],
|
|
52
|
+
reader.map { |x| x.attributes }
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_attribute_roundtrip
|
|
56
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
57
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'
|
|
58
|
+
xmlns='http://mothership.connection.com/'
|
|
59
|
+
>
|
|
60
|
+
<tenderlove:foo awesome='true' size='giant'>snuggles!</tenderlove:foo>
|
|
61
|
+
</x>
|
|
62
|
+
eoxml
|
|
63
|
+
reader.each do |node|
|
|
64
|
+
node.attributes.each do |key, value|
|
|
65
|
+
assert_equal value, node.attribute(key)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_attribute_at
|
|
71
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
72
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
|
73
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
|
74
|
+
</x>
|
|
75
|
+
eoxml
|
|
76
|
+
assert_nil reader.attribute_at(nil)
|
|
77
|
+
assert_nil reader.attribute_at(0)
|
|
78
|
+
assert_equal ['http://tenderlovemaking.com/', nil, 'true', nil, 'true', nil, 'http://tenderlovemaking.com/'],
|
|
79
|
+
reader.map { |x| x.attribute_at(0) }
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_attribute
|
|
83
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
84
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
|
85
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
|
86
|
+
</x>
|
|
87
|
+
eoxml
|
|
88
|
+
assert_nil reader.attribute(nil)
|
|
89
|
+
assert_nil reader.attribute('awesome')
|
|
90
|
+
assert_equal [nil, nil, 'true', nil, 'true', nil, nil],
|
|
91
|
+
reader.map { |x| x.attribute('awesome') }
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_attribute_length
|
|
95
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
96
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
|
97
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
|
98
|
+
</x>
|
|
99
|
+
eoxml
|
|
100
|
+
assert_equal 0, reader.attribute_count
|
|
101
|
+
assert_equal [1, 0, 1, 0, 0, 0, 0], reader.map { |x| x.attribute_count }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_depth
|
|
105
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
106
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
|
107
|
+
<tenderlove:foo>snuggles!</tenderlove:foo>
|
|
108
|
+
</x>
|
|
109
|
+
eoxml
|
|
110
|
+
assert_equal 0, reader.depth
|
|
111
|
+
assert_equal [0, 1, 1, 2, 1, 1, 0], reader.map { |x| x.depth }
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_encoding
|
|
115
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
116
|
+
<awesome>
|
|
117
|
+
<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
|
|
118
|
+
<p xml:lang="ja">日本語が上手です</p>
|
|
119
|
+
</awesome>
|
|
120
|
+
eoxml
|
|
121
|
+
assert_nil reader.encoding
|
|
122
|
+
assert_equal [nil], reader.map { |x| x.encoding }.uniq
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def test_xml_version
|
|
126
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
127
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
|
128
|
+
<tenderlove:foo>snuggles!</tenderlove:foo>
|
|
129
|
+
</x>
|
|
130
|
+
eoxml
|
|
131
|
+
assert_nil reader.xml_version
|
|
132
|
+
assert_equal ['1.0'], reader.map { |x| x.xml_version }.uniq
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def test_lang
|
|
136
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
137
|
+
<awesome>
|
|
138
|
+
<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
|
|
139
|
+
<p xml:lang="ja">日本語が上手です</p>
|
|
140
|
+
</awesome>
|
|
141
|
+
eoxml
|
|
142
|
+
assert_nil reader.lang
|
|
143
|
+
assert_equal [nil, nil, "en", "en", "en", nil, "ja", "ja", "ja", nil, nil],
|
|
144
|
+
reader.map { |x| x.lang }
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def test_value
|
|
148
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
149
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
|
150
|
+
<tenderlove:foo>snuggles!</tenderlove:foo>
|
|
151
|
+
</x>
|
|
152
|
+
eoxml
|
|
153
|
+
assert_nil reader.value
|
|
154
|
+
assert_equal [nil, "\n ", nil, "snuggles!", nil, "\n ", nil],
|
|
155
|
+
reader.map { |x| x.value }
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def test_prefix
|
|
159
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
160
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
|
161
|
+
<edi:foo>hello</edi:foo>
|
|
162
|
+
</x>
|
|
163
|
+
eoxml
|
|
164
|
+
assert_nil reader.prefix
|
|
165
|
+
assert_equal [nil, nil, "edi", nil, "edi", nil, nil],
|
|
166
|
+
reader.map { |n| n.prefix }
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def test_state
|
|
170
|
+
reader = Nokogiri::XML::Reader.from_memory('<foo>bar</bar>')
|
|
171
|
+
assert reader.state
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def test_ns_uri
|
|
175
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
176
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
|
177
|
+
<edi:foo>hello</edi:foo>
|
|
178
|
+
</x>
|
|
179
|
+
eoxml
|
|
180
|
+
assert_nil reader.namespace_uri
|
|
181
|
+
assert_equal([nil,
|
|
182
|
+
nil,
|
|
183
|
+
"http://ecommerce.example.org/schema",
|
|
184
|
+
nil,
|
|
185
|
+
"http://ecommerce.example.org/schema",
|
|
186
|
+
nil,
|
|
187
|
+
nil],
|
|
188
|
+
reader.map { |n| n.namespace_uri })
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def test_local_name
|
|
192
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
193
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
|
194
|
+
<edi:foo>hello</edi:foo>
|
|
195
|
+
</x>
|
|
196
|
+
eoxml
|
|
197
|
+
assert_nil reader.local_name
|
|
198
|
+
assert_equal(["x", "#text", "foo", "#text", "foo", "#text", "x"],
|
|
199
|
+
reader.map { |n| n.local_name })
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def test_name
|
|
203
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
|
204
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
|
205
|
+
<edi:foo>hello</edi:foo>
|
|
206
|
+
</x>
|
|
207
|
+
eoxml
|
|
208
|
+
assert_nil reader.name
|
|
209
|
+
assert_equal(["x", "#text", "edi:foo", "#text", "edi:foo", "#text", "x"],
|
|
210
|
+
reader.map { |n| n.name })
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def test_read_from_memory
|
|
214
|
+
called = false
|
|
215
|
+
reader = Nokogiri::XML::Reader.from_memory('<foo>bar</foo>')
|
|
216
|
+
reader.each do |node|
|
|
217
|
+
called = true
|
|
218
|
+
assert node
|
|
219
|
+
end
|
|
220
|
+
assert called
|
|
221
|
+
end
|
|
222
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
|
|
2
|
+
|
|
3
|
+
class TestXsltTransforms < Nokogiri::TestCase
|
|
4
|
+
def test_transform
|
|
5
|
+
assert doc = Nokogiri::XML.parse(File.read(XML_FILE))
|
|
6
|
+
assert doc.xml?
|
|
7
|
+
|
|
8
|
+
assert style = Nokogiri::XSLT.parse(File.read(XSLT_FILE))
|
|
9
|
+
|
|
10
|
+
assert result = style.apply_to(doc, ['title', '"Booyah"'])
|
|
11
|
+
assert_match %r{<h1>Booyah</h1>}, result
|
|
12
|
+
assert_match %r{<th.*Employee ID</th>}, result
|
|
13
|
+
assert_match %r{<th.*Name</th>}, result
|
|
14
|
+
assert_match %r{<th.*Position</th>}, result
|
|
15
|
+
assert_match %r{<th.*Salary</th>}, result
|
|
16
|
+
assert_match %r{<td>EMP0003</td>}, result
|
|
17
|
+
assert_match %r{<td>Margaret Martin</td>}, result
|
|
18
|
+
assert_match %r{<td>Computer Specialist</td>}, result
|
|
19
|
+
assert_match %r{<td>100,000</td>}, result
|
|
20
|
+
assert_no_match %r{Dallas|Texas}, result
|
|
21
|
+
assert_no_match %r{Female}, result
|
|
22
|
+
|
|
23
|
+
assert result = style.apply_to(doc, ['title', '"Grandma"'])
|
|
24
|
+
assert_match %r{<h1>Grandma</h1>}, result
|
|
25
|
+
|
|
26
|
+
assert result = style.apply_to(doc)
|
|
27
|
+
assert_match %r{<h1></h1>}, result
|
|
28
|
+
end
|
|
29
|
+
end
|