nokogiri 1.8.5 → 1.13.6
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 +4 -4
- data/Gemfile +3 -21
- data/LICENSE-DEPENDENCIES.md +1159 -868
- data/LICENSE.md +5 -28
- data/README.md +196 -90
- data/bin/nokogiri +63 -50
- data/dependencies.yml +13 -59
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +750 -420
- 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 +119 -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 -91
- data/ext/nokogiri/nokogiri.h +191 -89
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +41 -36
- data/ext/nokogiri/xml_attribute_decl.c +18 -18
- data/ext/nokogiri/xml_cdata.c +13 -18
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +291 -216
- 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 -52
- data/ext/nokogiri/xml_node.c +1044 -616
- data/ext/nokogiri/xml_node_set.c +174 -162
- 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 +112 -112
- data/ext/nokogiri/xml_sax_parser_context.c +112 -86
- data/ext/nokogiri/xml_sax_push_parser.c +36 -27
- 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 +397 -377
- data/lib/nokogiri/css/parser.y +250 -245
- 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 +3 -2
- data/lib/nokogiri/css/xpath_visitor.rb +218 -91
- 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 +103 -105
- 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 +17 -16
- 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 -108
- 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 +224 -86
- 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 +2 -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 +895 -377
- data/lib/nokogiri/xml/node_set.rb +92 -65
- data/lib/nokogiri/xml/notation.rb +13 -0
- data/lib/nokogiri/xml/parse_options.rb +22 -8
- 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 +38 -34
- 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 +112 -72
- data/lib/nokogiri/xml/syntax_error.rb +6 -4
- 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 +38 -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/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
- data/ports/archives/libxml2-2.9.14.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
- metadata +220 -266
- data/.autotest +0 -22
- data/.cross_rubies +0 -8
- data/.editorconfig +0 -17
- data/.gemtest +0 -0
- data/.travis.yml +0 -63
- data/CHANGELOG.md +0 -1368
- data/CONTRIBUTING.md +0 -42
- data/C_CODING_STYLE.rdoc +0 -33
- data/Gemfile-libxml-ruby +0 -3
- data/Manifest.txt +0 -370
- data/ROADMAP.md +0 -111
- data/Rakefile +0 -348
- data/SECURITY.md +0 -19
- data/STANDARD_RESPONSES.md +0 -47
- data/Y_U_NO_GEMSPEC.md +0 -155
- data/appveyor.yml +0 -29
- data/build_all +0 -44
- 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 -61
- 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 -15
- data/ext/nokogiri/xml_node.h +0 -13
- data/ext/nokogiri/xml_node_set.h +0 -12
- 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 -49
- data/lib/nokogiri/html/element_description_defaults.rb +0 -671
- data/lib/nokogiri/html/sax/parser_context.rb +0 -16
- data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
- data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
- data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
- data/patches/sort-patches-by-date +0 -25
- data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
- data/suppressions/README.txt +0 -1
- data/suppressions/nokogiri_ruby-2.supp +0 -10
- data/tasks/test.rb +0 -100
- data/test/css/test_nthiness.rb +0 -226
- data/test/css/test_parser.rb +0 -386
- data/test/css/test_tokenizer.rb +0 -215
- data/test/css/test_xpath_visitor.rb +0 -96
- data/test/decorators/test_slop.rb +0 -23
- 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 -271
- data/test/html/sax/test_parser.rb +0 -168
- data/test/html/sax/test_parser_context.rb +0 -46
- data/test/html/sax/test_parser_text.rb +0 -163
- data/test/html/sax/test_push_parser.rb +0 -87
- data/test/html/test_attributes.rb +0 -85
- data/test/html/test_builder.rb +0 -164
- data/test/html/test_document.rb +0 -712
- data/test/html/test_document_encoding.rb +0 -143
- data/test/html/test_document_fragment.rb +0 -310
- 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 -91
- 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 -47
- 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 -402
- data/test/xml/sax/test_parser_context.rb +0 -115
- data/test/xml/sax/test_parser_text.rb +0 -202
- data/test/xml/sax/test_push_parser.rb +0 -265
- data/test/xml/test_attr.rb +0 -74
- 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 -54
- 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 -298
- 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 -262
- data/test/xml/test_namespace.rb +0 -96
- data/test/xml/test_node.rb +0 -1325
- data/test/xml/test_node_attributes.rb +0 -115
- data/test/xml/test_node_encoding.rb +0 -75
- data/test/xml/test_node_inheritance.rb +0 -32
- data/test/xml/test_node_reparenting.rb +0 -592
- data/test/xml/test_node_set.rb +0 -809
- 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 -620
- 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 -36
- data/test/xml/test_text.rb +0 -60
- data/test/xml/test_unparented_node.rb +0 -483
- data/test/xml/test_xinclude.rb +0 -83
- data/test/xml/test_xpath.rb +0 -470
- data/test/xslt/test_custom_functions.rb +0 -133
- data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,19 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "pathname"
|
5
|
+
|
1
6
|
module Nokogiri
|
2
7
|
module XML
|
3
|
-
|
4
|
-
# Nokogiri::XML::Document
|
5
|
-
#
|
6
|
-
# See Nokogiri::XML::Document.parse() for more information on parsing.
|
8
|
+
# Nokogiri::XML::Document is the main entry point for dealing with XML documents. The Document
|
9
|
+
# is created by parsing an XML document. See Nokogiri::XML::Document.parse for more information
|
10
|
+
# on parsing.
|
7
11
|
#
|
8
12
|
# For searching a Document, see Nokogiri::XML::Searchable#css and
|
9
13
|
# Nokogiri::XML::Searchable#xpath
|
10
|
-
#
|
11
14
|
class Document < Nokogiri::XML::Node
|
12
|
-
#
|
13
|
-
#
|
15
|
+
# See http://www.w3.org/TR/REC-xml-names/#ns-decl for more details. Note that we're not
|
16
|
+
# attempting to handle unicode characters partly because libxml2 doesn't handle unicode
|
17
|
+
# characters in NCNAMEs.
|
14
18
|
NCNAME_START_CHAR = "A-Za-z_"
|
15
|
-
NCNAME_CHAR = NCNAME_START_CHAR + "
|
16
|
-
NCNAME_RE = /^xmlns(
|
19
|
+
NCNAME_CHAR = NCNAME_START_CHAR + "\\-\\.0-9"
|
20
|
+
NCNAME_RE = /^xmlns(?::([#{NCNAME_START_CHAR}][#{NCNAME_CHAR}]*))?$/
|
17
21
|
|
18
22
|
##
|
19
23
|
# Parse an XML file.
|
@@ -41,21 +45,27 @@ module Nokogiri
|
|
41
45
|
#
|
42
46
|
# Nokogiri.XML() is a convenience method which will call this method.
|
43
47
|
#
|
44
|
-
def self.parse
|
48
|
+
def self.parse(string_or_io, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML)
|
45
49
|
options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
|
46
|
-
# Give the options to the user
|
47
50
|
yield options if block_given?
|
48
51
|
|
52
|
+
url ||= string_or_io.respond_to?(:path) ? string_or_io.path : nil
|
53
|
+
|
49
54
|
if empty_doc?(string_or_io)
|
50
55
|
if options.strict?
|
51
|
-
raise Nokogiri::XML::SyntaxError
|
56
|
+
raise Nokogiri::XML::SyntaxError, "Empty document"
|
52
57
|
else
|
53
58
|
return encoding ? new.tap { |i| i.encoding = encoding } : new
|
54
59
|
end
|
55
60
|
end
|
56
61
|
|
57
62
|
doc = if string_or_io.respond_to?(:read)
|
58
|
-
|
63
|
+
if string_or_io.is_a?(Pathname)
|
64
|
+
# resolve the Pathname to the file and open it as an IO object, see #2110
|
65
|
+
string_or_io = string_or_io.expand_path.open
|
66
|
+
url ||= string_or_io.path
|
67
|
+
end
|
68
|
+
|
59
69
|
read_io(string_or_io, url, encoding, options.to_i)
|
60
70
|
else
|
61
71
|
# read_memory pukes on empty docs
|
@@ -65,68 +75,192 @@ module Nokogiri
|
|
65
75
|
# do xinclude processing
|
66
76
|
doc.do_xinclude(options) if options.xinclude?
|
67
77
|
|
68
|
-
|
78
|
+
doc
|
69
79
|
end
|
70
80
|
|
71
|
-
|
81
|
+
##
|
82
|
+
# :singleton-method: wrap
|
83
|
+
# :call-seq: wrap(java_document) → Nokogiri::XML::Document
|
84
|
+
#
|
85
|
+
# ⚠ This method is only available when running JRuby.
|
86
|
+
#
|
87
|
+
# Create a Document using an existing Java DOM document object.
|
88
|
+
#
|
89
|
+
# The returned Document shares the same underlying data structure as the Java object, so
|
90
|
+
# changes in one are reflected in the other.
|
91
|
+
#
|
92
|
+
# [Parameters]
|
93
|
+
# - `java_document` (Java::OrgW3cDom::Document)
|
94
|
+
# (The class `Java::OrgW3cDom::Document` is also accessible as `org.w3c.dom.Document`.)
|
95
|
+
#
|
96
|
+
# [Returns] Nokogiri::XML::Document
|
97
|
+
#
|
98
|
+
# See also \#to_java
|
99
|
+
|
100
|
+
# :method: to_java
|
101
|
+
# :call-seq: to_java() → Java::OrgW3cDom::Document
|
102
|
+
#
|
103
|
+
# ⚠ This method is only available when running JRuby.
|
104
|
+
#
|
105
|
+
# Returns the underlying Java DOM document object for this document.
|
106
|
+
#
|
107
|
+
# The returned Java object shares the same underlying data structure as this document, so
|
108
|
+
# changes in one are reflected in the other.
|
109
|
+
#
|
110
|
+
# [Returns]
|
111
|
+
# Java::OrgW3cDom::Document
|
112
|
+
# (The class `Java::OrgW3cDom::Document` is also accessible as `org.w3c.dom.Document`.)
|
113
|
+
#
|
114
|
+
# See also Document.wrap
|
115
|
+
|
116
|
+
# The errors found while parsing a document.
|
117
|
+
#
|
118
|
+
# [Returns] Array<Nokogiri::XML::SyntaxError>
|
72
119
|
attr_accessor :errors
|
73
120
|
|
74
|
-
|
121
|
+
# When `true`, reparented elements without a namespace will inherit their new parent's
|
122
|
+
# namespace (if one exists). Defaults to `false`.
|
123
|
+
#
|
124
|
+
# [Returns] Boolean
|
125
|
+
#
|
126
|
+
# *Example:* Default behavior of namespace inheritance
|
127
|
+
#
|
128
|
+
# xml = <<~EOF
|
129
|
+
# <root xmlns:foo="http://nokogiri.org/default_ns/test/foo">
|
130
|
+
# <foo:parent>
|
131
|
+
# </foo:parent>
|
132
|
+
# </root>
|
133
|
+
# EOF
|
134
|
+
# doc = Nokogiri::XML(xml)
|
135
|
+
# parent = doc.at_xpath("//foo:parent", "foo" => "http://nokogiri.org/default_ns/test/foo")
|
136
|
+
# parent.add_child("<child></child>")
|
137
|
+
# doc.to_xml
|
138
|
+
# # => <?xml version="1.0"?>
|
139
|
+
# # <root xmlns:foo="http://nokogiri.org/default_ns/test/foo">
|
140
|
+
# # <foo:parent>
|
141
|
+
# # <child/>
|
142
|
+
# # </foo:parent>
|
143
|
+
# # </root>
|
144
|
+
#
|
145
|
+
# *Example:* Setting namespace inheritance to `true`
|
146
|
+
#
|
147
|
+
# xml = <<~EOF
|
148
|
+
# <root xmlns:foo="http://nokogiri.org/default_ns/test/foo">
|
149
|
+
# <foo:parent>
|
150
|
+
# </foo:parent>
|
151
|
+
# </root>
|
152
|
+
# EOF
|
153
|
+
# doc = Nokogiri::XML(xml)
|
154
|
+
# doc.namespace_inheritance = true
|
155
|
+
# parent = doc.at_xpath("//foo:parent", "foo" => "http://nokogiri.org/default_ns/test/foo")
|
156
|
+
# parent.add_child("<child></child>")
|
157
|
+
# doc.to_xml
|
158
|
+
# # => <?xml version="1.0"?>
|
159
|
+
# # <root xmlns:foo="http://nokogiri.org/default_ns/test/foo">
|
160
|
+
# # <foo:parent>
|
161
|
+
# # <foo:child/>
|
162
|
+
# # </foo:parent>
|
163
|
+
# # </root>
|
164
|
+
#
|
165
|
+
# Since v1.12.4
|
166
|
+
attr_accessor :namespace_inheritance
|
167
|
+
|
168
|
+
def initialize(*args) # :nodoc:
|
75
169
|
@errors = []
|
76
170
|
@decorators = nil
|
171
|
+
@namespace_inheritance = false
|
77
172
|
end
|
78
173
|
|
79
|
-
|
80
|
-
#
|
174
|
+
# :call-seq:
|
175
|
+
# create_element(name, *contents_or_attrs, &block) → Nokogiri::XML::Element
|
176
|
+
#
|
177
|
+
# Create a new Element with `name` belonging to this document, optionally setting contents or
|
178
|
+
# attributes.
|
179
|
+
#
|
180
|
+
# This method is _not_ the most user-friendly option if your intention is to add a node to the
|
181
|
+
# document tree. Prefer one of the Nokogiri::XML::Node methods like Node#add_child,
|
182
|
+
# Node#add_next_sibling, Node#replace, etc. which will both create an element (or subtree) and
|
183
|
+
# place it in the document tree.
|
184
|
+
#
|
185
|
+
# Arguments may be passed to initialize the element:
|
186
|
+
#
|
187
|
+
# - a Hash argument will be used to set attributes
|
188
|
+
# - a non-Hash object that responds to \#to_s will be used to set the new node's contents
|
81
189
|
#
|
82
|
-
#
|
83
|
-
# doc.create_element "div", :class => "container" # <div class='container'></div>
|
84
|
-
# doc.create_element "div", "contents" # <div>contents</div>
|
85
|
-
# doc.create_element "div", "contents", :class => "container" # <div class='container'>contents</div>
|
86
|
-
# doc.create_element "div" { |node| node['class'] = "container" } # <div class='container'></div>
|
190
|
+
# A block may be passed to mutate the node.
|
87
191
|
#
|
88
|
-
|
192
|
+
# [Parameters]
|
193
|
+
# - `name` (String)
|
194
|
+
# - `contents_or_attrs` (\#to_s, Hash)
|
195
|
+
# [Yields] `node` (Nokogiri::XML::Element)
|
196
|
+
# [Returns] Nokogiri::XML::Element
|
197
|
+
#
|
198
|
+
# *Example:* An empty element without attributes
|
199
|
+
#
|
200
|
+
# doc.create_element("div")
|
201
|
+
# # => <div></div>
|
202
|
+
#
|
203
|
+
# *Example:* An element with contents
|
204
|
+
#
|
205
|
+
# doc.create_element("div", "contents")
|
206
|
+
# # => <div>contents</div>
|
207
|
+
#
|
208
|
+
# *Example:* An element with attributes
|
209
|
+
#
|
210
|
+
# doc.create_element("div", {"class" => "container"})
|
211
|
+
# # => <div class='container'></div>
|
212
|
+
#
|
213
|
+
# *Example:* An element with contents and attributes
|
214
|
+
#
|
215
|
+
# doc.create_element("div", "contents", {"class" => "container"})
|
216
|
+
# # => <div class='container'>contents</div>
|
217
|
+
#
|
218
|
+
# *Example:* Passing a block to mutate the element
|
219
|
+
#
|
220
|
+
# doc.create_element("div") { |node| node["class"] = "blue" if before_noon? }
|
221
|
+
#
|
222
|
+
def create_element(name, *contents_or_attrs, &block)
|
89
223
|
elm = Nokogiri::XML::Element.new(name, self, &block)
|
90
|
-
|
224
|
+
contents_or_attrs.each do |arg|
|
91
225
|
case arg
|
92
226
|
when Hash
|
93
|
-
arg.each
|
227
|
+
arg.each do |k, v|
|
94
228
|
key = k.to_s
|
95
229
|
if key =~ NCNAME_RE
|
96
|
-
ns_name =
|
97
|
-
elm.add_namespace_definition
|
230
|
+
ns_name = Regexp.last_match(1)
|
231
|
+
elm.add_namespace_definition(ns_name, v)
|
98
232
|
else
|
99
233
|
elm[k.to_s] = v.to_s
|
100
234
|
end
|
101
|
-
|
235
|
+
end
|
102
236
|
else
|
103
237
|
elm.content = arg
|
104
238
|
end
|
105
239
|
end
|
106
|
-
if ns = elm.namespace_definitions.find { |n| n.prefix.nil?
|
240
|
+
if (ns = elm.namespace_definitions.find { |n| n.prefix.nil? || (n.prefix == "") })
|
107
241
|
elm.namespace = ns
|
108
242
|
end
|
109
243
|
elm
|
110
244
|
end
|
111
245
|
|
112
246
|
# Create a Text Node with +string+
|
113
|
-
def create_text_node
|
114
|
-
Nokogiri::XML::Text.new
|
247
|
+
def create_text_node(string, &block)
|
248
|
+
Nokogiri::XML::Text.new(string.to_s, self, &block)
|
115
249
|
end
|
116
250
|
|
117
251
|
# Create a CDATA Node containing +string+
|
118
|
-
def create_cdata
|
119
|
-
Nokogiri::XML::CDATA.new
|
252
|
+
def create_cdata(string, &block)
|
253
|
+
Nokogiri::XML::CDATA.new(self, string.to_s, &block)
|
120
254
|
end
|
121
255
|
|
122
256
|
# Create a Comment Node containing +string+
|
123
|
-
def create_comment
|
124
|
-
Nokogiri::XML::Comment.new
|
257
|
+
def create_comment(string, &block)
|
258
|
+
Nokogiri::XML::Comment.new(self, string.to_s, &block)
|
125
259
|
end
|
126
260
|
|
127
261
|
# The name of this document. Always returns "document"
|
128
262
|
def name
|
129
|
-
|
263
|
+
"document"
|
130
264
|
end
|
131
265
|
|
132
266
|
# A reference to +self+
|
@@ -134,46 +268,51 @@ module Nokogiri
|
|
134
268
|
self
|
135
269
|
end
|
136
270
|
|
137
|
-
|
138
|
-
#
|
139
|
-
# return them as a hash.
|
271
|
+
# :call-seq:
|
272
|
+
# collect_namespaces() → Hash<String(Namespace#prefix) ⇒ String(Namespace#href)>
|
140
273
|
#
|
141
|
-
#
|
274
|
+
# Recursively get all namespaces from this node and its subtree and return them as a
|
275
|
+
# hash.
|
142
276
|
#
|
143
|
-
#
|
277
|
+
# ⚠ This method will not handle duplicate namespace prefixes, since the return value is a hash.
|
278
|
+
#
|
279
|
+
# Note that this method does an xpath lookup for nodes with namespaces, and as a result the
|
280
|
+
# order (and which duplicate prefix "wins") may be dependent on the implementation of the
|
281
|
+
# underlying XML library.
|
282
|
+
#
|
283
|
+
# *Example:* Basic usage
|
284
|
+
#
|
285
|
+
# Given this document:
|
286
|
+
#
|
287
|
+
# <root xmlns="default" xmlns:foo="bar">
|
144
288
|
# <bar xmlns:hello="world" />
|
145
289
|
# </root>
|
146
290
|
#
|
147
291
|
# This method will return:
|
148
292
|
#
|
149
|
-
# {
|
293
|
+
# {"xmlns:foo"=>"bar", "xmlns"=>"default", "xmlns:hello"=>"world"}
|
294
|
+
#
|
295
|
+
# *Example:* Duplicate prefixes
|
150
296
|
#
|
151
|
-
#
|
152
|
-
# For example, given this document:
|
297
|
+
# Given this document:
|
153
298
|
#
|
154
299
|
# <root xmlns:foo="bar">
|
155
300
|
# <bar xmlns:foo="baz" />
|
156
301
|
# </root>
|
157
302
|
#
|
158
|
-
# The hash returned will
|
303
|
+
# The hash returned will be something like:
|
159
304
|
#
|
160
|
-
#
|
161
|
-
# in the hash.
|
162
|
-
#
|
163
|
-
# Note that this method does an xpath lookup for nodes with
|
164
|
-
# namespaces, and as a result the order may be dependent on the
|
165
|
-
# implementation of the underlying XML library.
|
305
|
+
# {"xmlns:foo" => "baz"}
|
166
306
|
#
|
167
307
|
def collect_namespaces
|
168
|
-
xpath("//namespace::*").
|
169
|
-
hash[["xmlns",ns.prefix].compact.join(":")] = ns.href if ns.prefix != "xml"
|
170
|
-
hash
|
308
|
+
xpath("//namespace::*").each_with_object({}) do |ns, hash|
|
309
|
+
hash[["xmlns", ns.prefix].compact.join(":")] = ns.href if ns.prefix != "xml"
|
171
310
|
end
|
172
311
|
end
|
173
312
|
|
174
313
|
# Get the list of decorators given +key+
|
175
|
-
def decorators
|
176
|
-
@decorators ||=
|
314
|
+
def decorators(key)
|
315
|
+
@decorators ||= {}
|
177
316
|
@decorators[key] ||= []
|
178
317
|
end
|
179
318
|
|
@@ -182,7 +321,8 @@ module Nokogiri
|
|
182
321
|
# the document or +nil+ when there is no DTD.
|
183
322
|
def validate
|
184
323
|
return nil unless internal_subset
|
185
|
-
|
324
|
+
|
325
|
+
internal_subset.validate(self)
|
186
326
|
end
|
187
327
|
|
188
328
|
##
|
@@ -202,7 +342,7 @@ module Nokogiri
|
|
202
342
|
# ... which does absolutely nothing.
|
203
343
|
#
|
204
344
|
def slop!
|
205
|
-
unless decorators(XML::Node).include?
|
345
|
+
unless decorators(XML::Node).include?(Nokogiri::Decorators::Slop)
|
206
346
|
decorators(XML::Node) << Nokogiri::Decorators::Slop
|
207
347
|
decorate!
|
208
348
|
end
|
@@ -212,16 +352,18 @@ module Nokogiri
|
|
212
352
|
|
213
353
|
##
|
214
354
|
# Apply any decorators to +node+
|
215
|
-
def decorate
|
355
|
+
def decorate(node)
|
216
356
|
return unless @decorators
|
217
|
-
|
357
|
+
|
358
|
+
@decorators.each do |klass, list|
|
218
359
|
next unless node.is_a?(klass)
|
360
|
+
|
219
361
|
list.each { |moodule| node.extend(moodule) }
|
220
|
-
|
362
|
+
end
|
221
363
|
end
|
222
364
|
|
223
|
-
|
224
|
-
|
365
|
+
alias_method :to_xml, :serialize
|
366
|
+
alias_method :clone, :dup
|
225
367
|
|
226
368
|
# Get the hash of namespaces on the root Nokogiri::XML::Node
|
227
369
|
def namespaces
|
@@ -231,51 +373,47 @@ module Nokogiri
|
|
231
373
|
##
|
232
374
|
# Create a Nokogiri::XML::DocumentFragment from +tags+
|
233
375
|
# Returns an empty fragment if +tags+ is nil.
|
234
|
-
def fragment
|
235
|
-
DocumentFragment.new(self, tags,
|
376
|
+
def fragment(tags = nil)
|
377
|
+
DocumentFragment.new(self, tags, root)
|
236
378
|
end
|
237
379
|
|
238
380
|
undef_method :swap, :parent, :namespace, :default_namespace=
|
239
381
|
undef_method :add_namespace_definition, :attributes
|
240
382
|
undef_method :namespace_definitions, :line, :add_namespace
|
241
383
|
|
242
|
-
def add_child
|
243
|
-
raise "A document may not have multiple root nodes." if (root && root.name !=
|
384
|
+
def add_child(node_or_tags)
|
385
|
+
raise "A document may not have multiple root nodes." if (root && root.name != "nokogiri_text_wrapper") && !(node_or_tags.comment? || node_or_tags.processing_instruction?)
|
386
|
+
|
244
387
|
node_or_tags = coerce(node_or_tags)
|
245
388
|
if node_or_tags.is_a?(XML::NodeSet)
|
246
389
|
raise "A document may not have multiple root nodes." if node_or_tags.size > 1
|
390
|
+
|
247
391
|
super(node_or_tags.first)
|
248
392
|
else
|
249
393
|
super
|
250
394
|
end
|
251
395
|
end
|
252
|
-
|
253
|
-
|
254
|
-
##
|
255
|
-
# +JRuby+
|
256
|
-
# Wraps Java's org.w3c.dom.document and returns Nokogiri::XML::Document
|
257
|
-
def self.wrap document
|
258
|
-
raise "JRuby only method" unless Nokogiri.jruby?
|
259
|
-
return wrapJavaDocument(document)
|
260
|
-
end
|
396
|
+
alias_method :<<, :add_child
|
261
397
|
|
262
|
-
|
263
|
-
#
|
264
|
-
#
|
265
|
-
|
266
|
-
|
267
|
-
|
398
|
+
# :call-seq:
|
399
|
+
# xpath_doctype() → Nokogiri::CSS::XPathVisitor::DoctypeConfig
|
400
|
+
#
|
401
|
+
# [Returns] The document type which determines CSS-to-XPath translation.
|
402
|
+
#
|
403
|
+
# See XPathVisitor for more information.
|
404
|
+
def xpath_doctype
|
405
|
+
Nokogiri::CSS::XPathVisitor::DoctypeConfig::XML
|
268
406
|
end
|
269
407
|
|
270
408
|
private
|
271
|
-
|
409
|
+
|
410
|
+
def self.empty_doc?(string_or_io)
|
272
411
|
string_or_io.nil? ||
|
273
412
|
(string_or_io.respond_to?(:empty?) && string_or_io.empty?) ||
|
274
413
|
(string_or_io.respond_to?(:eof?) && string_or_io.eof?)
|
275
414
|
end
|
276
415
|
|
277
|
-
#
|
278
|
-
IMPLIED_XPATH_CONTEXTS = [ '//'.freeze ].freeze # :nodoc:
|
416
|
+
IMPLIED_XPATH_CONTEXTS = ["//"].freeze # :nodoc:
|
279
417
|
|
280
418
|
def inspect_attributes
|
281
419
|
[:name, :children]
|
@@ -1,34 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
class DocumentFragment < Nokogiri::XML::Node
|
6
|
+
####
|
7
|
+
# Create a Nokogiri::XML::DocumentFragment from +tags+
|
8
|
+
def self.parse(tags, options = ParseOptions::DEFAULT_XML, &block)
|
9
|
+
new(XML::Document.new, tags, nil, options, &block)
|
10
|
+
end
|
11
|
+
|
4
12
|
##
|
5
13
|
# Create a new DocumentFragment from +tags+.
|
6
14
|
#
|
7
15
|
# If +ctx+ is present, it is used as a context node for the
|
8
16
|
# subtree created, e.g., namespaces will be resolved relative
|
9
17
|
# to +ctx+.
|
10
|
-
def initialize
|
18
|
+
def initialize(document, tags = nil, ctx = nil, options = ParseOptions::DEFAULT_XML)
|
11
19
|
return self unless tags
|
12
20
|
|
21
|
+
options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
|
22
|
+
yield options if block_given?
|
23
|
+
|
13
24
|
children = if ctx
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
+
# Fix for issue#490
|
26
|
+
if Nokogiri.jruby?
|
27
|
+
# fix for issue #770
|
28
|
+
ctx.parse("<root #{namespace_declarations(ctx)}>#{tags}</root>", options).children
|
29
|
+
else
|
30
|
+
ctx.parse(tags, options)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
wrapper_doc = XML::Document.parse("<root>#{tags}</root>", nil, nil, options)
|
34
|
+
self.errors = wrapper_doc.errors
|
35
|
+
wrapper_doc.xpath("/root/node()")
|
36
|
+
end
|
25
37
|
children.each { |child| child.parent = self }
|
26
38
|
end
|
27
39
|
|
40
|
+
if Nokogiri.uses_libxml?
|
41
|
+
def dup
|
42
|
+
new_document = document.dup
|
43
|
+
new_fragment = self.class.new(new_document)
|
44
|
+
children.each do |child|
|
45
|
+
child.dup(1, new_document).parent = new_fragment
|
46
|
+
end
|
47
|
+
new_fragment
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
28
51
|
###
|
29
52
|
# return the name for DocumentFragment
|
30
53
|
def name
|
31
|
-
|
54
|
+
"#document-fragment"
|
32
55
|
end
|
33
56
|
|
34
57
|
###
|
@@ -40,10 +63,10 @@ module Nokogiri
|
|
40
63
|
###
|
41
64
|
# Convert this DocumentFragment to html
|
42
65
|
# See Nokogiri::XML::NodeSet#to_html
|
43
|
-
def to_html
|
66
|
+
def to_html(*args)
|
44
67
|
if Nokogiri.jruby?
|
45
68
|
options = args.first.is_a?(Hash) ? args.shift : {}
|
46
|
-
|
69
|
+
unless options[:save_with]
|
47
70
|
options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
|
48
71
|
end
|
49
72
|
args.insert(0, options)
|
@@ -54,10 +77,10 @@ module Nokogiri
|
|
54
77
|
###
|
55
78
|
# Convert this DocumentFragment to xhtml
|
56
79
|
# See Nokogiri::XML::NodeSet#to_xhtml
|
57
|
-
def to_xhtml
|
80
|
+
def to_xhtml(*args)
|
58
81
|
if Nokogiri.jruby?
|
59
82
|
options = args.first.is_a?(Hash) ? args.shift : {}
|
60
|
-
|
83
|
+
unless options[:save_with]
|
61
84
|
options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_XHTML
|
62
85
|
end
|
63
86
|
args.insert(0, options)
|
@@ -68,7 +91,7 @@ module Nokogiri
|
|
68
91
|
###
|
69
92
|
# Convert this DocumentFragment to xml
|
70
93
|
# See Nokogiri::XML::NodeSet#to_xml
|
71
|
-
def to_xml
|
94
|
+
def to_xml(*args)
|
72
95
|
children.to_xml(*args)
|
73
96
|
end
|
74
97
|
|
@@ -79,7 +102,7 @@ module Nokogiri
|
|
79
102
|
# selectors. For example:
|
80
103
|
#
|
81
104
|
# For more information see Nokogiri::XML::Searchable#css
|
82
|
-
def css
|
105
|
+
def css(*args)
|
83
106
|
if children.any?
|
84
107
|
children.css(*args) # 'children' is a smell here
|
85
108
|
else
|
@@ -98,51 +121,41 @@ module Nokogiri
|
|
98
121
|
# Search this fragment for +paths+. +paths+ must be one or more XPath or CSS queries.
|
99
122
|
#
|
100
123
|
# For more information see Nokogiri::XML::Searchable#search
|
101
|
-
def search
|
124
|
+
def search(*rules)
|
102
125
|
rules, handler, ns, binds = extract_params(rules)
|
103
126
|
|
104
127
|
rules.inject(NodeSet.new(document)) do |set, rule|
|
105
|
-
set
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
128
|
+
set + if Searchable::LOOKS_LIKE_XPATH.match?(rule)
|
129
|
+
xpath(*[rule, ns, handler, binds].compact)
|
130
|
+
else
|
131
|
+
children.css(*[rule, ns, handler].compact) # 'children' is a smell here
|
132
|
+
end
|
110
133
|
end
|
111
134
|
end
|
112
135
|
|
113
|
-
|
114
|
-
|
115
|
-
class << self
|
116
|
-
####
|
117
|
-
# Create a Nokogiri::XML::DocumentFragment from +tags+
|
118
|
-
def parse tags
|
119
|
-
self.new(XML::Document.new, tags)
|
120
|
-
end
|
121
|
-
end
|
136
|
+
alias_method :serialize, :to_s
|
122
137
|
|
123
138
|
# A list of Nokogiri::XML::SyntaxError found when parsing a document
|
124
139
|
def errors
|
125
140
|
document.errors
|
126
141
|
end
|
127
142
|
|
128
|
-
def errors=
|
143
|
+
def errors=(things) # :nodoc:
|
129
144
|
document.errors = things
|
130
145
|
end
|
131
146
|
|
147
|
+
def fragment(data)
|
148
|
+
document.fragment(data)
|
149
|
+
end
|
150
|
+
|
132
151
|
private
|
133
152
|
|
134
153
|
# fix for issue 770
|
135
|
-
def namespace_declarations
|
154
|
+
def namespace_declarations(ctx)
|
136
155
|
ctx.namespace_scopes.map do |namespace|
|
137
156
|
prefix = namespace.prefix.nil? ? "" : ":#{namespace.prefix}"
|
138
|
-
%
|
139
|
-
end.join
|
140
|
-
end
|
141
|
-
|
142
|
-
def coerce data
|
143
|
-
return super unless String === data
|
144
|
-
|
145
|
-
document.fragment(data).children
|
157
|
+
%{xmlns#{prefix}="#{namespace.href}"}
|
158
|
+
end.join(" ")
|
146
159
|
end
|
147
160
|
end
|
148
161
|
end
|
data/lib/nokogiri/xml/dtd.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
class DTD < Nokogiri::XML::Node
|
@@ -19,13 +21,13 @@ module Nokogiri
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def html_dtd?
|
22
|
-
name.casecmp(
|
24
|
+
name.casecmp("html").zero?
|
23
25
|
end
|
24
26
|
|
25
27
|
def html5_dtd?
|
26
28
|
html_dtd? &&
|
27
29
|
external_id.nil? &&
|
28
|
-
(system_id.nil? || system_id ==
|
30
|
+
(system_id.nil? || system_id == "about:legacy-compat")
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|