nokogiri 1.5.10 → 1.10.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (182) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-DEPENDENCIES.md +1614 -0
  3. data/LICENSE.md +9 -0
  4. data/README.md +198 -0
  5. data/bin/nokogiri +50 -10
  6. data/dependencies.yml +72 -0
  7. data/ext/nokogiri/extconf.rb +634 -92
  8. data/ext/nokogiri/html_document.c +8 -8
  9. data/ext/nokogiri/html_element_description.c +15 -15
  10. data/ext/nokogiri/html_entity_lookup.c +1 -1
  11. data/ext/nokogiri/html_sax_parser_context.c +4 -4
  12. data/ext/nokogiri/html_sax_push_parser.c +2 -2
  13. data/ext/nokogiri/nokogiri.c +20 -12
  14. data/ext/nokogiri/nokogiri.h +1 -44
  15. data/ext/nokogiri/xml_attr.c +34 -25
  16. data/ext/nokogiri/xml_cdata.c +12 -6
  17. data/ext/nokogiri/xml_comment.c +18 -3
  18. data/ext/nokogiri/xml_document.c +64 -32
  19. data/ext/nokogiri/xml_dtd.c +2 -2
  20. data/ext/nokogiri/xml_encoding_handler.c +3 -3
  21. data/ext/nokogiri/xml_entity_reference.c +1 -1
  22. data/ext/nokogiri/xml_io.c +11 -6
  23. data/ext/nokogiri/xml_namespace.c +50 -17
  24. data/ext/nokogiri/xml_namespace.h +3 -2
  25. data/ext/nokogiri/xml_node.c +459 -240
  26. data/ext/nokogiri/xml_node_set.c +166 -147
  27. data/ext/nokogiri/xml_node_set.h +2 -4
  28. data/ext/nokogiri/xml_processing_instruction.c +2 -2
  29. data/ext/nokogiri/xml_reader.c +6 -19
  30. data/ext/nokogiri/xml_sax_parser.c +11 -13
  31. data/ext/nokogiri/xml_sax_parser_context.c +41 -1
  32. data/ext/nokogiri/xml_sax_push_parser.c +56 -12
  33. data/ext/nokogiri/xml_schema.c +1 -1
  34. data/ext/nokogiri/xml_syntax_error.c +11 -5
  35. data/ext/nokogiri/xml_syntax_error.h +1 -1
  36. data/ext/nokogiri/xml_text.c +1 -1
  37. data/ext/nokogiri/xml_xpath_context.c +17 -38
  38. data/ext/nokogiri/xslt_stylesheet.c +10 -10
  39. data/lib/nokogiri/css/node.rb +0 -50
  40. data/lib/nokogiri/css/parser.rb +263 -233
  41. data/lib/nokogiri/css/parser.y +54 -40
  42. data/lib/nokogiri/css/tokenizer.rb +104 -103
  43. data/lib/nokogiri/css/tokenizer.rex +5 -5
  44. data/lib/nokogiri/css/xpath_visitor.rb +78 -19
  45. data/lib/nokogiri/decorators/slop.rb +12 -5
  46. data/lib/nokogiri/html/document.rb +102 -21
  47. data/lib/nokogiri/html/document_fragment.rb +11 -3
  48. data/lib/nokogiri/html/sax/parser.rb +12 -2
  49. data/lib/nokogiri/html/sax/push_parser.rb +22 -2
  50. data/lib/nokogiri/version.rb +40 -22
  51. data/lib/nokogiri/xml/builder.rb +34 -31
  52. data/lib/nokogiri/xml/document.rb +20 -14
  53. data/lib/nokogiri/xml/document_fragment.rb +50 -2
  54. data/lib/nokogiri/xml/dtd.rb +14 -4
  55. data/lib/nokogiri/xml/entity_reference.rb +18 -0
  56. data/lib/nokogiri/xml/node.rb +148 -203
  57. data/lib/nokogiri/xml/node_set.rb +139 -123
  58. data/lib/nokogiri/xml/parse_options.rb +22 -0
  59. data/lib/nokogiri/xml/sax/document.rb +1 -1
  60. data/lib/nokogiri/xml/sax/parser.rb +7 -8
  61. data/lib/nokogiri/xml/searchable.rb +230 -0
  62. data/lib/nokogiri/xml/syntax_error.rb +24 -1
  63. data/lib/nokogiri/xml.rb +3 -1
  64. data/lib/nokogiri.rb +40 -24
  65. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +78 -0
  66. data/patches/libxml2/0002-Remove-script-macro-support.patch +40 -0
  67. data/patches/libxml2/0003-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  68. data/patches/libxslt/0001-Fix-security-framework-bypass.patch +120 -0
  69. data/ports/archives/libxml2-2.9.9.tar.gz +0 -0
  70. data/ports/archives/libxslt-1.1.33.tar.gz +0 -0
  71. metadata +252 -388
  72. data/.autotest +0 -26
  73. data/.gemtest +0 -0
  74. data/CHANGELOG.ja.rdoc +0 -785
  75. data/CHANGELOG.rdoc +0 -783
  76. data/C_CODING_STYLE.rdoc +0 -33
  77. data/Manifest.txt +0 -303
  78. data/README.ja.rdoc +0 -106
  79. data/README.rdoc +0 -175
  80. data/ROADMAP.md +0 -90
  81. data/Rakefile +0 -228
  82. data/STANDARD_RESPONSES.md +0 -47
  83. data/Y_U_NO_GEMSPEC.md +0 -155
  84. data/build_all +0 -105
  85. data/tasks/cross_compile.rb +0 -150
  86. data/tasks/nokogiri.org.rb +0 -24
  87. data/tasks/test.rb +0 -95
  88. data/test/css/test_nthiness.rb +0 -159
  89. data/test/css/test_parser.rb +0 -341
  90. data/test/css/test_tokenizer.rb +0 -198
  91. data/test/css/test_xpath_visitor.rb +0 -91
  92. data/test/decorators/test_slop.rb +0 -16
  93. data/test/files/2ch.html +0 -108
  94. data/test/files/address_book.rlx +0 -12
  95. data/test/files/address_book.xml +0 -10
  96. data/test/files/bar/bar.xsd +0 -4
  97. data/test/files/dont_hurt_em_why.xml +0 -422
  98. data/test/files/encoding.html +0 -82
  99. data/test/files/encoding.xhtml +0 -84
  100. data/test/files/exslt.xml +0 -8
  101. data/test/files/exslt.xslt +0 -35
  102. data/test/files/foo/foo.xsd +0 -4
  103. data/test/files/metacharset.html +0 -10
  104. data/test/files/noencoding.html +0 -47
  105. data/test/files/po.xml +0 -32
  106. data/test/files/po.xsd +0 -66
  107. data/test/files/shift_jis.html +0 -10
  108. data/test/files/shift_jis.xml +0 -5
  109. data/test/files/snuggles.xml +0 -3
  110. data/test/files/staff.dtd +0 -10
  111. data/test/files/staff.xml +0 -59
  112. data/test/files/staff.xslt +0 -32
  113. data/test/files/test_document_url/bar.xml +0 -2
  114. data/test/files/test_document_url/document.dtd +0 -4
  115. data/test/files/test_document_url/document.xml +0 -6
  116. data/test/files/tlm.html +0 -850
  117. data/test/files/to_be_xincluded.xml +0 -2
  118. data/test/files/valid_bar.xml +0 -2
  119. data/test/files/xinclude.xml +0 -4
  120. data/test/helper.rb +0 -154
  121. data/test/html/sax/test_parser.rb +0 -141
  122. data/test/html/sax/test_parser_context.rb +0 -46
  123. data/test/html/test_builder.rb +0 -164
  124. data/test/html/test_document.rb +0 -552
  125. data/test/html/test_document_encoding.rb +0 -138
  126. data/test/html/test_document_fragment.rb +0 -261
  127. data/test/html/test_element_description.rb +0 -105
  128. data/test/html/test_named_characters.rb +0 -14
  129. data/test/html/test_node.rb +0 -196
  130. data/test/html/test_node_encoding.rb +0 -27
  131. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  132. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  133. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  134. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -66
  135. data/test/test_convert_xpath.rb +0 -135
  136. data/test/test_css_cache.rb +0 -45
  137. data/test/test_encoding_handler.rb +0 -46
  138. data/test/test_memory_leak.rb +0 -156
  139. data/test/test_nokogiri.rb +0 -132
  140. data/test/test_reader.rb +0 -555
  141. data/test/test_soap4r_sax.rb +0 -52
  142. data/test/test_xslt_transforms.rb +0 -254
  143. data/test/xml/node/test_save_options.rb +0 -28
  144. data/test/xml/node/test_subclass.rb +0 -44
  145. data/test/xml/sax/test_parser.rb +0 -366
  146. data/test/xml/sax/test_parser_context.rb +0 -106
  147. data/test/xml/sax/test_push_parser.rb +0 -157
  148. data/test/xml/test_attr.rb +0 -64
  149. data/test/xml/test_attribute_decl.rb +0 -86
  150. data/test/xml/test_builder.rb +0 -306
  151. data/test/xml/test_c14n.rb +0 -151
  152. data/test/xml/test_cdata.rb +0 -48
  153. data/test/xml/test_comment.rb +0 -29
  154. data/test/xml/test_document.rb +0 -828
  155. data/test/xml/test_document_encoding.rb +0 -28
  156. data/test/xml/test_document_fragment.rb +0 -223
  157. data/test/xml/test_dtd.rb +0 -103
  158. data/test/xml/test_dtd_encoding.rb +0 -33
  159. data/test/xml/test_element_content.rb +0 -56
  160. data/test/xml/test_element_decl.rb +0 -73
  161. data/test/xml/test_entity_decl.rb +0 -122
  162. data/test/xml/test_entity_reference.rb +0 -245
  163. data/test/xml/test_namespace.rb +0 -95
  164. data/test/xml/test_node.rb +0 -1137
  165. data/test/xml/test_node_attributes.rb +0 -96
  166. data/test/xml/test_node_encoding.rb +0 -107
  167. data/test/xml/test_node_inheritance.rb +0 -32
  168. data/test/xml/test_node_reparenting.rb +0 -374
  169. data/test/xml/test_node_set.rb +0 -755
  170. data/test/xml/test_parse_options.rb +0 -64
  171. data/test/xml/test_processing_instruction.rb +0 -30
  172. data/test/xml/test_reader_encoding.rb +0 -142
  173. data/test/xml/test_relax_ng.rb +0 -60
  174. data/test/xml/test_schema.rb +0 -103
  175. data/test/xml/test_syntax_error.rb +0 -12
  176. data/test/xml/test_text.rb +0 -45
  177. data/test/xml/test_unparented_node.rb +0 -422
  178. data/test/xml/test_xinclude.rb +0 -83
  179. data/test/xml/test_xpath.rb +0 -295
  180. data/test/xslt/test_custom_functions.rb +0 -133
  181. data/test/xslt/test_exception_handling.rb +0 -37
  182. data/test_all +0 -81
