nokogiri-maglev- 1.5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +26 -0
- data/.gemtest +0 -0
- data/CHANGELOG.ja.rdoc +544 -0
- data/CHANGELOG.rdoc +532 -0
- data/Manifest.txt +283 -0
- data/README.ja.rdoc +106 -0
- data/README.rdoc +174 -0
- data/Rakefile +171 -0
- data/bin/nokogiri +53 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +124 -0
- data/ext/nokogiri/html_document.c +154 -0
- data/ext/nokogiri/html_document.h +10 -0
- 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 +32 -0
- data/ext/nokogiri/html_entity_lookup.h +8 -0
- data/ext/nokogiri/html_sax_parser_context.c +94 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/nokogiri.c +115 -0
- data/ext/nokogiri/nokogiri.h +160 -0
- data/ext/nokogiri/st.c +576 -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 +478 -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 +84 -0
- data/ext/nokogiri/xml_namespace.h +13 -0
- data/ext/nokogiri/xml_node.c +1397 -0
- data/ext/nokogiri/xml_node.h +13 -0
- data/ext/nokogiri/xml_node_set.c +418 -0
- data/ext/nokogiri/xml_node_set.h +9 -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 +684 -0
- data/ext/nokogiri/xml_reader.h +10 -0
- data/ext/nokogiri/xml_relax_ng.c +162 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +293 -0
- data/ext/nokogiri/xml_sax_parser.h +39 -0
- 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 +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 +58 -0
- data/ext/nokogiri/xml_syntax_error.h +13 -0
- data/ext/nokogiri/xml_text.c +50 -0
- data/ext/nokogiri/xml_text.h +9 -0
- data/ext/nokogiri/xml_xpath_context.c +315 -0
- data/ext/nokogiri/xml_xpath_context.h +9 -0
- data/ext/nokogiri/xslt_stylesheet.c +265 -0
- data/ext/nokogiri/xslt_stylesheet.h +9 -0
- data/lib/nokogiri.rb +127 -0
- data/lib/nokogiri/css.rb +27 -0
- data/lib/nokogiri/css/node.rb +99 -0
- data/lib/nokogiri/css/parser.rb +677 -0
- data/lib/nokogiri/css/parser.y +237 -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 +171 -0
- data/lib/nokogiri/decorators/slop.rb +35 -0
- data/lib/nokogiri/html.rb +36 -0
- data/lib/nokogiri/html/builder.rb +35 -0
- data/lib/nokogiri/html/document.rb +213 -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/syntax_error.rb +4 -0
- data/lib/nokogiri/version.rb +88 -0
- data/lib/nokogiri/xml.rb +67 -0
- data/lib/nokogiri/xml/attr.rb +14 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +426 -0
- data/lib/nokogiri/xml/cdata.rb +11 -0
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +234 -0
- data/lib/nokogiri/xml/document_fragment.rb +98 -0
- data/lib/nokogiri/xml/dtd.rb +22 -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 +915 -0
- data/lib/nokogiri/xml/node/save_options.rb +61 -0
- data/lib/nokogiri/xml/node_set.rb +357 -0
- data/lib/nokogiri/xml/notation.rb +6 -0
- 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 +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 +164 -0
- data/lib/nokogiri/xml/sax/parser.rb +115 -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 +52 -0
- data/lib/nokogiri/xslt/stylesheet.rb +25 -0
- data/lib/xsd/xmlparser/nokogiri.rb +90 -0
- data/nokogiri_help_responses.md +40 -0
- data/tasks/cross_compile.rb +152 -0
- data/tasks/nokogiri.org.rb +18 -0
- data/tasks/test.rb +94 -0
- data/test/css/test_nthiness.rb +159 -0
- data/test/css/test_parser.rb +303 -0
- data/test/css/test_tokenizer.rb +198 -0
- data/test/css/test_xpath_visitor.rb +85 -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/bar/bar.xsd +4 -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/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/staff.xml +59 -0
- data/test/files/staff.xslt +32 -0
- data/test/files/tlm.html +850 -0
- data/test/files/valid_bar.xml +2 -0
- data/test/helper.rb +173 -0
- data/test/html/sax/test_parser.rb +139 -0
- data/test/html/sax/test_parser_context.rb +48 -0
- data/test/html/test_builder.rb +165 -0
- data/test/html/test_document.rb +472 -0
- data/test/html/test_document_encoding.rb +138 -0
- data/test/html/test_document_fragment.rb +255 -0
- data/test/html/test_element_description.rb +101 -0
- data/test/html/test_named_characters.rb +14 -0
- data/test/html/test_node.rb +193 -0
- data/test/html/test_node_encoding.rb +27 -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 +72 -0
- data/test/test_nokogiri.rb +133 -0
- data/test/test_reader.rb +425 -0
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +193 -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 +338 -0
- data/test/xml/sax/test_parser_context.rb +113 -0
- data/test/xml/sax/test_push_parser.rb +156 -0
- data/test/xml/test_attr.rb +65 -0
- data/test/xml/test_attribute_decl.rb +86 -0
- data/test/xml/test_builder.rb +227 -0
- data/test/xml/test_cdata.rb +50 -0
- data/test/xml/test_comment.rb +29 -0
- data/test/xml/test_document.rb +697 -0
- data/test/xml/test_document_encoding.rb +26 -0
- data/test/xml/test_document_fragment.rb +192 -0
- data/test/xml/test_dtd.rb +107 -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 +21 -0
- data/test/xml/test_namespace.rb +70 -0
- data/test/xml/test_node.rb +917 -0
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +107 -0
- data/test/xml/test_node_reparenting.rb +334 -0
- data/test/xml/test_node_set.rb +742 -0
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +30 -0
- data/test/xml/test_reader_encoding.rb +126 -0
- 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 +47 -0
- data/test/xml/test_unparented_node.rb +381 -0
- data/test/xml/test_xpath.rb +237 -0
- data/test/xslt/test_custom_functions.rb +94 -0
- data/test/xslt/test_exception_handling.rb +37 -0
- metadata +548 -0
@@ -0,0 +1,113 @@
|
|
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_from_io
|
69
|
+
assert_nothing_raised do
|
70
|
+
ParserContext.new StringIO.new('fo'), 'UTF-8'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_from_string
|
75
|
+
assert_nothing_raised do
|
76
|
+
ParserContext.new 'blah blah'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_parse_with
|
81
|
+
ctx = ParserContext.new 'blah'
|
82
|
+
assert_raises ArgumentError do
|
83
|
+
ctx.parse_with nil
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_parse_with_sax_parser
|
88
|
+
assert_nothing_raised do
|
89
|
+
xml = "<root />"
|
90
|
+
ctx = ParserContext.new xml
|
91
|
+
parser = Parser.new Doc.new
|
92
|
+
ctx.parse_with parser
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_from_file
|
97
|
+
assert_nothing_raised do
|
98
|
+
ctx = ParserContext.file XML_FILE
|
99
|
+
parser = Parser.new Doc.new
|
100
|
+
ctx.parse_with parser
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_parse_with_returns_nil
|
105
|
+
xml = "<root />"
|
106
|
+
ctx = ParserContext.new xml
|
107
|
+
parser = Parser.new Doc.new
|
108
|
+
assert_nil ctx.parse_with(parser)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,156 @@
|
|
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
|
+
@parser.options |= XML::ParseOptions::RECOVER
|
146
|
+
# This is ISO_8859-1:
|
147
|
+
@parser.<< "<?xml version='1.0' encoding='UTF-8'?><r>Gau\337</r>"
|
148
|
+
@parser.finish
|
149
|
+
assert(@parser.document.errors.size >= 1)
|
150
|
+
assert_equal "Gau\337", @parser.document.data.join
|
151
|
+
assert_equal [["r"]], @parser.document.end_elements
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestAttr < Nokogiri::TestCase
|
6
|
+
def test_new
|
7
|
+
assert_nothing_raised do
|
8
|
+
100.times {
|
9
|
+
doc = Nokogiri::XML::Document.new
|
10
|
+
Nokogiri::XML::Attr.new(doc, 'foo')
|
11
|
+
}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_content=
|
16
|
+
xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
17
|
+
address = xml.xpath('//address')[3]
|
18
|
+
street = address.attributes['street']
|
19
|
+
street.content = "Y&ent1;"
|
20
|
+
assert_equal "Y&ent1;", street.value
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_value=
|
24
|
+
xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
25
|
+
address = xml.xpath('//address')[3]
|
26
|
+
street = address.attributes['street']
|
27
|
+
street.value = "Y&ent1;"
|
28
|
+
assert_equal "Y&ent1;", street.value
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_unlink
|
32
|
+
xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
33
|
+
address = xml.xpath('/staff/employee/address').first
|
34
|
+
assert_equal 'Yes', address['domestic']
|
35
|
+
address.attribute_nodes.first.unlink
|
36
|
+
assert_nil address['domestic']
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_parsing_attribute_namespace
|
40
|
+
doc = Nokogiri::XML <<-EOXML
|
41
|
+
<root xmlns='http://google.com/' xmlns:f='http://flavorjon.es/'>
|
42
|
+
<div f:myattr='foo'></div>
|
43
|
+
</root>
|
44
|
+
EOXML
|
45
|
+
|
46
|
+
node = doc.at_css "div"
|
47
|
+
attr = node.attributes["myattr"]
|
48
|
+
assert_equal "http://flavorjon.es/", attr.namespace.href
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_setting_attribute_namespace
|
52
|
+
doc = Nokogiri::XML <<-EOXML
|
53
|
+
<root xmlns='http://google.com/' xmlns:f='http://flavorjon.es/'>
|
54
|
+
<div f:myattr='foo'></div>
|
55
|
+
</root>
|
56
|
+
EOXML
|
57
|
+
|
58
|
+
node = doc.at_css "div"
|
59
|
+
attr = node.attributes["myattr"]
|
60
|
+
attr.add_namespace("fizzle", "http://fizzle.com/")
|
61
|
+
assert_equal "http://fizzle.com/", attr.namespace.href
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
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,227 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestBuilder < Nokogiri::TestCase
|
6
|
+
def test_attribute_sensitivity
|
7
|
+
xml = Nokogiri::XML::Builder.new { |x|
|
8
|
+
x.tag "hello", "abcDef" => "world"
|
9
|
+
}.to_xml
|
10
|
+
doc = Nokogiri.XML xml
|
11
|
+
assert_equal 'world', doc.root['abcDef']
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_builder_escape
|
15
|
+
xml = Nokogiri::XML::Builder.new { |x|
|
16
|
+
x.condition "value < 1", :attr => "value < 1"
|
17
|
+
}.to_xml
|
18
|
+
doc = Nokogiri.XML xml
|
19
|
+
assert_equal 'value < 1', doc.root['attr']
|
20
|
+
assert_equal 'value < 1', doc.root.content
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_builder_namespace
|
24
|
+
doc = Nokogiri::XML::Builder.new { |xml|
|
25
|
+
xml.a("xmlns:a" => "x") do
|
26
|
+
xml.b("xmlns:a" => "x", "xmlns:b" => "y")
|
27
|
+
end
|
28
|
+
}.doc
|
29
|
+
|
30
|
+
b = doc.at('b')
|
31
|
+
assert b
|
32
|
+
assert_equal({"xmlns:a"=>"x", "xmlns:b"=>"y"}, b.namespaces)
|
33
|
+
assert_equal({"xmlns:b"=>"y"}, namespaces_defined_on(b))
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_builder_namespace_part_deux
|
37
|
+
doc = Nokogiri::XML::Builder.new { |xml|
|
38
|
+
xml.a("xmlns:b" => "y") do
|
39
|
+
xml.b("xmlns:a" => "x", "xmlns:b" => "y", "xmlns:c" => "z")
|
40
|
+
end
|
41
|
+
}.doc
|
42
|
+
|
43
|
+
b = doc.at('b')
|
44
|
+
assert b
|
45
|
+
assert_equal({"xmlns:a"=>"x", "xmlns:b"=>"y", "xmlns:c"=>"z"}, b.namespaces)
|
46
|
+
assert_equal({"xmlns:a"=>"x", "xmlns:c"=>"z"}, namespaces_defined_on(b))
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_builder_with_unlink
|
50
|
+
assert_nothing_raised do
|
51
|
+
Nokogiri::XML::Builder.new do |xml|
|
52
|
+
xml.foo do
|
53
|
+
xml.bar { xml.parent.unlink }
|
54
|
+
xml.bar2
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_with_root
|
61
|
+
doc = Nokogiri::XML(File.read(XML_FILE))
|
62
|
+
Nokogiri::XML::Builder.with(doc.at('employee')) do |xml|
|
63
|
+
xml.foo
|
64
|
+
end
|
65
|
+
assert_equal 1, doc.xpath('//employee/foo').length
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_root_namespace_default_decl
|
69
|
+
b = Nokogiri::XML::Builder.new { |xml| xml.root(:xmlns => 'one:two') }
|
70
|
+
doc = b.doc
|
71
|
+
assert_equal 'one:two', doc.root.namespace.href
|
72
|
+
assert_equal({ 'xmlns' => 'one:two' }, doc.root.namespaces)
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_root_namespace_multi_decl
|
76
|
+
b = Nokogiri::XML::Builder.new { |xml|
|
77
|
+
xml.root(:xmlns => 'one:two', 'xmlns:foo' => 'bar') do
|
78
|
+
xml.hello
|
79
|
+
end
|
80
|
+
}
|
81
|
+
doc = b.doc
|
82
|
+
assert_equal 'one:two', doc.root.namespace.href
|
83
|
+
assert_equal({ 'xmlns' => 'one:two', 'xmlns:foo' => 'bar' }, doc.root.namespaces)
|
84
|
+
|
85
|
+
assert_equal 'one:two', doc.at('hello').namespace.href
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_non_root_namespace
|
89
|
+
b = Nokogiri::XML::Builder.new { |xml|
|
90
|
+
xml.root { xml.hello(:xmlns => 'one') }
|
91
|
+
}
|
92
|
+
assert_equal 'one', b.doc.at('hello', 'xmlns' => 'one').namespace.href
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_specify_namespace
|
96
|
+
b = Nokogiri::XML::Builder.new { |xml|
|
97
|
+
xml.root('xmlns:foo' => 'bar') do
|
98
|
+
xml[:foo].bar
|
99
|
+
xml['foo'].baz
|
100
|
+
end
|
101
|
+
}
|
102
|
+
doc = b.doc
|
103
|
+
assert_equal 'bar', doc.at('foo|bar', 'foo' => 'bar').namespace.href
|
104
|
+
assert_equal 'bar', doc.at('foo|baz', 'foo' => 'bar').namespace.href
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_specify_namespace_nested
|
108
|
+
b = Nokogiri::XML::Builder.new { |xml|
|
109
|
+
xml.root('xmlns:foo' => 'bar') do
|
110
|
+
xml.yay do
|
111
|
+
xml[:foo].bar
|
112
|
+
|
113
|
+
xml.yikes do
|
114
|
+
xml['foo'].baz
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
}
|
119
|
+
doc = b.doc
|
120
|
+
assert_equal 'bar', doc.at('foo|bar', 'foo' => 'bar').namespace.href
|
121
|
+
assert_equal 'bar', doc.at('foo|baz', 'foo' => 'bar').namespace.href
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_specified_namespace_undeclared
|
125
|
+
Nokogiri::XML::Builder.new { |xml|
|
126
|
+
xml.root do
|
127
|
+
assert_raises(ArgumentError) do
|
128
|
+
xml[:foo]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
}
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_set_encoding
|
135
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
136
|
+
xml.root do
|
137
|
+
xml.bar 'blah'
|
138
|
+
end
|
139
|
+
end
|
140
|
+
assert_match 'UTF-8', builder.to_xml
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_bang_and_underscore_is_escaped
|
144
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
145
|
+
xml.root do
|
146
|
+
xml.p_('adsfadsf')
|
147
|
+
xml.p!('adsfadsf')
|
148
|
+
end
|
149
|
+
end
|
150
|
+
assert_equal 2, builder.doc.xpath('//p').length
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_square_brackets_set_attributes
|
154
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
155
|
+
xml.root do
|
156
|
+
foo = xml.foo
|
157
|
+
foo['id'] = 'hello'
|
158
|
+
assert_equal 'hello', foo['id']
|
159
|
+
end
|
160
|
+
end
|
161
|
+
assert_equal 1, builder.doc.xpath('//foo[@id = "hello"]').length
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_nested_local_variable
|
165
|
+
@ivar = 'hello'
|
166
|
+
local_var = 'hello world'
|
167
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
168
|
+
xml.root do
|
169
|
+
xml.foo local_var
|
170
|
+
xml.bar @ivar
|
171
|
+
xml.baz {
|
172
|
+
xml.text @ivar
|
173
|
+
}
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
assert_equal 'hello world', builder.doc.at('//root/foo').content
|
178
|
+
assert_equal 'hello', builder.doc.at('//root/bar').content
|
179
|
+
assert_equal 'hello', builder.doc.at('baz').content
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_raw_append
|
183
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
184
|
+
xml.root do
|
185
|
+
xml << 'hello'
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
assert_equal 'hello', builder.doc.at('/root').content
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_raw_append_with_instance_eval
|
193
|
+
builder = Nokogiri::XML::Builder.new do
|
194
|
+
root do
|
195
|
+
self << 'hello'
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
assert_equal 'hello', builder.doc.at('/root').content
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_cdata
|
203
|
+
builder = Nokogiri::XML::Builder.new do
|
204
|
+
root {
|
205
|
+
cdata "hello world"
|
206
|
+
}
|
207
|
+
end
|
208
|
+
assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>", builder.to_xml.gsub(/\n/, ''))
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_builder_no_block
|
212
|
+
string = "hello world"
|
213
|
+
builder = Nokogiri::XML::Builder.new
|
214
|
+
builder.root {
|
215
|
+
cdata string
|
216
|
+
}
|
217
|
+
assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>", builder.to_xml.gsub(/\n/, ''))
|
218
|
+
end
|
219
|
+
|
220
|
+
private
|
221
|
+
|
222
|
+
def namespaces_defined_on(node)
|
223
|
+
Hash[*node.namespace_definitions.collect{|n| ["xmlns:" + n.prefix, n.href]}.flatten]
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|