nokogiri 1.6.2.rc1-x64-mingw32
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 +7 -0
- data/.autotest +26 -0
- data/.editorconfig +17 -0
- data/.gemtest +0 -0
- data/.travis.yml +25 -0
- data/CHANGELOG.ja.rdoc +857 -0
- data/CHANGELOG.rdoc +880 -0
- data/C_CODING_STYLE.rdoc +33 -0
- data/Gemfile +21 -0
- data/Manifest.txt +371 -0
- data/README.ja.rdoc +112 -0
- data/README.rdoc +180 -0
- data/ROADMAP.md +89 -0
- data/Rakefile +351 -0
- data/STANDARD_RESPONSES.md +47 -0
- data/Y_U_NO_GEMSPEC.md +155 -0
- data/bin/nokogiri +78 -0
- data/build_all +130 -0
- data/dependencies.yml +4 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +453 -0
- data/ext/nokogiri/html_document.c +170 -0
- data/ext/nokogiri/html_document.h +10 -0
- data/ext/nokogiri/html_element_description.c +279 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.c +32 -0
- data/ext/nokogiri/html_entity_lookup.h +8 -0
- data/ext/nokogiri/html_sax_parser_context.c +116 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/html_sax_push_parser.c +87 -0
- data/ext/nokogiri/html_sax_push_parser.h +9 -0
- data/ext/nokogiri/nokogiri.c +148 -0
- data/ext/nokogiri/nokogiri.h +164 -0
- data/ext/nokogiri/xml_attr.c +94 -0
- data/ext/nokogiri/xml_attr.h +9 -0
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +56 -0
- data/ext/nokogiri/xml_cdata.h +9 -0
- data/ext/nokogiri/xml_comment.c +54 -0
- data/ext/nokogiri/xml_comment.h +9 -0
- data/ext/nokogiri/xml_document.c +577 -0
- data/ext/nokogiri/xml_document.h +23 -0
- data/ext/nokogiri/xml_document_fragment.c +48 -0
- data/ext/nokogiri/xml_document_fragment.h +10 -0
- data/ext/nokogiri/xml_dtd.c +202 -0
- data/ext/nokogiri/xml_dtd.h +10 -0
- 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 +52 -0
- data/ext/nokogiri/xml_entity_reference.h +9 -0
- data/ext/nokogiri/xml_io.c +56 -0
- data/ext/nokogiri/xml_io.h +11 -0
- data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
- data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
- data/ext/nokogiri/xml_namespace.c +78 -0
- data/ext/nokogiri/xml_namespace.h +13 -0
- data/ext/nokogiri/xml_node.c +1541 -0
- data/ext/nokogiri/xml_node.h +13 -0
- data/ext/nokogiri/xml_node_set.c +467 -0
- data/ext/nokogiri/xml_node_set.h +14 -0
- data/ext/nokogiri/xml_processing_instruction.c +56 -0
- data/ext/nokogiri/xml_processing_instruction.h +9 -0
- data/ext/nokogiri/xml_reader.c +681 -0
- data/ext/nokogiri/xml_reader.h +10 -0
- data/ext/nokogiri/xml_relax_ng.c +161 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +312 -0
- data/ext/nokogiri/xml_sax_parser.h +39 -0
- data/ext/nokogiri/xml_sax_parser_context.c +262 -0
- data/ext/nokogiri/xml_sax_parser_context.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +115 -0
- data/ext/nokogiri/xml_sax_push_parser.h +9 -0
- data/ext/nokogiri/xml_schema.c +205 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +63 -0
- data/ext/nokogiri/xml_syntax_error.h +13 -0
- data/ext/nokogiri/xml_text.c +52 -0
- data/ext/nokogiri/xml_text.h +9 -0
- data/ext/nokogiri/xml_xpath_context.c +307 -0
- data/ext/nokogiri/xml_xpath_context.h +10 -0
- data/ext/nokogiri/xslt_stylesheet.c +270 -0
- data/ext/nokogiri/xslt_stylesheet.h +14 -0
- data/lib/nokogiri.rb +137 -0
- data/lib/nokogiri/2.0/nokogiri.so +0 -0
- data/lib/nokogiri/2.1/nokogiri.so +0 -0
- data/lib/nokogiri/css.rb +27 -0
- data/lib/nokogiri/css/node.rb +52 -0
- data/lib/nokogiri/css/parser.rb +715 -0
- data/lib/nokogiri/css/parser.y +249 -0
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/syntax_error.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rb +152 -0
- data/lib/nokogiri/css/tokenizer.rex +55 -0
- data/lib/nokogiri/css/xpath_visitor.rb +219 -0
- data/lib/nokogiri/decorators/slop.rb +35 -0
- data/lib/nokogiri/html.rb +37 -0
- data/lib/nokogiri/html/builder.rb +35 -0
- data/lib/nokogiri/html/document.rb +333 -0
- data/lib/nokogiri/html/document_fragment.rb +41 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/element_description_defaults.rb +671 -0
- data/lib/nokogiri/html/entity_lookup.rb +13 -0
- data/lib/nokogiri/html/sax/parser.rb +52 -0
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/html/sax/push_parser.rb +16 -0
- data/lib/nokogiri/syntax_error.rb +4 -0
- data/lib/nokogiri/version.rb +106 -0
- data/lib/nokogiri/xml.rb +73 -0
- data/lib/nokogiri/xml/attr.rb +14 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +443 -0
- data/lib/nokogiri/xml/cdata.rb +11 -0
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +279 -0
- data/lib/nokogiri/xml/document_fragment.rb +112 -0
- data/lib/nokogiri/xml/dtd.rb +32 -0
- 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 +982 -0
- data/lib/nokogiri/xml/node/save_options.rb +61 -0
- data/lib/nokogiri/xml/node_set.rb +355 -0
- data/lib/nokogiri/xml/notation.rb +6 -0
- data/lib/nokogiri/xml/parse_options.rb +98 -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 +8 -0
- data/lib/nokogiri/xml/reader.rb +112 -0
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +4 -0
- data/lib/nokogiri/xml/sax/document.rb +171 -0
- data/lib/nokogiri/xml/sax/parser.rb +123 -0
- data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
- data/lib/nokogiri/xml/schema.rb +63 -0
- data/lib/nokogiri/xml/syntax_error.rb +47 -0
- data/lib/nokogiri/xml/text.rb +9 -0
- data/lib/nokogiri/xml/xpath.rb +10 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
- data/lib/nokogiri/xml/xpath_context.rb +16 -0
- data/lib/nokogiri/xslt.rb +56 -0
- data/lib/nokogiri/xslt/stylesheet.rb +25 -0
- data/lib/xsd/xmlparser/nokogiri.rb +102 -0
- data/suppressions/README.txt +1 -0
- data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
- data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
- data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
- data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
- data/tasks/nokogiri.org.rb +24 -0
- data/tasks/test.rb +95 -0
- data/test/css/test_nthiness.rb +222 -0
- data/test/css/test_parser.rb +358 -0
- data/test/css/test_tokenizer.rb +198 -0
- data/test/css/test_xpath_visitor.rb +96 -0
- data/test/decorators/test_slop.rb +16 -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/atom.xml +344 -0
- data/test/files/bar/bar.xsd +4 -0
- data/test/files/bogus.xml +0 -0
- data/test/files/dont_hurt_em_why.xml +422 -0
- data/test/files/encoding.html +82 -0
- data/test/files/encoding.xhtml +84 -0
- data/test/files/exslt.xml +8 -0
- data/test/files/exslt.xslt +35 -0
- data/test/files/foo/foo.xsd +4 -0
- data/test/files/metacharset.html +10 -0
- data/test/files/noencoding.html +47 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/saml/saml20assertion_schema.xsd +283 -0
- data/test/files/saml/saml20protocol_schema.xsd +302 -0
- data/test/files/saml/xenc_schema.xsd +146 -0
- data/test/files/saml/xmldsig_schema.xsd +318 -0
- data/test/files/shift_jis.html +10 -0
- data/test/files/shift_jis.xml +5 -0
- data/test/files/shift_jis_no_charset.html +9 -0
- data/test/files/snuggles.xml +3 -0
- data/test/files/staff.dtd +10 -0
- data/test/files/staff.xml +59 -0
- data/test/files/staff.xslt +32 -0
- data/test/files/test_document_url/bar.xml +2 -0
- data/test/files/test_document_url/document.dtd +4 -0
- data/test/files/test_document_url/document.xml +6 -0
- data/test/files/tlm.html +850 -0
- data/test/files/to_be_xincluded.xml +2 -0
- data/test/files/valid_bar.xml +2 -0
- data/test/files/xinclude.xml +4 -0
- data/test/helper.rb +164 -0
- data/test/html/sax/test_parser.rb +141 -0
- data/test/html/sax/test_parser_context.rb +46 -0
- data/test/html/test_builder.rb +164 -0
- data/test/html/test_document.rb +619 -0
- data/test/html/test_document_encoding.rb +148 -0
- data/test/html/test_document_fragment.rb +261 -0
- data/test/html/test_element_description.rb +105 -0
- data/test/html/test_named_characters.rb +14 -0
- data/test/html/test_node.rb +196 -0
- data/test/html/test_node_encoding.rb +27 -0
- data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +14 -0
- data/test/namespaces/test_namespaces_in_builder_doc.rb +75 -0
- data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
- data/test/namespaces/test_namespaces_in_created_doc.rb +75 -0
- data/test/namespaces/test_namespaces_in_parsed_doc.rb +66 -0
- data/test/test_convert_xpath.rb +135 -0
- data/test/test_css_cache.rb +45 -0
- data/test/test_encoding_handler.rb +46 -0
- data/test/test_memory_leak.rb +156 -0
- data/test/test_nokogiri.rb +138 -0
- data/test/test_reader.rb +558 -0
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +279 -0
- data/test/xml/node/test_save_options.rb +28 -0
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +382 -0
- data/test/xml/sax/test_parser_context.rb +115 -0
- data/test/xml/sax/test_push_parser.rb +157 -0
- data/test/xml/test_attr.rb +64 -0
- data/test/xml/test_attribute_decl.rb +86 -0
- data/test/xml/test_builder.rb +315 -0
- data/test/xml/test_c14n.rb +161 -0
- data/test/xml/test_cdata.rb +48 -0
- data/test/xml/test_comment.rb +29 -0
- data/test/xml/test_document.rb +934 -0
- data/test/xml/test_document_encoding.rb +28 -0
- data/test/xml/test_document_fragment.rb +228 -0
- data/test/xml/test_dtd.rb +187 -0
- data/test/xml/test_dtd_encoding.rb +33 -0
- 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 +122 -0
- data/test/xml/test_entity_reference.rb +245 -0
- data/test/xml/test_namespace.rb +95 -0
- data/test/xml/test_node.rb +1155 -0
- data/test/xml/test_node_attributes.rb +113 -0
- data/test/xml/test_node_encoding.rb +107 -0
- data/test/xml/test_node_inheritance.rb +32 -0
- data/test/xml/test_node_reparenting.rb +374 -0
- data/test/xml/test_node_set.rb +755 -0
- data/test/xml/test_parse_options.rb +64 -0
- data/test/xml/test_processing_instruction.rb +30 -0
- data/test/xml/test_reader_encoding.rb +142 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +129 -0
- data/test/xml/test_syntax_error.rb +12 -0
- data/test/xml/test_text.rb +45 -0
- data/test/xml/test_unparented_node.rb +422 -0
- data/test/xml/test_xinclude.rb +83 -0
- data/test/xml/test_xpath.rb +376 -0
- data/test/xslt/test_custom_functions.rb +133 -0
- data/test/xslt/test_exception_handling.rb +37 -0
- data/test_all +81 -0
- metadata +601 -0
@@ -0,0 +1,115 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require "helper"
|
4
|
+
|
5
|
+
module Nokogiri
|
6
|
+
module XML
|
7
|
+
module SAX
|
8
|
+
class TestParserContext < Nokogiri::SAX::TestCase
|
9
|
+
def setup
|
10
|
+
@xml = '<hello>
|
11
|
+
|
12
|
+
world
|
13
|
+
<inter>
|
14
|
+
<net>
|
15
|
+
</net>
|
16
|
+
</inter>
|
17
|
+
|
18
|
+
</hello>'
|
19
|
+
end
|
20
|
+
|
21
|
+
class Counter < Nokogiri::XML::SAX::Document
|
22
|
+
attr_accessor :context, :lines, :columns
|
23
|
+
def initialize
|
24
|
+
@context = nil
|
25
|
+
@lines = []
|
26
|
+
@columns = []
|
27
|
+
end
|
28
|
+
|
29
|
+
def start_element name, attrs = []
|
30
|
+
@lines << [name, context.line]
|
31
|
+
@columns << [name, context.column]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_line_numbers
|
36
|
+
sax_handler = Counter.new
|
37
|
+
|
38
|
+
parser = Nokogiri::XML::SAX::Parser.new(sax_handler)
|
39
|
+
parser.parse(@xml) do |ctx|
|
40
|
+
sax_handler.context = ctx
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_equal [["hello", 1], ["inter", 4], ["net", 5]],
|
44
|
+
sax_handler.lines
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_column_numbers
|
48
|
+
sax_handler = Counter.new
|
49
|
+
|
50
|
+
parser = Nokogiri::XML::SAX::Parser.new(sax_handler)
|
51
|
+
parser.parse(@xml) do |ctx|
|
52
|
+
sax_handler.context = ctx
|
53
|
+
end
|
54
|
+
|
55
|
+
assert_equal [["hello", 7], ["inter", 7], ["net", 9]],
|
56
|
+
sax_handler.columns
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_replace_entities
|
60
|
+
pc = ParserContext.new StringIO.new('<root />'), 'UTF-8'
|
61
|
+
pc.replace_entities = false
|
62
|
+
assert_equal false, pc.replace_entities
|
63
|
+
|
64
|
+
pc.replace_entities = true
|
65
|
+
assert_equal true, pc.replace_entities
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_recovery
|
69
|
+
pc = ParserContext.new StringIO.new('<root />'), 'UTF-8'
|
70
|
+
pc.recovery = false
|
71
|
+
assert_equal false, pc.recovery
|
72
|
+
|
73
|
+
pc.recovery = true
|
74
|
+
assert_equal true, pc.recovery
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_from_io
|
78
|
+
ctx = ParserContext.new StringIO.new('fo'), 'UTF-8'
|
79
|
+
assert ctx
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_from_string
|
83
|
+
assert ParserContext.new 'blah blah'
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_parse_with
|
87
|
+
ctx = ParserContext.new 'blah'
|
88
|
+
assert_raises ArgumentError do
|
89
|
+
ctx.parse_with nil
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_parse_with_sax_parser
|
94
|
+
xml = "<root />"
|
95
|
+
ctx = ParserContext.new xml
|
96
|
+
parser = Parser.new Doc.new
|
97
|
+
assert_nil ctx.parse_with parser
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_from_file
|
101
|
+
ctx = ParserContext.file XML_FILE
|
102
|
+
parser = Parser.new Doc.new
|
103
|
+
assert_nil ctx.parse_with parser
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_parse_with_returns_nil
|
107
|
+
xml = "<root />"
|
108
|
+
ctx = ParserContext.new xml
|
109
|
+
parser = Parser.new Doc.new
|
110
|
+
assert_nil ctx.parse_with(parser)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require "helper"
|
4
|
+
|
5
|
+
module Nokogiri
|
6
|
+
module XML
|
7
|
+
module SAX
|
8
|
+
class TestPushParser < Nokogiri::SAX::TestCase
|
9
|
+
def setup
|
10
|
+
super
|
11
|
+
@parser = XML::SAX::PushParser.new(Doc.new)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_exception
|
15
|
+
assert_raises(SyntaxError) do
|
16
|
+
@parser << "<foo /><foo />"
|
17
|
+
end
|
18
|
+
|
19
|
+
assert_raises(SyntaxError) do
|
20
|
+
@parser << nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_end_document_called
|
25
|
+
@parser.<<(<<-eoxml)
|
26
|
+
<p id="asdfasdf">
|
27
|
+
<!-- This is a comment -->
|
28
|
+
Paragraph 1
|
29
|
+
</p>
|
30
|
+
eoxml
|
31
|
+
assert ! @parser.document.end_document_called
|
32
|
+
@parser.finish
|
33
|
+
assert @parser.document.end_document_called
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_start_element
|
37
|
+
@parser.<<(<<-eoxml)
|
38
|
+
<p id="asdfasdf">
|
39
|
+
eoxml
|
40
|
+
|
41
|
+
assert_equal [["p", [["id", "asdfasdf"]]]],
|
42
|
+
@parser.document.start_elements
|
43
|
+
|
44
|
+
@parser.<<(<<-eoxml)
|
45
|
+
<!-- This is a comment -->
|
46
|
+
Paragraph 1
|
47
|
+
</p>
|
48
|
+
eoxml
|
49
|
+
assert_equal [' This is a comment '], @parser.document.comments
|
50
|
+
@parser.finish
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_start_element_with_namespaces
|
54
|
+
@parser.<<(<<-eoxml)
|
55
|
+
<p xmlns:foo="http://foo.example.com/">
|
56
|
+
eoxml
|
57
|
+
|
58
|
+
assert_equal [["p", [["xmlns:foo", "http://foo.example.com/"]]]],
|
59
|
+
@parser.document.start_elements
|
60
|
+
|
61
|
+
@parser.<<(<<-eoxml)
|
62
|
+
<!-- This is a comment -->
|
63
|
+
Paragraph 1
|
64
|
+
</p>
|
65
|
+
eoxml
|
66
|
+
assert_equal [' This is a comment '], @parser.document.comments
|
67
|
+
@parser.finish
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_start_element_ns
|
71
|
+
@parser.<<(<<-eoxml)
|
72
|
+
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' size='large'></stream:stream>
|
73
|
+
eoxml
|
74
|
+
|
75
|
+
assert_equal 1, @parser.document.start_elements_namespace.length
|
76
|
+
el = @parser.document.start_elements_namespace.first
|
77
|
+
|
78
|
+
assert_equal 'stream', el.first
|
79
|
+
assert_equal 2, el[1].length
|
80
|
+
assert_equal [['version', '1.0'], ['size', 'large']],
|
81
|
+
el[1].map { |x| [x.localname, x.value] }
|
82
|
+
|
83
|
+
assert_equal 'stream', el[2]
|
84
|
+
assert_equal 'http://etherx.jabber.org/streams', el[3]
|
85
|
+
@parser.finish
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_end_element_ns
|
89
|
+
@parser.<<(<<-eoxml)
|
90
|
+
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'></stream:stream>
|
91
|
+
eoxml
|
92
|
+
|
93
|
+
assert_equal [['stream', 'stream', 'http://etherx.jabber.org/streams']],
|
94
|
+
@parser.document.end_elements_namespace
|
95
|
+
@parser.finish
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_chevron_partial_xml
|
99
|
+
@parser.<<(<<-eoxml)
|
100
|
+
<p id="asdfasdf">
|
101
|
+
eoxml
|
102
|
+
|
103
|
+
@parser.<<(<<-eoxml)
|
104
|
+
<!-- This is a comment -->
|
105
|
+
Paragraph 1
|
106
|
+
</p>
|
107
|
+
eoxml
|
108
|
+
assert_equal [' This is a comment '], @parser.document.comments
|
109
|
+
@parser.finish
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_chevron
|
113
|
+
@parser.<<(<<-eoxml)
|
114
|
+
<p id="asdfasdf">
|
115
|
+
<!-- This is a comment -->
|
116
|
+
Paragraph 1
|
117
|
+
</p>
|
118
|
+
eoxml
|
119
|
+
@parser.finish
|
120
|
+
assert_equal [' This is a comment '], @parser.document.comments
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_default_options
|
124
|
+
assert_equal 0, @parser.options
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_recover
|
128
|
+
@parser.options |= XML::ParseOptions::RECOVER
|
129
|
+
@parser.<<(<<-eoxml)
|
130
|
+
<p>
|
131
|
+
Foo
|
132
|
+
<bar>
|
133
|
+
Bar
|
134
|
+
</p>
|
135
|
+
eoxml
|
136
|
+
@parser.finish
|
137
|
+
assert(@parser.document.errors.size >= 1)
|
138
|
+
assert_equal [["p", []], ["bar", []]], @parser.document.start_elements
|
139
|
+
assert_equal "FooBar", @parser.document.data.map { |x|
|
140
|
+
x.gsub(/\s/, '')
|
141
|
+
}.join
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_broken_encoding
|
145
|
+
skip("ultra hard to fix for pure Java version") if Nokogiri.jruby?
|
146
|
+
@parser.options |= XML::ParseOptions::RECOVER
|
147
|
+
# This is ISO_8859-1:
|
148
|
+
@parser.<< "<?xml version='1.0' encoding='UTF-8'?><r>Gau\337</r>"
|
149
|
+
@parser.finish
|
150
|
+
assert(@parser.document.errors.size >= 1)
|
151
|
+
assert_equal "Gau\337", @parser.document.data.join
|
152
|
+
assert_equal [["r"]], @parser.document.end_elements
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestAttr < Nokogiri::TestCase
|
6
|
+
def test_new
|
7
|
+
100.times {
|
8
|
+
doc = Nokogiri::XML::Document.new
|
9
|
+
assert doc
|
10
|
+
assert Nokogiri::XML::Attr.new(doc, 'foo')
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_content=
|
15
|
+
xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
16
|
+
address = xml.xpath('//address')[3]
|
17
|
+
street = address.attributes['street']
|
18
|
+
street.content = "Y&ent1;"
|
19
|
+
assert_equal "Y&ent1;", street.value
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_value=
|
23
|
+
xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
24
|
+
address = xml.xpath('//address')[3]
|
25
|
+
street = address.attributes['street']
|
26
|
+
street.value = "Y&ent1;"
|
27
|
+
assert_equal "Y&ent1;", street.value
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_unlink
|
31
|
+
xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
32
|
+
address = xml.xpath('/staff/employee/address').first
|
33
|
+
assert_equal 'Yes', address['domestic']
|
34
|
+
address.attribute_nodes.first.unlink
|
35
|
+
assert_nil address['domestic']
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_parsing_attribute_namespace
|
39
|
+
doc = Nokogiri::XML <<-EOXML
|
40
|
+
<root xmlns='http://google.com/' xmlns:f='http://flavorjon.es/'>
|
41
|
+
<div f:myattr='foo'></div>
|
42
|
+
</root>
|
43
|
+
EOXML
|
44
|
+
|
45
|
+
node = doc.at_css "div"
|
46
|
+
attr = node.attributes["myattr"]
|
47
|
+
assert_equal "http://flavorjon.es/", attr.namespace.href
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_setting_attribute_namespace
|
51
|
+
doc = Nokogiri::XML <<-EOXML
|
52
|
+
<root xmlns='http://google.com/' xmlns:f='http://flavorjon.es/'>
|
53
|
+
<div f:myattr='foo'></div>
|
54
|
+
</root>
|
55
|
+
EOXML
|
56
|
+
|
57
|
+
node = doc.at_css "div"
|
58
|
+
attr = node.attributes["myattr"]
|
59
|
+
attr.add_namespace("fizzle", "http://fizzle.com/")
|
60
|
+
assert_equal "http://fizzle.com/", attr.namespace.href
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestAttributeDecl < Nokogiri::TestCase
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
@xml = Nokogiri::XML(<<-eoxml)
|
9
|
+
<?xml version="1.0"?><?TEST-STYLE PIDATA?>
|
10
|
+
<!DOCTYPE staff SYSTEM "staff.dtd" [
|
11
|
+
<!ATTLIST br width CDATA "0">
|
12
|
+
<!ATTLIST a width CDATA "0">
|
13
|
+
<!ATTLIST payment type (check|cash) "cash">
|
14
|
+
]>
|
15
|
+
<root />
|
16
|
+
eoxml
|
17
|
+
@attrs = @xml.internal_subset.children
|
18
|
+
@attr_decl = @attrs.first
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_inspect
|
22
|
+
assert_equal(
|
23
|
+
"#<#{@attr_decl.class.name}:#{sprintf("0x%x", @attr_decl.object_id)} #{@attr_decl.to_s.inspect}>",
|
24
|
+
@attr_decl.inspect
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_type
|
29
|
+
assert_equal 16, @attr_decl.type
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_class
|
33
|
+
assert_instance_of Nokogiri::XML::AttributeDecl, @attr_decl
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_content
|
37
|
+
assert_raise NoMethodError do
|
38
|
+
@attr_decl.content
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_attributes
|
43
|
+
assert_raise NoMethodError do
|
44
|
+
@attr_decl.attributes
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_namespace
|
49
|
+
assert_raise NoMethodError do
|
50
|
+
@attr_decl.namespace
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_namespace_definitions
|
55
|
+
assert_raise NoMethodError do
|
56
|
+
@attr_decl.namespace_definitions
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_line
|
61
|
+
assert_raise NoMethodError do
|
62
|
+
@attr_decl.line
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_attribute_type
|
67
|
+
if Nokogiri.uses_libxml?
|
68
|
+
assert_equal 1, @attr_decl.attribute_type
|
69
|
+
else
|
70
|
+
assert_equal 'CDATA', @attr_decl.attribute_type
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_default
|
75
|
+
assert_equal '0', @attr_decl.default
|
76
|
+
assert_equal '0', @attrs[1].default
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_enumeration
|
80
|
+
assert_equal [], @attr_decl.enumeration
|
81
|
+
assert_equal ['check', 'cash'], @attrs[2].enumeration
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
@@ -0,0 +1,315 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require "helper"
|
4
|
+
|
5
|
+
module Nokogiri
|
6
|
+
module XML
|
7
|
+
class TestBuilder < Nokogiri::TestCase
|
8
|
+
def test_attribute_sensitivity
|
9
|
+
xml = Nokogiri::XML::Builder.new { |x|
|
10
|
+
x.tag "hello", "abcDef" => "world"
|
11
|
+
}.to_xml
|
12
|
+
doc = Nokogiri.XML xml
|
13
|
+
assert_equal 'world', doc.root['abcDef']
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_builder_multiple_nodes
|
17
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
18
|
+
0.upto(10) do
|
19
|
+
xml.text "test"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def test_builder_with_utf8_text
|
26
|
+
text = "test ﺵ "
|
27
|
+
doc = Nokogiri::XML::Builder.new(:encoding => "UTF-8") { |xml| xml.test text }.doc
|
28
|
+
assert_equal text, doc.content
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_builder_escape
|
32
|
+
xml = Nokogiri::XML::Builder.new { |x|
|
33
|
+
x.condition "value < 1", :attr => "value < 1"
|
34
|
+
}.to_xml
|
35
|
+
doc = Nokogiri.XML xml
|
36
|
+
assert_equal 'value < 1', doc.root['attr']
|
37
|
+
assert_equal 'value < 1', doc.root.content
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_builder_namespace
|
41
|
+
doc = Nokogiri::XML::Builder.new { |xml|
|
42
|
+
xml.a("xmlns:a" => "x") do
|
43
|
+
xml.b("xmlns:a" => "x", "xmlns:b" => "y")
|
44
|
+
end
|
45
|
+
}.doc
|
46
|
+
|
47
|
+
b = doc.at('b')
|
48
|
+
assert b
|
49
|
+
assert_equal({"xmlns:a"=>"x", "xmlns:b"=>"y"}, b.namespaces)
|
50
|
+
assert_equal({"xmlns:b"=>"y"}, namespaces_defined_on(b))
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_builder_namespace_part_deux
|
54
|
+
doc = Nokogiri::XML::Builder.new { |xml|
|
55
|
+
xml.a("xmlns:b" => "y") do
|
56
|
+
xml.b("xmlns:a" => "x", "xmlns:b" => "y", "xmlns:c" => "z")
|
57
|
+
end
|
58
|
+
}.doc
|
59
|
+
|
60
|
+
b = doc.at('b')
|
61
|
+
assert b
|
62
|
+
assert_equal({"xmlns:a"=>"x", "xmlns:b"=>"y", "xmlns:c"=>"z"}, b.namespaces)
|
63
|
+
assert_equal({"xmlns:a"=>"x", "xmlns:c"=>"z"}, namespaces_defined_on(b))
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_builder_with_unlink
|
67
|
+
b = Nokogiri::XML::Builder.new do |xml|
|
68
|
+
xml.foo do
|
69
|
+
xml.bar { xml.parent.unlink }
|
70
|
+
xml.bar2
|
71
|
+
end
|
72
|
+
end
|
73
|
+
assert b
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_with_root
|
77
|
+
doc = Nokogiri::XML(File.read(XML_FILE))
|
78
|
+
Nokogiri::XML::Builder.with(doc.at('employee')) do |xml|
|
79
|
+
xml.foo
|
80
|
+
end
|
81
|
+
assert_equal 1, doc.xpath('//employee/foo').length
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_root_namespace_default_decl
|
85
|
+
b = Nokogiri::XML::Builder.new { |xml| xml.root(:xmlns => 'one:two') }
|
86
|
+
doc = b.doc
|
87
|
+
assert_equal 'one:two', doc.root.namespace.href
|
88
|
+
assert_equal({ 'xmlns' => 'one:two' }, doc.root.namespaces)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_root_namespace_multi_decl
|
92
|
+
b = Nokogiri::XML::Builder.new { |xml|
|
93
|
+
xml.root(:xmlns => 'one:two', 'xmlns:foo' => 'bar') do
|
94
|
+
xml.hello
|
95
|
+
end
|
96
|
+
}
|
97
|
+
doc = b.doc
|
98
|
+
assert_equal 'one:two', doc.root.namespace.href
|
99
|
+
assert_equal({ 'xmlns' => 'one:two', 'xmlns:foo' => 'bar' }, doc.root.namespaces)
|
100
|
+
|
101
|
+
assert_equal 'one:two', doc.at('hello').namespace.href
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_non_root_namespace
|
105
|
+
b = Nokogiri::XML::Builder.new { |xml|
|
106
|
+
xml.root { xml.hello(:xmlns => 'one') }
|
107
|
+
}
|
108
|
+
assert_equal 'one', b.doc.at('hello', 'xmlns' => 'one').namespace.href
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_specify_namespace
|
112
|
+
b = Nokogiri::XML::Builder.new { |xml|
|
113
|
+
xml.root('xmlns:foo' => 'bar') do
|
114
|
+
xml[:foo].bar
|
115
|
+
xml['foo'].baz
|
116
|
+
end
|
117
|
+
}
|
118
|
+
doc = b.doc
|
119
|
+
assert_equal 'bar', doc.at('foo|bar', 'foo' => 'bar').namespace.href
|
120
|
+
assert_equal 'bar', doc.at('foo|baz', 'foo' => 'bar').namespace.href
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_dtd_in_builder_output
|
124
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
125
|
+
xml.doc.create_internal_subset(
|
126
|
+
'html',
|
127
|
+
"-//W3C//DTD HTML 4.01 Transitional//EN",
|
128
|
+
"http://www.w3.org/TR/html4/loose.dtd"
|
129
|
+
)
|
130
|
+
xml.root do
|
131
|
+
xml.foo
|
132
|
+
end
|
133
|
+
end
|
134
|
+
assert_match(/<!DOCTYPE html PUBLIC "-\/\/W3C\/\/DTD HTML 4.01 Transitional\/\/EN" "http:\/\/www.w3.org\/TR\/html4\/loose.dtd">/,
|
135
|
+
builder.to_xml)
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_specify_namespace_nested
|
139
|
+
b = Nokogiri::XML::Builder.new { |xml|
|
140
|
+
xml.root('xmlns:foo' => 'bar') do
|
141
|
+
xml.yay do
|
142
|
+
xml[:foo].bar
|
143
|
+
|
144
|
+
xml.yikes do
|
145
|
+
xml['foo'].baz
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
}
|
150
|
+
doc = b.doc
|
151
|
+
assert_equal 'bar', doc.at('foo|bar', 'foo' => 'bar').namespace.href
|
152
|
+
assert_equal 'bar', doc.at('foo|baz', 'foo' => 'bar').namespace.href
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_specified_namespace_postdeclared
|
156
|
+
doc = Nokogiri::XML::Builder.new { |xml|
|
157
|
+
xml.a do
|
158
|
+
xml[:foo].b("xmlns:foo" => "bar")
|
159
|
+
end
|
160
|
+
}.doc
|
161
|
+
a = doc.at('a')
|
162
|
+
assert_equal({}, a.namespaces)
|
163
|
+
|
164
|
+
b = doc.at_xpath('//foo:b', {:foo=>'bar'})
|
165
|
+
assert b
|
166
|
+
assert_equal({"xmlns:foo"=>"bar"}, b.namespaces)
|
167
|
+
assert_equal("b", b.name)
|
168
|
+
assert_equal("bar", b.namespace.href)
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_specified_namespace_undeclared
|
172
|
+
Nokogiri::XML::Builder.new { |xml|
|
173
|
+
xml.root do
|
174
|
+
assert_raises(ArgumentError) do
|
175
|
+
xml[:foo].bar
|
176
|
+
end
|
177
|
+
end
|
178
|
+
}
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_set_encoding
|
182
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
183
|
+
xml.root do
|
184
|
+
xml.bar 'blah'
|
185
|
+
end
|
186
|
+
end
|
187
|
+
assert_match 'UTF-8', builder.to_xml
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_bang_and_underscore_is_escaped
|
191
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
192
|
+
xml.root do
|
193
|
+
xml.p_('adsfadsf')
|
194
|
+
xml.p!('adsfadsf')
|
195
|
+
end
|
196
|
+
end
|
197
|
+
assert_equal 2, builder.doc.xpath('//p').length
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_square_brackets_set_attributes
|
201
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
202
|
+
xml.root do
|
203
|
+
foo = xml.foo
|
204
|
+
foo['id'] = 'hello'
|
205
|
+
assert_equal 'hello', foo['id']
|
206
|
+
end
|
207
|
+
end
|
208
|
+
assert_equal 1, builder.doc.xpath('//foo[@id = "hello"]').length
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_nested_local_variable
|
212
|
+
@ivar = 'hello'
|
213
|
+
local_var = 'hello world'
|
214
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
215
|
+
xml.root do
|
216
|
+
xml.foo local_var
|
217
|
+
xml.bar @ivar
|
218
|
+
xml.baz {
|
219
|
+
xml.text @ivar
|
220
|
+
}
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
assert_equal 'hello world', builder.doc.at('//root/foo').content
|
225
|
+
assert_equal 'hello', builder.doc.at('//root/bar').content
|
226
|
+
assert_equal 'hello', builder.doc.at('baz').content
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_raw_append
|
230
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
231
|
+
xml.root do
|
232
|
+
xml << 'hello'
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
assert_equal 'hello', builder.doc.at('/root').content
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_raw_append_with_instance_eval
|
240
|
+
builder = Nokogiri::XML::Builder.new do
|
241
|
+
root do
|
242
|
+
self << 'hello'
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
assert_equal 'hello', builder.doc.at('/root').content
|
247
|
+
end
|
248
|
+
|
249
|
+
def test_raw_xml_append
|
250
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
251
|
+
xml.root do
|
252
|
+
xml << '<aaa><bbb/><ccc/></aaa>'
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
assert_equal ["aaa"], builder.doc.at_css("root").children.collect(&:name)
|
257
|
+
assert_equal ["bbb","ccc"], builder.doc.at_css("aaa").children.collect(&:name)
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_raw_xml_append_with_namespaces
|
261
|
+
doc = Nokogiri::XML::Builder.new do |xml|
|
262
|
+
xml.root("xmlns:foo" => "x", "xmlns" => "y") do
|
263
|
+
xml << '<Element foo:bar="bazz"/>'
|
264
|
+
end
|
265
|
+
end.doc
|
266
|
+
|
267
|
+
el = doc.at 'Element'
|
268
|
+
assert_not_nil el
|
269
|
+
|
270
|
+
assert_equal 'y', el.namespace.href
|
271
|
+
assert_nil el.namespace.prefix
|
272
|
+
|
273
|
+
attr = el.attributes["bar"]
|
274
|
+
assert_not_nil attr
|
275
|
+
assert_not_nil attr.namespace
|
276
|
+
assert_equal "foo", attr.namespace.prefix
|
277
|
+
end
|
278
|
+
|
279
|
+
def test_cdata
|
280
|
+
builder = Nokogiri::XML::Builder.new do
|
281
|
+
root {
|
282
|
+
cdata "hello world"
|
283
|
+
}
|
284
|
+
end
|
285
|
+
assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>",
|
286
|
+
builder.to_xml.gsub(/\n/, ""))
|
287
|
+
end
|
288
|
+
|
289
|
+
def test_comment
|
290
|
+
builder = Nokogiri::XML::Builder.new do
|
291
|
+
root {
|
292
|
+
comment "this is a comment"
|
293
|
+
}
|
294
|
+
end
|
295
|
+
assert builder.doc.root.children.first.comment?
|
296
|
+
end
|
297
|
+
|
298
|
+
def test_builder_no_block
|
299
|
+
string = "hello world"
|
300
|
+
builder = Nokogiri::XML::Builder.new
|
301
|
+
builder.root {
|
302
|
+
cdata string
|
303
|
+
}
|
304
|
+
assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>",
|
305
|
+
builder.to_xml.gsub(/\n/, ''))
|
306
|
+
end
|
307
|
+
|
308
|
+
private
|
309
|
+
|
310
|
+
def namespaces_defined_on(node)
|
311
|
+
Hash[*node.namespace_definitions.collect{|n| ["xmlns:" + n.prefix, n.href]}.flatten]
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|