nokogiri 1.12.5-x64-mingw32 → 1.13.0-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/README.md +9 -7
  4. data/bin/nokogiri +63 -50
  5. data/dependencies.yml +5 -6
  6. data/ext/nokogiri/extconf.rb +47 -35
  7. data/ext/nokogiri/include/libxml2/libxml/xmlerror.h +1 -0
  8. data/ext/nokogiri/include/libxslt/xsltconfig.h +1 -1
  9. data/ext/nokogiri/xml_document.c +35 -35
  10. data/ext/nokogiri/xml_document_fragment.c +0 -2
  11. data/ext/nokogiri/xml_dtd.c +2 -2
  12. data/ext/nokogiri/xml_encoding_handler.c +25 -11
  13. data/ext/nokogiri/xml_node.c +638 -333
  14. data/ext/nokogiri/xml_reader.c +37 -11
  15. data/ext/nokogiri/xml_xpath_context.c +72 -49
  16. data/lib/nokogiri/2.6/nokogiri.so +0 -0
  17. data/lib/nokogiri/2.7/nokogiri.so +0 -0
  18. data/lib/nokogiri/3.0/nokogiri.so +0 -0
  19. data/lib/nokogiri/class_resolver.rb +67 -0
  20. data/lib/nokogiri/css/node.rb +9 -8
  21. data/lib/nokogiri/css/parser.rb +11 -3
  22. data/lib/nokogiri/css/parser.y +10 -2
  23. data/lib/nokogiri/css/parser_extras.rb +20 -20
  24. data/lib/nokogiri/css/syntax_error.rb +1 -0
  25. data/lib/nokogiri/css/tokenizer.rb +2 -1
  26. data/lib/nokogiri/css/tokenizer.rex +2 -1
  27. data/lib/nokogiri/css/xpath_visitor.rb +174 -75
  28. data/lib/nokogiri/css.rb +38 -6
  29. data/lib/nokogiri/decorators/slop.rb +8 -7
  30. data/lib/nokogiri/extension.rb +1 -1
  31. data/lib/nokogiri/gumbo.rb +1 -0
  32. data/lib/nokogiri/html.rb +16 -10
  33. data/lib/nokogiri/html4/builder.rb +1 -0
  34. data/lib/nokogiri/html4/document.rb +84 -75
  35. data/lib/nokogiri/html4/document_fragment.rb +11 -7
  36. data/lib/nokogiri/html4/element_description.rb +1 -0
  37. data/lib/nokogiri/html4/element_description_defaults.rb +426 -520
  38. data/lib/nokogiri/html4/entity_lookup.rb +2 -1
  39. data/lib/nokogiri/html4/sax/parser.rb +2 -1
  40. data/lib/nokogiri/html4/sax/parser_context.rb +1 -0
  41. data/lib/nokogiri/html4/sax/push_parser.rb +7 -7
  42. data/lib/nokogiri/html4.rb +11 -5
  43. data/lib/nokogiri/html5/document.rb +24 -10
  44. data/lib/nokogiri/html5/document_fragment.rb +5 -2
  45. data/lib/nokogiri/html5/node.rb +6 -3
  46. data/lib/nokogiri/html5.rb +68 -64
  47. data/lib/nokogiri/jruby/dependencies.rb +10 -9
  48. data/lib/nokogiri/syntax_error.rb +1 -0
  49. data/lib/nokogiri/version/constant.rb +2 -1
  50. data/lib/nokogiri/version/info.rb +19 -13
  51. data/lib/nokogiri/version.rb +1 -0
  52. data/lib/nokogiri/xml/attr.rb +5 -3
  53. data/lib/nokogiri/xml/attribute_decl.rb +2 -1
  54. data/lib/nokogiri/xml/builder.rb +32 -32
  55. data/lib/nokogiri/xml/cdata.rb +2 -1
  56. data/lib/nokogiri/xml/character_data.rb +1 -0
  57. data/lib/nokogiri/xml/document.rb +139 -103
  58. data/lib/nokogiri/xml/document_fragment.rb +41 -38
  59. data/lib/nokogiri/xml/dtd.rb +3 -2
  60. data/lib/nokogiri/xml/element_content.rb +1 -0
  61. data/lib/nokogiri/xml/element_decl.rb +2 -1
  62. data/lib/nokogiri/xml/entity_decl.rb +3 -2
  63. data/lib/nokogiri/xml/entity_reference.rb +1 -0
  64. data/lib/nokogiri/xml/namespace.rb +2 -0
  65. data/lib/nokogiri/xml/node/save_options.rb +6 -3
  66. data/lib/nokogiri/xml/node.rb +512 -348
  67. data/lib/nokogiri/xml/node_set.rb +46 -54
  68. data/lib/nokogiri/xml/notation.rb +12 -0
  69. data/lib/nokogiri/xml/parse_options.rb +11 -7
  70. data/lib/nokogiri/xml/pp/character_data.rb +8 -6
  71. data/lib/nokogiri/xml/pp/node.rb +24 -26
  72. data/lib/nokogiri/xml/pp.rb +1 -0
  73. data/lib/nokogiri/xml/processing_instruction.rb +2 -1
  74. data/lib/nokogiri/xml/reader.rb +17 -19
  75. data/lib/nokogiri/xml/relax_ng.rb +1 -0
  76. data/lib/nokogiri/xml/sax/document.rb +20 -19
  77. data/lib/nokogiri/xml/sax/parser.rb +36 -34
  78. data/lib/nokogiri/xml/sax/parser_context.rb +7 -3
  79. data/lib/nokogiri/xml/sax/push_parser.rb +5 -5
  80. data/lib/nokogiri/xml/sax.rb +1 -0
  81. data/lib/nokogiri/xml/schema.rb +7 -6
  82. data/lib/nokogiri/xml/searchable.rb +42 -22
  83. data/lib/nokogiri/xml/syntax_error.rb +4 -4
  84. data/lib/nokogiri/xml/text.rb +1 -0
  85. data/lib/nokogiri/xml/xpath/syntax_error.rb +2 -1
  86. data/lib/nokogiri/xml/xpath.rb +12 -0
  87. data/lib/nokogiri/xml/xpath_context.rb +2 -3
  88. data/lib/nokogiri/xml.rb +3 -3
  89. data/lib/nokogiri/xslt/stylesheet.rb +1 -0
  90. data/lib/nokogiri/xslt.rb +3 -2
  91. data/lib/nokogiri.rb +19 -16
  92. data/lib/xsd/xmlparser/nokogiri.rb +25 -24
  93. metadata +122 -51
  94. data/lib/nokogiri/2.5/nokogiri.so +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f13f4a2ac4b7b3bfac80539622651cab4ad6e945eba99624f021962bde039289
