nokogiri 1.9.0.rc1 → 1.9.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.
- checksums.yaml +4 -4
- data/lib/nokogiri/css/parser.rb +61 -61
- data/lib/nokogiri/version.rb +1 -1
- metadata +4 -146
- data/.autotest +0 -22
- data/.cross_rubies +0 -8
- data/.editorconfig +0 -17
- data/.gemtest +0 -0
- data/.travis.yml +0 -63
- data/CHANGELOG.md +0 -1402
- data/CONTRIBUTING.md +0 -42
- data/C_CODING_STYLE.rdoc +0 -33
- data/Gemfile +0 -23
- data/Gemfile-libxml-ruby +0 -3
- data/Manifest.txt +0 -371
- data/ROADMAP.md +0 -111
- data/Rakefile +0 -358
- data/SECURITY.md +0 -19
- data/STANDARD_RESPONSES.md +0 -47
- data/Y_U_NO_GEMSPEC.md +0 -155
- data/appveyor.yml +0 -29
- data/build_all +0 -48
- data/patches/sort-patches-by-date +0 -25
- data/suppressions/README.txt +0 -1
- data/suppressions/nokogiri_ruby-2.supp +0 -10
- data/tasks/test.rb +0 -100
- data/test/css/test_nthiness.rb +0 -226
- data/test/css/test_parser.rb +0 -386
- data/test/css/test_tokenizer.rb +0 -215
- data/test/css/test_xpath_visitor.rb +0 -96
- data/test/decorators/test_slop.rb +0 -23
- data/test/files/2ch.html +0 -108
- data/test/files/GH_1042.html +0 -18
- data/test/files/address_book.rlx +0 -12
- data/test/files/address_book.xml +0 -10
- data/test/files/atom.xml +0 -344
- data/test/files/bar/bar.xsd +0 -4
- data/test/files/bogus.xml +0 -0
- data/test/files/dont_hurt_em_why.xml +0 -422
- data/test/files/encoding.html +0 -82
- data/test/files/encoding.xhtml +0 -84
- data/test/files/exslt.xml +0 -8
- data/test/files/exslt.xslt +0 -35
- data/test/files/foo/foo.xsd +0 -4
- data/test/files/metacharset.html +0 -10
- data/test/files/namespace_pressure_test.xml +0 -1684
- data/test/files/noencoding.html +0 -47
- data/test/files/po.xml +0 -32
- data/test/files/po.xsd +0 -66
- data/test/files/saml/saml20assertion_schema.xsd +0 -283
- data/test/files/saml/saml20protocol_schema.xsd +0 -302
- data/test/files/saml/xenc_schema.xsd +0 -146
- data/test/files/saml/xmldsig_schema.xsd +0 -318
- data/test/files/shift_jis.html +0 -10
- data/test/files/shift_jis.xml +0 -5
- data/test/files/shift_jis_no_charset.html +0 -9
- data/test/files/slow-xpath.xml +0 -25509
- data/test/files/snuggles.xml +0 -3
- data/test/files/staff.dtd +0 -10
- data/test/files/staff.xml +0 -59
- data/test/files/staff.xslt +0 -32
- data/test/files/test_document_url/bar.xml +0 -2
- data/test/files/test_document_url/document.dtd +0 -4
- data/test/files/test_document_url/document.xml +0 -6
- data/test/files/tlm.html +0 -851
- data/test/files/to_be_xincluded.xml +0 -2
- data/test/files/valid_bar.xml +0 -2
- data/test/files/xinclude.xml +0 -4
- data/test/helper.rb +0 -271
- data/test/html/sax/test_parser.rb +0 -168
- data/test/html/sax/test_parser_context.rb +0 -46
- data/test/html/sax/test_parser_text.rb +0 -163
- data/test/html/sax/test_push_parser.rb +0 -87
- data/test/html/test_attributes.rb +0 -85
- data/test/html/test_builder.rb +0 -164
- data/test/html/test_document.rb +0 -722
- data/test/html/test_document_encoding.rb +0 -143
- data/test/html/test_document_fragment.rb +0 -310
- data/test/html/test_element_description.rb +0 -105
- data/test/html/test_named_characters.rb +0 -14
- data/test/html/test_node.rb +0 -212
- data/test/html/test_node_encoding.rb +0 -91
- data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
- data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
- data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
- data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
- data/test/namespaces/test_namespaces_preservation.rb +0 -31
- data/test/test_convert_xpath.rb +0 -135
- data/test/test_css_cache.rb +0 -47
- data/test/test_encoding_handler.rb +0 -48
- data/test/test_memory_leak.rb +0 -226
- data/test/test_nokogiri.rb +0 -138
- data/test/test_soap4r_sax.rb +0 -52
- data/test/test_xslt_transforms.rb +0 -314
- data/test/xml/node/test_save_options.rb +0 -28
- data/test/xml/node/test_subclass.rb +0 -44
- data/test/xml/sax/test_parser.rb +0 -402
- data/test/xml/sax/test_parser_context.rb +0 -115
- data/test/xml/sax/test_parser_text.rb +0 -202
- data/test/xml/sax/test_push_parser.rb +0 -265
- data/test/xml/test_attr.rb +0 -96
- data/test/xml/test_attribute_decl.rb +0 -86
- data/test/xml/test_builder.rb +0 -353
- data/test/xml/test_c14n.rb +0 -180
- data/test/xml/test_cdata.rb +0 -54
- data/test/xml/test_comment.rb +0 -40
- data/test/xml/test_document.rb +0 -982
- data/test/xml/test_document_encoding.rb +0 -31
- data/test/xml/test_document_fragment.rb +0 -312
- data/test/xml/test_dtd.rb +0 -187
- data/test/xml/test_dtd_encoding.rb +0 -31
- data/test/xml/test_element_content.rb +0 -56
- data/test/xml/test_element_decl.rb +0 -73
- data/test/xml/test_entity_decl.rb +0 -122
- data/test/xml/test_entity_reference.rb +0 -262
- data/test/xml/test_namespace.rb +0 -96
- data/test/xml/test_node.rb +0 -1379
- data/test/xml/test_node_attributes.rb +0 -115
- data/test/xml/test_node_encoding.rb +0 -75
- data/test/xml/test_node_inheritance.rb +0 -32
- data/test/xml/test_node_reparenting.rb +0 -661
- data/test/xml/test_node_set.rb +0 -828
- data/test/xml/test_parse_options.rb +0 -64
- data/test/xml/test_processing_instruction.rb +0 -30
- data/test/xml/test_reader.rb +0 -620
- data/test/xml/test_reader_encoding.rb +0 -134
- data/test/xml/test_relax_ng.rb +0 -60
- data/test/xml/test_schema.rb +0 -142
- data/test/xml/test_syntax_error.rb +0 -36
- data/test/xml/test_text.rb +0 -69
- data/test/xml/test_unparented_node.rb +0 -483
- data/test/xml/test_xinclude.rb +0 -83
- data/test/xml/test_xpath.rb +0 -470
- data/test/xslt/test_custom_functions.rb +0 -133
- data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,46 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
module Nokogiri
|
6
|
-
module HTML
|
7
|
-
module SAX
|
8
|
-
class TestParserContext < Nokogiri::SAX::TestCase
|
9
|
-
def test_from_io
|
10
|
-
ctx = ParserContext.new StringIO.new('fo'), 'UTF-8'
|
11
|
-
assert ctx
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_from_string
|
15
|
-
ctx = ParserContext.new 'blah blah'
|
16
|
-
assert ctx
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_parse_with
|
20
|
-
ctx = ParserContext.new 'blah'
|
21
|
-
assert_raises ArgumentError do
|
22
|
-
ctx.parse_with nil
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_parse_with_sax_parser
|
27
|
-
# assert_nothing_raised do
|
28
|
-
xml = "<root />"
|
29
|
-
ctx = ParserContext.new xml
|
30
|
-
parser = Parser.new Doc.new
|
31
|
-
ctx.parse_with parser
|
32
|
-
# end
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_from_file
|
36
|
-
# assert_nothing_raised do
|
37
|
-
ctx = ParserContext.file HTML_FILE, 'UTF-8'
|
38
|
-
parser = Parser.new Doc.new
|
39
|
-
ctx.parse_with parser
|
40
|
-
# end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
@@ -1,163 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
require "helper"
|
3
|
-
|
4
|
-
module Nokogiri
|
5
|
-
module HTML
|
6
|
-
module SAX
|
7
|
-
class TestParserText < Nokogiri::SAX::TestCase
|
8
|
-
def setup
|
9
|
-
super
|
10
|
-
@doc = DocWithOrderedItems.new
|
11
|
-
@parser = HTML::SAX::Parser.new @doc
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_texts_order
|
15
|
-
html = <<-eohtml
|
16
|
-
<!DOCTYPE html>
|
17
|
-
<html>
|
18
|
-
<head></head>
|
19
|
-
<body>
|
20
|
-
text 0
|
21
|
-
<p>
|
22
|
-
text 1
|
23
|
-
<span>text 2</span>
|
24
|
-
text 3
|
25
|
-
</p>
|
26
|
-
|
27
|
-
text 4
|
28
|
-
<!--
|
29
|
-
text 5
|
30
|
-
-->
|
31
|
-
|
32
|
-
<p>
|
33
|
-
<!-- text 6 -->
|
34
|
-
<span><!-- text 7 --></span>
|
35
|
-
<!-- text 8 -->
|
36
|
-
</p>
|
37
|
-
|
38
|
-
<!-- text 9 -->
|
39
|
-
</body>
|
40
|
-
</html>
|
41
|
-
eohtml
|
42
|
-
|
43
|
-
@parser.parse html
|
44
|
-
items = @doc.items.get_root_content "body"
|
45
|
-
items = items.select_methods [
|
46
|
-
:start_element, :end_element,
|
47
|
-
:characters, :comment
|
48
|
-
]
|
49
|
-
items.strip_text! [:characters, :comment]
|
50
|
-
|
51
|
-
assert_equal [
|
52
|
-
[:characters, 'text 0'],
|
53
|
-
|
54
|
-
[:start_element, 'p', []],
|
55
|
-
[:characters, 'text 1'],
|
56
|
-
|
57
|
-
[:start_element, 'span', []],
|
58
|
-
[:characters, 'text 2'],
|
59
|
-
[:end_element, 'span'],
|
60
|
-
|
61
|
-
[:characters, 'text 3'],
|
62
|
-
[:end_element, 'p'],
|
63
|
-
|
64
|
-
[:characters, 'text 4'],
|
65
|
-
[:comment, 'text 5'],
|
66
|
-
[:characters, ''],
|
67
|
-
|
68
|
-
[:start_element, 'p', []],
|
69
|
-
[:characters, ''],
|
70
|
-
[:comment, 'text 6'],
|
71
|
-
[:characters, ''],
|
72
|
-
|
73
|
-
[:start_element, 'span', []],
|
74
|
-
[:comment, 'text 7'],
|
75
|
-
[:end_element, 'span'],
|
76
|
-
[:characters, ''],
|
77
|
-
|
78
|
-
[:comment, 'text 8'],
|
79
|
-
[:characters, ''],
|
80
|
-
[:end_element, 'p'],
|
81
|
-
[:characters, ''],
|
82
|
-
|
83
|
-
[:comment, 'text 9'],
|
84
|
-
[:characters, '']
|
85
|
-
], items
|
86
|
-
|
87
|
-
nil
|
88
|
-
end
|
89
|
-
|
90
|
-
def text_whitespace
|
91
|
-
html = <<-eohtml
|
92
|
-
<!DOCTYPE html>
|
93
|
-
<html>
|
94
|
-
<head></head>
|
95
|
-
<body>
|
96
|
-
<p>
|
97
|
-
<span></span>
|
98
|
-
<span> </span>
|
99
|
-
<span>
|
100
|
-
|
101
|
-
</span>
|
102
|
-
</p>
|
103
|
-
<p>
|
104
|
-
<!---->
|
105
|
-
<!-- -->
|
106
|
-
<!--
|
107
|
-
|
108
|
-
-->
|
109
|
-
</p>
|
110
|
-
</body>
|
111
|
-
</html>
|
112
|
-
eohtml
|
113
|
-
|
114
|
-
@parser.parse html
|
115
|
-
items = @doc.items.get_root_content "body"
|
116
|
-
items = items.select_methods [
|
117
|
-
:start_element, :end_element,
|
118
|
-
:characters, :comment
|
119
|
-
]
|
120
|
-
items.strip_text! [:characters, :comment]
|
121
|
-
|
122
|
-
assert_equal [
|
123
|
-
[:characters, ''],
|
124
|
-
[:start_element, 'p', []],
|
125
|
-
|
126
|
-
[:characters, ''],
|
127
|
-
[:start_element, 'span', []],
|
128
|
-
[:end_element, 'span'],
|
129
|
-
[:characters, ''],
|
130
|
-
|
131
|
-
[:start_element, 'span', []],
|
132
|
-
[:characters, ''],
|
133
|
-
[:end_element, 'span'],
|
134
|
-
[:characters, ''],
|
135
|
-
|
136
|
-
[:start_element, 'span', []],
|
137
|
-
[:characters, ''],
|
138
|
-
[:end_element, 'span'],
|
139
|
-
[:characters, ''],
|
140
|
-
|
141
|
-
[:end_element, 'p'],
|
142
|
-
[:characters, ''],
|
143
|
-
|
144
|
-
[:start_element, 'p', []],
|
145
|
-
[:characters, ''],
|
146
|
-
|
147
|
-
[:comment, ''],
|
148
|
-
[:characters, ''],
|
149
|
-
[:comment, ''],
|
150
|
-
[:characters, ''],
|
151
|
-
[:comment, ''],
|
152
|
-
[:characters, ''],
|
153
|
-
|
154
|
-
[:end_element, 'p'],
|
155
|
-
[:characters, '']
|
156
|
-
], items
|
157
|
-
|
158
|
-
nil
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
module Nokogiri
|
6
|
-
module HTML
|
7
|
-
module SAX
|
8
|
-
class TestPushParser < Nokogiri::SAX::TestCase
|
9
|
-
def setup
|
10
|
-
super
|
11
|
-
@parser = HTML::SAX::PushParser.new(Doc.new)
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_end_document_called
|
15
|
-
@parser.<<(<<-eoxml)
|
16
|
-
<p id="asdfasdf">
|
17
|
-
<!-- This is a comment -->
|
18
|
-
Paragraph 1
|
19
|
-
</p>
|
20
|
-
eoxml
|
21
|
-
assert ! @parser.document.end_document_called
|
22
|
-
@parser.finish
|
23
|
-
assert @parser.document.end_document_called
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_start_element
|
27
|
-
@parser.<<(<<-eoxml)
|
28
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
29
|
-
<html><head><body><p id="asdfasdf">
|
30
|
-
eoxml
|
31
|
-
|
32
|
-
assert_equal [["html", []], ["head", []], ["body", []], ["p", [["id", "asdfasdf"]]]],
|
33
|
-
@parser.document.start_elements
|
34
|
-
|
35
|
-
@parser.<<(<<-eoxml)
|
36
|
-
<!-- This is a comment -->
|
37
|
-
Paragraph 1
|
38
|
-
</p></body></html>
|
39
|
-
eoxml
|
40
|
-
assert_equal [' This is a comment '], @parser.document.comments
|
41
|
-
@parser.finish
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
def test_chevron_partial_html
|
46
|
-
@parser.<<(<<-eoxml)
|
47
|
-
<p id="asdfasdf">
|
48
|
-
eoxml
|
49
|
-
|
50
|
-
@parser.<<(<<-eoxml)
|
51
|
-
<!-- This is a comment -->
|
52
|
-
Paragraph 1
|
53
|
-
</p>
|
54
|
-
eoxml
|
55
|
-
assert_equal [' This is a comment '], @parser.document.comments
|
56
|
-
@parser.finish
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_chevron
|
60
|
-
@parser.<<(<<-eoxml)
|
61
|
-
<p id="asdfasdf">
|
62
|
-
<!-- This is a comment -->
|
63
|
-
Paragraph 1
|
64
|
-
</p>
|
65
|
-
eoxml
|
66
|
-
@parser.finish
|
67
|
-
assert_equal [' This is a comment '], @parser.document.comments
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_default_options
|
71
|
-
assert_equal 0, @parser.options
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_broken_encoding
|
75
|
-
skip("ultra hard to fix for pure Java version") if Nokogiri.jruby?
|
76
|
-
@parser.options |= XML::ParseOptions::RECOVER
|
77
|
-
# This is ISO_8859-1:
|
78
|
-
@parser.<< "<?xml version='1.0' encoding='UTF-8'?><r>Gau\337</r>"
|
79
|
-
@parser.finish
|
80
|
-
assert(@parser.document.errors.size >= 1)
|
81
|
-
assert_equal "Gau\337", @parser.document.data.join
|
82
|
-
assert_equal [["r"], ["body"], ["html"]], @parser.document.end_elements
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
@@ -1,85 +0,0 @@
|
|
1
|
-
require "helper"
|
2
|
-
|
3
|
-
module Nokogiri
|
4
|
-
module HTML
|
5
|
-
class TestAttr < Nokogiri::TestCase
|
6
|
-
unless Nokogiri::VersionInfo.instance.libxml2? && Nokogiri::VersionInfo.instance.libxml2_using_system?
|
7
|
-
#
|
8
|
-
# libxml2 >= 2.9.2 fails to escape comments within some attributes. It
|
9
|
-
# wants to ensure these comments can be treated as "server-side includes",
|
10
|
-
# but as a result fails to ensure that serialization is well-formed,
|
11
|
-
# resulting in an opportunity for XSS injection of code into a final
|
12
|
-
# re-parsed document (presumably in a browser).
|
13
|
-
#
|
14
|
-
# the offending commit is:
|
15
|
-
#
|
16
|
-
# https://github.com/GNOME/libxml2/commit/960f0e2
|
17
|
-
#
|
18
|
-
# we'll test this by parsing the HTML, serializing it, then
|
19
|
-
# re-parsing it to ensure there isn't any ambiguity in the output
|
20
|
-
# that might allow code injection into a browser consuming
|
21
|
-
# "sanitized" output.
|
22
|
-
#
|
23
|
-
# complaints have been made upstream about this behavior, notably at
|
24
|
-
#
|
25
|
-
# https://bugzilla.gnome.org/show_bug.cgi?id=769760
|
26
|
-
#
|
27
|
-
# and multiple CVEs have been declared and fixed in downstream
|
28
|
-
# libraries as a result, a list is being kept up to date here:
|
29
|
-
#
|
30
|
-
# https://github.com/flavorjones/loofah/issues/144
|
31
|
-
#
|
32
|
-
[
|
33
|
-
#
|
34
|
-
# these tags and attributes are determined by the code at:
|
35
|
-
#
|
36
|
-
# https://git.gnome.org/browse/libxml2/tree/HTMLtree.c?h=v2.9.2#n714
|
37
|
-
#
|
38
|
-
{tag: "a", attr: "href"},
|
39
|
-
{tag: "div", attr: "href"},
|
40
|
-
{tag: "a", attr: "action"},
|
41
|
-
{tag: "div", attr: "action"},
|
42
|
-
{tag: "a", attr: "src"},
|
43
|
-
{tag: "div", attr: "src"},
|
44
|
-
{tag: "a", attr: "name"},
|
45
|
-
#
|
46
|
-
# note that div+name is _not_ affected by the libxml2 issue.
|
47
|
-
# but we test it anyway to ensure our logic isn't modifying
|
48
|
-
# attributes that don't need modifying.
|
49
|
-
#
|
50
|
-
{tag: "div", attr: "name", unescaped: true},
|
51
|
-
].each do |config|
|
52
|
-
|
53
|
-
define_method "test_uri_escaping_of_#{config[:attr]}_attr_in_#{config[:tag]}_tag" do
|
54
|
-
html = %{<#{config[:tag]} #{config[:attr]}='examp<!--" unsafeattr=unsafevalue()>-->le.com'>test</#{config[:tag]}>}
|
55
|
-
|
56
|
-
reparsed = HTML.fragment(HTML.fragment(html).to_html)
|
57
|
-
attributes = reparsed.at_css(config[:tag]).attribute_nodes
|
58
|
-
|
59
|
-
assert_equal [config[:attr]], attributes.collect(&:name)
|
60
|
-
if Nokogiri::VersionInfo.instance.libxml2?
|
61
|
-
if config[:unescaped]
|
62
|
-
#
|
63
|
-
# this attribute was emitted wrapped in single-quotes, so a double quote is A-OK.
|
64
|
-
# assert that this attribute's serialization is unaffected.
|
65
|
-
#
|
66
|
-
assert_equal %{examp<!--" unsafeattr=unsafevalue()>-->le.com}, attributes.first.value
|
67
|
-
else
|
68
|
-
#
|
69
|
-
# let's match the behavior in libxml < 2.9.2.
|
70
|
-
# test that this attribute's serialization is well-formed and sanitized.
|
71
|
-
#
|
72
|
-
assert_equal %{examp<!--%22%20unsafeattr=unsafevalue()>-->le.com}, attributes.first.value
|
73
|
-
end
|
74
|
-
else
|
75
|
-
#
|
76
|
-
# yay for consistency in javaland. move along, nothing to see here.
|
77
|
-
#
|
78
|
-
assert_equal %{examp<!--%22 unsafeattr=unsafevalue()>-->le.com}, attributes.first.value
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
data/test/html/test_builder.rb
DELETED
@@ -1,164 +0,0 @@
|
|
1
|
-
require "helper"
|
2
|
-
|
3
|
-
module Nokogiri
|
4
|
-
module HTML
|
5
|
-
class TestBuilder < Nokogiri::TestCase
|
6
|
-
def test_top_level_function_builds
|
7
|
-
foo = nil
|
8
|
-
Nokogiri() { |xml| foo = xml }
|
9
|
-
assert_instance_of Nokogiri::HTML::Builder, foo
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_builder_with_explicit_tags
|
13
|
-
html_doc = Nokogiri::HTML::Builder.new {
|
14
|
-
div.slide(:class => 'another_class') {
|
15
|
-
node = Nokogiri::XML::Node.new("id", doc)
|
16
|
-
node.content = "hello"
|
17
|
-
insert(node)
|
18
|
-
}
|
19
|
-
}.doc
|
20
|
-
assert_equal 1, html_doc.css('div.slide > id').length
|
21
|
-
assert_equal 'hello', html_doc.at('div.slide > id').content
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_hash_as_attributes_for_attribute_method
|
25
|
-
html = Nokogiri::HTML::Builder.new { ||
|
26
|
-
div.slide(:class => 'another_class') {
|
27
|
-
span 'Slide 1'
|
28
|
-
}
|
29
|
-
}.to_html
|
30
|
-
assert_match 'class="slide another_class"', html
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_hash_as_attributes
|
34
|
-
builder = Nokogiri::HTML::Builder.new do
|
35
|
-
div(:id => 'awesome') {
|
36
|
-
h1 "america"
|
37
|
-
}
|
38
|
-
end
|
39
|
-
assert_equal('<div id="awesome"><h1>america</h1></div>',
|
40
|
-
builder.doc.root.to_html.gsub(/\n/, '').gsub(/>\s*</, '><'))
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_href_with_attributes
|
44
|
-
uri = 'http://tenderlovemaking.com/'
|
45
|
-
built = Nokogiri::XML::Builder.new {
|
46
|
-
div {
|
47
|
-
a('King Khan & The Shrines', :href => uri)
|
48
|
-
}
|
49
|
-
}
|
50
|
-
assert_equal 'http://tenderlovemaking.com/',
|
51
|
-
built.doc.at('a')[:href]
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_tag_nesting
|
55
|
-
builder = Nokogiri::HTML::Builder.new do
|
56
|
-
body {
|
57
|
-
span.left ''
|
58
|
-
span.middle {
|
59
|
-
div.icon ''
|
60
|
-
}
|
61
|
-
span.right ''
|
62
|
-
}
|
63
|
-
end
|
64
|
-
assert node = builder.doc.css('span.right').first
|
65
|
-
assert_equal 'middle', node.previous_sibling['class']
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_has_ampersand
|
69
|
-
builder = Nokogiri::HTML::Builder.new do
|
70
|
-
div.rad.thing! {
|
71
|
-
text "<awe&some>"
|
72
|
-
b "hello & world"
|
73
|
-
}
|
74
|
-
end
|
75
|
-
assert_equal(
|
76
|
-
'<div class="rad" id="thing"><awe&some><b>hello & world</b></div>',
|
77
|
-
builder.doc.root.to_html.gsub(/\n/, ''))
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_multi_tags
|
81
|
-
builder = Nokogiri::HTML::Builder.new do
|
82
|
-
div.rad.thing! {
|
83
|
-
text "<awesome>"
|
84
|
-
b "hello"
|
85
|
-
}
|
86
|
-
end
|
87
|
-
assert_equal(
|
88
|
-
'<div class="rad" id="thing"><awesome><b>hello</b></div>',
|
89
|
-
builder.doc.root.to_html.gsub(/\n/, ''))
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_attributes_plus_block
|
93
|
-
builder = Nokogiri::HTML::Builder.new do
|
94
|
-
div.rad.thing! {
|
95
|
-
text "<awesome>"
|
96
|
-
}
|
97
|
-
end
|
98
|
-
assert_equal('<div class="rad" id="thing"><awesome></div>',
|
99
|
-
builder.doc.root.to_html.chomp)
|
100
|
-
end
|
101
|
-
|
102
|
-
def test_builder_adds_attributes
|
103
|
-
builder = Nokogiri::HTML::Builder.new do
|
104
|
-
div.rad.thing! "tender div"
|
105
|
-
end
|
106
|
-
assert_equal('<div class="rad" id="thing">tender div</div>',
|
107
|
-
builder.doc.root.to_html.chomp)
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_bold_tag
|
111
|
-
builder = Nokogiri::HTML::Builder.new do
|
112
|
-
b "bold tag"
|
113
|
-
end
|
114
|
-
assert_equal('<b>bold tag</b>', builder.doc.root.to_html.chomp)
|
115
|
-
end
|
116
|
-
|
117
|
-
def test_html_then_body_tag
|
118
|
-
builder = Nokogiri::HTML::Builder.new do
|
119
|
-
html {
|
120
|
-
body {
|
121
|
-
b "bold tag"
|
122
|
-
}
|
123
|
-
}
|
124
|
-
end
|
125
|
-
assert_equal('<html><body><b>bold tag</b></body></html>',
|
126
|
-
builder.doc.root.to_html.chomp.gsub(/>\s*</, '><'))
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_instance_eval_with_delegation_to_block_context
|
130
|
-
class << self
|
131
|
-
def foo
|
132
|
-
"foo!"
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
builder = Nokogiri::HTML::Builder.new { text foo }
|
137
|
-
assert builder.to_html.include?("foo!")
|
138
|
-
end
|
139
|
-
|
140
|
-
def test_builder_with_param
|
141
|
-
doc = Nokogiri::HTML::Builder.new { |html|
|
142
|
-
html.body {
|
143
|
-
html.p "hello world"
|
144
|
-
}
|
145
|
-
}.doc
|
146
|
-
|
147
|
-
assert node = doc.xpath('//body/p').first
|
148
|
-
assert_equal 'hello world', node.content
|
149
|
-
end
|
150
|
-
|
151
|
-
def test_builder_with_id
|
152
|
-
text = "hello world"
|
153
|
-
doc = Nokogiri::HTML::Builder.new { |html|
|
154
|
-
html.body {
|
155
|
-
html.id_ text
|
156
|
-
}
|
157
|
-
}.doc
|
158
|
-
|
159
|
-
assert node = doc.xpath('//body/id').first
|
160
|
-
assert_equal text, node.content
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|