nokogiri 1.2.3-x86-mswin32-60 → 1.4.5-x86-mswin32-60
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 +18 -7
- data/.gemtest +0 -0
- data/CHANGELOG.ja.rdoc +297 -3
- data/CHANGELOG.rdoc +289 -0
- data/Manifest.txt +148 -37
- data/README.ja.rdoc +20 -20
- data/README.rdoc +53 -22
- data/Rakefile +127 -211
- data/bin/nokogiri +54 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +89 -54
- data/ext/nokogiri/html_document.c +34 -27
- data/ext/nokogiri/html_document.h +1 -1
- 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 +7 -5
- data/ext/nokogiri/html_entity_lookup.h +1 -1
- data/ext/nokogiri/html_sax_parser_context.c +94 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
- data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
- data/ext/nokogiri/xml_attr.c +20 -9
- data/ext/nokogiri/xml_attr.h +1 -1
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +21 -9
- data/ext/nokogiri/xml_cdata.h +1 -1
- data/ext/nokogiri/xml_comment.c +18 -6
- data/ext/nokogiri/xml_comment.h +1 -1
- data/ext/nokogiri/xml_document.c +247 -68
- data/ext/nokogiri/xml_document.h +5 -3
- data/ext/nokogiri/xml_document_fragment.c +15 -7
- data/ext/nokogiri/xml_document_fragment.h +1 -1
- data/ext/nokogiri/xml_dtd.c +110 -10
- data/ext/nokogiri/xml_dtd.h +3 -1
- 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 +16 -5
- data/ext/nokogiri/xml_entity_reference.h +1 -1
- data/ext/nokogiri/xml_io.c +40 -8
- data/ext/nokogiri/xml_io.h +2 -1
- 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 +782 -225
- data/ext/nokogiri/xml_node.h +2 -4
- data/ext/nokogiri/xml_node_set.c +253 -34
- data/ext/nokogiri/xml_node_set.h +2 -2
- data/ext/nokogiri/xml_processing_instruction.c +17 -5
- data/ext/nokogiri/xml_processing_instruction.h +1 -1
- data/ext/nokogiri/xml_reader.c +277 -85
- data/ext/nokogiri/xml_reader.h +1 -1
- data/ext/nokogiri/xml_relax_ng.c +168 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +183 -111
- data/ext/nokogiri/xml_sax_parser.h +30 -1
- 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 +42 -12
- data/ext/nokogiri/xml_sax_push_parser.h +1 -1
- data/ext/nokogiri/xml_schema.c +205 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +28 -173
- data/ext/nokogiri/xml_syntax_error.h +2 -1
- data/ext/nokogiri/xml_text.c +16 -6
- data/ext/nokogiri/xml_text.h +1 -1
- data/ext/nokogiri/xml_xpath_context.c +104 -47
- data/ext/nokogiri/xml_xpath_context.h +1 -1
- data/ext/nokogiri/xslt_stylesheet.c +161 -19
- data/ext/nokogiri/xslt_stylesheet.h +1 -1
- data/lib/nokogiri.rb +47 -8
- data/lib/nokogiri/1.8/nokogiri.so +0 -0
- data/lib/nokogiri/1.9/nokogiri.so +0 -0
- data/lib/nokogiri/css.rb +6 -3
- data/lib/nokogiri/css/node.rb +14 -12
- data/lib/nokogiri/css/parser.rb +665 -62
- data/lib/nokogiri/css/parser.y +20 -10
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/tokenizer.rb +148 -5
- data/lib/nokogiri/css/tokenizer.rex +10 -9
- data/lib/nokogiri/css/xpath_visitor.rb +47 -44
- data/lib/nokogiri/decorators/slop.rb +8 -4
- data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
- data/lib/nokogiri/ffi/html/document.rb +28 -0
- data/lib/nokogiri/ffi/html/element_description.rb +81 -0
- data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
- data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
- data/lib/nokogiri/ffi/libxml.rb +420 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +38 -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 +20 -0
- data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
- data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
- data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
- data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -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_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -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 +124 -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 +38 -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/weak_bucket.rb +40 -0
- data/lib/nokogiri/ffi/xml/attr.rb +41 -0
- data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -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 +174 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
- data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
- data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
- data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
- data/lib/nokogiri/ffi/xml/node.rb +559 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +236 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
- data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
- data/lib/nokogiri/ffi/xml/schema.rb +109 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
- data/lib/nokogiri/html.rb +13 -47
- data/lib/nokogiri/html/builder.rb +27 -1
- data/lib/nokogiri/html/document.rb +201 -7
- data/lib/nokogiri/html/document_fragment.rb +41 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +2 -0
- data/lib/nokogiri/html/sax/parser.rb +34 -3
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/nokogiri.rb +1 -0
- data/lib/nokogiri/version.rb +40 -1
- data/lib/nokogiri/version_warning.rb +14 -0
- data/lib/nokogiri/xml.rb +32 -53
- data/lib/nokogiri/xml/attr.rb +5 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +349 -29
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +166 -14
- data/lib/nokogiri/xml/document_fragment.rb +76 -1
- data/lib/nokogiri/xml/dtd.rb +16 -3
- 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 +561 -166
- data/lib/nokogiri/xml/node/save_options.rb +22 -2
- data/lib/nokogiri/xml/node_set.rb +202 -40
- 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 +2 -0
- data/lib/nokogiri/xml/reader.rb +93 -8
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +1 -7
- data/lib/nokogiri/xml/sax/document.rb +107 -2
- data/lib/nokogiri/xml/sax/parser.rb +57 -7
- data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
- data/lib/nokogiri/xml/schema.rb +63 -0
- data/lib/nokogiri/xml/syntax_error.rb +25 -1
- data/lib/nokogiri/xml/text.rb +4 -1
- data/lib/nokogiri/xml/xpath.rb +1 -1
- data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
- data/lib/nokogiri/xml/xpath_context.rb +2 -0
- data/lib/nokogiri/xslt.rb +26 -2
- data/lib/nokogiri/xslt/stylesheet.rb +19 -0
- data/lib/xsd/xmlparser/nokogiri.rb +45 -9
- data/tasks/cross_compile.rb +173 -0
- data/tasks/test.rb +25 -69
- data/test/css/test_nthiness.rb +3 -4
- data/test/css/test_parser.rb +75 -20
- data/test/css/test_tokenizer.rb +23 -1
- data/test/css/test_xpath_visitor.rb +10 -1
- data/test/decorators/test_slop.rb +16 -0
- data/test/ffi/test_document.rb +35 -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/encoding.html +82 -0
- data/test/files/encoding.xhtml +84 -0
- data/test/files/foo/foo.xsd +4 -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/valid_bar.xml +2 -0
- data/test/helper.rb +101 -23
- data/test/html/sax/test_parser.rb +81 -2
- data/test/html/sax/test_parser_context.rb +48 -0
- data/test/html/test_builder.rb +39 -8
- data/test/html/test_document.rb +186 -23
- data/test/html/test_document_encoding.rb +78 -1
- data/test/html/test_document_fragment.rb +253 -0
- data/test/html/test_element_description.rb +98 -0
- data/test/html/test_named_characters.rb +1 -1
- data/test/html/test_node.rb +124 -36
- data/test/html/test_node_encoding.rb +27 -0
- data/test/test_convert_xpath.rb +1 -52
- data/test/test_css_cache.rb +2 -13
- data/test/test_encoding_handler.rb +46 -0
- data/test/test_memory_leak.rb +88 -19
- data/test/test_nokogiri.rb +38 -5
- data/test/test_reader.rb +188 -6
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +183 -83
- data/test/xml/node/test_save_options.rb +1 -1
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +175 -4
- data/test/xml/sax/test_parser_context.rb +113 -0
- data/test/xml/sax/test_push_parser.rb +90 -2
- data/test/xml/test_attr.rb +35 -1
- data/test/xml/test_attribute_decl.rb +82 -0
- data/test/xml/test_builder.rb +186 -1
- data/test/xml/test_cdata.rb +32 -1
- data/test/xml/test_comment.rb +13 -1
- data/test/xml/test_document.rb +415 -43
- data/test/xml/test_document_encoding.rb +1 -1
- data/test/xml/test_document_fragment.rb +173 -5
- data/test/xml/test_dtd.rb +61 -6
- data/test/xml/test_dtd_encoding.rb +3 -1
- 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 +120 -0
- data/test/xml/test_entity_reference.rb +5 -1
- data/test/xml/test_namespace.rb +68 -0
- data/test/xml/test_node.rb +546 -201
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +33 -3
- data/test/xml/test_node_reparenting.rb +321 -0
- data/test/xml/test_node_set.rb +538 -2
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +6 -1
- data/test/xml/test_reader_encoding.rb +1 -1
- 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 +35 -1
- data/test/xml/test_unparented_node.rb +5 -5
- data/test/xml/test_xpath.rb +142 -11
- data/test/xslt/test_custom_functions.rb +94 -0
- metadata +328 -92
- data/ext/nokogiri/html_sax_parser.c +0 -57
- data/ext/nokogiri/html_sax_parser.h +0 -11
- 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/native.so +0 -0
- data/ext/nokogiri/xml_xpath.c +0 -53
- data/ext/nokogiri/xml_xpath.h +0 -11
- data/ext/nokogiri/zlib1.dll +0 -0
- data/lib/action-nokogiri.rb +0 -30
- data/lib/nokogiri/css/generated_parser.rb +0 -713
- data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
- data/lib/nokogiri/decorators.rb +0 -2
- data/lib/nokogiri/decorators/hpricot.rb +0 -3
- data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
- data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
- data/lib/nokogiri/hpricot.rb +0 -51
- data/lib/nokogiri/xml/comment.rb +0 -6
- data/lib/nokogiri/xml/element.rb +0 -6
- data/lib/nokogiri/xml/entity_declaration.rb +0 -9
- data/lib/nokogiri/xml/fragment_handler.rb +0 -34
- data/test/hpricot/files/basic.xhtml +0 -17
- data/test/hpricot/files/boingboing.html +0 -2266
- data/test/hpricot/files/cy0.html +0 -3653
- data/test/hpricot/files/immob.html +0 -400
- data/test/hpricot/files/pace_application.html +0 -1320
- data/test/hpricot/files/tenderlove.html +0 -16
- data/test/hpricot/files/uswebgen.html +0 -220
- data/test/hpricot/files/utf8.html +0 -1054
- data/test/hpricot/files/week9.html +0 -1723
- data/test/hpricot/files/why.xml +0 -19
- data/test/hpricot/load_files.rb +0 -11
- data/test/hpricot/test_alter.rb +0 -68
- data/test/hpricot/test_builder.rb +0 -20
- data/test/hpricot/test_parser.rb +0 -426
- data/test/hpricot/test_paths.rb +0 -15
- data/test/hpricot/test_preserved.rb +0 -77
- data/test/hpricot/test_xml.rb +0 -30
- data/test/test_gc.rb +0 -15
@@ -4,16 +4,34 @@ module Nokogiri
|
|
4
4
|
###
|
5
5
|
# Save options for serializing nodes
|
6
6
|
class SaveOptions
|
7
|
-
|
8
|
-
|
7
|
+
# Format serialized xml
|
8
|
+
FORMAT = 1
|
9
|
+
# Do not include delcarations
|
10
|
+
NO_DECLARATION = 2
|
11
|
+
# Do not include empty tags
|
9
12
|
NO_EMPTY_TAGS = 4
|
13
|
+
# Do not save XHTML
|
10
14
|
NO_XHTML = 8
|
15
|
+
# Save as XHTML
|
11
16
|
AS_XHTML = 16
|
17
|
+
# Save as XML
|
12
18
|
AS_XML = 32
|
19
|
+
# Save as HTML
|
13
20
|
AS_HTML = 64
|
14
21
|
|
22
|
+
# the default for XML documents
|
23
|
+
DEFAULT_XML = FORMAT | AS_XML
|
24
|
+
# the default for HTML document
|
25
|
+
DEFAULT_HTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML
|
26
|
+
# the default for XHTML document
|
27
|
+
DEFAULT_XHTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_XHTML
|
28
|
+
|
29
|
+
# Integer representation of the SaveOptions
|
15
30
|
attr_reader :options
|
31
|
+
|
32
|
+
# Create a new SaveOptions object with +options+
|
16
33
|
def initialize options = 0; @options = options; end
|
34
|
+
|
17
35
|
constants.each do |constant|
|
18
36
|
class_eval %{
|
19
37
|
def #{constant.downcase}
|
@@ -26,6 +44,8 @@ module Nokogiri
|
|
26
44
|
end
|
27
45
|
}
|
28
46
|
end
|
47
|
+
|
48
|
+
alias :to_i :options
|
29
49
|
end
|
30
50
|
end
|
31
51
|
end
|
@@ -13,14 +13,20 @@ module Nokogiri
|
|
13
13
|
# Create a NodeSet with +document+ defaulting to +list+
|
14
14
|
def initialize document, list = []
|
15
15
|
@document = document
|
16
|
+
document.decorate(self)
|
16
17
|
list.each { |x| self << x }
|
17
18
|
yield self if block_given?
|
18
19
|
end
|
19
20
|
|
20
21
|
###
|
21
22
|
# Get the first element of the NodeSet.
|
22
|
-
def first
|
23
|
-
self[0]
|
23
|
+
def first n = nil
|
24
|
+
return self[0] unless n
|
25
|
+
list = []
|
26
|
+
0.upto(n - 1) do |i|
|
27
|
+
list << self[i]
|
28
|
+
end
|
29
|
+
list
|
24
30
|
end
|
25
31
|
|
26
32
|
###
|
@@ -35,6 +41,13 @@ module Nokogiri
|
|
35
41
|
length == 0
|
36
42
|
end
|
37
43
|
|
44
|
+
###
|
45
|
+
# Returns the index of the first node in self that is == to +node+. Returns nil if no match is found.
|
46
|
+
def index(node)
|
47
|
+
each_with_index { |member, j| return j if member == node }
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
|
38
51
|
###
|
39
52
|
# Insert +datum+ before the first Node in this NodeSet
|
40
53
|
def before datum
|
@@ -56,19 +69,81 @@ module Nokogiri
|
|
56
69
|
# For more information see Nokogiri::XML::Node#css and
|
57
70
|
# Nokogiri::XML::Node#xpath
|
58
71
|
def search *paths
|
59
|
-
|
72
|
+
handler = ![
|
73
|
+
Hash, String, Symbol
|
74
|
+
].include?(paths.last.class) ? paths.pop : nil
|
75
|
+
|
76
|
+
ns = paths.last.is_a?(Hash) ? paths.pop : nil
|
77
|
+
|
60
78
|
sub_set = NodeSet.new(document)
|
79
|
+
|
80
|
+
paths.each do |path|
|
81
|
+
sub_set += send(
|
82
|
+
path =~ /^(\.\/|\/)/ ? :xpath : :css,
|
83
|
+
*(paths + [ns, handler]).compact
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
61
87
|
document.decorate(sub_set)
|
88
|
+
sub_set
|
89
|
+
end
|
90
|
+
alias :/ :search
|
91
|
+
|
92
|
+
###
|
93
|
+
# Search this NodeSet for css +paths+
|
94
|
+
#
|
95
|
+
# For more information see Nokogiri::XML::Node#css
|
96
|
+
def css *paths
|
97
|
+
handler = ![
|
98
|
+
Hash, String, Symbol
|
99
|
+
].include?(paths.last.class) ? paths.pop : nil
|
100
|
+
|
101
|
+
ns = paths.last.is_a?(Hash) ? paths.pop : nil
|
102
|
+
|
103
|
+
sub_set = NodeSet.new(document)
|
104
|
+
|
62
105
|
each do |node|
|
63
|
-
|
64
|
-
|
65
|
-
|
106
|
+
doc = node.document
|
107
|
+
search_ns = ns || (doc.root ? doc.root.namespaces : {})
|
108
|
+
|
109
|
+
xpaths = paths.map { |rule|
|
110
|
+
[
|
111
|
+
CSS.xpath_for(rule.to_s, :prefix => ".//", :ns => search_ns),
|
112
|
+
CSS.xpath_for(rule.to_s, :prefix => "self::", :ns => search_ns)
|
113
|
+
].join(' | ')
|
114
|
+
}
|
115
|
+
|
116
|
+
sub_set += node.xpath(*(xpaths + [search_ns, handler].compact))
|
66
117
|
end
|
118
|
+
document.decorate(sub_set)
|
119
|
+
sub_set
|
120
|
+
end
|
121
|
+
|
122
|
+
###
|
123
|
+
# Search this NodeSet for XPath +paths+
|
124
|
+
#
|
125
|
+
# For more information see Nokogiri::XML::Node#xpath
|
126
|
+
def xpath *paths
|
127
|
+
handler = ![
|
128
|
+
Hash, String, Symbol
|
129
|
+
].include?(paths.last.class) ? paths.pop : nil
|
130
|
+
|
131
|
+
ns = paths.last.is_a?(Hash) ? paths.pop : nil
|
132
|
+
|
133
|
+
sub_set = NodeSet.new(document)
|
134
|
+
each do |node|
|
135
|
+
sub_set += node.xpath(*(paths + [ns, handler].compact))
|
136
|
+
end
|
137
|
+
document.decorate(sub_set)
|
67
138
|
sub_set
|
68
139
|
end
|
69
|
-
|
70
|
-
|
71
|
-
|
140
|
+
|
141
|
+
###
|
142
|
+
# Search this NodeSet's nodes' immediate children using CSS selector +selector+
|
143
|
+
def > selector
|
144
|
+
ns = document.root.namespaces
|
145
|
+
xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first
|
146
|
+
end
|
72
147
|
|
73
148
|
###
|
74
149
|
# If path is a string, search this document for +path+ returning the
|
@@ -77,28 +152,57 @@ module Nokogiri
|
|
77
152
|
return self[path] if path.is_a?(Numeric)
|
78
153
|
search(path, ns).first
|
79
154
|
end
|
155
|
+
alias :% :at
|
156
|
+
|
157
|
+
##
|
158
|
+
# Search this NodeSet for the first occurrence of XPath +paths+.
|
159
|
+
# Equivalent to <tt>xpath(paths).first</tt>
|
160
|
+
# See NodeSet#xpath for more information.
|
161
|
+
#
|
162
|
+
def at_xpath *paths
|
163
|
+
xpath(*paths).first
|
164
|
+
end
|
165
|
+
|
166
|
+
##
|
167
|
+
# Search this NodeSet for the first occurrence of CSS +rules+.
|
168
|
+
# Equivalent to <tt>css(rules).first</tt>
|
169
|
+
# See NodeSet#css for more information.
|
170
|
+
#
|
171
|
+
def at_css *rules
|
172
|
+
css(*rules).first
|
173
|
+
end
|
174
|
+
|
175
|
+
###
|
176
|
+
# Filter this list for nodes that match +expr+
|
177
|
+
def filter expr
|
178
|
+
find_all { |node| node.matches?(expr) }
|
179
|
+
end
|
80
180
|
|
81
181
|
###
|
82
182
|
# Append the class attribute +name+ to all Node objects in the NodeSet.
|
83
183
|
def add_class name
|
84
184
|
each do |el|
|
85
|
-
|
86
|
-
|
87
|
-
el.set_attribute('class', classes.push(name).uniq.join(" "))
|
185
|
+
classes = el['class'].to_s.split(/\s+/)
|
186
|
+
el['class'] = classes.push(name).uniq.join " "
|
88
187
|
end
|
89
188
|
self
|
90
189
|
end
|
91
190
|
|
92
191
|
###
|
93
192
|
# Remove the class attribute +name+ from all Node objects in the NodeSet.
|
193
|
+
# If +name+ is nil, remove the class attribute from all Nodes in the
|
194
|
+
# NodeSet.
|
94
195
|
def remove_class name = nil
|
95
196
|
each do |el|
|
96
|
-
next unless el.respond_to? :get_attribute
|
97
197
|
if name
|
98
|
-
classes = el
|
99
|
-
|
198
|
+
classes = el['class'].to_s.split(/\s+/)
|
199
|
+
if classes.empty?
|
200
|
+
el.delete 'class'
|
201
|
+
else
|
202
|
+
el['class'] = (classes - [name]).uniq.join " "
|
203
|
+
end
|
100
204
|
else
|
101
|
-
el.
|
205
|
+
el.delete "class"
|
102
206
|
end
|
103
207
|
end
|
104
208
|
self
|
@@ -108,29 +212,24 @@ module Nokogiri
|
|
108
212
|
# Set the attribute +key+ to +value+ or the return value of +blk+
|
109
213
|
# on all Node objects in the NodeSet.
|
110
214
|
def attr key, value = nil, &blk
|
111
|
-
|
112
|
-
|
113
|
-
el.set_attribute(key, value || blk[el])
|
114
|
-
end
|
115
|
-
return self
|
116
|
-
end
|
117
|
-
if key.is_a? Hash
|
118
|
-
key.each { |k,v| self.attr(k,v) }
|
119
|
-
return self
|
120
|
-
else
|
121
|
-
return self[0].get_attribute(key)
|
215
|
+
unless Hash === key || key && (value || blk)
|
216
|
+
return first.attribute(key)
|
122
217
|
end
|
218
|
+
|
219
|
+
hash = key.is_a?(Hash) ? key : { key => value }
|
220
|
+
|
221
|
+
hash.each { |k,v| each { |el| el[k] = v || blk[el] } }
|
222
|
+
|
223
|
+
self
|
123
224
|
end
|
124
|
-
|
225
|
+
alias :set :attr
|
226
|
+
alias :attribute :attr
|
125
227
|
|
126
228
|
###
|
127
229
|
# Remove the attributed named +name+ from all Node objects in the NodeSet
|
128
230
|
def remove_attr name
|
129
|
-
each
|
130
|
-
|
131
|
-
el.remove_attribute(name)
|
132
|
-
end
|
133
|
-
self
|
231
|
+
each { |el| el.delete name }
|
232
|
+
self
|
134
233
|
end
|
135
234
|
|
136
235
|
###
|
@@ -150,39 +249,102 @@ module Nokogiri
|
|
150
249
|
|
151
250
|
###
|
152
251
|
# Get the inner html of all contained Node objects
|
153
|
-
def inner_html
|
154
|
-
collect{|j| j.inner_html}.join('')
|
252
|
+
def inner_html *args
|
253
|
+
collect{|j| j.inner_html(*args) }.join('')
|
155
254
|
end
|
156
255
|
|
157
256
|
###
|
158
257
|
# Wrap this NodeSet with +html+ or the results of the builder in +blk+
|
159
258
|
def wrap(html, &blk)
|
160
259
|
each do |j|
|
161
|
-
new_parent =
|
162
|
-
j.
|
260
|
+
new_parent = document.parse(html).first
|
261
|
+
j.add_next_sibling(new_parent)
|
163
262
|
new_parent.add_child(j)
|
164
263
|
end
|
165
264
|
self
|
166
265
|
end
|
167
266
|
|
267
|
+
###
|
268
|
+
# Convert this NodeSet to a string.
|
168
269
|
def to_s
|
169
270
|
map { |x| x.to_s }.join
|
170
271
|
end
|
171
272
|
|
273
|
+
###
|
274
|
+
# Convert this NodeSet to HTML
|
172
275
|
def to_html *args
|
173
|
-
map { |x| x.to_html(*args) }.join
|
276
|
+
map { |x| x.to_html(*args) }.join
|
174
277
|
end
|
175
278
|
|
279
|
+
###
|
280
|
+
# Convert this NodeSet to XHTML
|
176
281
|
def to_xhtml *args
|
177
|
-
map { |x| x.to_xhtml(*args) }.join
|
282
|
+
map { |x| x.to_xhtml(*args) }.join
|
178
283
|
end
|
179
284
|
|
285
|
+
###
|
286
|
+
# Convert this NodeSet to XML
|
180
287
|
def to_xml *args
|
181
|
-
map { |x| x.to_xml(*args) }.join
|
288
|
+
map { |x| x.to_xml(*args) }.join
|
182
289
|
end
|
183
290
|
|
184
291
|
alias :size :length
|
185
292
|
alias :to_ary :to_a
|
293
|
+
|
294
|
+
###
|
295
|
+
# Removes the last element from set and returns it, or +nil+ if
|
296
|
+
# the set is empty
|
297
|
+
def pop
|
298
|
+
return nil if length == 0
|
299
|
+
delete last
|
300
|
+
end
|
301
|
+
|
302
|
+
###
|
303
|
+
# Returns the first element of the NodeSet and removes it. Returns
|
304
|
+
# +nil+ if the set is empty.
|
305
|
+
def shift
|
306
|
+
return nil if length == 0
|
307
|
+
delete first
|
308
|
+
end
|
309
|
+
|
310
|
+
###
|
311
|
+
# Equality -- Two NodeSets are equal if the contain the same number
|
312
|
+
# of elements and if each element is equal to the corresponding
|
313
|
+
# element in the other NodeSet
|
314
|
+
def == other
|
315
|
+
return false unless other.is_a?(Nokogiri::XML::NodeSet)
|
316
|
+
return false unless length == other.length
|
317
|
+
each_with_index do |node, i|
|
318
|
+
return false unless node == other[i]
|
319
|
+
end
|
320
|
+
true
|
321
|
+
end
|
322
|
+
|
323
|
+
###
|
324
|
+
# Returns a new NodeSet containing all the children of all the nodes in
|
325
|
+
# the NodeSet
|
326
|
+
def children
|
327
|
+
inject(NodeSet.new(document)) { |set, node| set += node.children }
|
328
|
+
end
|
329
|
+
|
330
|
+
###
|
331
|
+
# Returns a new NodeSet containing all the nodes in the NodeSet
|
332
|
+
# in reverse order
|
333
|
+
def reverse
|
334
|
+
node_set = NodeSet.new(document)
|
335
|
+
(length - 1).downto(0) do |x|
|
336
|
+
node_set.push self[x]
|
337
|
+
end
|
338
|
+
node_set
|
339
|
+
end
|
340
|
+
|
341
|
+
###
|
342
|
+
# Return a nicely formated string representation
|
343
|
+
def inspect
|
344
|
+
"[#{map { |c| c.inspect }.join ', '}]"
|
345
|
+
end
|
346
|
+
|
347
|
+
alias :+ :|
|
186
348
|
end
|
187
349
|
end
|
188
350
|
end
|
@@ -0,0 +1,93 @@
|
|
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
|
+
# 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
|
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 #{constant.downcase}?
|
68
|
+
#{constant} & @options == #{constant}
|
69
|
+
end
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
def strict
|
74
|
+
@options &= ~RECOVER
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
78
|
+
def strict?
|
79
|
+
@options & RECOVER == STRICT
|
80
|
+
end
|
81
|
+
|
82
|
+
alias :to_i :options
|
83
|
+
|
84
|
+
def inspect
|
85
|
+
options = []
|
86
|
+
self.class.constants.each do |k|
|
87
|
+
options << k.downcase if send(:"#{k.downcase}?")
|
88
|
+
end
|
89
|
+
super.sub(/>$/, " " + options.join(', ') + ">")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|