nokogiri 1.15.7-java → 1.16.0-java
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 +11 -14
- data/README.md +4 -1
- data/dependencies.yml +6 -5
- data/ext/java/nokogiri/XmlCdata.java +1 -2
- data/ext/java/nokogiri/XmlNode.java +1 -2
- data/ext/java/nokogiri/XmlReader.java +0 -8
- data/ext/java/nokogiri/XmlSchema.java +1 -2
- data/ext/java/nokogiri/XmlText.java +1 -2
- data/ext/nokogiri/extconf.rb +3 -4
- data/ext/nokogiri/html4_sax_push_parser.c +1 -1
- data/ext/nokogiri/test_global_handlers.c +1 -1
- data/ext/nokogiri/xml_cdata.c +1 -2
- data/ext/nokogiri/xml_document.c +3 -3
- data/ext/nokogiri/xml_namespace.c +0 -4
- data/ext/nokogiri/xml_node.c +6 -15
- data/ext/nokogiri/xml_reader.c +1 -44
- data/ext/nokogiri/xml_relax_ng.c +1 -1
- data/ext/nokogiri/xml_sax_parser_context.c +4 -0
- data/ext/nokogiri/xml_sax_push_parser.c +1 -1
- data/ext/nokogiri/xml_schema.c +2 -3
- data/ext/nokogiri/xml_syntax_error.c +3 -3
- data/ext/nokogiri/xml_text.c +1 -2
- data/ext/nokogiri/xml_xpath_context.c +2 -5
- data/gumbo-parser/Makefile +15 -0
- data/lib/nokogiri/css/parser_extras.rb +1 -1
- data/lib/nokogiri/css/xpath_visitor.rb +1 -21
- data/lib/nokogiri/html4/document.rb +1 -1
- data/lib/nokogiri/html4/encoding_reader.rb +1 -1
- data/lib/nokogiri/html5.rb +0 -66
- data/lib/nokogiri/nokogiri.jar +0 -0
- data/lib/nokogiri/version/constant.rb +1 -1
- data/lib/nokogiri/version/info.rb +6 -5
- data/lib/nokogiri/xml/attr.rb +2 -2
- data/lib/nokogiri/xml/document.rb +3 -3
- data/lib/nokogiri/xml/document_fragment.rb +2 -2
- data/lib/nokogiri/xml/namespace.rb +1 -2
- data/lib/nokogiri/xml/node.rb +31 -24
- data/lib/nokogiri/xml/node_set.rb +3 -3
- data/lib/nokogiri/xml/searchable.rb +3 -3
- data/lib/nokogiri/xml/syntax_error.rb +1 -1
- data/lib/nokogiri/xml.rb +1 -1
- data/lib/nokogiri/xslt.rb +1 -1
- data/lib/nokogiri.rb +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 143fbb80846d635867bc5a1fe2a561ae9f86806c90e1e621f2a849846b7a9b39
|
4
|
+
data.tar.gz: 17c2f47f92d2588e16a3638a17fc4199816f141132e1afd9757af43c75a26288
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad769e6a57a7db341a89e361209b889d5ce94693ef129038bf2066e4fd943179cf49c59ebdca326a1e4cc58883280d755f6dd589e5600dbc0df60dd3c3609862
|
7
|
+
data.tar.gz: 8e45bb445abbb907edd74dd954192068e7a0e8a1cc3ff52693bca831fa9b13291bc0441f3ff26df2b7123636c5323cf2cb892a27ba6b10e86d4c9f97ad9403bd
|
data/Gemfile
CHANGED
@@ -7,33 +7,30 @@ gemspec
|
|
7
7
|
group :development do
|
8
8
|
# bootstrapping
|
9
9
|
gem "bundler", "~> 2.3"
|
10
|
-
gem "rake", "
|
10
|
+
gem "rake", "13.1.0"
|
11
11
|
|
12
12
|
# building extensions
|
13
|
-
gem "rake-compiler", "
|
14
|
-
gem "rake-compiler-dock", "
|
15
|
-
|
16
|
-
# documentation
|
17
|
-
gem "hoe-markdown", "= 1.4.0"
|
13
|
+
gem "rake-compiler", "1.2.5"
|
14
|
+
gem "rake-compiler-dock", "1.4.0"
|
18
15
|
|
19
16
|
# parser generator
|
20
17
|
gem "rexical", "= 1.0.7"
|
21
18
|
|
22
19
|
# tests
|
23
|
-
gem "minitest", "5.
|
24
|
-
gem "minitest-
|
25
|
-
gem "ruby_memcheck", "
|
20
|
+
gem "minitest", "5.20.0"
|
21
|
+
gem "minitest-parallel_fork", "2.0.0"
|
22
|
+
gem "ruby_memcheck", "2.3.0"
|
26
23
|
gem "rubyzip", "~> 2.3.2"
|
27
24
|
gem "simplecov", "= 0.21.2"
|
28
25
|
|
29
26
|
# rubocop
|
30
27
|
if Gem::Requirement.new("~> 3.0").satisfied_by?(Gem::Version.new(RUBY_VERSION))
|
31
|
-
gem "rubocop", "1.
|
32
|
-
gem "rubocop-minitest", "0.
|
28
|
+
gem "rubocop", "1.59.0"
|
29
|
+
gem "rubocop-minitest", "0.34.2"
|
33
30
|
gem "rubocop-packaging", "0.5.2"
|
34
|
-
gem "rubocop-performance", "1.
|
31
|
+
gem "rubocop-performance", "1.20.1"
|
35
32
|
gem "rubocop-rake", "= 0.6.0"
|
36
|
-
gem "rubocop-shopify", "2.
|
33
|
+
gem "rubocop-shopify", "2.14.0"
|
37
34
|
end
|
38
35
|
end
|
39
36
|
|
@@ -41,5 +38,5 @@ end
|
|
41
38
|
# `bundle config set --local without rdoc`
|
42
39
|
# Then re-run `bundle install`.
|
43
40
|
group :rdoc do
|
44
|
-
gem "rdoc", "6.
|
41
|
+
gem "rdoc", "6.6.2"
|
45
42
|
end
|
data/README.md
CHANGED
@@ -55,6 +55,7 @@ There are a few ways to ask exploratory questions:
|
|
55
55
|
|
56
56
|
- The Nokogiri mailing list is active at https://groups.google.com/group/nokogiri-talk
|
57
57
|
- Open an issue using the "Help Request" template at https://github.com/sparklemotion/nokogiri/issues
|
58
|
+
- Open a discussion at https://github.com/sparklemotion/nokogiri/discussions
|
58
59
|
|
59
60
|
Please do not mail the maintainers at their personal addresses.
|
60
61
|
|
@@ -90,6 +91,8 @@ We bump `Major.Minor.Patch` versions following this guidance:
|
|
90
91
|
- Updating packaged libraries for non-security-related reasons.
|
91
92
|
- Dropping support for EOLed Ruby versions. [Some folks find this objectionable](https://github.com/sparklemotion/nokogiri/issues/1568), but [SemVer says this is OK if the public API hasn't changed](https://semver.org/#what-should-i-do-if-i-update-my-own-dependencies-without-changing-the-public-api).
|
92
93
|
- Backwards-incompatible changes to internal or private methods and constants. These are detailed in the "Changes" section of each changelog entry.
|
94
|
+
- Removal of deprecated methods or parameters, after a generous transition period; usually when those methods or parameters are rarely-used or dangerous to the user. Essentially, removals that do not justify a major version bump.
|
95
|
+
|
93
96
|
|
94
97
|
`Patch`:
|
95
98
|
|
@@ -111,7 +114,7 @@ You can help sponsor the maintainers of this software through one of these organ
|
|
111
114
|
|
112
115
|
Requirements:
|
113
116
|
|
114
|
-
- Ruby >=
|
117
|
+
- Ruby >= 3.0
|
115
118
|
- JRuby >= 9.4.0.0
|
116
119
|
|
117
120
|
|
data/dependencies.yml
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
|
1
2
|
libxml2:
|
2
|
-
version: "2.
|
3
|
-
sha256: "
|
4
|
-
# sha-256 hash provided in https://download.gnome.org/sources/libxml2/2.
|
3
|
+
version: "2.12.3"
|
4
|
+
sha256: "8c8f1092340a89ff32bc44ad5c9693aff9bc8a7a3e161bb239666e5d15ac9aaa"
|
5
|
+
# sha-256 hash provided in https://download.gnome.org/sources/libxml2/2.12/libxml2-2.12.3.sha256sum
|
5
6
|
|
6
7
|
libxslt:
|
7
8
|
version: "1.1.39"
|
@@ -9,8 +10,8 @@ libxslt:
|
|
9
10
|
# sha-256 hash provided in https://download.gnome.org/sources/libxslt/1.1/libxslt-1.1.39.sha256sum
|
10
11
|
|
11
12
|
zlib:
|
12
|
-
version: "1.
|
13
|
-
sha256: "
|
13
|
+
version: "1.3"
|
14
|
+
sha256: "ff0ba4c292013dbc27530b3a81e1f9a813cd39de01ca5e0f8bf355702efa593e"
|
14
15
|
# SHA-256 hash provided on http://zlib.net/
|
15
16
|
|
16
17
|
libiconv:
|
@@ -51,8 +51,7 @@ public class XmlCdata extends XmlText
|
|
51
51
|
throw context.runtime.newTypeError(msg);
|
52
52
|
}
|
53
53
|
if (!(rbDocument instanceof XmlDocument)) {
|
54
|
-
// TODO:
|
55
|
-
context.runtime.getWarnings().warn("Passing a Node as the first parameter to CDATA.new is deprecated. Please pass a Document instead. This will become an error in a future release of Nokogiri.");
|
54
|
+
context.runtime.getWarnings().warn("Passing a Node as the first parameter to CDATA.new is deprecated. Please pass a Document instead. This will become an error in Nokogiri v1.17.0."); // TODO: deprecated in v1.15.3, remove in v1.17.0
|
56
55
|
}
|
57
56
|
|
58
57
|
Document document = ((XmlNode) rbDocument).getOwnerDocument();
|
@@ -311,8 +311,7 @@ public class XmlNode extends RubyObject
|
|
311
311
|
throw context.runtime.newArgumentError("document must be a Nokogiri::XML::Node");
|
312
312
|
}
|
313
313
|
if (!(doc instanceof XmlDocument)) {
|
314
|
-
// TODO:
|
315
|
-
context.runtime.getWarnings().warn("Passing a Node as the second parameter to Node.new is deprecated. Please pass a Document instead, or prefer an alternative constructor like Node#add_child. This will become an error in a future release of Nokogiri.");
|
314
|
+
context.runtime.getWarnings().warn("Passing a Node as the second parameter to Node.new is deprecated. Please pass a Document instead, or prefer an alternative constructor like Node#add_child. This will become an error in Nokogiri v1.17.0."); // TODO: deprecated in v1.13.0, remove in v1.17.0
|
316
315
|
}
|
317
316
|
|
318
317
|
Document document = asXmlNode(context, doc).getOwnerDocument();
|
@@ -138,14 +138,6 @@ public class XmlReader extends RubyObject
|
|
138
138
|
return currentNode().getAttributeCount();
|
139
139
|
}
|
140
140
|
|
141
|
-
@JRubyMethod
|
142
|
-
public IRubyObject
|
143
|
-
attribute_nodes(ThreadContext context)
|
144
|
-
{
|
145
|
-
context.runtime.getWarnings().warn("Reader#attribute_nodes is deprecated and will be removed in a future version of Nokogiri. Please use Reader#attribute_hash instead.");
|
146
|
-
return currentNode().getAttributesNodes();
|
147
|
-
}
|
148
|
-
|
149
141
|
@JRubyMethod
|
150
142
|
public IRubyObject
|
151
143
|
attribute_hash(ThreadContext context)
|
@@ -154,8 +154,7 @@ public class XmlSchema extends RubyObject
|
|
154
154
|
throw context.runtime.newTypeError(msg);
|
155
155
|
}
|
156
156
|
if (!(rbDocument instanceof XmlDocument)) {
|
157
|
-
// TODO:
|
158
|
-
context.runtime.getWarnings().warn("Passing a Node as the first parameter to Schema.from_document is deprecated. Please pass a Document instead. This will become an error in a future release of Nokogiri.");
|
157
|
+
context.runtime.getWarnings().warn("Passing a Node as the first parameter to Schema.from_document is deprecated. Please pass a Document instead. This will become an error in Nokogiri v1.17.0."); // TODO: deprecated in v1.15.3, remove in v1.17.0
|
159
158
|
}
|
160
159
|
|
161
160
|
XmlDocument doc = ((XmlDocument)((XmlNode) rbDocument).document(context));
|
@@ -58,8 +58,7 @@ public class XmlText extends XmlNode
|
|
58
58
|
throw context.runtime.newTypeError(msg);
|
59
59
|
}
|
60
60
|
if (!(rbDocument instanceof XmlDocument)) {
|
61
|
-
// TODO:
|
62
|
-
context.runtime.getWarnings().warn("Passing a Node as the second parameter to Text.new is deprecated. Please pass a Document instead. This will become an error in a future release of Nokogiri.");
|
61
|
+
context.runtime.getWarnings().warn("Passing a Node as the second parameter to Text.new is deprecated. Please pass a Document instead. This will become an error in Nokogiri v1.17.0."); // TODO: deprecated in v1.15.3, remove in v1.17.0
|
63
62
|
}
|
64
63
|
|
65
64
|
Document document = asXmlNode(context, rbDocument).getOwnerDocument();
|
data/ext/nokogiri/extconf.rb
CHANGED
@@ -443,7 +443,7 @@ def process_recipe(name, version, static_p, cross_p, cacheable_p = true)
|
|
443
443
|
# We use 'host' to set compiler prefix for cross-compiling. Prefer host_alias over host. And
|
444
444
|
# prefer i686 (what external dev tools use) to i386 (what ruby's configure.ac emits).
|
445
445
|
recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"]
|
446
|
-
recipe.host = recipe.host.gsub(
|
446
|
+
recipe.host = recipe.host.gsub("i386", "i686")
|
447
447
|
|
448
448
|
recipe.target = File.join(PACKAGE_ROOT_DIR, "ports") if cacheable_p
|
449
449
|
recipe.configure_options << "--libdir=#{File.join(recipe.path, "lib")}"
|
@@ -651,8 +651,7 @@ append_cppflags(ENV["CPPFLAGS"].split) unless ENV["CPPFLAGS"].nil?
|
|
651
651
|
append_ldflags(ENV["LDFLAGS"].split) unless ENV["LDFLAGS"].nil?
|
652
652
|
$LIBS = concat_flags($LIBS, ENV["LIBS"])
|
653
653
|
|
654
|
-
#
|
655
|
-
# errors/warnings. see #2302
|
654
|
+
# libgumbo uses C90/C99 features, see #2302
|
656
655
|
append_cflags(["-std=c99", "-Wno-declaration-after-statement"])
|
657
656
|
|
658
657
|
# gumbo html5 serialization is slower with O3, let's make sure we use O2
|
@@ -919,6 +918,7 @@ else
|
|
919
918
|
"--with-c14n",
|
920
919
|
"--with-debug",
|
921
920
|
"--with-threads",
|
921
|
+
"--without-tls", # see https://github.com/sparklemotion/nokogiri/issues/3031
|
922
922
|
"CPPFLAGS=#{cppflags}",
|
923
923
|
"CFLAGS=#{cflags}",
|
924
924
|
]
|
@@ -1087,7 +1087,6 @@ have_func("xmlRelaxNGSetParserStructuredErrors") # introduced in libxml 2.6.24
|
|
1087
1087
|
have_func("xmlRelaxNGSetValidStructuredErrors") # introduced in libxml 2.6.21
|
1088
1088
|
have_func("xmlSchemaSetValidStructuredErrors") # introduced in libxml 2.6.23
|
1089
1089
|
have_func("xmlSchemaSetParserStructuredErrors") # introduced in libxml 2.6.23
|
1090
|
-
have_func("rb_gc_location") # introduced in Ruby 2.7
|
1091
1090
|
have_func("rb_category_warning") # introduced in Ruby 3.0
|
1092
1091
|
|
1093
1092
|
other_library_versions_string = OTHER_LIBRARY_VERSIONS.map { |k, v| [k, v].join(":") }.join(",")
|
@@ -32,7 +32,7 @@ native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
|
|
32
32
|
|
33
33
|
if ((status != 0) && !(ctx->options & XML_PARSE_RECOVER)) {
|
34
34
|
// TODO: there appear to be no tests for this block
|
35
|
-
|
35
|
+
xmlErrorConstPtr e = xmlCtxtGetLastError(ctx);
|
36
36
|
Nokogiri_error_raise(NULL, e);
|
37
37
|
}
|
38
38
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
static VALUE foreign_error_handler_block = Qnil;
|
4
4
|
|
5
5
|
static void
|
6
|
-
foreign_error_handler(void *user_data,
|
6
|
+
foreign_error_handler(void *user_data, xmlErrorConstPtr c_error)
|
7
7
|
{
|
8
8
|
rb_funcall(foreign_error_handler_block, rb_intern("call"), 0);
|
9
9
|
}
|
data/ext/nokogiri/xml_cdata.c
CHANGED
@@ -33,8 +33,7 @@ rb_xml_cdata_s_new(int argc, VALUE *argv, VALUE klass)
|
|
33
33
|
|
34
34
|
if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlDocument)) {
|
35
35
|
xmlNodePtr deprecated_node_type_arg;
|
36
|
-
// TODO:
|
37
|
-
NOKO_WARN_DEPRECATION("Passing a Node as the first parameter to CDATA.new is deprecated. Please pass a Document instead. This will become an error in a future release of Nokogiri.");
|
36
|
+
NOKO_WARN_DEPRECATION("Passing a Node as the first parameter to CDATA.new is deprecated. Please pass a Document instead. This will become an error in Nokogiri v1.17.0."); // TODO: deprecated in v1.15.3, remove in v1.17.0
|
38
37
|
Noko_Node_Get_Struct(rb_document, xmlNode, deprecated_node_type_arg);
|
39
38
|
c_document = deprecated_node_type_arg->doc;
|
40
39
|
} else {
|
data/ext/nokogiri/xml_document.c
CHANGED
@@ -337,7 +337,7 @@ read_io(VALUE klass,
|
|
337
337
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
338
338
|
|
339
339
|
if (doc == NULL) {
|
340
|
-
|
340
|
+
xmlErrorConstPtr error;
|
341
341
|
|
342
342
|
xmlFreeDoc(doc);
|
343
343
|
|
@@ -383,7 +383,7 @@ read_memory(VALUE klass,
|
|
383
383
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
384
384
|
|
385
385
|
if (doc == NULL) {
|
386
|
-
|
386
|
+
xmlErrorConstPtr error;
|
387
387
|
|
388
388
|
xmlFreeDoc(doc);
|
389
389
|
|
@@ -537,7 +537,7 @@ create_entity(int argc, VALUE *argv, VALUE self)
|
|
537
537
|
);
|
538
538
|
|
539
539
|
if (NULL == ptr) {
|
540
|
-
|
540
|
+
xmlErrorConstPtr error = xmlGetLastError();
|
541
541
|
if (error) {
|
542
542
|
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
543
543
|
} else {
|
@@ -42,7 +42,6 @@ _xml_namespace_dealloc(void *ptr)
|
|
42
42
|
xmlFree(ns);
|
43
43
|
}
|
44
44
|
|
45
|
-
#ifdef HAVE_RB_GC_LOCATION
|
46
45
|
static void
|
47
46
|
_xml_namespace_update_references(void *ptr)
|
48
47
|
{
|
@@ -51,9 +50,6 @@ _xml_namespace_update_references(void *ptr)
|
|
51
50
|
ns->_private = (void *)rb_gc_location((VALUE)ns->_private);
|
52
51
|
}
|
53
52
|
}
|
54
|
-
#else
|
55
|
-
# define _xml_namespace_update_references 0
|
56
|
-
#endif
|
57
53
|
|
58
54
|
static const rb_data_type_t nokogiri_xml_namespace_type_with_dealloc = {
|
59
55
|
.wrap_struct_name = "Nokogiri::XML::Namespace#with_dealloc",
|
data/ext/nokogiri/xml_node.c
CHANGED
@@ -28,7 +28,6 @@ _xml_node_mark(void *ptr)
|
|
28
28
|
}
|
29
29
|
}
|
30
30
|
|
31
|
-
#ifdef HAVE_RB_GC_LOCATION
|
32
31
|
static void
|
33
32
|
_xml_node_update_references(void *ptr)
|
34
33
|
{
|
@@ -38,9 +37,6 @@ _xml_node_update_references(void *ptr)
|
|
38
37
|
node->_private = (void *)rb_gc_location((VALUE)node->_private);
|
39
38
|
}
|
40
39
|
}
|
41
|
-
#else
|
42
|
-
# define _xml_node_update_references 0
|
43
|
-
#endif
|
44
40
|
|
45
41
|
static const rb_data_type_t nokogiri_node_type = {
|
46
42
|
.wrap_struct_name = "Nokogiri::XML::Node",
|
@@ -961,7 +957,7 @@ internal_subset(VALUE self)
|
|
961
957
|
* - +new_parent_doc+
|
962
958
|
* The new node's parent Document. Defaults to the this node's document.
|
963
959
|
*
|
964
|
-
* [Returns] The new
|
960
|
+
* [Returns] The new Nokogiri::XML::Node
|
965
961
|
*/
|
966
962
|
static VALUE
|
967
963
|
duplicate_node(int argc, VALUE *argv, VALUE self)
|
@@ -1853,19 +1849,13 @@ is_one_of(xmlNodePtr node, char const *const *tagnames, size_t num_tagnames)
|
|
1853
1849
|
if (name == NULL) { // fragments don't have a name
|
1854
1850
|
return false;
|
1855
1851
|
}
|
1856
|
-
|
1857
|
-
if (node->ns != NULL) {
|
1858
|
-
// if the node has a namespace, it's in a foreign context and is not one of the HTML tags we're
|
1859
|
-
// matching against.
|
1860
|
-
return false;
|
1861
|
-
}
|
1862
|
-
|
1863
1852
|
for (size_t idx = 0; idx < num_tagnames; ++idx) {
|
1864
1853
|
if (!strcmp(name, tagnames[idx])) {
|
1865
1854
|
return true;
|
1866
1855
|
}
|
1867
1856
|
}
|
1868
1857
|
return false;
|
1858
|
+
|
1869
1859
|
}
|
1870
1860
|
|
1871
1861
|
static void
|
@@ -2064,8 +2054,7 @@ rb_xml_node_new(int argc, VALUE *argv, VALUE klass)
|
|
2064
2054
|
rb_raise(rb_eArgError, "document must be a Nokogiri::XML::Node");
|
2065
2055
|
}
|
2066
2056
|
if (!rb_obj_is_kind_of(rb_document_node, cNokogiriXmlDocument)) {
|
2067
|
-
// TODO:
|
2068
|
-
NOKO_WARN_DEPRECATION("Passing a Node as the second parameter to Node.new is deprecated. Please pass a Document instead, or prefer an alternative constructor like Node#add_child. This will become an error in a future release of Nokogiri.");
|
2057
|
+
NOKO_WARN_DEPRECATION("Passing a Node as the second parameter to Node.new is deprecated. Please pass a Document instead, or prefer an alternative constructor like Node#add_child. This will become an error in Nokogiri v1.17.0."); // TODO: deprecated in v1.13.0, remove in v1.17.0
|
2069
2058
|
}
|
2070
2059
|
Noko_Node_Get_Struct(rb_document_node, xmlNode, c_document_node);
|
2071
2060
|
|
@@ -2144,7 +2133,7 @@ process_xincludes(VALUE self, VALUE options)
|
|
2144
2133
|
xmlSetStructuredErrorFunc(NULL, NULL);
|
2145
2134
|
|
2146
2135
|
if (rcode < 0) {
|
2147
|
-
|
2136
|
+
xmlErrorConstPtr error;
|
2148
2137
|
|
2149
2138
|
error = xmlGetLastError();
|
2150
2139
|
if (error) {
|
@@ -2180,6 +2169,8 @@ in_context(VALUE self, VALUE _str, VALUE _options)
|
|
2180
2169
|
|
2181
2170
|
/* Twiddle global variable because of a bug in libxml2.
|
2182
2171
|
* http://git.gnome.org/browse/libxml2/commit/?id=e20fb5a72c83cbfc8e4a8aa3943c6be8febadab7
|
2172
|
+
*
|
2173
|
+
* TODO: this is fixed, and HTML_PARSE_NOIMPLIED is defined, in libxml2 2.7.7
|
2183
2174
|
*/
|
2184
2175
|
#ifndef HTML_PARSE_NOIMPLIED
|
2185
2176
|
htmlHandleOmittedElem(0);
|
data/ext/nokogiri/xml_reader.c
CHANGED
@@ -166,48 +166,6 @@ rb_xml_reader_namespaces(VALUE rb_reader)
|
|
166
166
|
return rb_namespaces ;
|
167
167
|
}
|
168
168
|
|
169
|
-
/*
|
170
|
-
:call-seq: attribute_nodes() → Array<Nokogiri::XML::Attr>
|
171
|
-
|
172
|
-
Get the attributes of the current node as an Array of XML:Attr
|
173
|
-
|
174
|
-
⚠ This method is deprecated and unsafe to use. It will be removed in a future version of Nokogiri.
|
175
|
-
|
176
|
-
See related: #attribute_hash, #attributes
|
177
|
-
*/
|
178
|
-
static VALUE
|
179
|
-
rb_xml_reader_attribute_nodes(VALUE rb_reader)
|
180
|
-
{
|
181
|
-
xmlTextReaderPtr c_reader;
|
182
|
-
xmlNodePtr c_node;
|
183
|
-
VALUE attr_nodes;
|
184
|
-
int j;
|
185
|
-
|
186
|
-
// TODO: deprecated, remove in Nokogiri v1.15, see https://github.com/sparklemotion/nokogiri/issues/2598
|
187
|
-
// After removal, we can also remove all the "node_has_a_document" special handling from xml_node.c
|
188
|
-
NOKO_WARN_DEPRECATION("Reader#attribute_nodes is deprecated and will be removed in a future version of Nokogiri. Please use Reader#attribute_hash instead.");
|
189
|
-
|
190
|
-
TypedData_Get_Struct(rb_reader, xmlTextReader, &xml_reader_type, c_reader);
|
191
|
-
|
192
|
-
if (! has_attributes(c_reader)) {
|
193
|
-
return rb_ary_new() ;
|
194
|
-
}
|
195
|
-
|
196
|
-
c_node = xmlTextReaderExpand(c_reader);
|
197
|
-
if (c_node == NULL) {
|
198
|
-
return Qnil;
|
199
|
-
}
|
200
|
-
|
201
|
-
attr_nodes = noko_xml_node_attrs(c_node);
|
202
|
-
|
203
|
-
/* ensure that the Reader won't be GCed as long as a node is referenced */
|
204
|
-
for (j = 0 ; j < RARRAY_LEN(attr_nodes) ; j++) {
|
205
|
-
rb_iv_set(rb_ary_entry(attr_nodes, j), "@reader", rb_reader);
|
206
|
-
}
|
207
|
-
|
208
|
-
return attr_nodes;
|
209
|
-
}
|
210
|
-
|
211
169
|
/*
|
212
170
|
:call-seq: attribute_hash() → Hash<String ⇒ String>
|
213
171
|
|
@@ -554,7 +512,7 @@ static VALUE
|
|
554
512
|
read_more(VALUE self)
|
555
513
|
{
|
556
514
|
xmlTextReaderPtr reader;
|
557
|
-
|
515
|
+
xmlErrorConstPtr error;
|
558
516
|
VALUE error_list;
|
559
517
|
int ret;
|
560
518
|
|
@@ -778,7 +736,6 @@ noko_init_xml_reader(void)
|
|
778
736
|
rb_define_method(cNokogiriXmlReader, "attribute", reader_attribute, 1);
|
779
737
|
rb_define_method(cNokogiriXmlReader, "attribute_at", attribute_at, 1);
|
780
738
|
rb_define_method(cNokogiriXmlReader, "attribute_count", attribute_count, 0);
|
781
|
-
rb_define_method(cNokogiriXmlReader, "attribute_nodes", rb_xml_reader_attribute_nodes, 0);
|
782
739
|
rb_define_method(cNokogiriXmlReader, "attribute_hash", rb_xml_reader_attribute_hash, 0);
|
783
740
|
rb_define_method(cNokogiriXmlReader, "attributes?", attributes_eh, 0);
|
784
741
|
rb_define_method(cNokogiriXmlReader, "base_uri", rb_xml_reader_base_uri, 0);
|
data/ext/nokogiri/xml_relax_ng.c
CHANGED
@@ -59,6 +59,10 @@ parse_io(VALUE klass, VALUE io, VALUE encoding)
|
|
59
59
|
(xmlInputReadCallback)noko_io_read,
|
60
60
|
(xmlInputCloseCallback)noko_io_close,
|
61
61
|
(void *)io, enc);
|
62
|
+
if (!ctxt) {
|
63
|
+
rb_raise(rb_eRuntimeError, "failed to create xml sax parser context");
|
64
|
+
}
|
65
|
+
|
62
66
|
if (ctxt->sax) {
|
63
67
|
xmlFree(ctxt->sax);
|
64
68
|
ctxt->sax = NULL;
|
@@ -59,7 +59,7 @@ native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
|
|
59
59
|
|
60
60
|
if (xmlParseChunk(ctx, chunk, size, Qtrue == _last_chunk ? 1 : 0)) {
|
61
61
|
if (!(ctx->options & XML_PARSE_RECOVER)) {
|
62
|
-
|
62
|
+
xmlErrorConstPtr e = xmlCtxtGetLastError(ctx);
|
63
63
|
Nokogiri_error_raise(NULL, e);
|
64
64
|
}
|
65
65
|
}
|
data/ext/nokogiri/xml_schema.c
CHANGED
@@ -146,7 +146,7 @@ xml_schema_parse_schema(
|
|
146
146
|
xmlSchemaFreeParserCtxt(c_parser_context);
|
147
147
|
|
148
148
|
if (NULL == c_schema) {
|
149
|
-
|
149
|
+
xmlErrorConstPtr error = xmlGetLastError();
|
150
150
|
if (error) {
|
151
151
|
Nokogiri_error_raise(NULL, error);
|
152
152
|
} else {
|
@@ -222,8 +222,7 @@ rb_xml_schema_s_from_document(int argc, VALUE *argv, VALUE klass)
|
|
222
222
|
|
223
223
|
if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlDocument)) {
|
224
224
|
xmlNodePtr deprecated_node_type_arg;
|
225
|
-
// TODO:
|
226
|
-
NOKO_WARN_DEPRECATION("Passing a Node as the first parameter to Schema.from_document is deprecated. Please pass a Document instead. This will become an error in a future release of Nokogiri.");
|
225
|
+
NOKO_WARN_DEPRECATION("Passing a Node as the first parameter to Schema.from_document is deprecated. Please pass a Document instead. This will become an error in Nokogiri v1.17.0."); // TODO: deprecated in v1.15.3, remove in v1.17.0
|
227
226
|
Noko_Node_Get_Struct(rb_document, xmlNode, deprecated_node_type_arg);
|
228
227
|
c_document = deprecated_node_type_arg->doc;
|
229
228
|
} else {
|
@@ -26,7 +26,7 @@ Nokogiri_structured_error_func_restore(libxmlStructuredErrorHandlerState *handle
|
|
26
26
|
}
|
27
27
|
|
28
28
|
void
|
29
|
-
Nokogiri_error_array_pusher(void *ctx,
|
29
|
+
Nokogiri_error_array_pusher(void *ctx, xmlErrorConstPtr error)
|
30
30
|
{
|
31
31
|
VALUE list = (VALUE)ctx;
|
32
32
|
Check_Type(list, T_ARRAY);
|
@@ -34,13 +34,13 @@ Nokogiri_error_array_pusher(void *ctx, xmlErrorPtr error)
|
|
34
34
|
}
|
35
35
|
|
36
36
|
void
|
37
|
-
Nokogiri_error_raise(void *ctx,
|
37
|
+
Nokogiri_error_raise(void *ctx, xmlErrorConstPtr error)
|
38
38
|
{
|
39
39
|
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
|
40
40
|
}
|
41
41
|
|
42
42
|
VALUE
|
43
|
-
Nokogiri_wrap_xml_syntax_error(
|
43
|
+
Nokogiri_wrap_xml_syntax_error(xmlErrorConstPtr error)
|
44
44
|
{
|
45
45
|
VALUE msg, e, klass;
|
46
46
|
|
data/ext/nokogiri/xml_text.c
CHANGED
@@ -28,8 +28,7 @@ rb_xml_text_s_new(int argc, VALUE *argv, VALUE klass)
|
|
28
28
|
|
29
29
|
if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlDocument)) {
|
30
30
|
xmlNodePtr deprecated_node_type_arg;
|
31
|
-
// TODO:
|
32
|
-
NOKO_WARN_DEPRECATION("Passing a Node as the second parameter to Text.new is deprecated. Please pass a Document instead. This will become an error in a future release of Nokogiri.");
|
31
|
+
NOKO_WARN_DEPRECATION("Passing a Node as the second parameter to Text.new is deprecated. Please pass a Document instead. This will become an error in Nokogiri v1.17.0."); // TODO: deprecated in v1.15.3, remove in v1.17.0
|
33
32
|
Noko_Node_Get_Struct(rb_document, xmlNode, deprecated_node_type_arg);
|
34
33
|
c_document = deprecated_node_type_arg->doc;
|
35
34
|
} else {
|
@@ -321,11 +321,8 @@ handler_lookup(void *data, const xmlChar *c_name, const xmlChar *c_ns_uri)
|
|
321
321
|
VALUE rb_handler = (VALUE)data;
|
322
322
|
if (rb_respond_to(rb_handler, rb_intern((const char *)c_name))) {
|
323
323
|
if (c_ns_uri == NULL) {
|
324
|
-
NOKO_WARN_DEPRECATION(
|
325
|
-
|
326
|
-
" Please update your query to reference this function as 'nokogiri:%s'."
|
327
|
-
" Invoking custom handler functions without a namespace is deprecated and support will be removed in a future release of Nokogiri.",
|
328
|
-
c_name, c_name);
|
324
|
+
NOKO_WARN_DEPRECATION("A custom XPath or CSS handler function named '%s' is being invoked without a namespace. Please update your query to reference this function as 'nokogiri:%s'. Invoking custom handler functions without a namespace is deprecated and will become an error in Nokogiri v1.17.0.",
|
325
|
+
c_name, c_name); // deprecated in v1.15.0, remove in v1.17.0
|
329
326
|
}
|
330
327
|
return method_caller;
|
331
328
|
}
|
data/gumbo-parser/Makefile
CHANGED
@@ -13,6 +13,20 @@ LDFLAGS := -pthread
|
|
13
13
|
|
14
14
|
all: check
|
15
15
|
|
16
|
+
fuzzers: fuzzer-normal fuzzer-asan fuzzer-ubsan fuzzer-msan
|
17
|
+
|
18
|
+
fuzzer-normal:
|
19
|
+
./fuzzer/build.sh
|
20
|
+
|
21
|
+
fuzzer-asan:
|
22
|
+
SANITIZER=asan ./fuzzer/build.sh
|
23
|
+
|
24
|
+
fuzzer-ubsan:
|
25
|
+
SANITIZER=ubsan ./fuzzer/build.sh
|
26
|
+
|
27
|
+
fuzzer-msan:
|
28
|
+
SANITIZER=msan ./fuzzer/build.sh
|
29
|
+
|
16
30
|
# don't try to regenerate ragel or gperf files in CI, that should be a development-only action and
|
17
31
|
# the generated files should be committed to SCM
|
18
32
|
ifneq ($(CI),true)
|
@@ -81,6 +95,7 @@ coverage:
|
|
81
95
|
|
82
96
|
clean:
|
83
97
|
$(RM) -r build
|
98
|
+
$(RM) -r fuzzer/build fuzzer/src-* fuzzer/gumbo_corpus
|
84
99
|
|
85
100
|
build/src/flags: | build/src
|
86
101
|
@echo 'old_CC := $(CC)' > $@
|
@@ -302,7 +302,7 @@ module Nokogiri
|
|
302
302
|
end
|
303
303
|
|
304
304
|
def read_a_and_positive_b(values)
|
305
|
-
op = values[2]
|
305
|
+
op = values[2].strip
|
306
306
|
if op == "+"
|
307
307
|
a = values[0].to_i
|
308
308
|
b = values[3].to_i
|
@@ -335,25 +335,5 @@ module Nokogiri
|
|
335
335
|
end
|
336
336
|
end
|
337
337
|
end
|
338
|
-
|
339
|
-
module XPathVisitorAlwaysUseBuiltins # :nodoc:
|
340
|
-
def self.new
|
341
|
-
warn(
|
342
|
-
"Nokogiri::CSS::XPathVisitorAlwaysUseBuiltins is deprecated and will be removed in a future version of Nokogiri",
|
343
|
-
{ uplevel: 1 },
|
344
|
-
)
|
345
|
-
XPathVisitor.new(builtins: :always)
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
module XPathVisitorOptimallyUseBuiltins # :nodoc:
|
350
|
-
def self.new
|
351
|
-
warn(
|
352
|
-
"Nokogiri::CSS::XPathVisitorOptimallyUseBuiltins is deprecated and will be removed in a future version of Nokogiri",
|
353
|
-
{ uplevel: 1 },
|
354
|
-
)
|
355
|
-
XPathVisitor.new(builtins: :optimal)
|
356
|
-
end
|
357
|
-
end
|
358
338
|
end
|
359
339
|
end
|
@@ -92,7 +92,7 @@ module Nokogiri
|
|
92
92
|
title = XML::Node.new("title", self) << tnode
|
93
93
|
if (head = at_xpath("//head"))
|
94
94
|
head << title
|
95
|
-
elsif (meta =
|
95
|
+
elsif (meta = at_xpath("//meta[@charset]") || meta_content_type)
|
96
96
|
# better put after charset declaration
|
97
97
|
meta.add_next_sibling(title)
|
98
98
|
else
|
@@ -94,7 +94,7 @@ module Nokogiri
|
|
94
94
|
# no support for a call without len
|
95
95
|
|
96
96
|
unless @firstchunk
|
97
|
-
(@firstchunk = @io.read(len)) ||
|
97
|
+
(@firstchunk = @io.read(len)) || return
|
98
98
|
|
99
99
|
# This implementation expects that the first call from
|
100
100
|
# htmlReadIO() is made with a length long enough (~1KB) to
|
data/lib/nokogiri/html5.rb
CHANGED
@@ -239,23 +239,6 @@ module Nokogiri
|
|
239
239
|
DocumentFragment.parse(string, encoding, options)
|
240
240
|
end
|
241
241
|
|
242
|
-
# Fetch and parse a HTML document from the web, following redirects,
|
243
|
-
# handling https, and determining the character encoding using HTML5
|
244
|
-
# rules. +uri+ may be a +String+ or a +URI+. +options+ contains
|
245
|
-
# http headers and special options. Everything which is not a
|
246
|
-
# special option is considered a header. Special options include:
|
247
|
-
# * :follow_limit => number of redirects which are followed
|
248
|
-
# * :basic_auth => [username, password]
|
249
|
-
def get(uri, options = {})
|
250
|
-
# TODO: deprecate
|
251
|
-
warn(
|
252
|
-
"Nokogiri::HTML5.get is deprecated and will be removed in a future version of Nokogiri.",
|
253
|
-
uplevel: 1,
|
254
|
-
category: :deprecated,
|
255
|
-
)
|
256
|
-
get_impl(uri, options)
|
257
|
-
end
|
258
|
-
|
259
242
|
# :nodoc:
|
260
243
|
def read_and_encode(string, encoding)
|
261
244
|
# Read the string with the given encoding.
|
@@ -283,55 +266,6 @@ module Nokogiri
|
|
283
266
|
|
284
267
|
private
|
285
268
|
|
286
|
-
def get_impl(uri, options = {})
|
287
|
-
headers = options.clone
|
288
|
-
headers = { follow_limit: headers } if Numeric === headers # deprecated
|
289
|
-
limit = headers[:follow_limit] ? headers.delete(:follow_limit).to_i : 10
|
290
|
-
|
291
|
-
require "net/http"
|
292
|
-
uri = URI(uri) unless URI === uri
|
293
|
-
|
294
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
295
|
-
|
296
|
-
# TLS / SSL support
|
297
|
-
http.use_ssl = true if uri.scheme == "https"
|
298
|
-
|
299
|
-
# Pass through Net::HTTP override values, which currently include:
|
300
|
-
# :ca_file, :ca_path, :cert, :cert_store, :ciphers,
|
301
|
-
# :close_on_empty_response, :continue_timeout, :key, :open_timeout,
|
302
|
-
# :read_timeout, :ssl_timeout, :ssl_version, :use_ssl,
|
303
|
-
# :verify_callback, :verify_depth, :verify_mode
|
304
|
-
options.each do |key, _value|
|
305
|
-
http.send("#{key}=", headers.delete(key)) if http.respond_to?("#{key}=")
|
306
|
-
end
|
307
|
-
|
308
|
-
request = Net::HTTP::Get.new(uri.request_uri)
|
309
|
-
|
310
|
-
# basic authentication
|
311
|
-
auth = headers.delete(:basic_auth)
|
312
|
-
auth ||= [uri.user, uri.password] if uri.user && uri.password
|
313
|
-
request.basic_auth(auth.first, auth.last) if auth
|
314
|
-
|
315
|
-
# remaining options are treated as headers
|
316
|
-
headers.each { |key, value| request[key.to_s] = value.to_s }
|
317
|
-
|
318
|
-
response = http.request(request)
|
319
|
-
|
320
|
-
case response
|
321
|
-
when Net::HTTPSuccess
|
322
|
-
doc = parse(reencode(response.body, response["content-type"]), options)
|
323
|
-
doc.instance_variable_set(:@response, response)
|
324
|
-
doc.class.send(:attr_reader, :response)
|
325
|
-
doc
|
326
|
-
when Net::HTTPRedirection
|
327
|
-
response.value if limit <= 1
|
328
|
-
location = URI.join(uri, response["location"])
|
329
|
-
get_impl(location, options.merge(follow_limit: limit - 1))
|
330
|
-
else
|
331
|
-
response.value
|
332
|
-
end
|
333
|
-
end
|
334
|
-
|
335
269
|
# Charset sniffing is a complex and controversial topic that understandably isn't done _by
|
336
270
|
# default_ by the Ruby Net::HTTP library. This being said, it is a very real problem for
|
337
271
|
# consumers of HTML as the default for HTML is iso-8859-1, most "good" producers use utf-8, and
|
data/lib/nokogiri/nokogiri.jar
CHANGED
Binary file
|
@@ -94,11 +94,14 @@ module Nokogiri
|
|
94
94
|
nokogiri["version"] = Nokogiri::VERSION
|
95
95
|
|
96
96
|
unless jruby?
|
97
|
-
# enable gems
|
97
|
+
# enable gems to build against Nokogiri with the following in their extconf.rb:
|
98
98
|
#
|
99
99
|
# append_cflags(Nokogiri::VERSION_INFO["nokogiri"]["cppflags"])
|
100
100
|
# append_ldflags(Nokogiri::VERSION_INFO["nokogiri"]["ldflags"])
|
101
101
|
#
|
102
|
+
# though, this won't work on all platform and versions of Ruby, and won't be supported
|
103
|
+
# forever, see https://github.com/sparklemotion/nokogiri/discussions/2746 for context.
|
104
|
+
#
|
102
105
|
cppflags = ["-I#{header_directory.shellescape}"]
|
103
106
|
ldflags = []
|
104
107
|
|
@@ -108,7 +111,8 @@ module Nokogiri
|
|
108
111
|
end
|
109
112
|
|
110
113
|
if windows?
|
111
|
-
# on windows,
|
114
|
+
# on windows, third party libraries that wish to link against nokogiri
|
115
|
+
# should link against nokogiri.so to resolve symbols. see #2167
|
112
116
|
lib_directory = File.expand_path(File.join(File.dirname(__FILE__), "../#{ruby_minor}"))
|
113
117
|
unless File.exist?(lib_directory)
|
114
118
|
lib_directory = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
@@ -136,9 +140,6 @@ module Nokogiri
|
|
136
140
|
libxml["source"] = "packaged"
|
137
141
|
libxml["precompiled"] = libxml2_precompiled?
|
138
142
|
libxml["patches"] = Nokogiri::LIBXML2_PATCHES
|
139
|
-
|
140
|
-
# this is for nokogumbo and shouldn't be forever
|
141
|
-
libxml["libxml2_path"] = header_directory
|
142
143
|
else
|
143
144
|
libxml["source"] = "system"
|
144
145
|
end
|
data/lib/nokogiri/xml/attr.rb
CHANGED
@@ -18,8 +18,6 @@ module Nokogiri
|
|
18
18
|
# - +value+ → (String) The value of the attribute.
|
19
19
|
# - +namespace+ → (Namespace, nil) The Namespace of the attribute, or +nil+ if there is no namespace.
|
20
20
|
#
|
21
|
-
# ⚡ This is an experimental feature, available since v1.14.0
|
22
|
-
#
|
23
21
|
# *Example*
|
24
22
|
#
|
25
23
|
# doc = Nokogiri::XML.parse(<<~XML)
|
@@ -52,6 +50,8 @@ module Nokogiri
|
|
52
50
|
# # href = "http://nokogiri.org/ns/noko"
|
53
51
|
# # })}
|
54
52
|
#
|
53
|
+
# Since v1.14.0
|
54
|
+
#
|
55
55
|
def deconstruct_keys(keys)
|
56
56
|
{ name: name, value: value, namespace: namespace }
|
57
57
|
end
|
@@ -329,7 +329,7 @@ module Nokogiri
|
|
329
329
|
# Validate this Document against it's DTD. Returns a list of errors on
|
330
330
|
# the document or +nil+ when there is no DTD.
|
331
331
|
def validate
|
332
|
-
return
|
332
|
+
return unless internal_subset
|
333
333
|
|
334
334
|
internal_subset.validate(self)
|
335
335
|
end
|
@@ -426,8 +426,6 @@ module Nokogiri
|
|
426
426
|
# instructions. If you have a use case and would like this functionality, please let us know
|
427
427
|
# by opening an issue or a discussion on the github project.
|
428
428
|
#
|
429
|
-
# ⚡ This is an experimental feature, available since v1.14.0
|
430
|
-
#
|
431
429
|
# *Example*
|
432
430
|
#
|
433
431
|
# doc = Nokogiri::XML.parse(<<~XML)
|
@@ -454,6 +452,8 @@ module Nokogiri
|
|
454
452
|
# doc.deconstruct_keys([:root])
|
455
453
|
# # => {:root=>nil}
|
456
454
|
#
|
455
|
+
# Since v1.14.0
|
456
|
+
#
|
457
457
|
def deconstruct_keys(keys)
|
458
458
|
{ root: root }
|
459
459
|
end
|
@@ -154,8 +154,6 @@ module Nokogiri
|
|
154
154
|
# root elements, you should deconstruct the array returned by
|
155
155
|
# <tt>DocumentFragment#elements</tt>.
|
156
156
|
#
|
157
|
-
# ⚡ This is an experimental feature, available since v1.14.0
|
158
|
-
#
|
159
157
|
# *Example*
|
160
158
|
#
|
161
159
|
# frag = Nokogiri::HTML5.fragment(<<~HTML)
|
@@ -187,6 +185,8 @@ module Nokogiri
|
|
187
185
|
# # }),
|
188
186
|
# # #(Element:0x398 { name = "div", children = [ #(Text "End")] })]
|
189
187
|
#
|
188
|
+
# Since v1.14.0
|
189
|
+
#
|
190
190
|
def deconstruct
|
191
191
|
children.to_a
|
192
192
|
end
|
@@ -16,8 +16,6 @@ module Nokogiri
|
|
16
16
|
# - +prefix+ → (String, nil) The namespace's prefix, or +nil+ if there is no prefix (e.g., default namespace).
|
17
17
|
# - +href+ → (String) The namespace's URI
|
18
18
|
#
|
19
|
-
# ⚡ This is an experimental feature, available since v1.14.0
|
20
|
-
#
|
21
19
|
# *Example*
|
22
20
|
#
|
23
21
|
# doc = Nokogiri::XML.parse(<<~XML)
|
@@ -43,6 +41,7 @@ module Nokogiri
|
|
43
41
|
# doc.root.elements.last.namespace.deconstruct_keys([:prefix, :href])
|
44
42
|
# # => {:prefix=>"noko", :href=>"http://nokogiri.org/ns/noko"}
|
45
43
|
#
|
44
|
+
# Since v1.14.0
|
46
45
|
#
|
47
46
|
def deconstruct_keys(keys)
|
48
47
|
{ prefix: prefix, href: href }
|
data/lib/nokogiri/xml/node.rb
CHANGED
@@ -1049,29 +1049,35 @@ module Nokogiri
|
|
1049
1049
|
|
1050
1050
|
return Nokogiri::XML::NodeSet.new(document) if contents.empty?
|
1051
1051
|
|
1052
|
-
# libxml2 does not obey the +recover+ option after encountering errors during +in_context+
|
1053
|
-
# parsing, and so this horrible hack is here to try to emulate recovery behavior.
|
1054
|
-
#
|
1055
|
-
# Unfortunately, this means we're no longer parsing "in context" and so namespaces that
|
1056
|
-
# would have been inherited from the context node won't be handled correctly. This hack was
|
1057
|
-
# written in 2010, and I regret it, because it's silently degrading functionality in a way
|
1058
|
-
# that's not easily prevented (or even detected).
|
1059
|
-
#
|
1060
|
-
# I think preferable behavior would be to either:
|
1061
|
-
#
|
1062
|
-
# a. add an error noting that we "fell back" and pointing the user to turning off the +recover+ option
|
1063
|
-
# b. don't recover, but raise a sensible exception
|
1064
|
-
#
|
1065
|
-
# For context and background: https://github.com/sparklemotion/nokogiri/issues/313
|
1066
|
-
# FIXME bug report: https://github.com/sparklemotion/nokogiri/issues/2092
|
1067
1052
|
error_count = document.errors.length
|
1068
1053
|
node_set = in_context(contents, options.to_i)
|
1069
|
-
if
|
1070
|
-
|
1054
|
+
if document.errors.length > error_count
|
1055
|
+
raise document.errors[error_count] unless options.recover?
|
1056
|
+
|
1057
|
+
if node_set.empty?
|
1058
|
+
# libxml2 < 2.13 does not obey the +recover+ option after encountering errors during
|
1059
|
+
# +in_context+ parsing, and so this horrible hack is here to try to emulate recovery
|
1060
|
+
# behavior.
|
1061
|
+
#
|
1062
|
+
# (Note that HTML4 fragment parsing seems to have been fixed in abd74186, and XML
|
1063
|
+
# fragment parsing is fixed in 1c106edf. Both are in 2.13.)
|
1064
|
+
#
|
1065
|
+
# Unfortunately, this means we're no longer parsing "in context" and so namespaces that
|
1066
|
+
# would have been inherited from the context node won't be handled correctly. This hack
|
1067
|
+
# was written in 2010, and I regret it, because it's silently degrading functionality in
|
1068
|
+
# a way that's not easily prevented (or even detected).
|
1069
|
+
#
|
1070
|
+
# I think preferable behavior would be to either:
|
1071
|
+
#
|
1072
|
+
# a. add an error noting that we "fell back" and pointing the user to turning off the
|
1073
|
+
# +recover+ option
|
1074
|
+
# b. don't recover, but raise a sensible exception
|
1075
|
+
#
|
1076
|
+
# For context and background:
|
1077
|
+
# - https://github.com/sparklemotion/nokogiri/issues/313
|
1078
|
+
# - https://github.com/sparklemotion/nokogiri/issues/2092
|
1071
1079
|
fragment = document.related_class("DocumentFragment").parse(contents)
|
1072
1080
|
node_set = fragment.children
|
1073
|
-
else
|
1074
|
-
raise document.errors[error_count]
|
1075
1081
|
end
|
1076
1082
|
end
|
1077
1083
|
node_set
|
@@ -1165,7 +1171,7 @@ module Nokogiri
|
|
1165
1171
|
# Fetch the Nokogiri::HTML4::ElementDescription for this node. Returns
|
1166
1172
|
# nil on XML documents and on unknown tags.
|
1167
1173
|
def description
|
1168
|
-
return
|
1174
|
+
return if document.xml?
|
1169
1175
|
|
1170
1176
|
Nokogiri::HTML4::ElementDescription[name]
|
1171
1177
|
end
|
@@ -1254,8 +1260,8 @@ module Nokogiri
|
|
1254
1260
|
# Compare two Node objects with respect to their Document. Nodes from
|
1255
1261
|
# different documents cannot be compared.
|
1256
1262
|
def <=>(other)
|
1257
|
-
return
|
1258
|
-
return
|
1263
|
+
return unless other.is_a?(Nokogiri::XML::Node)
|
1264
|
+
return unless document == other.document
|
1259
1265
|
|
1260
1266
|
compare(other)
|
1261
1267
|
end
|
@@ -1278,6 +1284,7 @@ module Nokogiri
|
|
1278
1284
|
# end
|
1279
1285
|
#
|
1280
1286
|
def serialize(*args, &block)
|
1287
|
+
# TODO: deprecate non-hash options, see 46c68ed 2009-06-20 for context
|
1281
1288
|
options = if args.first.is_a?(Hash)
|
1282
1289
|
args.shift
|
1283
1290
|
else
|
@@ -1429,8 +1436,6 @@ module Nokogiri
|
|
1429
1436
|
# - +content+ → (String) The contents of all the text nodes in this node's subtree. See #content.
|
1430
1437
|
# - +inner_html+ → (String) The inner markup for the children of this node. See #inner_html.
|
1431
1438
|
#
|
1432
|
-
# ⚡ This is an experimental feature, available since v1.14.0
|
1433
|
-
#
|
1434
1439
|
# *Example*
|
1435
1440
|
#
|
1436
1441
|
# doc = Nokogiri::XML.parse(<<~XML)
|
@@ -1465,6 +1470,8 @@ module Nokogiri
|
|
1465
1470
|
# # value = "def"
|
1466
1471
|
# # })]}
|
1467
1472
|
#
|
1473
|
+
# Since v1.14.0
|
1474
|
+
#
|
1468
1475
|
def deconstruct_keys(keys)
|
1469
1476
|
requested_keys = DECONSTRUCT_KEYS & keys
|
1470
1477
|
{}.tap do |values|
|
@@ -372,7 +372,7 @@ module Nokogiri
|
|
372
372
|
# Removes the last element from set and returns it, or +nil+ if
|
373
373
|
# the set is empty
|
374
374
|
def pop
|
375
|
-
return
|
375
|
+
return if length == 0
|
376
376
|
|
377
377
|
delete(last)
|
378
378
|
end
|
@@ -381,7 +381,7 @@ module Nokogiri
|
|
381
381
|
# Returns the first element of the NodeSet and removes it. Returns
|
382
382
|
# +nil+ if the set is empty.
|
383
383
|
def shift
|
384
|
-
return
|
384
|
+
return if length == 0
|
385
385
|
|
386
386
|
delete(first)
|
387
387
|
end
|
@@ -435,7 +435,7 @@ module Nokogiri
|
|
435
435
|
#
|
436
436
|
# Returns the members of this NodeSet as an array, to use in pattern matching.
|
437
437
|
#
|
438
|
-
#
|
438
|
+
# Since v1.14.0
|
439
439
|
#
|
440
440
|
def deconstruct
|
441
441
|
to_a
|
@@ -199,7 +199,7 @@ module Nokogiri
|
|
199
199
|
#
|
200
200
|
# Search this node's immediate children using CSS selector +selector+
|
201
201
|
def >(selector) # rubocop:disable Naming/BinaryOperatorParameterName
|
202
|
-
ns =
|
202
|
+
ns = document.root&.namespaces || {}
|
203
203
|
xpath(CSS.xpath_for(selector, prefix: "./", ns: ns).first)
|
204
204
|
end
|
205
205
|
|
@@ -229,7 +229,7 @@ module Nokogiri
|
|
229
229
|
def xpath_impl(node, path, handler, ns, binds)
|
230
230
|
ctx = XPathContext.new(node)
|
231
231
|
ctx.register_namespaces(ns)
|
232
|
-
path = path.gsub(
|
232
|
+
path = path.gsub("xmlns:", " :") unless Nokogiri.uses_libxml?
|
233
233
|
|
234
234
|
binds&.each do |key, value|
|
235
235
|
ctx.register_variable(key.to_s, value)
|
@@ -269,7 +269,7 @@ module Nokogiri
|
|
269
269
|
end
|
270
270
|
ns, binds = hashes.reverse
|
271
271
|
|
272
|
-
ns ||=
|
272
|
+
ns ||= document.root&.namespaces || {}
|
273
273
|
|
274
274
|
[params, handler, ns, binds]
|
275
275
|
end
|
data/lib/nokogiri/xml.rb
CHANGED
data/lib/nokogiri/xslt.rb
CHANGED
@@ -101,7 +101,7 @@ module Nokogiri
|
|
101
101
|
params.flatten.each_slice(2).with_object([]) do |kv, quoted_params|
|
102
102
|
key, value = kv.map(&:to_s)
|
103
103
|
value = if value.include?("'")
|
104
|
-
"concat('#{value.gsub(
|
104
|
+
"concat('#{value.gsub("'", %q{', "'", '})}')"
|
105
105
|
else
|
106
106
|
"'#{value}'"
|
107
107
|
end
|
data/lib/nokogiri.rb
CHANGED
@@ -94,7 +94,7 @@ module Nokogiri
|
|
94
94
|
|
95
95
|
# :nodoc:
|
96
96
|
def install_default_aliases
|
97
|
-
warn("Nokogiri.install_default_aliases is deprecated
|
97
|
+
warn("Nokogiri.install_default_aliases is deprecated. Please call Nokogiri::EncodingHandler.install_default_aliases instead. This will become an error in Nokogiri v1.17.0.", uplevel: 1, category: :deprecated) # deprecated in v1.14.0, remove in v1.17.0
|
98
98
|
Nokogiri::EncodingHandler.install_default_aliases
|
99
99
|
end
|
100
100
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nokogiri
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.16.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Mike Dalessio
|
@@ -20,15 +20,15 @@ authors:
|
|
20
20
|
autorequire:
|
21
21
|
bindir: bin
|
22
22
|
cert_chain: []
|
23
|
-
date:
|
23
|
+
date: 2023-12-27 00:00:00.000000000 Z
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name: jar-dependencies
|
27
26
|
requirement: !ruby/object:Gem::Requirement
|
28
27
|
requirements:
|
29
28
|
- - '='
|
30
29
|
- !ruby/object:Gem::Version
|
31
30
|
version: 0.4.1
|
31
|
+
name: jar-dependencies
|
32
32
|
type: :development
|
33
33
|
prerelease: false
|
34
34
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -37,12 +37,13 @@ dependencies:
|
|
37
37
|
- !ruby/object:Gem::Version
|
38
38
|
version: 0.4.1
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
|
-
|
40
|
+
force_ruby_platform: false
|
41
41
|
requirement: !ruby/object:Gem::Requirement
|
42
42
|
requirements:
|
43
43
|
- - "~>"
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '1.4'
|
46
|
+
name: racc
|
46
47
|
type: :runtime
|
47
48
|
prerelease: false
|
48
49
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -336,7 +337,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
336
337
|
requirements:
|
337
338
|
- - ">="
|
338
339
|
- !ruby/object:Gem::Version
|
339
|
-
version:
|
340
|
+
version: 3.0.0
|
340
341
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
341
342
|
requirements:
|
342
343
|
- - ">="
|