nokogiri 1.2.3-x86-mswin32-60 → 1.4.5-x86-mswin32-60
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 +18 -7
- data/.gemtest +0 -0
- data/CHANGELOG.ja.rdoc +297 -3
- data/CHANGELOG.rdoc +289 -0
- data/Manifest.txt +148 -37
- data/README.ja.rdoc +20 -20
- data/README.rdoc +53 -22
- data/Rakefile +127 -211
- data/bin/nokogiri +54 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +89 -54
- data/ext/nokogiri/html_document.c +34 -27
- data/ext/nokogiri/html_document.h +1 -1
- data/ext/nokogiri/html_element_description.c +276 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.c +7 -5
- data/ext/nokogiri/html_entity_lookup.h +1 -1
- data/ext/nokogiri/html_sax_parser_context.c +94 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
- data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
- data/ext/nokogiri/xml_attr.c +20 -9
- data/ext/nokogiri/xml_attr.h +1 -1
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +21 -9
- data/ext/nokogiri/xml_cdata.h +1 -1
- data/ext/nokogiri/xml_comment.c +18 -6
- data/ext/nokogiri/xml_comment.h +1 -1
- data/ext/nokogiri/xml_document.c +247 -68
- data/ext/nokogiri/xml_document.h +5 -3
- data/ext/nokogiri/xml_document_fragment.c +15 -7
- data/ext/nokogiri/xml_document_fragment.h +1 -1
- data/ext/nokogiri/xml_dtd.c +110 -10
- data/ext/nokogiri/xml_dtd.h +3 -1
- data/ext/nokogiri/xml_element_content.c +123 -0
- data/ext/nokogiri/xml_element_content.h +10 -0
- data/ext/nokogiri/xml_element_decl.c +69 -0
- data/ext/nokogiri/xml_element_decl.h +9 -0
- data/ext/nokogiri/xml_encoding_handler.c +79 -0
- data/ext/nokogiri/xml_encoding_handler.h +8 -0
- data/ext/nokogiri/xml_entity_decl.c +110 -0
- data/ext/nokogiri/xml_entity_decl.h +10 -0
- data/ext/nokogiri/xml_entity_reference.c +16 -5
- data/ext/nokogiri/xml_entity_reference.h +1 -1
- data/ext/nokogiri/xml_io.c +40 -8
- data/ext/nokogiri/xml_io.h +2 -1
- data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
- data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
- data/ext/nokogiri/xml_namespace.c +84 -0
- data/ext/nokogiri/xml_namespace.h +13 -0
- data/ext/nokogiri/xml_node.c +782 -225
- data/ext/nokogiri/xml_node.h +2 -4
- data/ext/nokogiri/xml_node_set.c +253 -34
- data/ext/nokogiri/xml_node_set.h +2 -2
- data/ext/nokogiri/xml_processing_instruction.c +17 -5
- data/ext/nokogiri/xml_processing_instruction.h +1 -1
- data/ext/nokogiri/xml_reader.c +277 -85
- data/ext/nokogiri/xml_reader.h +1 -1
- data/ext/nokogiri/xml_relax_ng.c +168 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +183 -111
- data/ext/nokogiri/xml_sax_parser.h +30 -1
- data/ext/nokogiri/xml_sax_parser_context.c +199 -0
- data/ext/nokogiri/xml_sax_parser_context.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +42 -12
- data/ext/nokogiri/xml_sax_push_parser.h +1 -1
- data/ext/nokogiri/xml_schema.c +205 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +28 -173
- data/ext/nokogiri/xml_syntax_error.h +2 -1
- data/ext/nokogiri/xml_text.c +16 -6
- data/ext/nokogiri/xml_text.h +1 -1
- data/ext/nokogiri/xml_xpath_context.c +104 -47
- data/ext/nokogiri/xml_xpath_context.h +1 -1
- data/ext/nokogiri/xslt_stylesheet.c +161 -19
- data/ext/nokogiri/xslt_stylesheet.h +1 -1
- data/lib/nokogiri.rb +47 -8
- data/lib/nokogiri/1.8/nokogiri.so +0 -0
- data/lib/nokogiri/1.9/nokogiri.so +0 -0
- data/lib/nokogiri/css.rb +6 -3
- data/lib/nokogiri/css/node.rb +14 -12
- data/lib/nokogiri/css/parser.rb +665 -62
- data/lib/nokogiri/css/parser.y +20 -10
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/tokenizer.rb +148 -5
- data/lib/nokogiri/css/tokenizer.rex +10 -9
- data/lib/nokogiri/css/xpath_visitor.rb +47 -44
- data/lib/nokogiri/decorators/slop.rb +8 -4
- data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
- data/lib/nokogiri/ffi/html/document.rb +28 -0
- data/lib/nokogiri/ffi/html/element_description.rb +81 -0
- data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
- data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
- data/lib/nokogiri/ffi/libxml.rb +420 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +38 -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 +20 -0
- data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
- data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
- data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
- data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -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_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -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 +124 -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 +38 -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/weak_bucket.rb +40 -0
- data/lib/nokogiri/ffi/xml/attr.rb +41 -0
- data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -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 +174 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
- data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
- data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
- data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
- data/lib/nokogiri/ffi/xml/node.rb +559 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +236 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
- data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
- data/lib/nokogiri/ffi/xml/schema.rb +109 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
- data/lib/nokogiri/html.rb +13 -47
- data/lib/nokogiri/html/builder.rb +27 -1
- data/lib/nokogiri/html/document.rb +201 -7
- data/lib/nokogiri/html/document_fragment.rb +41 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +2 -0
- data/lib/nokogiri/html/sax/parser.rb +34 -3
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/nokogiri.rb +1 -0
- data/lib/nokogiri/version.rb +40 -1
- data/lib/nokogiri/version_warning.rb +14 -0
- data/lib/nokogiri/xml.rb +32 -53
- data/lib/nokogiri/xml/attr.rb +5 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +349 -29
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +166 -14
- data/lib/nokogiri/xml/document_fragment.rb +76 -1
- data/lib/nokogiri/xml/dtd.rb +16 -3
- data/lib/nokogiri/xml/element_content.rb +36 -0
- data/lib/nokogiri/xml/element_decl.rb +13 -0
- data/lib/nokogiri/xml/entity_decl.rb +19 -0
- data/lib/nokogiri/xml/namespace.rb +13 -0
- data/lib/nokogiri/xml/node.rb +561 -166
- data/lib/nokogiri/xml/node/save_options.rb +22 -2
- data/lib/nokogiri/xml/node_set.rb +202 -40
- data/lib/nokogiri/xml/parse_options.rb +93 -0
- data/lib/nokogiri/xml/pp.rb +2 -0
- data/lib/nokogiri/xml/pp/character_data.rb +18 -0
- data/lib/nokogiri/xml/pp/node.rb +56 -0
- data/lib/nokogiri/xml/processing_instruction.rb +2 -0
- data/lib/nokogiri/xml/reader.rb +93 -8
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +1 -7
- data/lib/nokogiri/xml/sax/document.rb +107 -2
- data/lib/nokogiri/xml/sax/parser.rb +57 -7
- data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
- data/lib/nokogiri/xml/schema.rb +63 -0
- data/lib/nokogiri/xml/syntax_error.rb +25 -1
- data/lib/nokogiri/xml/text.rb +4 -1
- data/lib/nokogiri/xml/xpath.rb +1 -1
- data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
- data/lib/nokogiri/xml/xpath_context.rb +2 -0
- data/lib/nokogiri/xslt.rb +26 -2
- data/lib/nokogiri/xslt/stylesheet.rb +19 -0
- data/lib/xsd/xmlparser/nokogiri.rb +45 -9
- data/tasks/cross_compile.rb +173 -0
- data/tasks/test.rb +25 -69
- data/test/css/test_nthiness.rb +3 -4
- data/test/css/test_parser.rb +75 -20
- data/test/css/test_tokenizer.rb +23 -1
- data/test/css/test_xpath_visitor.rb +10 -1
- data/test/decorators/test_slop.rb +16 -0
- data/test/ffi/test_document.rb +35 -0
- data/test/files/2ch.html +108 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/bar/bar.xsd +4 -0
- data/test/files/encoding.html +82 -0
- data/test/files/encoding.xhtml +84 -0
- data/test/files/foo/foo.xsd +4 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/shift_jis.html +10 -0
- data/test/files/shift_jis.xml +5 -0
- data/test/files/snuggles.xml +3 -0
- data/test/files/staff.dtd +10 -0
- data/test/files/valid_bar.xml +2 -0
- data/test/helper.rb +101 -23
- data/test/html/sax/test_parser.rb +81 -2
- data/test/html/sax/test_parser_context.rb +48 -0
- data/test/html/test_builder.rb +39 -8
- data/test/html/test_document.rb +186 -23
- data/test/html/test_document_encoding.rb +78 -1
- data/test/html/test_document_fragment.rb +253 -0
- data/test/html/test_element_description.rb +98 -0
- data/test/html/test_named_characters.rb +1 -1
- data/test/html/test_node.rb +124 -36
- data/test/html/test_node_encoding.rb +27 -0
- data/test/test_convert_xpath.rb +1 -52
- data/test/test_css_cache.rb +2 -13
- data/test/test_encoding_handler.rb +46 -0
- data/test/test_memory_leak.rb +88 -19
- data/test/test_nokogiri.rb +38 -5
- data/test/test_reader.rb +188 -6
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +183 -83
- data/test/xml/node/test_save_options.rb +1 -1
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +175 -4
- data/test/xml/sax/test_parser_context.rb +113 -0
- data/test/xml/sax/test_push_parser.rb +90 -2
- data/test/xml/test_attr.rb +35 -1
- data/test/xml/test_attribute_decl.rb +82 -0
- data/test/xml/test_builder.rb +186 -1
- data/test/xml/test_cdata.rb +32 -1
- data/test/xml/test_comment.rb +13 -1
- data/test/xml/test_document.rb +415 -43
- data/test/xml/test_document_encoding.rb +1 -1
- data/test/xml/test_document_fragment.rb +173 -5
- data/test/xml/test_dtd.rb +61 -6
- data/test/xml/test_dtd_encoding.rb +3 -1
- data/test/xml/test_element_content.rb +56 -0
- data/test/xml/test_element_decl.rb +73 -0
- data/test/xml/test_entity_decl.rb +120 -0
- data/test/xml/test_entity_reference.rb +5 -1
- data/test/xml/test_namespace.rb +68 -0
- data/test/xml/test_node.rb +546 -201
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +33 -3
- data/test/xml/test_node_reparenting.rb +321 -0
- data/test/xml/test_node_set.rb +538 -2
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +6 -1
- data/test/xml/test_reader_encoding.rb +1 -1
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +94 -0
- data/test/xml/test_syntax_error.rb +12 -0
- data/test/xml/test_text.rb +35 -1
- data/test/xml/test_unparented_node.rb +5 -5
- data/test/xml/test_xpath.rb +142 -11
- data/test/xslt/test_custom_functions.rb +94 -0
- metadata +328 -92
- data/ext/nokogiri/html_sax_parser.c +0 -57
- data/ext/nokogiri/html_sax_parser.h +0 -11
- 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/native.so +0 -0
- data/ext/nokogiri/xml_xpath.c +0 -53
- data/ext/nokogiri/xml_xpath.h +0 -11
- data/ext/nokogiri/zlib1.dll +0 -0
- data/lib/action-nokogiri.rb +0 -30
- data/lib/nokogiri/css/generated_parser.rb +0 -713
- data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
- data/lib/nokogiri/decorators.rb +0 -2
- data/lib/nokogiri/decorators/hpricot.rb +0 -3
- data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
- data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
- data/lib/nokogiri/hpricot.rb +0 -51
- data/lib/nokogiri/xml/comment.rb +0 -6
- data/lib/nokogiri/xml/element.rb +0 -6
- data/lib/nokogiri/xml/entity_declaration.rb +0 -9
- data/lib/nokogiri/xml/fragment_handler.rb +0 -34
- data/test/hpricot/files/basic.xhtml +0 -17
- data/test/hpricot/files/boingboing.html +0 -2266
- data/test/hpricot/files/cy0.html +0 -3653
- data/test/hpricot/files/immob.html +0 -400
- data/test/hpricot/files/pace_application.html +0 -1320
- data/test/hpricot/files/tenderlove.html +0 -16
- data/test/hpricot/files/uswebgen.html +0 -220
- data/test/hpricot/files/utf8.html +0 -1054
- data/test/hpricot/files/week9.html +0 -1723
- data/test/hpricot/files/why.xml +0 -19
- data/test/hpricot/load_files.rb +0 -11
- data/test/hpricot/test_alter.rb +0 -68
- data/test/hpricot/test_builder.rb +0 -20
- data/test/hpricot/test_parser.rb +0 -426
- data/test/hpricot/test_paths.rb +0 -15
- data/test/hpricot/test_preserved.rb +0 -77
- data/test/hpricot/test_xml.rb +0 -30
- data/test/test_gc.rb +0 -15
data/test/html/test_node.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
require 'nkf'
|
4
4
|
|
@@ -11,12 +11,101 @@ module Nokogiri
|
|
11
11
|
<html>
|
12
12
|
<head></head>
|
13
13
|
<body>
|
14
|
-
<div>first</div>
|
14
|
+
<div class='baz'><a href="foo" class="bar">first</a></div>
|
15
15
|
</body>
|
16
16
|
</html>
|
17
17
|
eohtml
|
18
18
|
end
|
19
19
|
|
20
|
+
def test_to_a
|
21
|
+
assert_equal [['class', 'bar'], ['href', 'foo']],@html.at('a').to_a.sort
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_attr
|
25
|
+
node = @html.at('div.baz')
|
26
|
+
assert_equal node['class'], node.attr('class')
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_get_attribute
|
30
|
+
element = @html.at('div')
|
31
|
+
assert_equal 'baz', element.get_attribute('class')
|
32
|
+
assert_equal 'baz', element['class']
|
33
|
+
element['href'] = "javascript:alert(\"AGGA-KA-BOO!\")"
|
34
|
+
assert_match(/%22AGGA-KA-BOO!%22/, element.to_html)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_css_path_round_trip
|
38
|
+
doc = Nokogiri::HTML(File.read(HTML_FILE))
|
39
|
+
%w{ #header small div[2] div.post body }.each do |css_sel|
|
40
|
+
ele = doc.at css_sel
|
41
|
+
assert_equal ele, doc.at(ele.css_path), ele.css_path
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_path_round_trip
|
46
|
+
doc = Nokogiri::HTML(File.read(HTML_FILE))
|
47
|
+
%w{ #header small div[2] div.post body }.each do |css_sel|
|
48
|
+
ele = doc.at css_sel
|
49
|
+
assert_equal ele, doc.at(ele.path), ele.path
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_append_with_document
|
54
|
+
assert_raises(ArgumentError) do
|
55
|
+
@html.root << Nokogiri::HTML::Document.new
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
###
|
60
|
+
# Make sure a document that doesn't declare a meta encoding returns
|
61
|
+
# nil.
|
62
|
+
def test_meta_encoding
|
63
|
+
assert_nil @html.meta_encoding
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_description
|
67
|
+
assert desc = @html.at('a.bar').description
|
68
|
+
assert_equal 'a', desc.name
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_ancestors_with_selector
|
72
|
+
assert node = @html.at('a.bar').child
|
73
|
+
assert list = node.ancestors('.baz')
|
74
|
+
assert_equal 1, list.length
|
75
|
+
assert_equal 'div', list.first.name
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_matches_inside_fragment
|
79
|
+
fragment = DocumentFragment.new @html
|
80
|
+
fragment << XML::Node.new('a', @html)
|
81
|
+
|
82
|
+
a = fragment.children.last
|
83
|
+
assert a.matches?('a'), 'a should match'
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_css_matches?
|
87
|
+
assert node = @html.at('a.bar')
|
88
|
+
assert node.matches?('a.bar')
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_xpath_matches?
|
92
|
+
assert node = @html.at('//a')
|
93
|
+
assert node.matches?('//a')
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_unlink_then_swap
|
97
|
+
node = @html.at('a')
|
98
|
+
node.unlink
|
99
|
+
|
100
|
+
another_node = @html.at('div')
|
101
|
+
assert another_node, 'should have a node'
|
102
|
+
|
103
|
+
# This used to segv
|
104
|
+
assert_nothing_raised do
|
105
|
+
node.add_previous_sibling another_node
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
20
109
|
def test_swap
|
21
110
|
@html.at('div').swap('<a href="foo">bar</a>')
|
22
111
|
a_tag = @html.css('a').first
|
@@ -24,6 +113,12 @@ module Nokogiri
|
|
24
113
|
assert_equal 0, @html.css('div').length
|
25
114
|
end
|
26
115
|
|
116
|
+
def test_swap_with_regex_characters
|
117
|
+
@html.at('div').swap('<a href="foo">ba)r</a>')
|
118
|
+
a_tag = @html.css('a').first
|
119
|
+
assert_equal 'ba)r', a_tag.text
|
120
|
+
end
|
121
|
+
|
27
122
|
def test_attribute_decodes_entities
|
28
123
|
node = @html.at('div')
|
29
124
|
node['href'] = 'foo&bar'
|
@@ -32,20 +127,18 @@ module Nokogiri
|
|
32
127
|
assert_equal 'foo&bar&baz', node['href']
|
33
128
|
end
|
34
129
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
node.
|
39
|
-
|
130
|
+
def test_parse_config_option
|
131
|
+
node = @html.at('div')
|
132
|
+
options = nil
|
133
|
+
node.parse("<div></div>") do |config|
|
134
|
+
options = config
|
135
|
+
end
|
136
|
+
assert_equal Nokogiri::XML::ParseOptions::DEFAULT_HTML, options.to_i
|
40
137
|
end
|
41
138
|
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
assert_equal 'span', div.children.first.name
|
46
|
-
|
47
|
-
div.inner_html = 'testing'
|
48
|
-
assert_equal 'testing', div.content
|
139
|
+
def test_fragment_handler_does_not_regurge_on_invalid_attributes
|
140
|
+
iframe = %Q{<iframe style="width: 0%; height: 0px" src="http://someurl" allowtransparency></iframe>}
|
141
|
+
assert_nothing_raised { @html.at('div').fragment(iframe) }
|
49
142
|
end
|
50
143
|
|
51
144
|
def test_fragment
|
@@ -63,29 +156,17 @@ module Nokogiri
|
|
63
156
|
assert_equal 'foo', p_tag.parent['class']
|
64
157
|
end
|
65
158
|
|
66
|
-
def
|
67
|
-
|
68
|
-
|
69
|
-
assert_equal
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
doc = Nokogiri::HTML(<<-eohtml)
|
74
|
-
<html>
|
75
|
-
<head></head>
|
76
|
-
<body>
|
77
|
-
<center><img src='logo.gif' /></center>
|
78
|
-
</body>
|
79
|
-
</html>
|
80
|
-
eohtml
|
81
|
-
center = doc.at("//center")
|
82
|
-
img = center.search("//img")
|
83
|
-
assert_raises ArgumentError do
|
84
|
-
center.replace img
|
85
|
-
end
|
159
|
+
def test_fragment_serialization
|
160
|
+
fragment = Nokogiri::HTML.fragment("<div>foo</div>")
|
161
|
+
assert_equal "<div>foo</div>", fragment.serialize.chomp
|
162
|
+
assert_equal "<div>foo</div>", fragment.to_xml.chomp
|
163
|
+
assert_equal "<div>foo</div>", fragment.inner_html
|
164
|
+
assert_equal "<div>foo</div>", fragment.to_html
|
165
|
+
assert_equal "<div>foo</div>", fragment.to_s
|
86
166
|
end
|
87
167
|
|
88
168
|
def test_to_html_does_not_contain_entities
|
169
|
+
return unless defined?(NKF) # NKF is not implemented on Rubinius as of 2009-11-23
|
89
170
|
html = NKF.nkf("-e --msdos", <<-EOH)
|
90
171
|
<html><body>
|
91
172
|
<p> test paragraph
|
@@ -94,8 +175,15 @@ module Nokogiri
|
|
94
175
|
EOH
|
95
176
|
nokogiri = Nokogiri::HTML.parse(html)
|
96
177
|
|
97
|
-
|
98
|
-
|
178
|
+
if RUBY_PLATFORM =~ /java/
|
179
|
+
# NKF linebreak modes are not supported as of jruby 1.2
|
180
|
+
# see http://jira.codehaus.org/browse/JRUBY-3602 for status
|
181
|
+
assert_equal "<p>testparagraph\nfoobar</p>",
|
182
|
+
nokogiri.at("p").to_html.gsub(/ /, '')
|
183
|
+
else
|
184
|
+
assert_equal "<p>testparagraph\r\nfoobar</p>",
|
185
|
+
nokogiri.at("p").to_html.gsub(/ /, '')
|
186
|
+
end
|
99
187
|
end
|
100
188
|
end
|
101
189
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "helper"
|
3
|
+
|
4
|
+
module Nokogiri
|
5
|
+
module HTML
|
6
|
+
if RUBY_VERSION =~ /^1\.9/
|
7
|
+
class TestNodeEncoding < Nokogiri::TestCase
|
8
|
+
def test_inner_html
|
9
|
+
doc = Nokogiri::HTML File.open(SHIFT_JIS_HTML, 'rb')
|
10
|
+
|
11
|
+
hello = "こんにちは"
|
12
|
+
|
13
|
+
contents = doc.at('h2').inner_html
|
14
|
+
assert_equal doc.encoding, contents.encoding.name
|
15
|
+
assert_match hello.encode('Shift_JIS'), contents
|
16
|
+
|
17
|
+
contents = doc.at('h2').inner_html(:encoding => 'UTF-8')
|
18
|
+
assert_match hello, contents
|
19
|
+
|
20
|
+
doc.encoding = 'UTF-8'
|
21
|
+
contents = doc.at('h2').inner_html
|
22
|
+
assert_match hello, contents
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/test/test_convert_xpath.rb
CHANGED
@@ -1,36 +1,15 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
begin
|
4
|
-
require 'rubygems'
|
5
|
-
require 'hpricot'
|
6
|
-
HAS_HPRICOT = true
|
7
|
-
rescue LoadError
|
8
|
-
HAS_HPRICOT = false
|
9
|
-
end
|
1
|
+
require "helper"
|
10
2
|
|
11
3
|
class TestConvertXPath < Nokogiri::TestCase
|
12
4
|
|
13
5
|
def setup
|
14
6
|
super
|
15
7
|
@N = Nokogiri(File.read(HTML_FILE))
|
16
|
-
@NH = Nokogiri.Hpricot(File.read(HTML_FILE)) # decorated document
|
17
|
-
@H = Hpricot(File.read(HTML_FILE)) if HAS_HPRICOT
|
18
8
|
end
|
19
9
|
|
20
10
|
def assert_syntactical_equivalence(hpath, xpath, match, &blk)
|
21
11
|
blk ||= lambda {|j| j.first}
|
22
12
|
assert_equal match, blk.call(@N.search(xpath)), "xpath result did not match"
|
23
|
-
if HAS_HPRICOT
|
24
|
-
assert_equal match, blk.call(@H.search(hpath)), "hpath result did not match"
|
25
|
-
end
|
26
|
-
assert_equal [xpath], @NH.convert_to_xpath(hpath), "converted hpath did not match xpath"
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_ordinary_xpath_conversions
|
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
|
-
assert_equal(".//p", @NH.convert_to_xpath(".//p").first)
|
34
13
|
end
|
35
14
|
|
36
15
|
def test_child_tag
|
@@ -117,21 +96,6 @@ class TestConvertXPath < Nokogiri::TestCase
|
|
117
96
|
end
|
118
97
|
|
119
98
|
def test_positional
|
120
|
-
##
|
121
|
-
# we are intentionally NOT staying compatible with nth-and-friends, as Hpricot has an OB1 bug.
|
122
|
-
#
|
123
|
-
# 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|
|
124
|
-
# j.first.inner_text
|
125
|
-
# end
|
126
|
-
# 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|
|
127
|
-
# j.first.inner_text
|
128
|
-
# end
|
129
|
-
# 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|
|
130
|
-
# j.first.inner_text
|
131
|
-
# end
|
132
|
-
# 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|
|
133
|
-
# j.first.inner_text
|
134
|
-
# end
|
135
99
|
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|
|
136
100
|
j.first.inner_text.gsub(/[\r\n]/, '')
|
137
101
|
end
|
@@ -152,21 +116,6 @@ class TestConvertXPath < Nokogiri::TestCase
|
|
152
116
|
end
|
153
117
|
end
|
154
118
|
|
155
|
-
def test_compat_mode_namespaces
|
156
|
-
assert_equal(".//*[name()='t:sam']", @NH.convert_to_xpath("//t:sam").first)
|
157
|
-
assert_equal(".//*[name()='t:sam'][@rel='bookmark'][1]", @NH.convert_to_xpath("//t:sam[@rel='bookmark'][1]").first)
|
158
|
-
end
|
159
|
-
|
160
|
-
##
|
161
|
-
# 'and' is not supported by hpricot
|
162
|
-
# def test_and
|
163
|
-
# 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|
|
164
|
-
# j.inner_text
|
165
|
-
# end
|
166
|
-
# end
|
167
|
-
|
168
|
-
|
169
|
-
|
170
119
|
# TODO:
|
171
120
|
# doc/'title ~ link' -> links that are siblings of title
|
172
121
|
# doc/'p[@class~="final"]' -> class includes string (whitespacy)
|
data/test/test_css_cache.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
class TestCssCache < Nokogiri::TestCase
|
4
4
|
|
@@ -31,7 +31,7 @@ class TestCssCache < Nokogiri::TestCase
|
|
31
31
|
times = cache_setting ? 4 : nil
|
32
32
|
|
33
33
|
Nokogiri::CSS::Parser.set_cache cache_setting
|
34
|
-
|
34
|
+
|
35
35
|
Nokogiri::CSS.xpath_for(@css)
|
36
36
|
Nokogiri::CSS.xpath_for(@css)
|
37
37
|
Nokogiri::CSS::Parser.new.xpath_for(@css)
|
@@ -39,17 +39,6 @@ class TestCssCache < Nokogiri::TestCase
|
|
39
39
|
|
40
40
|
assert_equal(times, Nokogiri::CSS::Parser.class_eval { @cache.count })
|
41
41
|
end
|
42
|
-
|
43
|
-
define_method "test_hpricot_cache_#{cache_setting ? "true" : "false"}" do
|
44
|
-
times = cache_setting ? 2 : nil
|
45
|
-
Nokogiri::CSS::Parser.set_cache cache_setting
|
46
|
-
|
47
|
-
nh = Nokogiri.Hpricot("<html></html>")
|
48
|
-
|
49
|
-
nh.convert_to_xpath(@css)
|
50
|
-
nh.convert_to_xpath(@css)
|
51
|
-
assert_equal(times, Nokogiri::CSS::Parser.class_eval { @cache.count })
|
52
|
-
end
|
53
42
|
end
|
54
43
|
|
55
44
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require "helper"
|
4
|
+
|
5
|
+
class TestEncodingHandler < Nokogiri::TestCase
|
6
|
+
def teardown
|
7
|
+
Nokogiri::EncodingHandler.clear_aliases!
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_get
|
11
|
+
assert_not_nil Nokogiri::EncodingHandler['UTF-8']
|
12
|
+
assert_nil Nokogiri::EncodingHandler['alsdkjfhaldskjfh']
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_name
|
16
|
+
eh = Nokogiri::EncodingHandler['UTF-8']
|
17
|
+
assert_equal "UTF-8", eh.name
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_alias
|
21
|
+
Nokogiri::EncodingHandler.alias('UTF-8', 'UTF-18')
|
22
|
+
assert_equal 'UTF-8', Nokogiri::EncodingHandler['UTF-18'].name
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_cleanup_aliases
|
26
|
+
assert_nil Nokogiri::EncodingHandler['UTF-9']
|
27
|
+
Nokogiri::EncodingHandler.alias('UTF-8', 'UTF-9')
|
28
|
+
assert_not_nil Nokogiri::EncodingHandler['UTF-9']
|
29
|
+
|
30
|
+
Nokogiri::EncodingHandler.clear_aliases!
|
31
|
+
assert_nil Nokogiri::EncodingHandler['UTF-9']
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_delete
|
35
|
+
assert_nil Nokogiri::EncodingHandler['UTF-9']
|
36
|
+
Nokogiri::EncodingHandler.alias('UTF-8', 'UTF-9')
|
37
|
+
assert_not_nil Nokogiri::EncodingHandler['UTF-9']
|
38
|
+
|
39
|
+
Nokogiri::EncodingHandler.delete 'UTF-9'
|
40
|
+
assert_nil Nokogiri::EncodingHandler['UTF-9']
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_delete_non_existent
|
44
|
+
assert_nil Nokogiri::EncodingHandler.delete('UTF-9')
|
45
|
+
end
|
46
|
+
end
|
data/test/test_memory_leak.rb
CHANGED
@@ -1,15 +1,48 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
class TestMemoryLeak < Nokogiri::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
|
5
|
+
if ENV['NOKOGIRI_GC'] # turning these off by default for now
|
6
|
+
|
7
|
+
def test_dont_hurt_em_why
|
8
|
+
content = File.open("#{File.dirname(__FILE__)}/files/dont_hurt_em_why.xml").read
|
9
|
+
ndoc = Nokogiri::XML(content)
|
10
|
+
2.times do
|
11
|
+
ndoc.search('status text').first.inner_text
|
12
|
+
ndoc.search('user name').first.inner_text
|
13
|
+
GC.start
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class BadIO
|
18
|
+
def read(*args)
|
19
|
+
raise 'hell'
|
20
|
+
end
|
21
|
+
|
22
|
+
def write(*args)
|
23
|
+
raise 'chickens'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_for_mem_leak_on_io_callbacks
|
28
|
+
io = File.open SNUGGLES_FILE
|
29
|
+
reader = Nokogiri::XML.parse(io)
|
30
|
+
|
31
|
+
(10**10).times do
|
32
|
+
Nokogiri::XML.parse(BadIO.new) rescue nil
|
33
|
+
doc.write BadIO.new rescue nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_for_memory_leak
|
38
|
+
begin
|
39
|
+
# we don't use Dike in any tests, but requiring it has side effects
|
40
|
+
# that can create memory leaks, and that's what we're testing for.
|
41
|
+
require 'rubygems'
|
42
|
+
require 'dike' # do not remove!
|
43
|
+
|
44
|
+
count_start = count_object_space_documents
|
45
|
+
xml_data = <<-EOS
|
13
46
|
<test>
|
14
47
|
<items>
|
15
48
|
<item>abc</item>
|
@@ -18,17 +51,53 @@ class TestMemoryLeak < Nokogiri::TestCase
|
|
18
51
|
<items>
|
19
52
|
</test>
|
20
53
|
EOS
|
21
|
-
|
22
|
-
|
23
|
-
|
54
|
+
20.times do
|
55
|
+
doc = Nokogiri::XML(xml_data)
|
56
|
+
doc.xpath("//item")
|
57
|
+
end
|
58
|
+
2.times { GC.start }
|
59
|
+
count_end = count_object_space_documents
|
60
|
+
assert((count_end - count_start) <= 2, "memory leak detected")
|
61
|
+
rescue LoadError
|
62
|
+
puts "\ndike is not installed, skipping memory leak test"
|
24
63
|
end
|
25
|
-
2.times { GC.start }
|
26
|
-
count_end = count_object_space_documents
|
27
|
-
assert((count_end - count_start) <= 2, "memory leak detected")
|
28
|
-
rescue LoadError
|
29
|
-
puts "\ndike is not installed, skipping memory leak test"
|
30
64
|
end
|
31
|
-
|
65
|
+
|
66
|
+
if Nokogiri.ffi?
|
67
|
+
[ ['Node', 'p', nil],
|
68
|
+
['CDATA', nil, 'content'],
|
69
|
+
['Comment', nil, 'content'],
|
70
|
+
['DocumentFragment', nil],
|
71
|
+
['EntityReference', nil, 'p'],
|
72
|
+
['ProcessingInstruction', nil, 'p', 'content'] ].each do |klass, *args|
|
73
|
+
|
74
|
+
define_method "test_for_leaked_#{klass}_nodes" do
|
75
|
+
Nokogiri::LibXML.expects(:xmlAddChild).at_least(1) # more than once shows we're GCing properly
|
76
|
+
10.times {
|
77
|
+
xml = Nokogiri::XML("<root></root>")
|
78
|
+
2.times { Nokogiri::XML.const_get(klass).new(*(args.collect{|arg| arg || xml})) }
|
79
|
+
GC.start
|
80
|
+
}
|
81
|
+
GC.start
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_for_leaked_attr_nodes
|
87
|
+
Nokogiri::LibXML.expects(:xmlFreePropList).at_least(1) # more than once shows we're GCing properly
|
88
|
+
10.times {
|
89
|
+
xml = Nokogiri::XML("<root></root>")
|
90
|
+
2.times { Nokogiri::XML::Attr.new(xml, "p") }
|
91
|
+
GC.start
|
92
|
+
}
|
93
|
+
GC.start
|
94
|
+
end
|
95
|
+
|
96
|
+
end # if ffi
|
97
|
+
|
98
|
+
end # if NOKOGIRI_GC
|
99
|
+
|
100
|
+
private
|
32
101
|
|
33
102
|
def count_object_space_documents
|
34
103
|
count = 0
|