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,61 @@
|
|
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 declarations
|
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
|
+
if Nokogiri.jruby?
|
23
|
+
# Save builder created document
|
24
|
+
AS_BUILDER = 128
|
25
|
+
# the default for XML documents
|
26
|
+
DEFAULT_XML = AS_XML # https://github.com/sparklemotion/nokogiri/issues/#issue/415
|
27
|
+
# the default for HTML document
|
28
|
+
DEFAULT_HTML = NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML
|
29
|
+
else
|
30
|
+
# the default for XML documents
|
31
|
+
DEFAULT_XML = FORMAT | AS_XML
|
32
|
+
# the default for HTML document
|
33
|
+
DEFAULT_HTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML
|
34
|
+
end
|
35
|
+
# the default for XHTML document
|
36
|
+
DEFAULT_XHTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_XHTML
|
37
|
+
|
38
|
+
# Integer representation of the SaveOptions
|
39
|
+
attr_reader :options
|
40
|
+
|
41
|
+
# Create a new SaveOptions object with +options+
|
42
|
+
def initialize options = 0; @options = options; end
|
43
|
+
|
44
|
+
constants.each do |constant|
|
45
|
+
class_eval %{
|
46
|
+
def #{constant.downcase}
|
47
|
+
@options |= #{constant}
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
def #{constant.downcase}?
|
52
|
+
#{constant} & @options == #{constant}
|
53
|
+
end
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
alias :to_i :options
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,355 @@
|
|
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
|
+
document.decorate(self)
|
17
|
+
list.each { |x| self << x }
|
18
|
+
yield self if block_given?
|
19
|
+
end
|
20
|
+
|
21
|
+
###
|
22
|
+
# Get the first element of the NodeSet.
|
23
|
+
def first n = nil
|
24
|
+
return self[0] unless n
|
25
|
+
list = []
|
26
|
+
n.times { |i| list << self[i] }
|
27
|
+
list
|
28
|
+
end
|
29
|
+
|
30
|
+
###
|
31
|
+
# Get the last element of the NodeSet.
|
32
|
+
def last
|
33
|
+
self[-1]
|
34
|
+
end
|
35
|
+
|
36
|
+
###
|
37
|
+
# Is this NodeSet empty?
|
38
|
+
def empty?
|
39
|
+
length == 0
|
40
|
+
end
|
41
|
+
|
42
|
+
###
|
43
|
+
# Returns the index of the first node in self that is == to +node+. Returns nil if no match is found.
|
44
|
+
def index(node)
|
45
|
+
each_with_index { |member, j| return j if member == node }
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
###
|
50
|
+
# Insert +datum+ before the first Node in this NodeSet
|
51
|
+
def before datum
|
52
|
+
first.before datum
|
53
|
+
end
|
54
|
+
|
55
|
+
###
|
56
|
+
# Insert +datum+ after the last Node in this NodeSet
|
57
|
+
def after datum
|
58
|
+
last.after datum
|
59
|
+
end
|
60
|
+
|
61
|
+
alias :<< :push
|
62
|
+
alias :remove :unlink
|
63
|
+
|
64
|
+
###
|
65
|
+
# Search this document for +paths+
|
66
|
+
#
|
67
|
+
# For more information see Nokogiri::XML::Node#css and
|
68
|
+
# Nokogiri::XML::Node#xpath
|
69
|
+
def search *paths
|
70
|
+
handler = ![
|
71
|
+
Hash, String, Symbol
|
72
|
+
].include?(paths.last.class) ? paths.pop : nil
|
73
|
+
|
74
|
+
ns = paths.last.is_a?(Hash) ? paths.pop : nil
|
75
|
+
|
76
|
+
sub_set = NodeSet.new(document)
|
77
|
+
|
78
|
+
paths.each do |path|
|
79
|
+
sub_set += send(
|
80
|
+
path =~ /^(\.\/|\/|\.\.|\.$)/ ? :xpath : :css,
|
81
|
+
*(paths + [ns, handler]).compact
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
document.decorate(sub_set)
|
86
|
+
sub_set
|
87
|
+
end
|
88
|
+
alias :/ :search
|
89
|
+
|
90
|
+
###
|
91
|
+
# Search this NodeSet for css +paths+
|
92
|
+
#
|
93
|
+
# For more information see Nokogiri::XML::Node#css
|
94
|
+
def css *paths
|
95
|
+
handler = ![
|
96
|
+
Hash, String, Symbol
|
97
|
+
].include?(paths.last.class) ? paths.pop : nil
|
98
|
+
|
99
|
+
ns = paths.last.is_a?(Hash) ? paths.pop : nil
|
100
|
+
|
101
|
+
sub_set = NodeSet.new(document)
|
102
|
+
|
103
|
+
each do |node|
|
104
|
+
doc = node.document
|
105
|
+
search_ns = ns || (doc.root ? doc.root.namespaces : {})
|
106
|
+
|
107
|
+
xpaths = paths.map { |rule|
|
108
|
+
[
|
109
|
+
CSS.xpath_for(rule.to_s, :prefix => ".//", :ns => search_ns),
|
110
|
+
CSS.xpath_for(rule.to_s, :prefix => "self::", :ns => search_ns)
|
111
|
+
].join(' | ')
|
112
|
+
}
|
113
|
+
|
114
|
+
sub_set += node.xpath(*(xpaths + [search_ns, handler].compact))
|
115
|
+
end
|
116
|
+
document.decorate(sub_set)
|
117
|
+
sub_set
|
118
|
+
end
|
119
|
+
|
120
|
+
###
|
121
|
+
# Search this NodeSet for XPath +paths+
|
122
|
+
#
|
123
|
+
# For more information see Nokogiri::XML::Node#xpath
|
124
|
+
def xpath *paths
|
125
|
+
handler = ![
|
126
|
+
Hash, String, Symbol
|
127
|
+
].include?(paths.last.class) ? paths.pop : nil
|
128
|
+
|
129
|
+
ns = paths.last.is_a?(Hash) ? paths.pop : nil
|
130
|
+
|
131
|
+
sub_set = NodeSet.new(document)
|
132
|
+
each do |node|
|
133
|
+
sub_set += node.xpath(*(paths + [ns, handler].compact))
|
134
|
+
end
|
135
|
+
document.decorate(sub_set)
|
136
|
+
sub_set
|
137
|
+
end
|
138
|
+
|
139
|
+
###
|
140
|
+
# Search this NodeSet's nodes' immediate children using CSS selector +selector+
|
141
|
+
def > selector
|
142
|
+
ns = document.root.namespaces
|
143
|
+
xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first
|
144
|
+
end
|
145
|
+
|
146
|
+
###
|
147
|
+
# If path is a string, search this document for +path+ returning the
|
148
|
+
# first Node. Otherwise, index in to the array with +path+.
|
149
|
+
def at path, ns = document.root ? document.root.namespaces : {}
|
150
|
+
return self[path] if path.is_a?(Numeric)
|
151
|
+
search(path, ns).first
|
152
|
+
end
|
153
|
+
alias :% :at
|
154
|
+
|
155
|
+
##
|
156
|
+
# Search this NodeSet for the first occurrence of XPath +paths+.
|
157
|
+
# Equivalent to <tt>xpath(paths).first</tt>
|
158
|
+
# See NodeSet#xpath for more information.
|
159
|
+
#
|
160
|
+
def at_xpath *paths
|
161
|
+
xpath(*paths).first
|
162
|
+
end
|
163
|
+
|
164
|
+
##
|
165
|
+
# Search this NodeSet for the first occurrence of CSS +rules+.
|
166
|
+
# Equivalent to <tt>css(rules).first</tt>
|
167
|
+
# See NodeSet#css for more information.
|
168
|
+
#
|
169
|
+
def at_css *rules
|
170
|
+
css(*rules).first
|
171
|
+
end
|
172
|
+
|
173
|
+
###
|
174
|
+
# Filter this list for nodes that match +expr+
|
175
|
+
def filter expr
|
176
|
+
find_all { |node| node.matches?(expr) }
|
177
|
+
end
|
178
|
+
|
179
|
+
###
|
180
|
+
# Append the class attribute +name+ to all Node objects in the NodeSet.
|
181
|
+
def add_class name
|
182
|
+
each do |el|
|
183
|
+
classes = el['class'].to_s.split(/\s+/)
|
184
|
+
el['class'] = classes.push(name).uniq.join " "
|
185
|
+
end
|
186
|
+
self
|
187
|
+
end
|
188
|
+
|
189
|
+
###
|
190
|
+
# Remove the class attribute +name+ from all Node objects in the NodeSet.
|
191
|
+
# If +name+ is nil, remove the class attribute from all Nodes in the
|
192
|
+
# NodeSet.
|
193
|
+
def remove_class name = nil
|
194
|
+
each do |el|
|
195
|
+
if name
|
196
|
+
classes = el['class'].to_s.split(/\s+/)
|
197
|
+
if classes.empty?
|
198
|
+
el.delete 'class'
|
199
|
+
else
|
200
|
+
el['class'] = (classes - [name]).uniq.join " "
|
201
|
+
end
|
202
|
+
else
|
203
|
+
el.delete "class"
|
204
|
+
end
|
205
|
+
end
|
206
|
+
self
|
207
|
+
end
|
208
|
+
|
209
|
+
###
|
210
|
+
# Set the attribute +key+ to +value+ or the return value of +blk+
|
211
|
+
# on all Node objects in the NodeSet.
|
212
|
+
def attr key, value = nil, &blk
|
213
|
+
unless Hash === key || key && (value || blk)
|
214
|
+
return first.attribute(key)
|
215
|
+
end
|
216
|
+
|
217
|
+
hash = key.is_a?(Hash) ? key : { key => value }
|
218
|
+
|
219
|
+
hash.each { |k,v| each { |el| el[k] = v || blk[el] } }
|
220
|
+
|
221
|
+
self
|
222
|
+
end
|
223
|
+
alias :set :attr
|
224
|
+
alias :attribute :attr
|
225
|
+
|
226
|
+
###
|
227
|
+
# Remove the attributed named +name+ from all Node objects in the NodeSet
|
228
|
+
def remove_attr name
|
229
|
+
each { |el| el.delete name }
|
230
|
+
self
|
231
|
+
end
|
232
|
+
|
233
|
+
###
|
234
|
+
# Iterate over each node, yielding to +block+
|
235
|
+
def each(&block)
|
236
|
+
0.upto(length - 1) do |x|
|
237
|
+
yield self[x]
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
###
|
242
|
+
# Get the inner text of all contained Node objects
|
243
|
+
def inner_text
|
244
|
+
collect{|j| j.inner_text}.join('')
|
245
|
+
end
|
246
|
+
alias :text :inner_text
|
247
|
+
|
248
|
+
###
|
249
|
+
# Get the inner html of all contained Node objects
|
250
|
+
def inner_html *args
|
251
|
+
collect{|j| j.inner_html(*args) }.join('')
|
252
|
+
end
|
253
|
+
|
254
|
+
###
|
255
|
+
# Wrap this NodeSet with +html+ or the results of the builder in +blk+
|
256
|
+
def wrap(html, &blk)
|
257
|
+
each do |j|
|
258
|
+
new_parent = document.parse(html).first
|
259
|
+
j.add_next_sibling(new_parent)
|
260
|
+
new_parent.add_child(j)
|
261
|
+
end
|
262
|
+
self
|
263
|
+
end
|
264
|
+
|
265
|
+
###
|
266
|
+
# Convert this NodeSet to a string.
|
267
|
+
def to_s
|
268
|
+
map { |x| x.to_s }.join
|
269
|
+
end
|
270
|
+
|
271
|
+
###
|
272
|
+
# Convert this NodeSet to HTML
|
273
|
+
def to_html *args
|
274
|
+
if Nokogiri.jruby?
|
275
|
+
options = args.first.is_a?(Hash) ? args.shift : {}
|
276
|
+
if !options[:save_with]
|
277
|
+
options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
|
278
|
+
end
|
279
|
+
args.insert(0, options)
|
280
|
+
end
|
281
|
+
map { |x| x.to_html(*args) }.join
|
282
|
+
end
|
283
|
+
|
284
|
+
###
|
285
|
+
# Convert this NodeSet to XHTML
|
286
|
+
def to_xhtml *args
|
287
|
+
map { |x| x.to_xhtml(*args) }.join
|
288
|
+
end
|
289
|
+
|
290
|
+
###
|
291
|
+
# Convert this NodeSet to XML
|
292
|
+
def to_xml *args
|
293
|
+
map { |x| x.to_xml(*args) }.join
|
294
|
+
end
|
295
|
+
|
296
|
+
alias :size :length
|
297
|
+
alias :to_ary :to_a
|
298
|
+
|
299
|
+
###
|
300
|
+
# Removes the last element from set and returns it, or +nil+ if
|
301
|
+
# the set is empty
|
302
|
+
def pop
|
303
|
+
return nil if length == 0
|
304
|
+
delete last
|
305
|
+
end
|
306
|
+
|
307
|
+
###
|
308
|
+
# Returns the first element of the NodeSet and removes it. Returns
|
309
|
+
# +nil+ if the set is empty.
|
310
|
+
def shift
|
311
|
+
return nil if length == 0
|
312
|
+
delete first
|
313
|
+
end
|
314
|
+
|
315
|
+
###
|
316
|
+
# Equality -- Two NodeSets are equal if the contain the same number
|
317
|
+
# of elements and if each element is equal to the corresponding
|
318
|
+
# element in the other NodeSet
|
319
|
+
def == other
|
320
|
+
return false unless other.is_a?(Nokogiri::XML::NodeSet)
|
321
|
+
return false unless length == other.length
|
322
|
+
each_with_index do |node, i|
|
323
|
+
return false unless node == other[i]
|
324
|
+
end
|
325
|
+
true
|
326
|
+
end
|
327
|
+
|
328
|
+
###
|
329
|
+
# Returns a new NodeSet containing all the children of all the nodes in
|
330
|
+
# the NodeSet
|
331
|
+
def children
|
332
|
+
inject(NodeSet.new(document)) { |set, node| set += node.children }
|
333
|
+
end
|
334
|
+
|
335
|
+
###
|
336
|
+
# Returns a new NodeSet containing all the nodes in the NodeSet
|
337
|
+
# in reverse order
|
338
|
+
def reverse
|
339
|
+
node_set = NodeSet.new(document)
|
340
|
+
(length - 1).downto(0) do |x|
|
341
|
+
node_set.push self[x]
|
342
|
+
end
|
343
|
+
node_set
|
344
|
+
end
|
345
|
+
|
346
|
+
###
|
347
|
+
# Return a nicely formated string representation
|
348
|
+
def inspect
|
349
|
+
"[#{map { |c| c.inspect }.join ', '}]"
|
350
|
+
end
|
351
|
+
|
352
|
+
alias :+ :|
|
353
|
+
end
|
354
|
+
end
|
355
|
+
end
|
@@ -0,0 +1,98 @@
|
|
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 substitution
|
29
|
+
XINCLUDE = 1 << 10
|
30
|
+
# Forbid network access. Recommended for dealing with untrusted documents.
|
31
|
+
NONET = 1 << 11
|
32
|
+
# Do not reuse the context dictionary
|
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
|
+
# compact small text nodes; no modification of the tree allowed afterwards (will possibly crash if you try to modify the tree)
|
41
|
+
COMPACT = 1 << 16
|
42
|
+
# parse using XML-1.0 before update 5
|
43
|
+
OLD10 = 1 << 17
|
44
|
+
# do not fixup XINCLUDE xml:base uris
|
45
|
+
NOBASEFIX = 1 << 18
|
46
|
+
# relax any hardcoded limit from the parser
|
47
|
+
HUGE = 1 << 19
|
48
|
+
|
49
|
+
# the default options used for parsing XML documents
|
50
|
+
DEFAULT_XML = RECOVER | NONET
|
51
|
+
# the default options used for parsing HTML documents
|
52
|
+
DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET
|
53
|
+
|
54
|
+
attr_accessor :options
|
55
|
+
def initialize options = STRICT
|
56
|
+
@options = options
|
57
|
+
end
|
58
|
+
|
59
|
+
constants.each do |constant|
|
60
|
+
next if constant.to_sym == :STRICT
|
61
|
+
class_eval %{
|
62
|
+
def #{constant.downcase}
|
63
|
+
@options |= #{constant}
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
def no#{constant.downcase}
|
68
|
+
@options &= ~#{constant}
|
69
|
+
self
|
70
|
+
end
|
71
|
+
|
72
|
+
def #{constant.downcase}?
|
73
|
+
#{constant} & @options == #{constant}
|
74
|
+
end
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def strict
|
79
|
+
@options &= ~RECOVER
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
def strict?
|
84
|
+
@options & RECOVER == STRICT
|
85
|
+
end
|
86
|
+
|
87
|
+
alias :to_i :options
|
88
|
+
|
89
|
+
def inspect
|
90
|
+
options = []
|
91
|
+
self.class.constants.each do |k|
|
92
|
+
options << k.downcase if send(:"#{k.downcase}?")
|
93
|
+
end
|
94
|
+
super.sub(/>$/, " " + options.join(', ') + ">")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|