libxml-ruby 5.0.4 → 5.0.5
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.
- checksums.yaml +4 -4
- data/HISTORY +10 -6
- data/README.rdoc +1 -1
- data/ext/libxml/extconf.rb +5 -0
- data/ext/libxml/ruby_xml.c +556 -556
- data/ext/libxml/ruby_xml_attributes.h +17 -17
- data/ext/libxml/ruby_xml_document.c +1129 -1129
- data/ext/libxml/ruby_xml_dtd.c +257 -257
- data/ext/libxml/ruby_xml_encoding.c +250 -250
- data/ext/libxml/ruby_xml_error.c +1003 -1003
- data/ext/libxml/ruby_xml_error.h +14 -14
- data/ext/libxml/ruby_xml_html_parser_context.c +351 -351
- data/ext/libxml/ruby_xml_input_cbg.c +188 -188
- data/ext/libxml/ruby_xml_namespace.c +151 -151
- data/ext/libxml/ruby_xml_parser.h +10 -10
- data/ext/libxml/ruby_xml_parser_context.c +1009 -1009
- data/ext/libxml/ruby_xml_parser_options.c +74 -74
- data/ext/libxml/ruby_xml_parser_options.h +10 -10
- data/ext/libxml/ruby_xml_sax2_handler.c +326 -326
- data/ext/libxml/ruby_xml_sax_parser.c +108 -108
- data/ext/libxml/ruby_xml_version.h +9 -9
- data/lib/libxml/attr.rb +122 -122
- data/lib/libxml/attr_decl.rb +80 -80
- data/lib/libxml/attributes.rb +13 -13
- data/lib/libxml/document.rb +194 -194
- data/lib/libxml/error.rb +95 -95
- data/lib/libxml/hpricot.rb +77 -77
- data/lib/libxml/html_parser.rb +96 -96
- data/lib/libxml/namespace.rb +61 -61
- data/lib/libxml/namespaces.rb +37 -37
- data/lib/libxml/node.rb +323 -323
- data/lib/libxml/parser.rb +102 -102
- data/lib/libxml/sax_callbacks.rb +179 -179
- data/lib/libxml/sax_parser.rb +40 -40
- data/lib/libxml/tree.rb +28 -28
- data/lib/libxml.rb +4 -4
- data/lib/xml/libxml.rb +10 -10
- data/lib/xml.rb +13 -13
- data/libxml-ruby.gemspec +50 -49
- data/test/test_document.rb +140 -140
- data/test/test_document_write.rb +142 -142
- data/test/test_dtd.rb +126 -126
- data/test/test_encoding.rb +126 -126
- data/test/test_error.rb +194 -194
- data/test/test_helper.rb +20 -20
- data/test/test_namespace.rb +58 -58
- data/test/test_node.rb +235 -235
- data/test/test_node_write.rb +93 -93
- data/test/test_parser.rb +333 -333
- data/test/test_reader.rb +364 -364
- data/test/test_xml.rb +168 -168
- metadata +5 -4
data/lib/libxml/document.rb
CHANGED
@@ -1,194 +1,194 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
module LibXML
|
4
|
-
module XML
|
5
|
-
class Document
|
6
|
-
# call-seq:
|
7
|
-
# XML::Document.document(document) -> XML::Document
|
8
|
-
#
|
9
|
-
# Creates a new document based on the specified document.
|
10
|
-
#
|
11
|
-
# Parameters:
|
12
|
-
#
|
13
|
-
# document - A preparsed document.
|
14
|
-
def self.document(value)
|
15
|
-
Parser.document(value).parse
|
16
|
-
end
|
17
|
-
|
18
|
-
# call-seq:
|
19
|
-
# XML::Document.file(path) -> XML::Document
|
20
|
-
# XML::Document.file(path, encoding: XML::Encoding::UTF_8,
|
21
|
-
# options: XML::Parser::Options::NOENT) -> XML::Document
|
22
|
-
#
|
23
|
-
# Creates a new document from the specified file or uri.
|
24
|
-
#
|
25
|
-
# Parameters:
|
26
|
-
#
|
27
|
-
# path - Path to file
|
28
|
-
# encoding - The document encoding, defaults to nil. Valid values
|
29
|
-
# are the encoding constants defined on XML::Encoding.
|
30
|
-
# options - Parser options. Valid values are the constants defined on
|
31
|
-
# XML::Parser::Options. Mutliple options can be combined
|
32
|
-
# by using Bitwise OR (|).
|
33
|
-
def self.file(path, encoding: nil, options: nil)
|
34
|
-
Parser.file(path, encoding: encoding, options: options).parse
|
35
|
-
end
|
36
|
-
|
37
|
-
# call-seq:
|
38
|
-
# XML::Document.io(io) -> XML::Document
|
39
|
-
# XML::Document.io(io, :encoding => XML::Encoding::UTF_8,
|
40
|
-
# :options => XML::Parser::Options::NOENT
|
41
|
-
# :base_uri="http://libxml.org") -> XML::Document
|
42
|
-
#
|
43
|
-
# Creates a new document from the specified io object.
|
44
|
-
#
|
45
|
-
# Parameters:
|
46
|
-
#
|
47
|
-
# io - io object that contains the xml to parser
|
48
|
-
# base_uri - The base url for the parsed document.
|
49
|
-
# encoding - The document encoding, defaults to nil. Valid values
|
50
|
-
# are the encoding constants defined on XML::Encoding.
|
51
|
-
# options - Parser options. Valid values are the constants defined on
|
52
|
-
# XML::Parser::Options. Mutliple options can be combined
|
53
|
-
# by using Bitwise OR (|).
|
54
|
-
def self.io(io, base_uri: nil, encoding: nil, options: nil)
|
55
|
-
Parser.io(io, base_uri: base_uri, encoding: encoding, options: options).parse
|
56
|
-
end
|
57
|
-
|
58
|
-
# call-seq:
|
59
|
-
# XML::Document.string(string) -> XML::Document
|
60
|
-
# XML::Document.string(string, encoding: XML::Encoding::UTF_8,
|
61
|
-
# options: XML::Parser::Options::NOENT
|
62
|
-
# base_uri: "http://libxml.org") -> XML::Document
|
63
|
-
#
|
64
|
-
# Creates a new document from the specified string.
|
65
|
-
#
|
66
|
-
# Parameters:
|
67
|
-
#
|
68
|
-
# string - String to parse
|
69
|
-
# base_uri - The base url for the parsed document.
|
70
|
-
# encoding - The document encoding, defaults to nil. Valid values
|
71
|
-
# are the encoding constants defined on XML::Encoding.
|
72
|
-
# options - Parser options. Valid values are the constants defined on
|
73
|
-
# XML::Parser::Options. Mutliple options can be combined
|
74
|
-
# by using Bitwise OR (|).
|
75
|
-
def self.string(value, base_uri: nil, encoding: nil, options: nil)
|
76
|
-
Parser.string(value, base_uri: base_uri, encoding: encoding, options: options).parse
|
77
|
-
end
|
78
|
-
|
79
|
-
# Returns a new XML::XPathContext for the document.
|
80
|
-
#
|
81
|
-
# call-seq:
|
82
|
-
# document.context(namespaces=nil) -> XPath::Context
|
83
|
-
#
|
84
|
-
# Namespaces is an optional array of XML::NS objects
|
85
|
-
def context(nslist = nil)
|
86
|
-
context = XPath::Context.new(self)
|
87
|
-
context.node = self.root
|
88
|
-
context.register_namespaces_from_node(self.root)
|
89
|
-
context.register_namespaces(nslist) if nslist
|
90
|
-
context
|
91
|
-
end
|
92
|
-
|
93
|
-
# Return the nodes matching the specified xpath expression,
|
94
|
-
# optionally using the specified namespace. For more
|
95
|
-
# information about working with namespaces, please refer
|
96
|
-
# to the XML::XPath documentation.
|
97
|
-
#
|
98
|
-
# call-seq:
|
99
|
-
# document.find(xpath, nslist=nil) -> XML::XPath::Object
|
100
|
-
#
|
101
|
-
# Parameters:
|
102
|
-
# * xpath - The xpath expression as a string
|
103
|
-
# * namespaces - An optional list of namespaces (see XML::XPath for information).
|
104
|
-
#
|
105
|
-
# document.find('/foo', 'xlink:http://www.w3.org/1999/xlink')
|
106
|
-
#
|
107
|
-
# IMPORTANT - The returned XML::Node::Set must be freed before
|
108
|
-
# its associated document. In a running Ruby program this will
|
109
|
-
# happen automatically via Ruby's mark and sweep garbage collector.
|
110
|
-
# However, if the program exits, Ruby does not guarantee the order
|
111
|
-
# in which objects are freed
|
112
|
-
# (see http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/17700).
|
113
|
-
# As a result, the associated document may be freed before the node
|
114
|
-
# list, which will cause a segmentation fault.
|
115
|
-
# To avoid this, use the following (non-ruby like) coding style:
|
116
|
-
#
|
117
|
-
# nodes = doc.find('/header')
|
118
|
-
# nodes.each do |node|
|
119
|
-
# ... do stuff ...
|
120
|
-
# end
|
121
|
-
# # nodes = nil # GC.start
|
122
|
-
def find(xpath, nslist = nil)
|
123
|
-
self.context(nslist).find(xpath)
|
124
|
-
end
|
125
|
-
|
126
|
-
# Return the first node matching the specified xpath expression.
|
127
|
-
# For more information, please refer to the documentation
|
128
|
-
# for XML::Document#find.
|
129
|
-
def find_first(xpath, nslist = nil)
|
130
|
-
find(xpath, nslist).first
|
131
|
-
end
|
132
|
-
|
133
|
-
# Returns this node's type name
|
134
|
-
def node_type_name
|
135
|
-
case node_type
|
136
|
-
when XML::Node::DOCUMENT_NODE
|
137
|
-
'document_xml'
|
138
|
-
when XML::Node::DOCB_DOCUMENT_NODE
|
139
|
-
'document_docbook'
|
140
|
-
when XML::Node::HTML_DOCUMENT_NODE
|
141
|
-
'document_html'
|
142
|
-
else
|
143
|
-
raise(UnknownType, "Unknown node type: %n", node.node_type);
|
144
|
-
end
|
145
|
-
end
|
146
|
-
# :enddoc:
|
147
|
-
|
148
|
-
# Specifies if this is an document node
|
149
|
-
def document?
|
150
|
-
node_type == XML::Node::DOCUMENT_NODE
|
151
|
-
end
|
152
|
-
|
153
|
-
# Specifies if this is an docbook node
|
154
|
-
def docbook_doc?
|
155
|
-
node_type == XML::Node::DOCB_DOCUMENT_NODE
|
156
|
-
end
|
157
|
-
|
158
|
-
# Specifies if this is an html node
|
159
|
-
def html_doc?
|
160
|
-
node_type == XML::Node::HTML_DOCUMENT_NODE
|
161
|
-
end
|
162
|
-
|
163
|
-
def dump
|
164
|
-
warn('Document#dump is deprecated. Use Document#to_s instead.')
|
165
|
-
self.to_s
|
166
|
-
end
|
167
|
-
|
168
|
-
def format_dump
|
169
|
-
warn('Document#format_dump is deprecated. Use Document#to_s instead.')
|
170
|
-
self.to_s
|
171
|
-
end
|
172
|
-
|
173
|
-
def debug_dump
|
174
|
-
warn('Document#debug_dump is deprecated. Use Document#debug instead.')
|
175
|
-
self.debug
|
176
|
-
end
|
177
|
-
|
178
|
-
def debug_dump_head
|
179
|
-
warn('Document#debug_dump_head is deprecated. Use Document#debug instead.')
|
180
|
-
self.debug
|
181
|
-
end
|
182
|
-
|
183
|
-
def debug_format_dump
|
184
|
-
warn('Document#debug_format_dump is deprecated. Use Document#to_s instead.')
|
185
|
-
self.to_s
|
186
|
-
end
|
187
|
-
|
188
|
-
def reader
|
189
|
-
warn('Document#reader is deprecated. Use XML::Reader.document(self) instead.')
|
190
|
-
XML::Reader.document(self)
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module LibXML
|
4
|
+
module XML
|
5
|
+
class Document
|
6
|
+
# call-seq:
|
7
|
+
# XML::Document.document(document) -> XML::Document
|
8
|
+
#
|
9
|
+
# Creates a new document based on the specified document.
|
10
|
+
#
|
11
|
+
# Parameters:
|
12
|
+
#
|
13
|
+
# document - A preparsed document.
|
14
|
+
def self.document(value)
|
15
|
+
Parser.document(value).parse
|
16
|
+
end
|
17
|
+
|
18
|
+
# call-seq:
|
19
|
+
# XML::Document.file(path) -> XML::Document
|
20
|
+
# XML::Document.file(path, encoding: XML::Encoding::UTF_8,
|
21
|
+
# options: XML::Parser::Options::NOENT) -> XML::Document
|
22
|
+
#
|
23
|
+
# Creates a new document from the specified file or uri.
|
24
|
+
#
|
25
|
+
# Parameters:
|
26
|
+
#
|
27
|
+
# path - Path to file
|
28
|
+
# encoding - The document encoding, defaults to nil. Valid values
|
29
|
+
# are the encoding constants defined on XML::Encoding.
|
30
|
+
# options - Parser options. Valid values are the constants defined on
|
31
|
+
# XML::Parser::Options. Mutliple options can be combined
|
32
|
+
# by using Bitwise OR (|).
|
33
|
+
def self.file(path, encoding: nil, options: nil)
|
34
|
+
Parser.file(path, encoding: encoding, options: options).parse
|
35
|
+
end
|
36
|
+
|
37
|
+
# call-seq:
|
38
|
+
# XML::Document.io(io) -> XML::Document
|
39
|
+
# XML::Document.io(io, :encoding => XML::Encoding::UTF_8,
|
40
|
+
# :options => XML::Parser::Options::NOENT
|
41
|
+
# :base_uri="http://libxml.org") -> XML::Document
|
42
|
+
#
|
43
|
+
# Creates a new document from the specified io object.
|
44
|
+
#
|
45
|
+
# Parameters:
|
46
|
+
#
|
47
|
+
# io - io object that contains the xml to parser
|
48
|
+
# base_uri - The base url for the parsed document.
|
49
|
+
# encoding - The document encoding, defaults to nil. Valid values
|
50
|
+
# are the encoding constants defined on XML::Encoding.
|
51
|
+
# options - Parser options. Valid values are the constants defined on
|
52
|
+
# XML::Parser::Options. Mutliple options can be combined
|
53
|
+
# by using Bitwise OR (|).
|
54
|
+
def self.io(io, base_uri: nil, encoding: nil, options: nil)
|
55
|
+
Parser.io(io, base_uri: base_uri, encoding: encoding, options: options).parse
|
56
|
+
end
|
57
|
+
|
58
|
+
# call-seq:
|
59
|
+
# XML::Document.string(string) -> XML::Document
|
60
|
+
# XML::Document.string(string, encoding: XML::Encoding::UTF_8,
|
61
|
+
# options: XML::Parser::Options::NOENT
|
62
|
+
# base_uri: "http://libxml.org") -> XML::Document
|
63
|
+
#
|
64
|
+
# Creates a new document from the specified string.
|
65
|
+
#
|
66
|
+
# Parameters:
|
67
|
+
#
|
68
|
+
# string - String to parse
|
69
|
+
# base_uri - The base url for the parsed document.
|
70
|
+
# encoding - The document encoding, defaults to nil. Valid values
|
71
|
+
# are the encoding constants defined on XML::Encoding.
|
72
|
+
# options - Parser options. Valid values are the constants defined on
|
73
|
+
# XML::Parser::Options. Mutliple options can be combined
|
74
|
+
# by using Bitwise OR (|).
|
75
|
+
def self.string(value, base_uri: nil, encoding: nil, options: nil)
|
76
|
+
Parser.string(value, base_uri: base_uri, encoding: encoding, options: options).parse
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns a new XML::XPathContext for the document.
|
80
|
+
#
|
81
|
+
# call-seq:
|
82
|
+
# document.context(namespaces=nil) -> XPath::Context
|
83
|
+
#
|
84
|
+
# Namespaces is an optional array of XML::NS objects
|
85
|
+
def context(nslist = nil)
|
86
|
+
context = XPath::Context.new(self)
|
87
|
+
context.node = self.root
|
88
|
+
context.register_namespaces_from_node(self.root)
|
89
|
+
context.register_namespaces(nslist) if nslist
|
90
|
+
context
|
91
|
+
end
|
92
|
+
|
93
|
+
# Return the nodes matching the specified xpath expression,
|
94
|
+
# optionally using the specified namespace. For more
|
95
|
+
# information about working with namespaces, please refer
|
96
|
+
# to the XML::XPath documentation.
|
97
|
+
#
|
98
|
+
# call-seq:
|
99
|
+
# document.find(xpath, nslist=nil) -> XML::XPath::Object
|
100
|
+
#
|
101
|
+
# Parameters:
|
102
|
+
# * xpath - The xpath expression as a string
|
103
|
+
# * namespaces - An optional list of namespaces (see XML::XPath for information).
|
104
|
+
#
|
105
|
+
# document.find('/foo', 'xlink:http://www.w3.org/1999/xlink')
|
106
|
+
#
|
107
|
+
# IMPORTANT - The returned XML::Node::Set must be freed before
|
108
|
+
# its associated document. In a running Ruby program this will
|
109
|
+
# happen automatically via Ruby's mark and sweep garbage collector.
|
110
|
+
# However, if the program exits, Ruby does not guarantee the order
|
111
|
+
# in which objects are freed
|
112
|
+
# (see http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/17700).
|
113
|
+
# As a result, the associated document may be freed before the node
|
114
|
+
# list, which will cause a segmentation fault.
|
115
|
+
# To avoid this, use the following (non-ruby like) coding style:
|
116
|
+
#
|
117
|
+
# nodes = doc.find('/header')
|
118
|
+
# nodes.each do |node|
|
119
|
+
# ... do stuff ...
|
120
|
+
# end
|
121
|
+
# # nodes = nil # GC.start
|
122
|
+
def find(xpath, nslist = nil)
|
123
|
+
self.context(nslist).find(xpath)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Return the first node matching the specified xpath expression.
|
127
|
+
# For more information, please refer to the documentation
|
128
|
+
# for XML::Document#find.
|
129
|
+
def find_first(xpath, nslist = nil)
|
130
|
+
find(xpath, nslist).first
|
131
|
+
end
|
132
|
+
|
133
|
+
# Returns this node's type name
|
134
|
+
def node_type_name
|
135
|
+
case node_type
|
136
|
+
when XML::Node::DOCUMENT_NODE
|
137
|
+
'document_xml'
|
138
|
+
when XML::Node::DOCB_DOCUMENT_NODE
|
139
|
+
'document_docbook'
|
140
|
+
when XML::Node::HTML_DOCUMENT_NODE
|
141
|
+
'document_html'
|
142
|
+
else
|
143
|
+
raise(UnknownType, "Unknown node type: %n", node.node_type);
|
144
|
+
end
|
145
|
+
end
|
146
|
+
# :enddoc:
|
147
|
+
|
148
|
+
# Specifies if this is an document node
|
149
|
+
def document?
|
150
|
+
node_type == XML::Node::DOCUMENT_NODE
|
151
|
+
end
|
152
|
+
|
153
|
+
# Specifies if this is an docbook node
|
154
|
+
def docbook_doc?
|
155
|
+
node_type == XML::Node::DOCB_DOCUMENT_NODE
|
156
|
+
end
|
157
|
+
|
158
|
+
# Specifies if this is an html node
|
159
|
+
def html_doc?
|
160
|
+
node_type == XML::Node::HTML_DOCUMENT_NODE
|
161
|
+
end
|
162
|
+
|
163
|
+
def dump
|
164
|
+
warn('Document#dump is deprecated. Use Document#to_s instead.')
|
165
|
+
self.to_s
|
166
|
+
end
|
167
|
+
|
168
|
+
def format_dump
|
169
|
+
warn('Document#format_dump is deprecated. Use Document#to_s instead.')
|
170
|
+
self.to_s
|
171
|
+
end
|
172
|
+
|
173
|
+
def debug_dump
|
174
|
+
warn('Document#debug_dump is deprecated. Use Document#debug instead.')
|
175
|
+
self.debug
|
176
|
+
end
|
177
|
+
|
178
|
+
def debug_dump_head
|
179
|
+
warn('Document#debug_dump_head is deprecated. Use Document#debug instead.')
|
180
|
+
self.debug
|
181
|
+
end
|
182
|
+
|
183
|
+
def debug_format_dump
|
184
|
+
warn('Document#debug_format_dump is deprecated. Use Document#to_s instead.')
|
185
|
+
self.to_s
|
186
|
+
end
|
187
|
+
|
188
|
+
def reader
|
189
|
+
warn('Document#reader is deprecated. Use XML::Reader.document(self) instead.')
|
190
|
+
XML::Reader.document(self)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
data/lib/libxml/error.rb
CHANGED
@@ -1,95 +1,95 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
module LibXML
|
4
|
-
module XML
|
5
|
-
class Error
|
6
|
-
# Create mapping from domain constant values to keys
|
7
|
-
DOMAIN_CODE_MAP = [:NO_ERROR, :PARSER, :TREE, :NAMESPACE, :DTD, :HTML, :MEMORY,
|
8
|
-
:OUTPUT, :IO, :FTP, :HTTP, :XINCLUDE, :XPATH, :XPOINTER, :REGEXP,
|
9
|
-
:DATATYPE, :SCHEMASP, :SCHEMASV, :RELAXNGP, :RELAXNGV, :CATALOG,
|
10
|
-
:C14N, :XSLT, :VALID, :CHECK, :WRITER, :MODULE, :I18N, :SCHEMATRONV].inject(Hash.new) do |hash, code|
|
11
|
-
if const_defined?(code)
|
12
|
-
hash[const_get(code)] = code
|
13
|
-
end
|
14
|
-
hash
|
15
|
-
end
|
16
|
-
|
17
|
-
# Create mapping from error constant values (so need to remove domain_codes) to keys
|
18
|
-
ERROR_CODE_MAP = Hash.new.tap do |map|
|
19
|
-
(constants -
|
20
|
-
DOMAIN_CODE_MAP.values - #Domains
|
21
|
-
[:NONE, :WARNING, :ERROR, :FATAL] # Levels
|
22
|
-
).each do |code|
|
23
|
-
map[const_get(code)] = code
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# Verbose error handler
|
28
|
-
VERBOSE_HANDLER = lambda do |error|
|
29
|
-
STDERR << error.to_s << "\n"
|
30
|
-
STDERR.flush
|
31
|
-
end
|
32
|
-
|
33
|
-
# Quiet error handler
|
34
|
-
QUIET_HANDLER = lambda do |error|
|
35
|
-
end
|
36
|
-
|
37
|
-
def ==(other)
|
38
|
-
eql?(other)
|
39
|
-
end
|
40
|
-
|
41
|
-
def eql?(other)
|
42
|
-
self.code == other.code and
|
43
|
-
self.domain == other.domain and
|
44
|
-
self.message == other.message and
|
45
|
-
self.level == other.level and
|
46
|
-
self.file == other.file and
|
47
|
-
self.line == other.line and
|
48
|
-
self.str1 == other.str1 and
|
49
|
-
self.str2 == other.str2 and
|
50
|
-
self.str3 == other.str3 and
|
51
|
-
self.int1 == other.int1 and
|
52
|
-
self.int2 == other.int2 and
|
53
|
-
self.ctxt == other.ctxt and
|
54
|
-
self.node == other.node
|
55
|
-
rescue
|
56
|
-
false
|
57
|
-
end
|
58
|
-
|
59
|
-
def level_to_s
|
60
|
-
case self.level
|
61
|
-
when NONE
|
62
|
-
''
|
63
|
-
when WARNING
|
64
|
-
'Warning:'
|
65
|
-
when ERROR
|
66
|
-
'Error:'
|
67
|
-
when FATAL
|
68
|
-
'Fatal error:'
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def domain_to_s
|
73
|
-
DOMAIN_CODE_MAP[self.domain].to_s
|
74
|
-
end
|
75
|
-
|
76
|
-
def code_to_s
|
77
|
-
ERROR_CODE_MAP[self.code].to_s
|
78
|
-
end
|
79
|
-
|
80
|
-
def to_s
|
81
|
-
msg = super
|
82
|
-
msg = msg ? msg.strip: ''
|
83
|
-
|
84
|
-
if self.line
|
85
|
-
sprintf("%s %s at %s:%d.", self.level_to_s, msg,
|
86
|
-
self.file, self.line)
|
87
|
-
else
|
88
|
-
sprintf("%s %s.", self.level_to_s, msg)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
LibXML::XML::Error.set_handler(&LibXML::XML::Error::VERBOSE_HANDLER)
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module LibXML
|
4
|
+
module XML
|
5
|
+
class Error
|
6
|
+
# Create mapping from domain constant values to keys
|
7
|
+
DOMAIN_CODE_MAP = [:NO_ERROR, :PARSER, :TREE, :NAMESPACE, :DTD, :HTML, :MEMORY,
|
8
|
+
:OUTPUT, :IO, :FTP, :HTTP, :XINCLUDE, :XPATH, :XPOINTER, :REGEXP,
|
9
|
+
:DATATYPE, :SCHEMASP, :SCHEMASV, :RELAXNGP, :RELAXNGV, :CATALOG,
|
10
|
+
:C14N, :XSLT, :VALID, :CHECK, :WRITER, :MODULE, :I18N, :SCHEMATRONV].inject(Hash.new) do |hash, code|
|
11
|
+
if const_defined?(code)
|
12
|
+
hash[const_get(code)] = code
|
13
|
+
end
|
14
|
+
hash
|
15
|
+
end
|
16
|
+
|
17
|
+
# Create mapping from error constant values (so need to remove domain_codes) to keys
|
18
|
+
ERROR_CODE_MAP = Hash.new.tap do |map|
|
19
|
+
(constants -
|
20
|
+
DOMAIN_CODE_MAP.values - #Domains
|
21
|
+
[:NONE, :WARNING, :ERROR, :FATAL] # Levels
|
22
|
+
).each do |code|
|
23
|
+
map[const_get(code)] = code
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Verbose error handler
|
28
|
+
VERBOSE_HANDLER = lambda do |error|
|
29
|
+
STDERR << error.to_s << "\n"
|
30
|
+
STDERR.flush
|
31
|
+
end
|
32
|
+
|
33
|
+
# Quiet error handler
|
34
|
+
QUIET_HANDLER = lambda do |error|
|
35
|
+
end
|
36
|
+
|
37
|
+
def ==(other)
|
38
|
+
eql?(other)
|
39
|
+
end
|
40
|
+
|
41
|
+
def eql?(other)
|
42
|
+
self.code == other.code and
|
43
|
+
self.domain == other.domain and
|
44
|
+
self.message == other.message and
|
45
|
+
self.level == other.level and
|
46
|
+
self.file == other.file and
|
47
|
+
self.line == other.line and
|
48
|
+
self.str1 == other.str1 and
|
49
|
+
self.str2 == other.str2 and
|
50
|
+
self.str3 == other.str3 and
|
51
|
+
self.int1 == other.int1 and
|
52
|
+
self.int2 == other.int2 and
|
53
|
+
self.ctxt == other.ctxt and
|
54
|
+
self.node == other.node
|
55
|
+
rescue
|
56
|
+
false
|
57
|
+
end
|
58
|
+
|
59
|
+
def level_to_s
|
60
|
+
case self.level
|
61
|
+
when NONE
|
62
|
+
''
|
63
|
+
when WARNING
|
64
|
+
'Warning:'
|
65
|
+
when ERROR
|
66
|
+
'Error:'
|
67
|
+
when FATAL
|
68
|
+
'Fatal error:'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def domain_to_s
|
73
|
+
DOMAIN_CODE_MAP[self.domain].to_s
|
74
|
+
end
|
75
|
+
|
76
|
+
def code_to_s
|
77
|
+
ERROR_CODE_MAP[self.code].to_s
|
78
|
+
end
|
79
|
+
|
80
|
+
def to_s
|
81
|
+
msg = super
|
82
|
+
msg = msg ? msg.strip: ''
|
83
|
+
|
84
|
+
if self.line
|
85
|
+
sprintf("%s %s at %s:%d.", self.level_to_s, msg,
|
86
|
+
self.file, self.line)
|
87
|
+
else
|
88
|
+
sprintf("%s %s.", self.level_to_s, msg)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
LibXML::XML::Error.set_handler(&LibXML::XML::Error::VERBOSE_HANDLER)
|