@@ -1,2 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <included>this snippet is to be included from xinclude.xml</included>
@@ -1,2 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <bar />
@@ -1,4 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <test xmlns:xi="http://www.w3.org/2001/XInclude">
3
- <xi:include href="to_be_xincluded.xml"/>
4
- </test>
data/test/helper.rb DELETED
@@ -1,154 +0,0 @@
1
- #Process.setrlimit(Process::RLIMIT_CORE, Process::RLIM_INFINITY) unless RUBY_PLATFORM =~ /(java|mswin|mingw)/i
2
- $VERBOSE = true
3
- require 'minitest/autorun'
4
- require 'minitest/pride'
5
- require 'fileutils'
6
- require 'tempfile'
7
- require 'pp'
8
-
9
- require 'nokogiri'
10
-
11
- warn "#{__FILE__}:#{__LINE__}: version info: #{Nokogiri::VERSION_INFO.inspect}"
12
-
13
- module Nokogiri
14
- class TestCase < MiniTest::Spec
15
- ASSETS_DIR = File.expand_path File.join(File.dirname(__FILE__), 'files')
16
- ADDRESS_SCHEMA_FILE = File.join(ASSETS_DIR, 'address_book.rlx')
17
- ADDRESS_XML_FILE = File.join(ASSETS_DIR, 'address_book.xml')
18
- ENCODING_HTML_FILE = File.join(ASSETS_DIR, 'encoding.html')
19
- ENCODING_XHTML_FILE = File.join(ASSETS_DIR, 'encoding.xhtml')
20
- EXML_FILE = File.join(ASSETS_DIR, 'exslt.xml')
21
- EXSLT_FILE = File.join(ASSETS_DIR, 'exslt.xslt')
22
- HTML_FILE = File.join(ASSETS_DIR, 'tlm.html')
23
- METACHARSET_FILE = File.join(ASSETS_DIR, 'metacharset.html')
24
- NICH_FILE = File.join(ASSETS_DIR, '2ch.html')
25
- NOENCODING_FILE = File.join(ASSETS_DIR, 'noencoding.html')
26
- PO_SCHEMA_FILE = File.join(ASSETS_DIR, 'po.xsd')
27
- PO_XML_FILE = File.join(ASSETS_DIR, 'po.xml')
28
- SHIFT_JIS_HTML = File.join(ASSETS_DIR, 'shift_jis.html')
29
- SHIFT_JIS_XML = File.join(ASSETS_DIR, 'shift_jis.xml')
30
- SNUGGLES_FILE = File.join(ASSETS_DIR, 'snuggles.xml')
31
- XML_FILE = File.join(ASSETS_DIR, 'staff.xml')
32
- XML_XINCLUDE_FILE = File.join(ASSETS_DIR, 'xinclude.xml')
33
- XSLT_FILE = File.join(ASSETS_DIR, 'staff.xslt')
34
-
35
- def teardown
36
- if ENV['NOKOGIRI_GC']
37
- STDOUT.putc '!'
38
- if RUBY_PLATFORM =~ /java/
39
- require 'java'
40
- java.lang.System.gc
41
- else
42
- GC.start
43
- end
44
- end
45
- end
46
-
47
- def assert_indent amount, doc, message = nil
48
- nodes = []
49
- doc.traverse do |node|
50
- nodes << node if node.text? && node.blank?
51
- end
52
- assert nodes.length > 0
53
- nodes.each do |node|
54
- len = node.content.gsub(/[\r\n]/, '').length
55
- assert_equal(0, len % amount, message)
56
- end
57
- end
58
-
59
- def util_decorate(document, decorator_module)
60
- document.decorators(XML::Node) << decorator_module
61
- document.decorators(XML::NodeSet) << decorator_module
62
- document.decorate!
63
- end
64
-
65
- #
66
- # Test::Unit backwards compatibility section
67
- #
68
- alias :assert_no_match :refute_match
69
- alias :assert_not_nil :refute_nil
70
- alias :assert_raise :assert_raises
71
- alias :assert_not_equal :refute_equal
72
- end
73
-
74
- module SAX
75
- class TestCase < Nokogiri::TestCase
76
- class Doc < XML::SAX::Document
77
- attr_reader :start_elements, :start_document_called
78
- attr_reader :end_elements, :end_document_called
79
- attr_reader :data, :comments, :cdata_blocks, :start_elements_namespace
80
- attr_reader :errors, :warnings, :end_elements_namespace
81
- attr_reader :xmldecls
82
- attr_reader :processing_instructions
83
-
84
- def xmldecl version, encoding, standalone
85
- @xmldecls = [version, encoding, standalone].compact
86
- super
87
- end
88
-
89
- def start_document
90
- @start_document_called = true
91
- super
92
- end
93
-
94
- def end_document
95
- @end_document_called = true
96
- super
97
- end
98
-
99
- def error error
100
- (@errors ||= []) << error
101
- super
102
- end
103
-
104
- def warning warning
105
- (@warning ||= []) << warning
106
- super
107
- end
108
-
109
- def start_element *args
110
- (@start_elements ||= []) << args
111
- super
112
- end
113
-
114
- def start_element_namespace *args
115
- (@start_elements_namespace ||= []) << args
116
- super
117
- end
118
-
119
- def end_element *args
120
- (@end_elements ||= []) << args
121
- super
122
- end
123
-
124
- def end_element_namespace *args
125
- (@end_elements_namespace ||= []) << args
126
- super
127
- end
128
-
129
- def characters string
130
- @data ||= []
131
- @data += [string]
132
- super
133
- end
134
-
135
- def comment string
136
- @comments ||= []
137
- @comments += [string]
138
- super
139
- end
140
-
141
- def cdata_block string
142
- @cdata_blocks ||= []
143
- @cdata_blocks += [string]
144
- super
145
- end
146
-
147
- def processing_instruction name, content
148
- @processing_instructions ||= []
149
- @processing_instructions << [name, content]
150
- end
151
- end
152
- end
153
- end
154
- end
@@ -1,141 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- require "helper"
3
-
4
- module Nokogiri
5
- module HTML
6
- module SAX
7
- class TestParser < Nokogiri::SAX::TestCase
8
- def setup
9
- super
10
- @parser = HTML::SAX::Parser.new(Doc.new)
11
- end
12
-
13
- def test_parse_empty_document
14
- # This caused a segfault in libxml 2.6.x
15
- assert_nil @parser.parse ''
16
- end
17
-
18
- def test_parse_empty_file
19
- # Make sure empty files don't break stuff
20
- empty_file_name = File.join(ASSETS_DIR, 'bogus.xml')
21
- # assert_nothing_raised do
22
- @parser.parse_file empty_file_name
23
- # end
24
- end
25
-
26
- def test_parse_file
27
- @parser.parse_file(HTML_FILE)
28
-
29
- # Take a look at the comment in test_parse_document to know
30
- # a possible reason to this difference.
31
- if Nokogiri.uses_libxml?
32
- assert_equal 1110, @parser.document.end_elements.length
33
- else
34
- assert_equal 1119, @parser.document.end_elements.length
35
- end
36
- end
37
-
38
- def test_parse_file_nil_argument
39
- assert_raises(ArgumentError) {
40
- @parser.parse_file(nil)
41
- }
42
- end
43
-
44
- def test_parse_file_non_existant
45
- assert_raise Errno::ENOENT do
46
- @parser.parse_file('there_is_no_reasonable_way_this_file_exists')
47
- end
48
- end
49
-
50
- def test_parse_file_with_dir
51
- assert_raise Errno::EISDIR do
52
- @parser.parse_file(File.dirname(__FILE__))
53
- end
54
- end
55
-
56
- def test_parse_memory_nil
57
- assert_raise ArgumentError do
58
- @parser.parse_memory(nil)
59
- end
60
- end
61
-
62
- def test_parse_force_encoding
63
- @parser.parse_memory(<<-HTML, 'UTF-8')
64
- <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
65
- Информация
66
- HTML
67
- assert_equal("Информация",
68
- @parser.document.data.join.strip)
69
- end
70
-
71
- def test_parse_document
72
- @parser.parse_memory(<<-eoxml)
73
- <p>Paragraph 1</p>
74
- <p>Paragraph 2</p>
75
- eoxml
76
-
77
- # JRuby version is different because of the internal implementation
78
- # JRuby version uses NekoHTML which inserts empty "head" elements.
79
- #
80
- # Currently following features are set:
81
- # "http://cyberneko.org/html/properties/names/elems" => "lower"
82
- # "http://cyberneko.org/html/properties/names/attrs" => "lower"
83
- if Nokogiri.uses_libxml?
84
- assert_equal([["html", []], ["body", []], ["p", []], ["p", []]],
85
- @parser.document.start_elements)
86
- else
87
- assert_equal([["html", []], ["head", []], ["body", []], ["p", []], ["p", []]],
88
- @parser.document.start_elements)
89
- end
90
- end
91
-
92
- def test_parser_attributes
93
- html = <<-eohtml
94
- <html>
95
- <head>
96
- <title>hello</title>
97
- </head>
98
- <body>
99
- <img src="face.jpg" title="daddy &amp; me">
100
- <hr noshade size="2">
101
- </body>
102
- </html>
103
- eohtml
104
-
105
- block_called = false
106
- @parser.parse(html) { |ctx|
107
- block_called = true
108
- ctx.replace_entities = true
109
- }
110
-
111
- assert block_called
112
-
113
- noshade_value = if Nokogiri.uses_libxml? && Nokogiri::VERSION_INFO['libxml']['loaded'] < '2.7.7'
114
- ['noshade', 'noshade']
115
- else
116
- ['noshade', nil]
117
- end
118
-
119
- assert_equal [
120
- ['html', []],
121
- ['head', []],
122
- ['title', []],
123
- ['body', []],
124
- ['img', [
125
- ['src', 'face.jpg'],
126
- ['title', 'daddy & me']
127
- ]],
128
- ['hr', [
129
- noshade_value,
130
- ['size', '2']
131
- ]]
132
- ], @parser.document.start_elements
133
- end
134
-
135
- def test_empty_processing_instruction
136
- @parser.parse_memory("<strong>this will segfault<?strong>")
137
- end
138
- end
139
- end
140
- end
141
- end
@@ -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,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">&lt;awe&amp;some&gt;<b>hello &amp; 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">&lt;awesome&gt;<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">&lt;awesome&gt;</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