nokogiri 1.6.8.1 → 1.13.4
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 +5 -5
- data/Gemfile +3 -20
- data/LICENSE-DEPENDENCIES.md +1903 -0
- data/LICENSE.md +9 -0
- data/README.md +197 -83
- data/bin/nokogiri +63 -50
- data/dependencies.yml +16 -22
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +751 -432
- data/ext/nokogiri/gumbo.c +584 -0
- data/ext/nokogiri/html4_document.c +166 -0
- data/ext/nokogiri/html4_element_description.c +294 -0
- data/ext/nokogiri/html4_entity_lookup.c +37 -0
- data/ext/nokogiri/html4_sax_parser_context.c +120 -0
- data/ext/nokogiri/html4_sax_push_parser.c +95 -0
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +228 -95
- data/ext/nokogiri/nokogiri.h +190 -98
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +49 -40
- data/ext/nokogiri/xml_attribute_decl.c +18 -18
- data/ext/nokogiri/xml_cdata.c +24 -23
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +291 -217
- data/ext/nokogiri/xml_document_fragment.c +12 -16
- data/ext/nokogiri/xml_dtd.c +56 -50
- data/ext/nokogiri/xml_element_content.c +31 -26
- data/ext/nokogiri/xml_element_decl.c +22 -22
- data/ext/nokogiri/xml_encoding_handler.c +43 -18
- data/ext/nokogiri/xml_entity_decl.c +32 -30
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +61 -58
- data/ext/nokogiri/xml_node.c +1194 -729
- data/ext/nokogiri/xml_node_set.c +178 -165
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +226 -175
- data/ext/nokogiri/xml_relax_ng.c +52 -28
- data/ext/nokogiri/xml_sax_parser.c +115 -114
- data/ext/nokogiri/xml_sax_parser_context.c +105 -86
- data/ext/nokogiri/xml_sax_push_parser.c +88 -35
- data/ext/nokogiri/xml_schema.c +112 -33
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +13 -17
- data/ext/nokogiri/xml_xpath_context.c +223 -115
- data/ext/nokogiri/xslt_stylesheet.c +265 -173
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +101 -0
- data/gumbo-parser/THANKS +27 -0
- data/gumbo-parser/src/Makefile +34 -0
- data/gumbo-parser/src/README.md +41 -0
- data/gumbo-parser/src/ascii.c +75 -0
- data/gumbo-parser/src/ascii.h +115 -0
- data/gumbo-parser/src/attribute.c +42 -0
- data/gumbo-parser/src/attribute.h +17 -0
- data/gumbo-parser/src/char_ref.c +22225 -0
- data/gumbo-parser/src/char_ref.h +29 -0
- data/gumbo-parser/src/char_ref.rl +2154 -0
- data/gumbo-parser/src/error.c +626 -0
- data/gumbo-parser/src/error.h +148 -0
- data/gumbo-parser/src/foreign_attrs.c +104 -0
- data/gumbo-parser/src/foreign_attrs.gperf +27 -0
- data/gumbo-parser/src/gumbo.h +943 -0
- data/gumbo-parser/src/insertion_mode.h +33 -0
- data/gumbo-parser/src/macros.h +91 -0
- data/gumbo-parser/src/parser.c +4875 -0
- data/gumbo-parser/src/parser.h +41 -0
- data/gumbo-parser/src/replacement.h +33 -0
- data/gumbo-parser/src/string_buffer.c +103 -0
- data/gumbo-parser/src/string_buffer.h +68 -0
- data/gumbo-parser/src/string_piece.c +48 -0
- data/gumbo-parser/src/svg_attrs.c +174 -0
- data/gumbo-parser/src/svg_attrs.gperf +77 -0
- data/gumbo-parser/src/svg_tags.c +137 -0
- data/gumbo-parser/src/svg_tags.gperf +55 -0
- data/gumbo-parser/src/tag.c +222 -0
- data/gumbo-parser/src/tag_lookup.c +382 -0
- data/gumbo-parser/src/tag_lookup.gperf +169 -0
- data/gumbo-parser/src/tag_lookup.h +13 -0
- data/gumbo-parser/src/token_buffer.c +79 -0
- data/gumbo-parser/src/token_buffer.h +71 -0
- data/gumbo-parser/src/token_type.h +17 -0
- data/gumbo-parser/src/tokenizer.c +3463 -0
- data/gumbo-parser/src/tokenizer.h +112 -0
- data/gumbo-parser/src/tokenizer_states.h +339 -0
- data/gumbo-parser/src/utf8.c +245 -0
- data/gumbo-parser/src/utf8.h +164 -0
- data/gumbo-parser/src/util.c +68 -0
- data/gumbo-parser/src/util.h +30 -0
- data/gumbo-parser/src/vector.c +111 -0
- data/gumbo-parser/src/vector.h +45 -0
- data/lib/nokogiri/class_resolver.rb +67 -0
- data/lib/nokogiri/css/node.rb +10 -8
- data/lib/nokogiri/css/parser.rb +410 -372
- data/lib/nokogiri/css/parser.y +260 -244
- data/lib/nokogiri/css/parser_extras.rb +54 -49
- data/lib/nokogiri/css/syntax_error.rb +3 -1
- data/lib/nokogiri/css/tokenizer.rb +107 -104
- data/lib/nokogiri/css/tokenizer.rex +7 -6
- data/lib/nokogiri/css/xpath_visitor.rb +226 -92
- data/lib/nokogiri/css.rb +50 -17
- data/lib/nokogiri/decorators/slop.rb +9 -7
- data/lib/nokogiri/extension.rb +31 -0
- data/lib/nokogiri/gumbo.rb +15 -0
- data/lib/nokogiri/html.rb +38 -27
- data/lib/nokogiri/{html → html4}/builder.rb +4 -2
- data/lib/nokogiri/{html → html4}/document.rb +104 -106
- data/lib/nokogiri/html4/document_fragment.rb +54 -0
- data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
- data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
- data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
- data/lib/nokogiri/{html → html4}/sax/parser.rb +24 -13
- data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
- data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
- data/lib/nokogiri/html4.rb +46 -0
- data/lib/nokogiri/html5/document.rb +91 -0
- data/lib/nokogiri/html5/document_fragment.rb +83 -0
- data/lib/nokogiri/html5/node.rb +100 -0
- data/lib/nokogiri/html5.rb +478 -0
- data/lib/nokogiri/jruby/dependencies.rb +21 -0
- data/lib/nokogiri/syntax_error.rb +2 -0
- data/lib/nokogiri/version/constant.rb +6 -0
- data/lib/nokogiri/version/info.rb +222 -0
- data/lib/nokogiri/version.rb +3 -107
- data/lib/nokogiri/xml/attr.rb +6 -3
- data/lib/nokogiri/xml/attribute_decl.rb +3 -1
- data/lib/nokogiri/xml/builder.rb +97 -53
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +2 -0
- data/lib/nokogiri/xml/document.rb +231 -93
- data/lib/nokogiri/xml/document_fragment.rb +57 -44
- data/lib/nokogiri/xml/dtd.rb +4 -2
- data/lib/nokogiri/xml/element_content.rb +2 -0
- data/lib/nokogiri/xml/element_decl.rb +3 -1
- data/lib/nokogiri/xml/entity_decl.rb +4 -2
- data/lib/nokogiri/xml/entity_reference.rb +20 -0
- data/lib/nokogiri/xml/namespace.rb +3 -0
- data/lib/nokogiri/xml/node/save_options.rb +10 -5
- data/lib/nokogiri/xml/node.rb +911 -337
- data/lib/nokogiri/xml/node_set.rb +141 -84
- data/lib/nokogiri/xml/notation.rb +13 -0
- data/lib/nokogiri/xml/parse_options.rb +23 -9
- data/lib/nokogiri/xml/pp/character_data.rb +9 -6
- data/lib/nokogiri/xml/pp/node.rb +25 -26
- data/lib/nokogiri/xml/pp.rb +4 -2
- data/lib/nokogiri/xml/processing_instruction.rb +3 -1
- data/lib/nokogiri/xml/reader.rb +23 -28
- data/lib/nokogiri/xml/relax_ng.rb +8 -2
- data/lib/nokogiri/xml/sax/document.rb +45 -49
- data/lib/nokogiri/xml/sax/parser.rb +43 -40
- data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
- data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
- data/lib/nokogiri/xml/sax.rb +6 -4
- data/lib/nokogiri/xml/schema.rb +19 -9
- data/lib/nokogiri/xml/searchable.rb +138 -89
- data/lib/nokogiri/xml/syntax_error.rb +26 -1
- data/lib/nokogiri/xml/text.rb +2 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
- data/lib/nokogiri/xml/xpath.rb +15 -4
- data/lib/nokogiri/xml/xpath_context.rb +3 -3
- data/lib/nokogiri/xml.rb +39 -37
- data/lib/nokogiri/xslt/stylesheet.rb +3 -1
- data/lib/nokogiri/xslt.rb +29 -20
- data/lib/nokogiri.rb +49 -65
- data/lib/xsd/xmlparser/nokogiri.rb +26 -24
- data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
- data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
- data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
- data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
- data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
- data/patches/libxml2/0006-update-automake-files-for-arm64.patch +3040 -0
- data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
- data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
- data/patches/libxml2/0010-Revert-Different-approach-to-fix-quadratic-behavior.patch +45 -0
- data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
- data/ports/archives/libxml2-2.9.13.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
- metadata +233 -258
- data/.autotest +0 -26
- data/.cross_rubies +0 -9
- data/.editorconfig +0 -17
- data/.gemtest +0 -0
- data/.travis.yml +0 -51
- data/CHANGELOG.rdoc +0 -1160
- data/CONTRIBUTING.md +0 -42
- data/C_CODING_STYLE.rdoc +0 -33
- data/LICENSE.txt +0 -31
- data/Manifest.txt +0 -364
- data/ROADMAP.md +0 -111
- data/Rakefile +0 -375
- data/STANDARD_RESPONSES.md +0 -47
- data/Y_U_NO_GEMSPEC.md +0 -155
- data/appveyor.yml +0 -22
- data/build_all +0 -45
- data/ext/nokogiri/html_document.c +0 -170
- data/ext/nokogiri/html_document.h +0 -10
- data/ext/nokogiri/html_element_description.c +0 -279
- data/ext/nokogiri/html_element_description.h +0 -10
- data/ext/nokogiri/html_entity_lookup.c +0 -32
- data/ext/nokogiri/html_entity_lookup.h +0 -8
- data/ext/nokogiri/html_sax_parser_context.c +0 -116
- data/ext/nokogiri/html_sax_parser_context.h +0 -11
- data/ext/nokogiri/html_sax_push_parser.c +0 -87
- data/ext/nokogiri/html_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_attr.h +0 -9
- data/ext/nokogiri/xml_attribute_decl.h +0 -9
- data/ext/nokogiri/xml_cdata.h +0 -9
- data/ext/nokogiri/xml_comment.h +0 -9
- data/ext/nokogiri/xml_document.h +0 -23
- data/ext/nokogiri/xml_document_fragment.h +0 -10
- data/ext/nokogiri/xml_dtd.h +0 -10
- data/ext/nokogiri/xml_element_content.h +0 -10
- data/ext/nokogiri/xml_element_decl.h +0 -9
- data/ext/nokogiri/xml_encoding_handler.h +0 -8
- data/ext/nokogiri/xml_entity_decl.h +0 -10
- data/ext/nokogiri/xml_entity_reference.h +0 -9
- data/ext/nokogiri/xml_io.c +0 -60
- data/ext/nokogiri/xml_io.h +0 -11
- data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
- data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
- data/ext/nokogiri/xml_namespace.h +0 -13
- data/ext/nokogiri/xml_node.h +0 -13
- data/ext/nokogiri/xml_node_set.h +0 -13
- data/ext/nokogiri/xml_processing_instruction.h +0 -9
- data/ext/nokogiri/xml_reader.h +0 -10
- data/ext/nokogiri/xml_relax_ng.h +0 -9
- data/ext/nokogiri/xml_sax_parser.h +0 -39
- data/ext/nokogiri/xml_sax_parser_context.h +0 -10
- data/ext/nokogiri/xml_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_schema.h +0 -9
- data/ext/nokogiri/xml_syntax_error.h +0 -13
- data/ext/nokogiri/xml_text.h +0 -9
- data/ext/nokogiri/xml_xpath_context.h +0 -10
- data/ext/nokogiri/xslt_stylesheet.h +0 -14
- data/lib/nokogiri/html/document_fragment.rb +0 -39
- data/lib/nokogiri/html/element_description_defaults.rb +0 -671
- data/lib/nokogiri/html/sax/parser_context.rb +0 -16
- data/patches/sort-patches-by-date +0 -25
- data/ports/archives/libxml2-2.9.4.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.29.tar.gz +0 -0
- data/suppressions/README.txt +0 -1
- data/suppressions/nokogiri_ree-1.8.7.358.supp +0 -61
- data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
- data/suppressions/nokogiri_ruby-1.9.2.320.supp +0 -28
- data/suppressions/nokogiri_ruby-1.9.3.327.supp +0 -28
- data/tasks/test.rb +0 -100
- data/test/css/test_nthiness.rb +0 -226
- data/test/css/test_parser.rb +0 -369
- data/test/css/test_tokenizer.rb +0 -215
- data/test/css/test_xpath_visitor.rb +0 -96
- data/test/decorators/test_slop.rb +0 -20
- data/test/files/2ch.html +0 -108
- data/test/files/GH_1042.html +0 -18
- data/test/files/address_book.rlx +0 -12
- data/test/files/address_book.xml +0 -10
- data/test/files/atom.xml +0 -344
- data/test/files/bar/bar.xsd +0 -4
- data/test/files/bogus.xml +0 -0
- data/test/files/dont_hurt_em_why.xml +0 -422
- data/test/files/encoding.html +0 -82
- data/test/files/encoding.xhtml +0 -84
- data/test/files/exslt.xml +0 -8
- data/test/files/exslt.xslt +0 -35
- data/test/files/foo/foo.xsd +0 -4
- data/test/files/metacharset.html +0 -10
- data/test/files/namespace_pressure_test.xml +0 -1684
- data/test/files/noencoding.html +0 -47
- data/test/files/po.xml +0 -32
- data/test/files/po.xsd +0 -66
- data/test/files/saml/saml20assertion_schema.xsd +0 -283
- data/test/files/saml/saml20protocol_schema.xsd +0 -302
- data/test/files/saml/xenc_schema.xsd +0 -146
- data/test/files/saml/xmldsig_schema.xsd +0 -318
- data/test/files/shift_jis.html +0 -10
- data/test/files/shift_jis.xml +0 -5
- data/test/files/shift_jis_no_charset.html +0 -9
- data/test/files/slow-xpath.xml +0 -25509
- data/test/files/snuggles.xml +0 -3
- data/test/files/staff.dtd +0 -10
- data/test/files/staff.xml +0 -59
- data/test/files/staff.xslt +0 -32
- data/test/files/test_document_url/bar.xml +0 -2
- data/test/files/test_document_url/document.dtd +0 -4
- data/test/files/test_document_url/document.xml +0 -6
- data/test/files/tlm.html +0 -851
- data/test/files/to_be_xincluded.xml +0 -2
- data/test/files/valid_bar.xml +0 -2
- data/test/files/xinclude.xml +0 -4
- data/test/helper.rb +0 -181
- data/test/html/sax/test_parser.rb +0 -141
- data/test/html/sax/test_parser_context.rb +0 -46
- data/test/html/sax/test_push_parser.rb +0 -87
- data/test/html/test_builder.rb +0 -164
- data/test/html/test_document.rb +0 -701
- data/test/html/test_document_encoding.rb +0 -145
- data/test/html/test_document_fragment.rb +0 -301
- data/test/html/test_element_description.rb +0 -105
- data/test/html/test_named_characters.rb +0 -14
- data/test/html/test_node.rb +0 -212
- data/test/html/test_node_encoding.rb +0 -85
- data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
- data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
- data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
- data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
- data/test/namespaces/test_namespaces_preservation.rb +0 -31
- data/test/test_convert_xpath.rb +0 -135
- data/test/test_css_cache.rb +0 -45
- data/test/test_encoding_handler.rb +0 -48
- data/test/test_memory_leak.rb +0 -156
- data/test/test_nokogiri.rb +0 -138
- data/test/test_soap4r_sax.rb +0 -52
- data/test/test_xslt_transforms.rb +0 -314
- data/test/xml/node/test_save_options.rb +0 -28
- data/test/xml/node/test_subclass.rb +0 -44
- data/test/xml/sax/test_parser.rb +0 -394
- data/test/xml/sax/test_parser_context.rb +0 -115
- data/test/xml/sax/test_push_parser.rb +0 -157
- data/test/xml/test_attr.rb +0 -67
- data/test/xml/test_attribute_decl.rb +0 -86
- data/test/xml/test_builder.rb +0 -341
- data/test/xml/test_c14n.rb +0 -180
- data/test/xml/test_cdata.rb +0 -48
- data/test/xml/test_comment.rb +0 -40
- data/test/xml/test_document.rb +0 -982
- data/test/xml/test_document_encoding.rb +0 -31
- data/test/xml/test_document_fragment.rb +0 -271
- data/test/xml/test_dtd.rb +0 -187
- data/test/xml/test_dtd_encoding.rb +0 -31
- data/test/xml/test_element_content.rb +0 -56
- data/test/xml/test_element_decl.rb +0 -73
- data/test/xml/test_entity_decl.rb +0 -122
- data/test/xml/test_entity_reference.rb +0 -251
- data/test/xml/test_namespace.rb +0 -96
- data/test/xml/test_node.rb +0 -1244
- data/test/xml/test_node_attributes.rb +0 -115
- data/test/xml/test_node_encoding.rb +0 -69
- data/test/xml/test_node_inheritance.rb +0 -32
- data/test/xml/test_node_reparenting.rb +0 -549
- data/test/xml/test_node_set.rb +0 -775
- data/test/xml/test_parse_options.rb +0 -64
- data/test/xml/test_processing_instruction.rb +0 -30
- data/test/xml/test_reader.rb +0 -589
- data/test/xml/test_reader_encoding.rb +0 -134
- data/test/xml/test_relax_ng.rb +0 -60
- data/test/xml/test_schema.rb +0 -142
- data/test/xml/test_syntax_error.rb +0 -30
- data/test/xml/test_text.rb +0 -60
- data/test/xml/test_unparented_node.rb +0 -440
- data/test/xml/test_xinclude.rb +0 -83
- data/test/xml/test_xpath.rb +0 -445
- data/test/xslt/test_custom_functions.rb +0 -133
- data/test/xslt/test_exception_handling.rb +0 -37
- data/test_all +0 -107
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
####
|
@@ -11,8 +13,10 @@ module Nokogiri
|
|
11
13
|
# The Document this NodeSet is associated with
|
12
14
|
attr_accessor :document
|
13
15
|
|
16
|
+
alias_method :clone, :dup
|
17
|
+
|
14
18
|
# Create a NodeSet with +document+ defaulting to +list+
|
15
|
-
def initialize
|
19
|
+
def initialize(document, list = [])
|
16
20
|
@document = document
|
17
21
|
document.decorate(self)
|
18
22
|
list.each { |x| self << x }
|
@@ -21,10 +25,11 @@ module Nokogiri
|
|
21
25
|
|
22
26
|
###
|
23
27
|
# Get the first element of the NodeSet.
|
24
|
-
def first
|
28
|
+
def first(n = nil)
|
25
29
|
return self[0] unless n
|
30
|
+
|
26
31
|
list = []
|
27
|
-
n.times { |i| list << self[i] }
|
32
|
+
[n, length].min.times { |i| list << self[i] }
|
28
33
|
list
|
29
34
|
end
|
30
35
|
|
@@ -41,26 +46,31 @@ module Nokogiri
|
|
41
46
|
end
|
42
47
|
|
43
48
|
###
|
44
|
-
# Returns the index of the first node in self that is == to +node
|
45
|
-
def index(node)
|
46
|
-
|
49
|
+
# Returns the index of the first node in self that is == to +node+ or meets the given block. Returns nil if no match is found.
|
50
|
+
def index(node = nil)
|
51
|
+
if node
|
52
|
+
warn("given block not used") if block_given?
|
53
|
+
each_with_index { |member, j| return j if member == node }
|
54
|
+
elsif block_given?
|
55
|
+
each_with_index { |member, j| return j if yield(member) }
|
56
|
+
end
|
47
57
|
nil
|
48
58
|
end
|
49
59
|
|
50
60
|
###
|
51
61
|
# Insert +datum+ before the first Node in this NodeSet
|
52
|
-
def before
|
53
|
-
first.before
|
62
|
+
def before(datum)
|
63
|
+
first.before(datum)
|
54
64
|
end
|
55
65
|
|
56
66
|
###
|
57
67
|
# Insert +datum+ after the last Node in this NodeSet
|
58
|
-
def after
|
59
|
-
last.after
|
68
|
+
def after(datum)
|
69
|
+
last.after(datum)
|
60
70
|
end
|
61
71
|
|
62
|
-
|
63
|
-
|
72
|
+
alias_method :<<, :push
|
73
|
+
alias_method :remove, :unlink
|
64
74
|
|
65
75
|
###
|
66
76
|
# call-seq: css *rules, [namespace-bindings, custom-pseudo-class]
|
@@ -69,11 +79,12 @@ module Nokogiri
|
|
69
79
|
# selectors. For example:
|
70
80
|
#
|
71
81
|
# For more information see Nokogiri::XML::Searchable#css
|
72
|
-
def css
|
82
|
+
def css(*args)
|
73
83
|
rules, handler, ns, _ = extract_params(args)
|
84
|
+
paths = css_rules_to_xpath(rules, ns)
|
74
85
|
|
75
86
|
inject(NodeSet.new(document)) do |set, node|
|
76
|
-
set
|
87
|
+
set + xpath_internal(node, paths, handler, ns, nil)
|
77
88
|
end
|
78
89
|
end
|
79
90
|
|
@@ -84,21 +95,14 @@ module Nokogiri
|
|
84
95
|
# queries.
|
85
96
|
#
|
86
97
|
# For more information see Nokogiri::XML::Searchable#xpath
|
87
|
-
def xpath
|
98
|
+
def xpath(*args)
|
88
99
|
paths, handler, ns, binds = extract_params(args)
|
89
100
|
|
90
101
|
inject(NodeSet.new(document)) do |set, node|
|
91
|
-
set
|
102
|
+
set + xpath_internal(node, paths, handler, ns, binds)
|
92
103
|
end
|
93
104
|
end
|
94
105
|
|
95
|
-
###
|
96
|
-
# Search this NodeSet's nodes' immediate children using CSS selector +selector+
|
97
|
-
def > selector
|
98
|
-
ns = document.root.namespaces
|
99
|
-
xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first
|
100
|
-
end
|
101
|
-
|
102
106
|
###
|
103
107
|
# call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class]
|
104
108
|
#
|
@@ -111,105 +115,155 @@ module Nokogiri
|
|
111
115
|
#
|
112
116
|
# node_set.at(3) # same as node_set[3]
|
113
117
|
#
|
114
|
-
def at
|
118
|
+
def at(*args)
|
115
119
|
if args.length == 1 && args.first.is_a?(Numeric)
|
116
120
|
return self[args.first]
|
117
121
|
end
|
118
122
|
|
119
123
|
super(*args)
|
120
124
|
end
|
121
|
-
|
125
|
+
alias_method :%, :at
|
122
126
|
|
123
127
|
###
|
124
128
|
# Filter this list for nodes that match +expr+
|
125
|
-
def filter
|
129
|
+
def filter(expr)
|
126
130
|
find_all { |node| node.matches?(expr) }
|
127
131
|
end
|
128
132
|
|
129
133
|
###
|
130
|
-
#
|
131
|
-
|
134
|
+
# Add the class attribute +name+ to all Node objects in the
|
135
|
+
# NodeSet.
|
136
|
+
#
|
137
|
+
# See Nokogiri::XML::Node#add_class for more information.
|
138
|
+
def add_class(name)
|
132
139
|
each do |el|
|
133
|
-
|
134
|
-
el['class'] = classes.push(name).uniq.join " "
|
140
|
+
el.add_class(name)
|
135
141
|
end
|
136
142
|
self
|
137
143
|
end
|
138
144
|
|
139
145
|
###
|
140
|
-
#
|
141
|
-
# If +name+ is nil, remove the class attribute from all Nodes in the
|
146
|
+
# Append the class attribute +name+ to all Node objects in the
|
142
147
|
# NodeSet.
|
143
|
-
|
148
|
+
#
|
149
|
+
# See Nokogiri::XML::Node#append_class for more information.
|
150
|
+
def append_class(name)
|
144
151
|
each do |el|
|
145
|
-
|
146
|
-
classes = el['class'].to_s.split(/\s+/)
|
147
|
-
if classes.empty?
|
148
|
-
el.delete 'class'
|
149
|
-
else
|
150
|
-
el['class'] = (classes - [name]).uniq.join " "
|
151
|
-
end
|
152
|
-
else
|
153
|
-
el.delete "class"
|
154
|
-
end
|
152
|
+
el.append_class(name)
|
155
153
|
end
|
156
154
|
self
|
157
155
|
end
|
158
156
|
|
159
157
|
###
|
160
|
-
#
|
161
|
-
#
|
162
|
-
|
163
|
-
|
164
|
-
|
158
|
+
# Remove the class attribute +name+ from all Node objects in the
|
159
|
+
# NodeSet.
|
160
|
+
#
|
161
|
+
# See Nokogiri::XML::Node#remove_class for more information.
|
162
|
+
def remove_class(name = nil)
|
163
|
+
each do |el|
|
164
|
+
el.remove_class(name)
|
165
|
+
end
|
166
|
+
self
|
167
|
+
end
|
168
|
+
|
169
|
+
###
|
170
|
+
# Set attributes on each Node in the NodeSet, or get an
|
171
|
+
# attribute from the first Node in the NodeSet.
|
172
|
+
#
|
173
|
+
# To get an attribute from the first Node in a NodeSet:
|
174
|
+
#
|
175
|
+
# node_set.attr("href") # => "https://www.nokogiri.org"
|
176
|
+
#
|
177
|
+
# Note that an empty NodeSet will return nil when +#attr+ is called as a getter.
|
178
|
+
#
|
179
|
+
# To set an attribute on each node, +key+ can either be an
|
180
|
+
# attribute name, or a Hash of attribute names and values. When
|
181
|
+
# called as a setter, +#attr+ returns the NodeSet.
|
182
|
+
#
|
183
|
+
# If +key+ is an attribute name, then either +value+ or +block+
|
184
|
+
# must be passed.
|
185
|
+
#
|
186
|
+
# If +key+ is a Hash then attributes will be set for each
|
187
|
+
# key/value pair:
|
188
|
+
#
|
189
|
+
# node_set.attr("href" => "https://www.nokogiri.org", "class" => "member")
|
190
|
+
#
|
191
|
+
# If +value+ is passed, it will be used as the attribute value
|
192
|
+
# for all nodes:
|
193
|
+
#
|
194
|
+
# node_set.attr("href", "https://www.nokogiri.org")
|
195
|
+
#
|
196
|
+
# If +block+ is passed, it will be called on each Node object in
|
197
|
+
# the NodeSet and the return value used as the attribute value
|
198
|
+
# for that node:
|
199
|
+
#
|
200
|
+
# node_set.attr("class") { |node| node.name }
|
201
|
+
#
|
202
|
+
def attr(key, value = nil, &block)
|
203
|
+
unless key.is_a?(Hash) || (key && (value || block))
|
204
|
+
return first ? first.attribute(key) : nil
|
165
205
|
end
|
166
206
|
|
167
207
|
hash = key.is_a?(Hash) ? key : { key => value }
|
168
208
|
|
169
|
-
hash.each
|
209
|
+
hash.each do |k, v|
|
210
|
+
each do |node|
|
211
|
+
node[k] = v || yield(node)
|
212
|
+
end
|
213
|
+
end
|
170
214
|
|
171
215
|
self
|
172
216
|
end
|
173
|
-
|
174
|
-
|
217
|
+
alias_method :set, :attr
|
218
|
+
alias_method :attribute, :attr
|
175
219
|
|
176
220
|
###
|
177
221
|
# Remove the attributed named +name+ from all Node objects in the NodeSet
|
178
|
-
def remove_attr
|
179
|
-
each { |el| el.delete
|
222
|
+
def remove_attr(name)
|
223
|
+
each { |el| el.delete(name) }
|
180
224
|
self
|
181
225
|
end
|
226
|
+
alias_method :remove_attribute, :remove_attr
|
182
227
|
|
183
228
|
###
|
184
229
|
# Iterate over each node, yielding to +block+
|
185
|
-
def each
|
230
|
+
def each
|
231
|
+
return to_enum unless block_given?
|
232
|
+
|
186
233
|
0.upto(length - 1) do |x|
|
187
234
|
yield self[x]
|
188
235
|
end
|
236
|
+
self
|
189
237
|
end
|
190
238
|
|
191
239
|
###
|
192
240
|
# Get the inner text of all contained Node objects
|
241
|
+
#
|
242
|
+
# Note: This joins the text of all Node objects in the NodeSet:
|
243
|
+
#
|
244
|
+
# doc = Nokogiri::XML('<xml><a><d>foo</d><d>bar</d></a></xml>')
|
245
|
+
# doc.css('d').text # => "foobar"
|
246
|
+
#
|
247
|
+
# Instead, if you want to return the text of all nodes in the NodeSet:
|
248
|
+
#
|
249
|
+
# doc.css('d').map(&:text) # => ["foo", "bar"]
|
250
|
+
#
|
251
|
+
# See Nokogiri::XML::Node#content for more information.
|
193
252
|
def inner_text
|
194
|
-
collect(&:inner_text).join(
|
253
|
+
collect(&:inner_text).join("")
|
195
254
|
end
|
196
|
-
|
255
|
+
alias_method :text, :inner_text
|
197
256
|
|
198
257
|
###
|
199
258
|
# Get the inner html of all contained Node objects
|
200
|
-
def inner_html
|
201
|
-
collect{|j| j.inner_html(*args) }.join(
|
259
|
+
def inner_html(*args)
|
260
|
+
collect { |j| j.inner_html(*args) }.join("")
|
202
261
|
end
|
203
262
|
|
204
263
|
###
|
205
|
-
# Wrap this NodeSet with +html+
|
206
|
-
def wrap(html
|
207
|
-
|
208
|
-
new_parent = document.parse(html).first
|
209
|
-
j.add_next_sibling(new_parent)
|
210
|
-
new_parent.add_child(j)
|
211
|
-
end
|
212
|
-
self
|
264
|
+
# Wrap this NodeSet with +html+
|
265
|
+
def wrap(html)
|
266
|
+
map { |node| node.wrap(html) }
|
213
267
|
end
|
214
268
|
|
215
269
|
###
|
@@ -220,10 +274,10 @@ module Nokogiri
|
|
220
274
|
|
221
275
|
###
|
222
276
|
# Convert this NodeSet to HTML
|
223
|
-
def to_html
|
277
|
+
def to_html(*args)
|
224
278
|
if Nokogiri.jruby?
|
225
279
|
options = args.first.is_a?(Hash) ? args.shift : {}
|
226
|
-
|
280
|
+
unless options[:save_with]
|
227
281
|
options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
|
228
282
|
end
|
229
283
|
args.insert(0, options)
|
@@ -233,25 +287,26 @@ module Nokogiri
|
|
233
287
|
|
234
288
|
###
|
235
289
|
# Convert this NodeSet to XHTML
|
236
|
-
def to_xhtml
|
290
|
+
def to_xhtml(*args)
|
237
291
|
map { |x| x.to_xhtml(*args) }.join
|
238
292
|
end
|
239
293
|
|
240
294
|
###
|
241
295
|
# Convert this NodeSet to XML
|
242
|
-
def to_xml
|
296
|
+
def to_xml(*args)
|
243
297
|
map { |x| x.to_xml(*args) }.join
|
244
298
|
end
|
245
299
|
|
246
|
-
|
247
|
-
|
300
|
+
alias_method :size, :length
|
301
|
+
alias_method :to_ary, :to_a
|
248
302
|
|
249
303
|
###
|
250
304
|
# Removes the last element from set and returns it, or +nil+ if
|
251
305
|
# the set is empty
|
252
306
|
def pop
|
253
307
|
return nil if length == 0
|
254
|
-
|
308
|
+
|
309
|
+
delete(last)
|
255
310
|
end
|
256
311
|
|
257
312
|
###
|
@@ -259,16 +314,18 @@ module Nokogiri
|
|
259
314
|
# +nil+ if the set is empty.
|
260
315
|
def shift
|
261
316
|
return nil if length == 0
|
262
|
-
|
317
|
+
|
318
|
+
delete(first)
|
263
319
|
end
|
264
320
|
|
265
321
|
###
|
266
322
|
# Equality -- Two NodeSets are equal if the contain the same number
|
267
323
|
# of elements and if each element is equal to the corresponding
|
268
324
|
# element in the other NodeSet
|
269
|
-
def ==
|
325
|
+
def ==(other)
|
270
326
|
return false unless other.is_a?(Nokogiri::XML::NodeSet)
|
271
327
|
return false unless length == other.length
|
328
|
+
|
272
329
|
each_with_index do |node, i|
|
273
330
|
return false unless node == other[i]
|
274
331
|
end
|
@@ -279,7 +336,11 @@ module Nokogiri
|
|
279
336
|
# Returns a new NodeSet containing all the children of all the nodes in
|
280
337
|
# the NodeSet
|
281
338
|
def children
|
282
|
-
|
339
|
+
node_set = NodeSet.new(document)
|
340
|
+
each do |node|
|
341
|
+
node.children.each { |n| node_set.push(n) }
|
342
|
+
end
|
343
|
+
node_set
|
283
344
|
end
|
284
345
|
|
285
346
|
###
|
@@ -288,7 +349,7 @@ module Nokogiri
|
|
288
349
|
def reverse
|
289
350
|
node_set = NodeSet.new(document)
|
290
351
|
(length - 1).downto(0) do |x|
|
291
|
-
node_set.push
|
352
|
+
node_set.push(self[x])
|
292
353
|
end
|
293
354
|
node_set
|
294
355
|
end
|
@@ -296,16 +357,12 @@ module Nokogiri
|
|
296
357
|
###
|
297
358
|
# Return a nicely formated string representation
|
298
359
|
def inspect
|
299
|
-
"[#{map(&:inspect).join
|
360
|
+
"[#{map(&:inspect).join(", ")}]"
|
300
361
|
end
|
301
362
|
|
302
|
-
|
303
|
-
|
304
|
-
private
|
363
|
+
alias_method :+, :|
|
305
364
|
|
306
|
-
|
307
|
-
[".//", "self::"]
|
308
|
-
end
|
365
|
+
IMPLIED_XPATH_CONTEXTS = [".//", "self::"].freeze # :nodoc:
|
309
366
|
end
|
310
367
|
end
|
311
368
|
end
|
@@ -1,6 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
5
|
+
# Struct representing an {XML Schema Notation}[https://www.w3.org/TR/xml/#Notations]
|
3
6
|
class Notation < Struct.new(:name, :public_id, :system_id)
|
7
|
+
# dead comment to ensure rdoc processing
|
8
|
+
|
9
|
+
# :attr: name (String)
|
10
|
+
# The name for the element.
|
11
|
+
|
12
|
+
# :attr: public_id (String)
|
13
|
+
# The URI corresponding to the public identifier
|
14
|
+
|
15
|
+
# :attr: system_id (String,nil)
|
16
|
+
# The URI corresponding to the system identifier
|
4
17
|
end
|
5
18
|
end
|
6
19
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
###
|
@@ -5,13 +7,13 @@ module Nokogiri
|
|
5
7
|
#
|
6
8
|
# == Building combinations of parse options
|
7
9
|
# You can build your own combinations of these parse options by using any of the following methods:
|
8
|
-
# *Note*: All examples attempt to set the +RECOVER+ & +NOENT+ options.
|
10
|
+
# *Note*: All examples attempt to set the +RECOVER+ & +NOENT+ options.
|
9
11
|
# [Ruby's bitwise operators] You can use the Ruby bitwise operators to set various combinations.
|
10
|
-
#
|
12
|
+
# Nokogiri.XML('<content>Chapter 1</content', nil, nil, Nokogiri::XML::ParseOptions.new((1 << 0) | (1 << 1)))
|
11
13
|
# [Method chaining] Every option has an equivalent method in lowercase. You can chain these methods together to set various combinations.
|
12
|
-
#
|
14
|
+
# Nokogiri.XML('<content>Chapter 1</content', nil, nil, Nokogiri::XML::ParseOptions.new.recover.noent)
|
13
15
|
# [Using Ruby Blocks] You can also setup parse combinations in the block passed to Nokogiri.XML or Nokogiri.HTML
|
14
|
-
#
|
16
|
+
# Nokogiri.XML('<content>Chapter 1</content') {|config| config.recover.noent}
|
15
17
|
#
|
16
18
|
# == Removing particular parse options
|
17
19
|
# You can also remove options from an instance of +ParseOptions+ dynamically.
|
@@ -67,19 +69,27 @@ module Nokogiri
|
|
67
69
|
NOBASEFIX = 1 << 18
|
68
70
|
# relax any hardcoded limit from the parser
|
69
71
|
HUGE = 1 << 19
|
72
|
+
# line numbers stored as long int (instead of a short int)
|
73
|
+
BIG_LINES = 1 << 22
|
70
74
|
|
71
75
|
# the default options used for parsing XML documents
|
72
|
-
DEFAULT_XML = RECOVER | NONET
|
76
|
+
DEFAULT_XML = RECOVER | NONET | BIG_LINES
|
77
|
+
# the default options used for parsing XSLT stylesheets
|
78
|
+
DEFAULT_XSLT = RECOVER | NONET | NOENT | DTDLOAD | DTDATTR | NOCDATA | BIG_LINES
|
73
79
|
# the default options used for parsing HTML documents
|
74
|
-
DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET
|
80
|
+
DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET | BIG_LINES
|
81
|
+
# the default options used for parsing XML schemas
|
82
|
+
DEFAULT_SCHEMA = NONET | BIG_LINES
|
75
83
|
|
76
84
|
attr_accessor :options
|
77
|
-
|
85
|
+
|
86
|
+
def initialize(options = STRICT)
|
78
87
|
@options = options
|
79
88
|
end
|
80
89
|
|
81
90
|
constants.each do |constant|
|
82
91
|
next if constant.to_sym == :STRICT
|
92
|
+
|
83
93
|
class_eval %{
|
84
94
|
def #{constant.downcase}
|
85
95
|
@options |= #{constant}
|
@@ -106,14 +116,18 @@ module Nokogiri
|
|
106
116
|
@options & RECOVER == STRICT
|
107
117
|
end
|
108
118
|
|
109
|
-
|
119
|
+
def ==(other)
|
120
|
+
other.to_i == to_i
|
121
|
+
end
|
122
|
+
|
123
|
+
alias_method :to_i, :options
|
110
124
|
|
111
125
|
def inspect
|
112
126
|
options = []
|
113
127
|
self.class.constants.each do |k|
|
114
128
|
options << k.downcase if send(:"#{k.downcase}?")
|
115
129
|
end
|
116
|
-
super.sub(/>$/, " " + options.join(
|
130
|
+
super.sub(/>$/, " " + options.join(", ") + ">")
|
117
131
|
end
|
118
132
|
end
|
119
133
|
end
|
@@ -1,16 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
5
|
+
# :nodoc: all
|
3
6
|
module PP
|
4
7
|
module CharacterData
|
5
|
-
def pretty_print
|
6
|
-
nice_name = self.class.name.split(
|
7
|
-
pp.group(2, "#(#{nice_name} ",
|
8
|
-
pp.pp
|
8
|
+
def pretty_print(pp)
|
9
|
+
nice_name = self.class.name.split("::").last
|
10
|
+
pp.group(2, "#(#{nice_name} ", ")") do
|
11
|
+
pp.pp(text)
|
9
12
|
end
|
10
13
|
end
|
11
14
|
|
12
|
-
def inspect
|
13
|
-
"#<#{self.class.name}:#{
|
15
|
+
def inspect
|
16
|
+
"#<#{self.class.name}:#{format("0x%x", object_id)} #{text.inspect}>"
|
14
17
|
end
|
15
18
|
end
|
16
19
|
end
|
data/lib/nokogiri/xml/pp/node.rb
CHANGED
@@ -1,53 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
5
|
+
# :nodoc: all
|
3
6
|
module PP
|
4
7
|
module Node
|
5
|
-
def inspect
|
6
|
-
attributes = inspect_attributes.reject
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
}.join ' '
|
16
|
-
"#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{attributes}>"
|
8
|
+
def inspect
|
9
|
+
attributes = inspect_attributes.reject do |x|
|
10
|
+
attribute = send(x)
|
11
|
+
!attribute || (attribute.respond_to?(:empty?) && attribute.empty?)
|
12
|
+
rescue NoMethodError
|
13
|
+
true
|
14
|
+
end.map do |attribute|
|
15
|
+
"#{attribute.to_s.sub(/_\w+/, "s")}=#{send(attribute).inspect}"
|
16
|
+
end.join(" ")
|
17
|
+
"#<#{self.class.name}:#{format("0x%x", object_id)} #{attributes}>"
|
17
18
|
end
|
18
19
|
|
19
|
-
def pretty_print
|
20
|
-
nice_name = self.class.name.split(
|
21
|
-
pp.group(2, "#(#{nice_name}:#{
|
22
|
-
|
20
|
+
def pretty_print(pp)
|
21
|
+
nice_name = self.class.name.split("::").last
|
22
|
+
pp.group(2, "#(#{nice_name}:#{format("0x%x", object_id)} {", "})") do
|
23
23
|
pp.breakable
|
24
|
-
attrs = inspect_attributes.map
|
24
|
+
attrs = inspect_attributes.map do |t|
|
25
25
|
[t, send(t)] if respond_to?(t)
|
26
|
-
|
26
|
+
end.compact.find_all do |x|
|
27
27
|
if x.last
|
28
|
-
if [:attribute_nodes, :children].include?
|
28
|
+
if [:attribute_nodes, :children].include?(x.first)
|
29
29
|
!x.last.empty?
|
30
30
|
else
|
31
31
|
true
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
34
|
+
end
|
35
35
|
|
36
36
|
pp.seplist(attrs) do |v|
|
37
|
-
if [:attribute_nodes, :children].include?
|
38
|
-
pp.group(2, "#{v.first.to_s.sub(/_\w+$/,
|
37
|
+
if [:attribute_nodes, :children].include?(v.first)
|
38
|
+
pp.group(2, "#{v.first.to_s.sub(/_\w+$/, "s")} = [", "]") do
|
39
39
|
pp.breakable
|
40
40
|
pp.seplist(v.last) do |item|
|
41
|
-
pp.pp
|
41
|
+
pp.pp(item)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
else
|
45
|
-
pp.text
|
46
|
-
pp.pp
|
45
|
+
pp.text("#{v.first} = ")
|
46
|
+
pp.pp(v.last)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
pp.breakable
|
50
|
-
|
51
50
|
end
|
52
51
|
end
|
53
52
|
end
|
data/lib/nokogiri/xml/pp.rb
CHANGED