nokogiri 1.3.0-x86-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.
- data/.autotest +27 -0
- data/CHANGELOG.ja.rdoc +233 -0
- data/CHANGELOG.rdoc +222 -0
- data/Manifest.txt +247 -0
- data/README.ja.rdoc +103 -0
- data/README.rdoc +117 -0
- data/Rakefile +205 -0
- data/bin/nokogiri +47 -0
- data/ext/nokogiri/extconf.rb +89 -0
- data/ext/nokogiri/html_document.c +183 -0
- data/ext/nokogiri/html_document.h +10 -0
- data/ext/nokogiri/html_element_description.c +272 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.c +30 -0
- data/ext/nokogiri/html_entity_lookup.h +8 -0
- data/ext/nokogiri/html_sax_parser.c +57 -0
- data/ext/nokogiri/html_sax_parser.h +11 -0
- 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/nokogiri.c +81 -0
- data/ext/nokogiri/nokogiri.h +149 -0
- data/ext/nokogiri/xml_attr.c +92 -0
- data/ext/nokogiri/xml_attr.h +9 -0
- data/ext/nokogiri/xml_cdata.c +53 -0
- data/ext/nokogiri/xml_cdata.h +9 -0
- data/ext/nokogiri/xml_comment.c +51 -0
- data/ext/nokogiri/xml_comment.h +9 -0
- data/ext/nokogiri/xml_document.c +308 -0
- data/ext/nokogiri/xml_document.h +21 -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 +102 -0
- data/ext/nokogiri/xml_dtd.h +8 -0
- data/ext/nokogiri/xml_entity_reference.c +50 -0
- data/ext/nokogiri/xml_entity_reference.h +9 -0
- data/ext/nokogiri/xml_io.c +24 -0
- data/ext/nokogiri/xml_io.h +10 -0
- data/ext/nokogiri/xml_namespace.c +69 -0
- data/ext/nokogiri/xml_namespace.h +12 -0
- data/ext/nokogiri/xml_node.c +928 -0
- data/ext/nokogiri/xml_node.h +14 -0
- data/ext/nokogiri/xml_node_set.c +386 -0
- data/ext/nokogiri/xml_node_set.h +9 -0
- data/ext/nokogiri/xml_processing_instruction.c +54 -0
- data/ext/nokogiri/xml_processing_instruction.h +9 -0
- data/ext/nokogiri/xml_reader.c +572 -0
- data/ext/nokogiri/xml_reader.h +10 -0
- data/ext/nokogiri/xml_relax_ng.c +106 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +336 -0
- data/ext/nokogiri/xml_sax_parser.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +86 -0
- data/ext/nokogiri/xml_sax_push_parser.h +9 -0
- data/ext/nokogiri/xml_schema.c +107 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +203 -0
- data/ext/nokogiri/xml_syntax_error.h +12 -0
- data/ext/nokogiri/xml_text.c +47 -0
- data/ext/nokogiri/xml_text.h +9 -0
- data/ext/nokogiri/xml_xpath.c +53 -0
- data/ext/nokogiri/xml_xpath.h +11 -0
- data/ext/nokogiri/xml_xpath_context.c +252 -0
- data/ext/nokogiri/xml_xpath_context.h +9 -0
- data/ext/nokogiri/xslt_stylesheet.c +131 -0
- data/ext/nokogiri/xslt_stylesheet.h +9 -0
- data/ext/nokogiri/zlib1.dll +0 -0
- data/lib/action-nokogiri.rb +36 -0
- data/lib/nokogiri.rb +110 -0
- data/lib/nokogiri/1.8/nokogiri.so +0 -0
- data/lib/nokogiri/1.9/nokogiri.so +0 -0
- data/lib/nokogiri/css.rb +25 -0
- data/lib/nokogiri/css/generated_parser.rb +748 -0
- data/lib/nokogiri/css/generated_tokenizer.rb +144 -0
- data/lib/nokogiri/css/node.rb +107 -0
- data/lib/nokogiri/css/parser.rb +82 -0
- data/lib/nokogiri/css/parser.y +227 -0
- data/lib/nokogiri/css/syntax_error.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rb +11 -0
- data/lib/nokogiri/css/tokenizer.rex +54 -0
- data/lib/nokogiri/css/xpath_visitor.rb +172 -0
- data/lib/nokogiri/decorators.rb +2 -0
- data/lib/nokogiri/decorators/hpricot.rb +3 -0
- data/lib/nokogiri/decorators/hpricot/node.rb +56 -0
- data/lib/nokogiri/decorators/hpricot/node_set.rb +54 -0
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +30 -0
- data/lib/nokogiri/decorators/slop.rb +33 -0
- data/lib/nokogiri/ffi/html/document.rb +37 -0
- data/lib/nokogiri/ffi/html/element_description.rb +85 -0
- data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
- data/lib/nokogiri/ffi/html/sax/parser.rb +21 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +32 -0
- data/lib/nokogiri/ffi/libxml.rb +314 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +26 -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 +19 -0
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +26 -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_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 +14 -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 +37 -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/xml/attr.rb +41 -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 +107 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +26 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +42 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +38 -0
- data/lib/nokogiri/ffi/xml/node.rb +380 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +130 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +217 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +51 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +148 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +38 -0
- data/lib/nokogiri/ffi/xml/schema.rb +55 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +76 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
- data/lib/nokogiri/hpricot.rb +62 -0
- data/lib/nokogiri/html.rb +34 -0
- data/lib/nokogiri/html/builder.rb +35 -0
- data/lib/nokogiri/html/document.rb +71 -0
- data/lib/nokogiri/html/document_fragment.rb +15 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +13 -0
- data/lib/nokogiri/html/sax/parser.rb +47 -0
- data/lib/nokogiri/nokogiri.rb +1 -0
- data/lib/nokogiri/syntax_error.rb +4 -0
- data/lib/nokogiri/version.rb +29 -0
- data/lib/nokogiri/version_warning.rb +11 -0
- data/lib/nokogiri/xml.rb +62 -0
- data/lib/nokogiri/xml/attr.rb +9 -0
- data/lib/nokogiri/xml/builder.rb +254 -0
- data/lib/nokogiri/xml/cdata.rb +11 -0
- data/lib/nokogiri/xml/document.rb +100 -0
- data/lib/nokogiri/xml/document_fragment.rb +49 -0
- data/lib/nokogiri/xml/dtd.rb +11 -0
- data/lib/nokogiri/xml/entity_declaration.rb +11 -0
- data/lib/nokogiri/xml/fragment_handler.rb +55 -0
- data/lib/nokogiri/xml/namespace.rb +7 -0
- data/lib/nokogiri/xml/node.rb +745 -0
- data/lib/nokogiri/xml/node/save_options.rb +42 -0
- data/lib/nokogiri/xml/node_set.rb +238 -0
- data/lib/nokogiri/xml/notation.rb +6 -0
- data/lib/nokogiri/xml/parse_options.rb +80 -0
- data/lib/nokogiri/xml/processing_instruction.rb +8 -0
- data/lib/nokogiri/xml/reader.rb +66 -0
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +3 -0
- data/lib/nokogiri/xml/sax/document.rb +143 -0
- data/lib/nokogiri/xml/sax/parser.rb +101 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
- data/lib/nokogiri/xml/schema.rb +65 -0
- data/lib/nokogiri/xml/syntax_error.rb +34 -0
- data/lib/nokogiri/xml/xpath.rb +10 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +8 -0
- data/lib/nokogiri/xml/xpath_context.rb +16 -0
- data/lib/nokogiri/xslt.rb +48 -0
- data/lib/nokogiri/xslt/stylesheet.rb +25 -0
- data/lib/xsd/xmlparser/nokogiri.rb +64 -0
- data/tasks/test.rb +161 -0
- data/test/css/test_nthiness.rb +160 -0
- data/test/css/test_parser.rb +277 -0
- data/test/css/test_tokenizer.rb +176 -0
- data/test/css/test_xpath_visitor.rb +76 -0
- data/test/ffi/test_document.rb +35 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/dont_hurt_em_why.xml +422 -0
- data/test/files/exslt.xml +8 -0
- data/test/files/exslt.xslt +35 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/staff.xml +59 -0
- data/test/files/staff.xslt +32 -0
- data/test/files/tlm.html +850 -0
- data/test/helper.rb +123 -0
- data/test/hpricot/files/basic.xhtml +17 -0
- data/test/hpricot/files/boingboing.html +2266 -0
- data/test/hpricot/files/cy0.html +3653 -0
- data/test/hpricot/files/immob.html +400 -0
- data/test/hpricot/files/pace_application.html +1320 -0
- data/test/hpricot/files/tenderlove.html +16 -0
- data/test/hpricot/files/uswebgen.html +220 -0
- data/test/hpricot/files/utf8.html +1054 -0
- data/test/hpricot/files/week9.html +1723 -0
- data/test/hpricot/files/why.xml +19 -0
- data/test/hpricot/load_files.rb +11 -0
- data/test/hpricot/test_alter.rb +68 -0
- data/test/hpricot/test_builder.rb +20 -0
- data/test/hpricot/test_parser.rb +426 -0
- data/test/hpricot/test_paths.rb +15 -0
- data/test/hpricot/test_preserved.rb +77 -0
- data/test/hpricot/test_xml.rb +30 -0
- data/test/html/sax/test_parser.rb +52 -0
- data/test/html/test_builder.rb +156 -0
- data/test/html/test_document.rb +361 -0
- data/test/html/test_document_encoding.rb +46 -0
- data/test/html/test_document_fragment.rb +97 -0
- data/test/html/test_element_description.rb +95 -0
- data/test/html/test_named_characters.rb +14 -0
- data/test/html/test_node.rb +165 -0
- data/test/test_convert_xpath.rb +186 -0
- data/test/test_css_cache.rb +56 -0
- data/test/test_gc.rb +15 -0
- data/test/test_memory_leak.rb +77 -0
- data/test/test_nokogiri.rb +127 -0
- data/test/test_reader.rb +316 -0
- data/test/test_xslt_transforms.rb +131 -0
- data/test/xml/node/test_save_options.rb +20 -0
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +169 -0
- data/test/xml/sax/test_push_parser.rb +92 -0
- data/test/xml/test_attr.rb +38 -0
- data/test/xml/test_builder.rb +73 -0
- data/test/xml/test_cdata.rb +38 -0
- data/test/xml/test_comment.rb +23 -0
- data/test/xml/test_document.rb +397 -0
- data/test/xml/test_document_encoding.rb +26 -0
- data/test/xml/test_document_fragment.rb +76 -0
- data/test/xml/test_dtd.rb +42 -0
- data/test/xml/test_dtd_encoding.rb +31 -0
- data/test/xml/test_entity_reference.rb +21 -0
- data/test/xml/test_namespace.rb +43 -0
- data/test/xml/test_node.rb +808 -0
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +84 -0
- data/test/xml/test_node_set.rb +368 -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 +65 -0
- data/test/xml/test_text.rb +18 -0
- data/test/xml/test_unparented_node.rb +381 -0
- data/test/xml/test_xpath.rb +106 -0
- metadata +409 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XML
|
3
|
+
class Node
|
4
|
+
###
|
5
|
+
# Save options for serializing nodes
|
6
|
+
class SaveOptions
|
7
|
+
# Format serialized xml
|
8
|
+
FORMAT = 1
|
9
|
+
# Do not include delcarations
|
10
|
+
NO_DECLARATION = 2
|
11
|
+
# Do not include empty tags
|
12
|
+
NO_EMPTY_TAGS = 4
|
13
|
+
# Do not save XHTML
|
14
|
+
NO_XHTML = 8
|
15
|
+
# Save as XHTML
|
16
|
+
AS_XHTML = 16
|
17
|
+
# Save as XML
|
18
|
+
AS_XML = 32
|
19
|
+
# Save as HTML
|
20
|
+
AS_HTML = 64
|
21
|
+
|
22
|
+
# Integer representation of the SaveOptions
|
23
|
+
attr_reader :options
|
24
|
+
|
25
|
+
# Create a new SaveOptions object with +options+
|
26
|
+
def initialize options = 0; @options = options; end
|
27
|
+
constants.each do |constant|
|
28
|
+
class_eval %{
|
29
|
+
def #{constant.downcase}
|
30
|
+
@options |= #{constant}
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def #{constant.downcase}?
|
35
|
+
#{constant} & @options == #{constant}
|
36
|
+
end
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,238 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XML
|
3
|
+
####
|
4
|
+
# A NodeSet contains a list of Nokogiri::XML::Node objects. Typically
|
5
|
+
# a NodeSet is return as a result of searching a Document via
|
6
|
+
# Nokogiri::XML::Node#css or Nokogiri::XML::Node#xpath
|
7
|
+
class NodeSet
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
# The Document this NodeSet is associated with
|
11
|
+
attr_accessor :document
|
12
|
+
|
13
|
+
# Create a NodeSet with +document+ defaulting to +list+
|
14
|
+
def initialize document, list = []
|
15
|
+
@document = document
|
16
|
+
list.each { |x| self << x }
|
17
|
+
yield self if block_given?
|
18
|
+
end
|
19
|
+
|
20
|
+
###
|
21
|
+
# Get the first element of the NodeSet.
|
22
|
+
def first n = nil
|
23
|
+
return self[0] unless n
|
24
|
+
list = []
|
25
|
+
0.upto(n - 1) do |i|
|
26
|
+
list << self[i]
|
27
|
+
end
|
28
|
+
list
|
29
|
+
end
|
30
|
+
|
31
|
+
###
|
32
|
+
# Get the last element of the NodeSet.
|
33
|
+
def last
|
34
|
+
self[length - 1]
|
35
|
+
end
|
36
|
+
|
37
|
+
###
|
38
|
+
# Is this NodeSet empty?
|
39
|
+
def empty?
|
40
|
+
length == 0
|
41
|
+
end
|
42
|
+
|
43
|
+
###
|
44
|
+
# Returns the index of the first node in self that is == to +node+. Returns nil if no match is found.
|
45
|
+
def index(node)
|
46
|
+
each_with_index { |member, j| return j if member == node }
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
|
50
|
+
###
|
51
|
+
# Insert +datum+ before the first Node in this NodeSet
|
52
|
+
def before datum
|
53
|
+
first.before datum
|
54
|
+
end
|
55
|
+
|
56
|
+
###
|
57
|
+
# Insert +datum+ after the last Node in this NodeSet
|
58
|
+
def after datum
|
59
|
+
last.after datum
|
60
|
+
end
|
61
|
+
|
62
|
+
alias :<< :push
|
63
|
+
alias :remove :unlink
|
64
|
+
|
65
|
+
###
|
66
|
+
# Search this document for +paths+
|
67
|
+
#
|
68
|
+
# For more information see Nokogiri::XML::Node#css and
|
69
|
+
# Nokogiri::XML::Node#xpath
|
70
|
+
def search *paths
|
71
|
+
ns = paths.last.is_a?(Hash) ? paths.pop : document.root.namespaces
|
72
|
+
sub_set = NodeSet.new(document)
|
73
|
+
document.decorate(sub_set)
|
74
|
+
each do |node|
|
75
|
+
node.search(*(paths + [ns])).each do |sub_node|
|
76
|
+
sub_set << sub_node
|
77
|
+
end
|
78
|
+
end
|
79
|
+
sub_set
|
80
|
+
end
|
81
|
+
alias :/ :search
|
82
|
+
alias :xpath :search
|
83
|
+
alias :css :search
|
84
|
+
|
85
|
+
###
|
86
|
+
# If path is a string, search this document for +path+ returning the
|
87
|
+
# first Node. Otherwise, index in to the array with +path+.
|
88
|
+
def at path, ns = document.root ? document.root.namespaces : {}
|
89
|
+
return self[path] if path.is_a?(Numeric)
|
90
|
+
search(path, ns).first
|
91
|
+
end
|
92
|
+
alias :% :at
|
93
|
+
|
94
|
+
###
|
95
|
+
# Append the class attribute +name+ to all Node objects in the NodeSet.
|
96
|
+
def add_class name
|
97
|
+
each do |el|
|
98
|
+
next unless el.respond_to? :get_attribute
|
99
|
+
classes = el.get_attribute('class').to_s.split(" ")
|
100
|
+
el.set_attribute('class', classes.push(name).uniq.join(" "))
|
101
|
+
end
|
102
|
+
self
|
103
|
+
end
|
104
|
+
|
105
|
+
###
|
106
|
+
# Remove the class attribute +name+ from all Node objects in the NodeSet.
|
107
|
+
def remove_class name = nil
|
108
|
+
each do |el|
|
109
|
+
next unless el.respond_to? :get_attribute
|
110
|
+
if name
|
111
|
+
classes = el.get_attribute('class').to_s.split(" ")
|
112
|
+
el.set_attribute('class', (classes - [name]).uniq.join(" "))
|
113
|
+
else
|
114
|
+
el.remove_attribute("class")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
self
|
118
|
+
end
|
119
|
+
|
120
|
+
###
|
121
|
+
# Set the attribute +key+ to +value+ or the return value of +blk+
|
122
|
+
# on all Node objects in the NodeSet.
|
123
|
+
def attr key, value = nil, &blk
|
124
|
+
if value or blk
|
125
|
+
each do |el|
|
126
|
+
el.set_attribute(key, value || blk[el])
|
127
|
+
end
|
128
|
+
return self
|
129
|
+
end
|
130
|
+
if key.is_a? Hash
|
131
|
+
key.each { |k,v| self.attr(k,v) }
|
132
|
+
return self
|
133
|
+
else
|
134
|
+
return self[0].get_attribute(key)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
alias_method :set, :attr
|
138
|
+
|
139
|
+
###
|
140
|
+
# Remove the attributed named +name+ from all Node objects in the NodeSet
|
141
|
+
def remove_attr name
|
142
|
+
each do |el|
|
143
|
+
next unless el.respond_to? :remove_attribute
|
144
|
+
el.remove_attribute(name)
|
145
|
+
end
|
146
|
+
self
|
147
|
+
end
|
148
|
+
|
149
|
+
###
|
150
|
+
# Iterate over each node, yielding to +block+
|
151
|
+
def each(&block)
|
152
|
+
0.upto(length - 1) do |x|
|
153
|
+
yield self[x]
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
###
|
158
|
+
# Get the inner text of all contained Node objects
|
159
|
+
def inner_text
|
160
|
+
collect{|j| j.inner_text}.join('')
|
161
|
+
end
|
162
|
+
alias :text :inner_text
|
163
|
+
|
164
|
+
###
|
165
|
+
# Get the inner html of all contained Node objects
|
166
|
+
def inner_html
|
167
|
+
collect{|j| j.inner_html}.join('')
|
168
|
+
end
|
169
|
+
|
170
|
+
###
|
171
|
+
# Wrap this NodeSet with +html+ or the results of the builder in +blk+
|
172
|
+
def wrap(html, &blk)
|
173
|
+
each do |j|
|
174
|
+
new_parent = Nokogiri.make(html, &blk)
|
175
|
+
j.parent.add_child(new_parent)
|
176
|
+
new_parent.add_child(j)
|
177
|
+
end
|
178
|
+
self
|
179
|
+
end
|
180
|
+
|
181
|
+
###
|
182
|
+
# Convert this NodeSet to a string.
|
183
|
+
def to_s
|
184
|
+
map { |x| x.to_s }.join
|
185
|
+
end
|
186
|
+
|
187
|
+
###
|
188
|
+
# Convert this NodeSet to HTML
|
189
|
+
def to_html *args
|
190
|
+
map { |x| x.to_html(*args) }.join
|
191
|
+
end
|
192
|
+
|
193
|
+
###
|
194
|
+
# Convert this NodeSet to XHTML
|
195
|
+
def to_xhtml *args
|
196
|
+
map { |x| x.to_xhtml(*args) }.join
|
197
|
+
end
|
198
|
+
|
199
|
+
###
|
200
|
+
# Convert this NodeSet to XML
|
201
|
+
def to_xml *args
|
202
|
+
map { |x| x.to_xml(*args) }.join
|
203
|
+
end
|
204
|
+
|
205
|
+
alias :size :length
|
206
|
+
alias :to_ary :to_a
|
207
|
+
|
208
|
+
###
|
209
|
+
# Removes the last element from set and returns it, or +nil+ if
|
210
|
+
# the set is empty
|
211
|
+
def pop
|
212
|
+
return nil if length == 0
|
213
|
+
delete last
|
214
|
+
end
|
215
|
+
|
216
|
+
###
|
217
|
+
# Returns the first element of the NodeSet and removes it. Returns
|
218
|
+
# +nil+ if the set is empty.
|
219
|
+
def shift
|
220
|
+
return nil if length == 0
|
221
|
+
delete first
|
222
|
+
end
|
223
|
+
|
224
|
+
###
|
225
|
+
# Equality -- Two NodeSets are equal if the contain the same number
|
226
|
+
# of elements and if each element is equal to the corresponding
|
227
|
+
# element in the other NodeSet
|
228
|
+
def == other
|
229
|
+
return false unless other.is_a?(Nokogiri::XML::NodeSet)
|
230
|
+
return false unless length == other.length
|
231
|
+
each_with_index do |node, i|
|
232
|
+
return false unless node == other[i]
|
233
|
+
end
|
234
|
+
true
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XML
|
3
|
+
###
|
4
|
+
# Parse options for passing to Nokogiri.XML or Nokogiri.HTML
|
5
|
+
class ParseOptions
|
6
|
+
# Strict parsing
|
7
|
+
STRICT = 0
|
8
|
+
# Recover from errors
|
9
|
+
RECOVER = 1 << 0
|
10
|
+
# Substitute entities
|
11
|
+
NOENT = 1 << 1
|
12
|
+
# Load external subsets
|
13
|
+
DTDLOAD = 1 << 2
|
14
|
+
# Default DTD attributes
|
15
|
+
DTDATTR = 1 << 3
|
16
|
+
# validate with the DTD
|
17
|
+
DTDVALID = 1 << 4
|
18
|
+
# suppress error reports
|
19
|
+
NOERROR = 1 << 5
|
20
|
+
# suppress warning reports
|
21
|
+
NOWARNING = 1 << 6
|
22
|
+
# pedantic error reporting
|
23
|
+
PEDANTIC = 1 << 7
|
24
|
+
# remove blank nodes
|
25
|
+
NOBLANKS = 1 << 8
|
26
|
+
# use the SAX1 interface internally
|
27
|
+
SAX1 = 1 << 9
|
28
|
+
# Implement XInclude substitition
|
29
|
+
XINCLUDE = 1 << 10
|
30
|
+
# Forbid network access
|
31
|
+
NONET = 1 << 11
|
32
|
+
# Do not reuse the context dictionnary
|
33
|
+
NODICT = 1 << 12
|
34
|
+
# remove redundant namespaces declarations
|
35
|
+
NSCLEAN = 1 << 13
|
36
|
+
# merge CDATA as text nodes
|
37
|
+
NOCDATA = 1 << 14
|
38
|
+
# do not generate XINCLUDE START/END nodes
|
39
|
+
NOXINCNODE = 1 << 15
|
40
|
+
|
41
|
+
attr_accessor :options
|
42
|
+
def initialize options = 0
|
43
|
+
@options = options
|
44
|
+
end
|
45
|
+
|
46
|
+
constants.each do |constant|
|
47
|
+
next if constant == 'STRICT'
|
48
|
+
class_eval %{
|
49
|
+
def #{constant.downcase}
|
50
|
+
@options |= #{constant}
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
def #{constant.downcase}?
|
55
|
+
#{constant} & @options == #{constant}
|
56
|
+
end
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def strict
|
61
|
+
@options |= STRICT
|
62
|
+
self
|
63
|
+
end
|
64
|
+
|
65
|
+
def strict?
|
66
|
+
@options & RECOVER == STRICT
|
67
|
+
end
|
68
|
+
|
69
|
+
alias :to_i :options
|
70
|
+
|
71
|
+
def inspect
|
72
|
+
options = []
|
73
|
+
self.class.constants.each do |k|
|
74
|
+
options << k.downcase if send(:"#{k.downcase}?")
|
75
|
+
end
|
76
|
+
super.sub(/>$/, " " + options.join(', ') + ">")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XML
|
3
|
+
###
|
4
|
+
# Nokogiri::XML::Reader parses an XML document similar to the way a cursor
|
5
|
+
# would move. The Reader is given an XML document, and yields nodes
|
6
|
+
# to an each block.
|
7
|
+
#
|
8
|
+
# Here is an example of usage:
|
9
|
+
#
|
10
|
+
# reader = Nokogiri::XML::Reader(<<-eoxml)
|
11
|
+
# <x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
12
|
+
# <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
13
|
+
# </x>
|
14
|
+
# eoxml
|
15
|
+
#
|
16
|
+
# reader.each do |node|
|
17
|
+
#
|
18
|
+
# # node is an instance of Nokogiri::XML::Reader
|
19
|
+
# puts node.name
|
20
|
+
#
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# Note that Nokogiri::XML::Reader#each can only be called once!! Once
|
24
|
+
# the cursor moves through the entire document, you must parse the
|
25
|
+
# document again. So make sure that you capture any information you
|
26
|
+
# need during the first iteration.
|
27
|
+
#
|
28
|
+
# The Reader parser is good for when you need the speed of a SAX parser,
|
29
|
+
# but do not want to write a Document handler.
|
30
|
+
class Reader
|
31
|
+
include Enumerable
|
32
|
+
|
33
|
+
# A list of errors encountered while parsing
|
34
|
+
attr_accessor :errors
|
35
|
+
|
36
|
+
# The encoding for the document
|
37
|
+
attr_reader :encoding
|
38
|
+
|
39
|
+
# The XML source
|
40
|
+
attr_reader :source
|
41
|
+
|
42
|
+
def initialize source, url = nil, encoding = nil # :nodoc:
|
43
|
+
@source = source
|
44
|
+
@errors = []
|
45
|
+
@encoding = encoding
|
46
|
+
end
|
47
|
+
private :initialize
|
48
|
+
|
49
|
+
###
|
50
|
+
# Get a list of attributes for the current node.
|
51
|
+
def attributes
|
52
|
+
Hash[*(attribute_nodes.map { |node|
|
53
|
+
[node.name, node.to_s]
|
54
|
+
}.flatten)].merge(namespaces || {})
|
55
|
+
end
|
56
|
+
|
57
|
+
###
|
58
|
+
# Move the cursor through the document yielding each node to the block
|
59
|
+
def each(&block)
|
60
|
+
while node = self.read
|
61
|
+
block.call(node)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XML
|
3
|
+
class << self
|
4
|
+
###
|
5
|
+
# Create a new Nokogiri::XML::RelaxNG document from +string_or_io+.
|
6
|
+
# See Nokogiri::XML::RelaxNG for an example.
|
7
|
+
def RelaxNG string_or_io
|
8
|
+
RelaxNG.new(string_or_io)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
###
|
13
|
+
# Nokogiri::XML::RelaxNG is used for validating XML against a
|
14
|
+
# RelaxNG schema.
|
15
|
+
#
|
16
|
+
# == Synopsis
|
17
|
+
#
|
18
|
+
# Validate an XML document against a RelaxNG schema. Loop over the errors
|
19
|
+
# that are returned and print them out:
|
20
|
+
#
|
21
|
+
# schema = Nokogiri::XML::RelaxNG(File.read(ADDRESS_SCHEMA_FILE))
|
22
|
+
# doc = Nokogiri::XML(File.read(ADDRESS_XML_FILE))
|
23
|
+
#
|
24
|
+
# schema.validate(doc).each do |error|
|
25
|
+
# puts error.message
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# The list of errors are Nokogiri::XML::SyntaxError objects.
|
29
|
+
class RelaxNG < Nokogiri::XML::Schema
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|