4
- data.tar.gz: 0bde4d13bff32fdd411862207b0d0f1864ef10a600a839e8ecb5d51201a0e621
3
+ metadata.gz: e4c65220b62e72d6f6a047d0102a0d8adc6a9b7accfb0927ee710359d7731036
4
+ data.tar.gz: a74bac75a48ca772282cabda8d9a3783fb49e8d601b241d7d1abd33c140026f2
5
5
  SHA512:
6
- metadata.gz: cefdd5f1fffcef398cd7b56c5491fdda7f6cbb947ea098ed5d0f4d24a9d0549c921bcef6aa9a3803bdfe21c15c796a074e8e940e350f7ffdf53a22a31c8081ec
7
- data.tar.gz: cb1d6692529a25ed019ebf139f45fb60045c18183c6a88e91cc284f2d410c8d82d6e4a96de20fb892f55fa7e7c193ac5e3cf90895a319a6cf845ac335ebaf40c
6
+ metadata.gz: 8ad88fd00a58888a793ba8698353d217a32d4d26bef3b1673c0b3aea17c62ede7c98a2ab074a68ffee2dc14f882b8d7bf4b6bdd7c4269347266f444981b15abc
7
+ data.tar.gz: 19345b5258a472713f41e4d169008e7309eba0f01d01539667910e4c76458fe3c6fbf5ad3f7f70c9d0800ebacb18434aa5ce098680fa6f3f2dccdbc936ddd8eb
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  gemspec
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Nokogiri
4
4
 
5
- Nokogiri (鋸) makes it easy and painless to work with XML and HTML from Ruby. It provides a sensible, easy-to-understand API for [reading](https://nokogiri.org/tutorials/parsing_an_html_xml_document.html), writing, [modifying](https://nokogiri.org/tutorials/modifying_an_html_xml_document.html), and [querying](https://nokogiri.org/tutorials/searching_a_xml_html_document.html) documents. It is fast and standards-compliant by relying on native parsers like libxml2 (C) and xerces (Java).
5
+ Nokogiri (鋸) makes it easy and painless to work with XML and HTML from Ruby. It provides a sensible, easy-to-understand API for [reading](https://nokogiri.org/tutorials/parsing_an_html_xml_document.html), writing, [modifying](https://nokogiri.org/tutorials/modifying_an_html_xml_document.html), and [querying](https://nokogiri.org/tutorials/searching_a_xml_html_document.html) documents. It is fast and standards-compliant by relying on native parsers like libxml2 (CRuby) and xerces (JRuby).
6
6
 
7
7
  ## Guiding Principles
8
8
 
@@ -30,7 +30,9 @@ Some guiding principles Nokogiri tries to follow:
30
30
  [![Appveyor CI](https://ci.appveyor.com/api/projects/status/xj2pqwvlxwuwgr06/branch/main?svg=true)](https://ci.appveyor.com/project/flavorjones/nokogiri/branch/main)
31
31
 
32
32
  [![Gem Version](https://badge.fury.io/rb/nokogiri.svg)](https://rubygems.org/gems/nokogiri)
33
- [![SemVer compatibility](https://api.dependabot.com/badges/compatibility_score?dependency-name=nokogiri&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score/?dependency-name=nokogiri&package-manager=bundler)
33
+ [![SemVer compatibility](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=nokogiri&package-manager=bundler&previous-version=1.11.7&new-version=1.12.5)](https://docs.github.com/en/code-security/supply-chain-security/managing-vulnerabilities-in-your-projects-dependencies/about-dependabot-security-updates#about-compatibility-scores)
34
+
35
+ [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5344/badge)](https://bestpractices.coreinfrastructure.org/projects/5344)
34
36
  [![Tidelift dependencies](https://tidelift.com/badges/package/rubygems/nokogiri)](https://tidelift.com/subscription/pkg/rubygems-nokogiri?utm_source=rubygems-nokogiri&utm_medium=referral&utm_campaign=readme)
35
37
 
36
38
 
@@ -78,7 +80,7 @@ Full information and description of our security policy is in [`SECURITY.md`](SE
78
80
 
79
81
  ### Semantic Versioning Policy
80
82
 
81
- Nokogiri follows [Semantic Versioning](https://semver.org/) (since 2017 or so). [![Dependabot's SemVer compatibility score for Nokogiri](https://api.dependabot.com/badges/compatibility_score?dependency-name=nokogiri&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score/?dependency-name=nokogiri&package-manager=bundler)
83
+ Nokogiri follows [Semantic Versioning](https://semver.org/) (since 2017 or so). [![Dependabot's SemVer compatibility score for Nokogiri](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=nokogiri&package-manager=bundler&previous-version=1.11.7&new-version=1.12.5)](https://docs.github.com/en/code-security/supply-chain-security/managing-vulnerabilities-in-your-projects-dependencies/about-dependabot-security-updates#about-compatibility-scores)
82
84
 
83
85
  We bump `Major.Minor.Patch` versions following this guidance:
84
86
 
@@ -105,8 +107,8 @@ We bump `Major.Minor.Patch` versions following this guidance:
105
107
 
106
108
  Requirements:
107
109
 
108
- - Ruby >= 2.5
109
- - JRuby >= 9.2.0.0
110
+ - Ruby >= 2.6
111
+ - JRuby >= 9.3.0.0
110
112
 
111
113
 
112
114
  ### Native Gems: Faster, more reliable installation
@@ -115,12 +117,12 @@ Requirements:
115
117
 
116
118
  ### Supported Platforms
117
119
 
118
- As of v1.11.0, Nokogiri ships pre-compiled, "native" gems for the following platforms:
120
+ Nokogiri ships pre-compiled, "native" gems for the following platforms:
119
121
 
120
122
  - Linux: `x86-linux` and `x86_64-linux` (req: `glibc >= 2.17`), including musl platforms like Alpine
121
123
  - Darwin/MacOS: `x86_64-darwin` and `arm64-darwin`
122
124
  - Windows: `x86-mingw32` and `x64-mingw32`
123
- - Java: any platform running JRuby 9.2 or higher
125
+ - Java: any platform running JRuby 9.3 or higher
124
126
 
125
127
  To determine whether your system supports one of these gems, look at the output of `bundle platform` or `ruby -e 'puts Gem::Platform.local.to_s'`.
126
128
 
data/bin/nokogiri CHANGED
@@ -1,61 +1,77 @@
1
1
  #!/usr/bin/env ruby
2
- require 'optparse'
3
- require 'open-uri'
4
- require 'uri'
5
- require 'rubygems'
6
- require 'nokogiri'
7
- autoload :IRB, 'irb'
2
+ # frozen_string_literal: true
3
+
4
+ require "optparse"
5
+ require "open-uri"
6
+ require "uri"
7
+ require "rubygems"
8
+ require "nokogiri"
9
+ autoload :IRB, "irb"
8
10
 
9
11
  parse_class = Nokogiri
10
12
  encoding = nil
11
13
 
12
14
  # This module provides some tunables with the nokogiri CLI for use in
13
15
  # your ~/.nokogirirc.
14
- module Nokogiri::CLI
15
- class << self
16
- # Specify the console engine, defaulted to IRB.
17
- #
18
- # call-seq:
19
- # require 'pry'
20
- # Nokogiri::CLI.console = Pry
21
- attr_writer :console
22
-
23
- def console
24
- case @console
25
- when Symbol
26
- Kernel.const_get(@console)
27
- else
28
- @console
16
+ module Nokogiri
17
+ module CLI
18
+ class << self
19
+ # Specify the console engine, defaulted to IRB.
20
+ #
21
+ # call-seq:
22
+ # require 'pry'
23
+ # Nokogiri::CLI.console = Pry
24
+ attr_writer :console
25
+
26
+ def console
27
+ case @console
28
+ when Symbol
29
+ Kernel.const_get(@console)
30
+ else
31
+ @console
32
+ end
29
33
  end
34
+
35
+ attr_accessor :rcfile
30
36
  end
31
37
 
32
- attr_accessor :rcfile
38
+ self.rcfile = File.expand_path("~/.nokogirirc")
39
+ self.console = :IRB
33
40
  end
41
+ end
34
42
 
35
- self.rcfile = File.expand_path('~/.nokogirirc')
36
- self.console = :IRB
43
+ def safe_read(uri_or_path)
44
+ uri = URI.parse(uri_or_path)
45
+ case uri
46
+ when URI::HTTP
47
+ uri.read
48
+ when URI::File
49
+ File.read(uri.path)
50
+ else
51
+ File.read(uri_or_path)
52
+ end
37
53
  end
38
54
 
39
55
  opts = OptionParser.new do |opts|
40
56
  opts.banner = "Nokogiri: an HTML, XML, SAX, and Reader parser"
41
- opts.define_head "Usage: nokogiri <uri|path> [options]"
42
- opts.separator ""
43
- opts.separator "Examples:"
44
- opts.separator " nokogiri https://www.ruby-lang.org/"
45
- opts.separator " nokogiri ./public/index.html"
46
- opts.separator " curl -s http://www.nokogiri.org | nokogiri -e'p $_.css(\"h1\").length'"
47
- opts.separator ""
48
- opts.separator "Options:"
57
+ opts.define_head("Usage: nokogiri <uri|path> [options]")
58
+ opts.separator("")
59
+ opts.separator("Examples:")
60
+ opts.separator(" nokogiri https://www.ruby-lang.org/")
61
+ opts.separator(" nokogiri ./public/index.html")
62
+ opts.separator(" curl -s http://www.nokogiri.org | nokogiri -e'p $_.css(\"h1\").length'")
63
+ opts.separator("")
64
+ opts.separator("Options:")
49
65
 
50
66
  opts.on("--type type", "Parse as type: xml or html (default: auto)", [:xml, :html]) do |v|
51
- parse_class = {:xml => Nokogiri::XML, :html => Nokogiri::HTML}[v]
67
+ parse_class = { xml: Nokogiri::XML, html: Nokogiri::HTML }[v]
52
68
  end
53
69
 
54
70
  opts.on("-C file", "Specifies initialization file to load (default #{Nokogiri::CLI.rcfile})") do |v|
55
71
  Nokogiri::CLI.rcfile = v
56
72
  end
57
73
 
58
- opts.on("-E", "--encoding encoding", "Read as encoding (default: #{encoding || 'none'})") do |v|
74
+ opts.on("-E", "--encoding encoding", "Read as encoding (default: #{encoding || "none"})") do |v|
59
75
  encoding = v
60
76
  end
61
77
 
@@ -64,7 +80,7 @@ opts = OptionParser.new do |opts|
64
80
  end
65
81
 
66
82
  opts.on("--rng <uri|path>", "Validate using this rng file.") do |v|
67
- @rng = open(v) {|f| Nokogiri::XML::RelaxNG(f)}
83
+ @rng = Nokogiri::XML::RelaxNG(safe_read(v))
68
84
  end
69
85
 
70
86
  opts.on_tail("-?", "--help", "Show this message") do
@@ -90,15 +106,10 @@ if File.file?(Nokogiri::CLI.rcfile)
90
106
  load Nokogiri::CLI.rcfile
91
107
  end
92
108
 
93
- if url || $stdin.tty?
94
- case uri = (URI(url) rescue url)
95
- when URI::HTTP
96
- @doc = parse_class.parse(uri.read, url, encoding)
97
- else
98
- @doc = parse_class.parse(open(url).read, nil, encoding)
99
- end
109
+ @doc = if url || $stdin.tty?
110
+ parse_class.parse(safe_read(url), url, encoding)
100
111
  else
101
- @doc = parse_class.parse($stdin, nil, encoding)
112
+ parse_class.parse($stdin, nil, encoding)
102
113
  end
103
114
 
104
115
  $_ = @doc
@@ -107,12 +118,14 @@ if @rng
107
118
  @rng.validate(@doc).each do |error|
108
119
  puts error.message
109
120
  end
110
- else
111
- if @script
112
- eval @script, binding, '<main>'
113
- else
114
- puts "Your document is stored in @doc..."
115
- Nokogiri::CLI.console.start
121
+ elsif @script
122
+ begin
123
+ eval(@script, binding, "<main>") # rubocop:disable Security/Eval
124
+ rescue Exception => e # rubocop:disable Lint/RescueException
125
+ warn("ERROR: Exception raised while evaluating '#{@script}'")
126
+ raise e
116
127
  end
128
+ else
129
+ puts "Your document is stored in @doc..."
130
+ Nokogiri::CLI.console.start
117
131
  end
118
-
data/dependencies.yml CHANGED
@@ -64,11 +64,10 @@ zlib:
64
64
  # SHA-256 hash provided on http://zlib.net/
65
65
 
66
66
  libiconv:
67
- version: "1.15"
68
- sha256: "ccf536620a45458d26ba83887a983b96827001e92a13847b45e4925cc8913178"
69
- # gpg: Signature made Fri Feb 3 00:38:12 2017 CET
67
+ version: "1.16"
68
+ sha256: "e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04"
69
+ # gpg: Signature made Fri 26 Apr 2019 03:36:38 PM EDT
70
70
  # gpg: using RSA key 4F494A942E4616C2
71
- # gpg: Good signature from "Bruno Haible (Open Source Development) <bruno@clisp.org>" [unknown]
72
- # gpg: WARNING: This key is not certified with a trusted signature!
73
- # gpg: There is no indication that the signature belongs to the owner.
71
+ # gpg: Good signature from "Bruno Haible (Open Source Development) <bruno@clisp.org>" [expired]
72
+ # gpg: Note: This key has expired!
74
73
  # Primary key fingerprint: 68D9 4D8A AEEA D48A E7DC 5B90 4F49 4A94 2E46 16C2
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
- ENV["RC_ARCHS"] = "" if RUBY_PLATFORM =~ /darwin/
2
+
3
+ # rubocop:disable Style/GlobalVars
4
+
5
+ ENV["RC_ARCHS"] = "" if RUBY_PLATFORM.include?("darwin")
3
6
 
4
7
  require "mkmf"
5
8
  require "rbconfig"
@@ -12,16 +15,14 @@ PACKAGE_ROOT_DIR = File.expand_path(File.join(File.dirname(__FILE__), "..", ".."
12
15
  REQUIRED_LIBXML_VERSION = "2.6.21"
13
16
  RECOMMENDED_LIBXML_VERSION = "2.9.3"
14
17
 
15
- # The gem version constraint in the Rakefile is not respected at install time.
16
- # Keep this version in sync with the one in the Rakefile !
17
- REQUIRED_MINI_PORTILE_VERSION = "~> 2.6.1"
18
+ REQUIRED_MINI_PORTILE_VERSION = "~> 2.7.0" # keep this version in sync with the one in the gemspec
18
19
  REQUIRED_PKG_CONFIG_VERSION = "~> 1.1"
19
20
 
20
21
  # Keep track of what versions of what libraries we build against
21
22
  OTHER_LIBRARY_VERSIONS = {}
22
23
 
23
24
  NOKOGIRI_HELP_MESSAGE = <<~HELP
24
- USAGE: ruby #{$0} [options]
25
+ USAGE: ruby #{$PROGRAM_NAME} [options]
25
26
 
26
27
  Flags that are always valid:
27
28
 
@@ -175,23 +176,23 @@ def config_system_libraries?
175
176
  end
176
177
 
177
178
  def windows?
178
- RbConfig::CONFIG["target_os"] =~ /mingw32|mswin/
179
+ RbConfig::CONFIG["target_os"].match?(/mingw|mswin/)
179
180
  end
180
181
 
181
182
  def solaris?
182
- RbConfig::CONFIG["target_os"] =~ /solaris/
183
+ RbConfig::CONFIG["target_os"].include?("solaris")
183
184
  end
184
185
 
185
186
  def darwin?
186
- RbConfig::CONFIG["target_os"] =~ /darwin/
187
+ RbConfig::CONFIG["target_os"].include?("darwin")
187
188
  end
188
189
 
189
190
  def openbsd?
190
- RbConfig::CONFIG["target_os"] =~ /openbsd/
191
+ RbConfig::CONFIG["target_os"].include?("openbsd")
191
192
  end
192
193
 
193
194
  def aix?
194
- RbConfig::CONFIG["target_os"] =~ /aix/
195
+ RbConfig::CONFIG["target_os"].include?("aix")
195
196
  end
196
197
 
197
198
  def nix?
@@ -284,17 +285,16 @@ ensure
284
285
  end
285
286
 
286
287
  def abort_could_not_find_library(lib)
287
- abort("-----\n#{caller[0]}\n#{lib} is missing. Please locate mkmf.log to investigate how it is failing.\n-----")
288
+ callers = caller(1..2).join("\n")
289
+ abort("-----\n#{callers}\n#{lib} is missing. Please locate mkmf.log to investigate how it is failing.\n-----")
288
290
  end
289
291
 
290
- def chdir_for_build
292
+ def chdir_for_build(&block)
291
293
  # When using rake-compiler-dock on Windows, the underlying Virtualbox shared
292
294
  # folders don't support symlinks, but libiconv expects it for a build on
293
295
  # Linux. We work around this limitation by using the temp dir for cooking.
294
- build_dir = ENV["RCD_HOST_RUBY_PLATFORM"].to_s =~ /mingw|mswin|cygwin/ ? "/tmp" : "."
295
- Dir.chdir(build_dir) do
296
- yield
297
- end
296
+ build_dir = /mingw|mswin|cygwin/.match?(ENV["RCD_HOST_RUBY_PLATFORM"].to_s) ? "/tmp" : "."
297
+ Dir.chdir(build_dir, &block)
298
298
  end
299
299
 
300
300
  def sh_export_path(path)
@@ -402,9 +402,9 @@ def iconv_configure_flags
402
402
  abort_could_not_find_library("libiconv")
403
403
  end
404
404
 
405
- def process_recipe(name, version, static_p, cross_p, cacheable_p=true)
405
+ def process_recipe(name, version, static_p, cross_p, cacheable_p = true)
406
406
  require "rubygems"
407
- gem("mini_portile2", REQUIRED_MINI_PORTILE_VERSION)
407
+ gem("mini_portile2", REQUIRED_MINI_PORTILE_VERSION) # gemspec is not respected at install time
408
408
  require "mini_portile2"
409
409
  message("Using mini_portile version #{MiniPortile::VERSION}\n")
410
410
 
@@ -413,9 +413,13 @@ def process_recipe(name, version, static_p, cross_p, cacheable_p=true)
413
413
  end
414
414
 
415
415
  MiniPortile.new(name, version).tap do |recipe|
416
+ def recipe.port_path
417
+ "#{@target}/#{RUBY_PLATFORM}/#{@name}/#{@version}"
418
+ end
419
+
416
420
  recipe.target = File.join(PACKAGE_ROOT_DIR, "ports") if cacheable_p
417
- # Prefer host_alias over host in order to use i586-mingw32msvc as
418
- # correct compiler prefix for cross build, but use host if not set.
421
+ # Prefer host_alias over host in order to use the correct compiler prefix for cross build, but
422
+ # use host if not set.
419
423
  recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"]
420
424
  recipe.configure_options << "--libdir=#{File.join(recipe.path, "lib")}"
421
425
 
@@ -462,7 +466,7 @@ def process_recipe(name, version, static_p, cross_p, cacheable_p=true)
462
466
  end
463
467
 
464
468
  if RbConfig::CONFIG["target_cpu"] == "universal"
465
- %w[CFLAGS LDFLAGS].each do |key|
469
+ ["CFLAGS", "LDFLAGS"].each do |key|
466
470
  unless env[key].include?("-arch")
467
471
  env[key] = concat_flags(env[key], RbConfig::CONFIG["ARCH_FLAG"])
468
472
  end
@@ -473,7 +477,7 @@ def process_recipe(name, version, static_p, cross_p, cacheable_p=true)
473
477
  "#{key}=#{value.strip}"
474
478
  end
475
479
 
476
- checkpoint = "#{recipe.target}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
480
+ checkpoint = "#{recipe.target}/#{recipe.name}-#{recipe.version}-#{RUBY_PLATFORM}.installed"
477
481
  if File.exist?(checkpoint) && !recipe.source_directory
478
482
  message("Building Nokogiri with a packaged version of #{name}-#{version}.\n")
479
483
  else
@@ -487,7 +491,7 @@ def process_recipe(name, version, static_p, cross_p, cacheable_p=true)
487
491
  message("The following patches are being applied:\n")
488
492
 
489
493
  recipe.patch_files.each do |patch|
490
- message(" - %s\n" % File.basename(patch))
494
+ message(format(" - %s\n", File.basename(patch)))
491
495
  end
492
496
  end
493
497
 
@@ -656,7 +660,7 @@ else
656
660
  if cross_build_p || windows?
657
661
  zlib_recipe = process_recipe("zlib", dependencies["zlib"]["version"], static_p, cross_build_p) do |recipe|
658
662
  recipe.files = [{
659
- url: "http://zlib.net/fossils/#{recipe.name}-#{recipe.version}.tar.gz",
663
+ url: "https://zlib.net/fossils/#{recipe.name}-#{recipe.version}.tar.gz",
660
664
  sha256: dependencies["zlib"]["sha256"],
661
665
  }]
662
666
  if windows?
@@ -700,7 +704,7 @@ else
700
704
  end
701
705
 
702
706
  def compile
703
- if host =~ /darwin/
707
+ if /darwin/.match?(host)
704
708
  execute("compile", "make AR=#{host}-libtool")
705
709
  else
706
710
  super
@@ -714,10 +718,13 @@ else
714
718
  libiconv_recipe = process_recipe("libiconv", dependencies["libiconv"]["version"], static_p,
715
719
  cross_build_p) do |recipe|
716
720
  recipe.files = [{
717
- url: "http://ftp.gnu.org/pub/gnu/libiconv/#{recipe.name}-#{recipe.version}.tar.gz",
721
+ url: "https://ftp.gnu.org/pub/gnu/libiconv/#{recipe.name}-#{recipe.version}.tar.gz",
718
722
  sha256: dependencies["libiconv"]["sha256"],
719
723
  }]
720
724
 
725
+ # The libiconv configure script doesn't accept "arm64" host string but "aarch64"
726
+ recipe.host = recipe.host.gsub("arm64-apple-darwin", "aarch64-apple-darwin")
727
+
721
728
  cflags = concat_flags(ENV["CFLAGS"], "-O2", "-U_FORTIFY_SOURCE", "-g")
722
729
 
723
730
  recipe.configure_options += [
@@ -741,12 +748,21 @@ else
741
748
  Tools" to open the developer site, download the installer for your OS
742
749
  version and run it.
743
750
  -----
744
- EOM
751
+ EOM
745
752
  end
746
753
 
747
- unless windows?
748
- preserving_globals { local_have_library("z", "gzdopen", "zlib.h") } ||
749
- abort("zlib is missing; necessary for building libxml2")
754
+ if zlib_recipe
755
+ append_cppflags("-I#{zlib_recipe.path}/include")
756
+ $LIBPATH = ["#{zlib_recipe.path}/lib"] | $LIBPATH
757
+ ensure_package_configuration(opt: "zlib", pc: "zlib", lib: "z",
758
+ headers: "zlib.h", func: "gzdopen")
759
+ end
760
+
761
+ if libiconv_recipe
762
+ append_cppflags("-I#{libiconv_recipe.path}/include")
763
+ $LIBPATH = ["#{libiconv_recipe.path}/lib"] | $LIBPATH
764
+ ensure_package_configuration(opt: "iconv", pc: "iconv", lib: "iconv",
765
+ headers: "iconv.h", func: "iconv_open")
750
766
  end
751
767
 
752
768
  libxml2_recipe = process_recipe("libxml2", dependencies["libxml2"]["version"], static_p, cross_build_p) do |recipe|
@@ -765,7 +781,6 @@ else
765
781
 
766
782
  if zlib_recipe
767
783
  recipe.configure_options << "--with-zlib=#{zlib_recipe.path}"
768
- cflags = concat_flags(cflags, "-I#{zlib_recipe.path}/include")
769
784
  end
770
785
 
771
786
  if libiconv_recipe
@@ -834,9 +849,6 @@ else
834
849
  append_cppflags("-DNOKOGIRI_PACKAGED_LIBRARIES")
835
850
  append_cppflags("-DNOKOGIRI_PRECOMPILED_LIBRARIES") if cross_build_p
836
851
 
837
- $LIBPATH = ["#{zlib_recipe.path}/lib"] | $LIBPATH if zlib_recipe
838
- $LIBPATH = ["#{libiconv_recipe.path}/lib"] | $LIBPATH if libiconv_recipe
839
-
840
852
  $libs = $libs.shellsplit.tap do |libs|
841
853
  [libxml2_recipe, libxslt_recipe].each do |recipe|
842
854
  libname = recipe.name[/\Alib(.+)\z/, 1]
@@ -929,7 +941,7 @@ libgumbo_recipe = process_recipe("libgumbo", "1.0.0-nokogiri", static_p, cross_b
929
941
 
930
942
  env = { "CC" => gcc_cmd, "CFLAGS" => cflags }
931
943
  if config_cross_build?
932
- if host =~ /darwin/
944
+ if /darwin/.match?(host)
933
945
  env["AR"] = "#{host}-libtool"
934
946
  env["ARFLAGS"] = "-o"
935
947
  else
@@ -209,6 +209,7 @@ typedef enum {
209
209
  XML_ERR_VERSION_MISMATCH, /* 109 */
210
210
  XML_ERR_NAME_TOO_LONG, /* 110 */
211
211
  XML_ERR_USER_STOP, /* 111 */
212
+ XML_ERR_COMMENT_ABRUPTLY_ENDED, /* 112 */
212
213
  XML_NS_ERR_XML_NAMESPACE = 200,
213
214
  XML_NS_ERR_UNDEFINED_NAMESPACE, /* 201 */
214
215
  XML_NS_ERR_QNAME, /* 202 */
@@ -133,7 +133,7 @@ extern "C" {
133
133
  #ifndef WITH_MODULES
134
134
  #define WITH_MODULES
135
135
  #endif
136
- #define LIBXSLT_DEFAULT_PLUGINS_PATH() "/home/flavorjones/code/oss/nokogiri/ports/x86_64-w64-mingw32/libxslt/1.1.34/lib/libxslt-plugins"
136
+ #define LIBXSLT_DEFAULT_PLUGINS_PATH() "/home/flavorjones/code/oss/nokogiri/ports/x64-mingw32/libxslt/1.1.34/lib/libxslt-plugins"
137
137
  #endif
138
138
 
139
139
  /**
@@ -533,59 +533,59 @@ block_caller(void *ctx, xmlNodePtr c_node, xmlNodePtr c_parent_node)
533
533
  static VALUE
534
534
  rb_xml_document_canonicalize(int argc, VALUE *argv, VALUE self)
535
535
  {
536
- VALUE mode;
537
- VALUE incl_ns;
538
- VALUE with_comments;
539
- xmlChar **ns;
540
- long ns_len, i;
536
+ VALUE rb_mode;
537
+ VALUE rb_namespaces;
538
+ VALUE rb_comments_p;
539
+ xmlChar **c_namespaces;
541
540
 
542
- xmlDocPtr doc;
543
- xmlOutputBufferPtr buf;
544
- xmlC14NIsVisibleCallback cb = NULL;
545
- void *ctx = NULL;
541
+ xmlDocPtr c_doc;
542
+ xmlOutputBufferPtr c_obuf;
543
+ xmlC14NIsVisibleCallback c_callback_wrapper = NULL;
544
+ void *rb_callback = NULL;
546
545
 
547
546
  VALUE rb_cStringIO;
548
- VALUE io;
547
+ VALUE rb_io;
549
548
 
550
- rb_scan_args(argc, argv, "03", &mode, &incl_ns, &with_comments);
549
+ rb_scan_args(argc, argv, "03", &rb_mode, &rb_namespaces, &rb_comments_p);
550
+ if (!NIL_P(rb_mode)) { Check_Type(rb_mode, T_FIXNUM); }
551
+ if (!NIL_P(rb_namespaces)) { Check_Type(rb_namespaces, T_ARRAY); }
551
552
 
552
- Data_Get_Struct(self, xmlDoc, doc);
553
+ Data_Get_Struct(self, xmlDoc, c_doc);
553
554
 
554
555
  rb_cStringIO = rb_const_get_at(rb_cObject, rb_intern("StringIO"));
555
- io = rb_class_new_instance(0, 0, rb_cStringIO);
556
- buf = xmlAllocOutputBuffer(NULL);
556
+ rb_io = rb_class_new_instance(0, 0, rb_cStringIO);
557
+ c_obuf = xmlAllocOutputBuffer(NULL);
557
558
 
558
- buf->writecallback = (xmlOutputWriteCallback)noko_io_write;
559
- buf->closecallback = (xmlOutputCloseCallback)noko_io_close;
560
- buf->context = (void *)io;
559
+ c_obuf->writecallback = (xmlOutputWriteCallback)noko_io_write;
560
+ c_obuf->closecallback = (xmlOutputCloseCallback)noko_io_close;
561
+ c_obuf->context = (void *)rb_io;
561
562
 
562
563
  if (rb_block_given_p()) {
563
- cb = block_caller;
564
- ctx = (void *)rb_block_proc();
564
+ c_callback_wrapper = block_caller;
565
+ rb_callback = (void *)rb_block_proc();
565
566
  }
566
567
 
567
- if (NIL_P(incl_ns)) {
568
- ns = NULL;
568
+ if (NIL_P(rb_namespaces)) {
569
+ c_namespaces = NULL;
569
570
  } else {
570
- Check_Type(incl_ns, T_ARRAY);
571
- ns_len = RARRAY_LEN(incl_ns);
572
- ns = calloc((size_t)ns_len + 1, sizeof(xmlChar *));
573
- for (i = 0 ; i < ns_len ; i++) {
574
- VALUE entry = rb_ary_entry(incl_ns, i);
575
- ns[i] = (xmlChar *)StringValueCStr(entry);
571
+ long ns_len = RARRAY_LEN(rb_namespaces);
572
+ c_namespaces = calloc((size_t)ns_len + 1, sizeof(xmlChar *));
573
+ for (int j = 0 ; j < ns_len ; j++) {
574
+ VALUE entry = rb_ary_entry(rb_namespaces, j);
575
+ c_namespaces[j] = (xmlChar *)StringValueCStr(entry);
576
576
  }
577
577
  }
578
578
 
579
+ xmlC14NExecute(c_doc, c_callback_wrapper, rb_callback,
580
+ (int)(NIL_P(rb_mode) ? 0 : NUM2INT(rb_mode)),
581
+ c_namespaces,
582
+ (int)RTEST(rb_comments_p),
583
+ c_obuf);
579
584
 
580
- xmlC14NExecute(doc, cb, ctx,
581
- (int)(NIL_P(mode) ? 0 : NUM2INT(mode)),
582
- ns,
583
- (int) RTEST(with_comments),
584
- buf);
585
-
586
- xmlOutputBufferClose(buf);
585
+ free(c_namespaces);
586
+ xmlOutputBufferClose(c_obuf);
587
587
 
588
- return rb_funcall(io, rb_intern("string"), 0);
588
+ return rb_funcall(rb_io, rb_intern("string"), 0);
589
589
  }
590
590
 
591
591
  VALUE
@@ -28,8 +28,6 @@ new (int argc, VALUE *argv, VALUE klass)
28
28
  rb_node = noko_xml_node_wrap(klass, node);
29
29
  rb_obj_call_init(rb_node, argc, argv);
30
30
 
31
- if (rb_block_given_p()) { rb_yield(rb_node); }
32
-
33
31
  return rb_node;
34
32
  }
35
33
 
@@ -57,9 +57,9 @@ entities(VALUE self)
57
57
 
58
58
  /*
59
59
  * call-seq:
60
- * notations
60
+ * notations() → Hash<name(String)⇒Notation>
61
61
  *
62
- * Get a hash of the notations for this DTD.
62
+ * [Returns] All the notations for this DTD in a Hash of Notation +name+ to Notation.
63
63
  */
64
64
  static VALUE
65
65
  notations(VALUE self)