addressable 2.4.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +54 -0
- data/Gemfile +13 -12
- data/README.md +31 -15
- data/Rakefile +5 -3
- data/addressable.gemspec +23 -20
- data/lib/addressable/idna/native.rb +11 -5
- data/lib/addressable/idna/pure.rb +61 -55
- data/lib/addressable/idna.rb +3 -1
- data/lib/addressable/template.rb +64 -84
- data/lib/addressable/uri.rb +228 -96
- data/lib/addressable/version.rb +4 -2
- data/lib/addressable.rb +2 -0
- data/spec/addressable/idna_spec.rb +35 -3
- data/spec/addressable/net_http_compat_spec.rb +3 -1
- data/spec/addressable/security_spec.rb +3 -1
- data/spec/addressable/template_spec.rb +77 -3
- data/spec/addressable/uri_spec.rb +663 -203
- data/spec/spec_helper.rb +12 -0
- data/tasks/clobber.rake +2 -0
- data/tasks/gem.rake +9 -14
- data/tasks/git.rake +2 -0
- data/tasks/metrics.rake +2 -0
- data/tasks/profile.rake +72 -0
- data/tasks/rspec.rake +3 -1
- data/tasks/yard.rake +2 -0
- metadata +36 -11
- data/spec/addressable/rack_mount_compat_spec.rb +0 -104
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 03a21b1eab156a16e90bd7963af85980edfbddc8f3dbe052766303dba76cc000
|
4
|
+
data.tar.gz: 03eca5d86f4c70f9320000f36e3cff4fd8023342a4e0ac855d0ef1ec89ee6183
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d504f9475ad823f5bb077b9c039a2c91c83e52c20896247a7289b61725c61b1ddefe8ae06155fb018fc67087cf04276081b42105a18394b45e2374ad0b2fadb0
|
7
|
+
data.tar.gz: b81766fbcb9335d5ca94403b62d3b2a6fae31b66cd3c05f48e1885eaf07883bfa1321b6930271fe1415135aec687af51312a26ce27bd4b83b2ac6424dec597c9
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,57 @@
|
|
1
|
+
# Addressable 2.8.0
|
2
|
+
- fixes ReDoS vulnerability in Addressable::Template#match
|
3
|
+
- no longer replaces `+` with spaces in queries for non-http(s) schemes
|
4
|
+
- fixed encoding ipv6 literals
|
5
|
+
- the `:compacted` flag for `normalized_query` now dedupes parameters
|
6
|
+
- fix broken `escape_component` alias
|
7
|
+
- dropping support for Ruby 2.0 and 2.1
|
8
|
+
- adding Ruby 3.0 compatibility for development tasks
|
9
|
+
- drop support for `rack-mount` and remove Addressable::Template#generate
|
10
|
+
- performance improvements
|
11
|
+
- switch CI/CD to GitHub Actions
|
12
|
+
|
13
|
+
# Addressable 2.7.0
|
14
|
+
- added `:compacted` flag to `normalized_query`
|
15
|
+
- `heuristic_parse` handles `mailto:` more intuitively
|
16
|
+
- dropped explicit support for JRuby 9.0.5.0
|
17
|
+
- compatibility w/ public_suffix 4.x
|
18
|
+
- performance improvements
|
19
|
+
|
20
|
+
# Addressable 2.6.0
|
21
|
+
- added `tld=` method to allow assignment to the public suffix
|
22
|
+
- most `heuristic_parse` patterns are now case-insensitive
|
23
|
+
- `heuristic_parse` handles more `file://` URI variations
|
24
|
+
- fixes bug in `heuristic_parse` when uri starts with digit
|
25
|
+
- fixes bug in `request_uri=` with query strings
|
26
|
+
- fixes template issues with `nil` and `?` operator
|
27
|
+
- `frozen_string_literal` pragmas added
|
28
|
+
- minor performance improvements in regexps
|
29
|
+
- fixes to eliminate warnings
|
30
|
+
|
31
|
+
# Addressable 2.5.2
|
32
|
+
- better support for frozen string literals
|
33
|
+
- fixed bug w/ uppercase characters in scheme
|
34
|
+
- IDNA errors w/ emoji URLs
|
35
|
+
- compatibility w/ public_suffix 3.x
|
36
|
+
|
37
|
+
# Addressable 2.5.1
|
38
|
+
- allow unicode normalization to be disabled for URI Template expansion
|
39
|
+
- removed duplicate test
|
40
|
+
|
41
|
+
# Addressable 2.5.0
|
42
|
+
- dropping support for Ruby 1.9
|
43
|
+
- adding support for Ruby 2.4 preview
|
44
|
+
- add support for public suffixes and tld; first runtime dependency
|
45
|
+
- hostname escaping should match RFC; underscores in hostnames no longer escaped
|
46
|
+
- paths beginning with // and missing an authority are now considered invalid
|
47
|
+
- validation now also takes place after setting a path
|
48
|
+
- handle backslashes in authority more like a browser for `heuristic_parse`
|
49
|
+
- unescaped backslashes in host now raise an `InvalidURIError`
|
50
|
+
- `merge!`, `join!`, `omit!` and `normalize!` don't disable deferred validation
|
51
|
+
- `heuristic_parse` now trims whitespace before parsing
|
52
|
+
- host parts longer than 63 bytes will be ignored and not passed to libidn
|
53
|
+
- normalized values always encoded as UTF-8
|
54
|
+
|
1
55
|
# Addressable 2.4.0
|
2
56
|
- support for 1.8.x dropped
|
3
57
|
- double quotes in a host now raises an error
|
data/Gemfile
CHANGED
@@ -1,12 +1,17 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
source 'https://rubygems.org'
|
4
4
|
|
5
|
-
|
5
|
+
gemspec(path: __FILE__ == "(eval)" ? ".." : ".")
|
6
6
|
|
7
7
|
group :test do
|
8
|
-
gem 'rspec', '~> 3.
|
9
|
-
gem 'rspec-its', '~> 1.
|
8
|
+
gem 'rspec', '~> 3.8'
|
9
|
+
gem 'rspec-its', '~> 1.3'
|
10
|
+
end
|
11
|
+
|
12
|
+
group :coverage do
|
13
|
+
gem "coveralls", "> 0.7", require: false, platforms: :mri
|
14
|
+
gem "simplecov", require: false
|
10
15
|
end
|
11
16
|
|
12
17
|
group :development do
|
@@ -16,12 +21,8 @@ group :development do
|
|
16
21
|
end
|
17
22
|
|
18
23
|
group :test, :development do
|
19
|
-
gem '
|
20
|
-
gem
|
21
|
-
:ruby_19, :ruby_20, :ruby_21, :rbx, :jruby
|
22
|
-
]
|
23
|
-
# Used to test compatibility.
|
24
|
-
gem 'rack-mount', git: 'https://github.com/sporkmonger/rack-mount.git', require: 'rack/mount'
|
24
|
+
gem 'memory_profiler'
|
25
|
+
gem "rake", ">= 12.3.3"
|
25
26
|
end
|
26
27
|
|
27
|
-
gem
|
28
|
+
gem "idn-ruby", platform: :mri
|
data/README.md
CHANGED
@@ -3,28 +3,27 @@
|
|
3
3
|
<dl>
|
4
4
|
<dt>Homepage</dt><dd><a href="https://github.com/sporkmonger/addressable">github.com/sporkmonger/addressable</a></dd>
|
5
5
|
<dt>Author</dt><dd><a href="mailto:bob@sporkmonger.com">Bob Aman</a></dd>
|
6
|
-
<dt>Copyright</dt><dd>Copyright ©
|
6
|
+
<dt>Copyright</dt><dd>Copyright © Bob Aman</dd>
|
7
7
|
<dt>License</dt><dd>Apache 2.0</dd>
|
8
8
|
</dl>
|
9
9
|
|
10
|
-
[][gemnasium]
|
10
|
+
[][gem]
|
11
|
+
[][actions]
|
13
12
|
[][coveralls]
|
14
|
-
[](https://www.gittip.com/sporkmonger/ "Support Open Source Development w/ Gittip")
|
13
|
+
[][inch]
|
16
14
|
|
17
15
|
[gem]: https://rubygems.org/gems/addressable
|
18
|
-
[
|
19
|
-
[gemnasium]: https://gemnasium.com/sporkmonger/addressable
|
16
|
+
[actions]: https://github.com/sporkmonger/addressable/actions
|
20
17
|
[coveralls]: https://coveralls.io/r/sporkmonger/addressable
|
21
|
-
[inch]:
|
18
|
+
[inch]: https://inch-ci.org/github/sporkmonger/addressable
|
22
19
|
|
23
20
|
# Description
|
24
21
|
|
25
|
-
Addressable is
|
26
|
-
Ruby's standard library. It
|
27
|
-
|
22
|
+
Addressable is an alternative implementation to the URI implementation
|
23
|
+
that is part of Ruby's standard library. It is flexible, offers heuristic
|
24
|
+
parsing, and additionally provides extensive support for IRIs and URI templates.
|
25
|
+
|
26
|
+
Addressable closely conforms to RFC 3986, RFC 3987, and RFC 6570 (level 4).
|
28
27
|
|
29
28
|
# Reference
|
30
29
|
|
@@ -59,7 +58,7 @@ For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt).
|
|
59
58
|
|
60
59
|
require "addressable/template"
|
61
60
|
|
62
|
-
template = Addressable::Template.new("http://example.com/{?query*}
|
61
|
+
template = Addressable::Template.new("http://example.com/{?query*}")
|
63
62
|
template.expand({
|
64
63
|
"query" => {
|
65
64
|
'foo' => 'bar',
|
@@ -92,14 +91,31 @@ template.extract(uri)
|
|
92
91
|
# Install
|
93
92
|
|
94
93
|
```console
|
95
|
-
$
|
94
|
+
$ gem install addressable
|
96
95
|
```
|
97
96
|
|
98
97
|
You may optionally turn on native IDN support by installing libidn and the
|
99
98
|
idn gem:
|
100
99
|
|
101
100
|
```console
|
102
|
-
$ sudo apt-get install
|
101
|
+
$ sudo apt-get install libidn11-dev # Debian/Ubuntu
|
103
102
|
$ brew install libidn # OS X
|
104
103
|
$ gem install idn-ruby
|
105
104
|
```
|
105
|
+
|
106
|
+
# Semantic Versioning
|
107
|
+
|
108
|
+
This project uses [Semantic Versioning](https://semver.org/). You can (and should) specify your
|
109
|
+
dependency using a pessimistic version constraint covering the major and minor
|
110
|
+
values:
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
spec.add_dependency 'addressable', '~> 2.7'
|
114
|
+
```
|
115
|
+
|
116
|
+
If you need a specific bug fix, you can also specify minimum tiny versions
|
117
|
+
without preventing updates to the latest minor release:
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
spec.add_dependency 'addressable', '~> 2.3', '>= 2.3.7'
|
121
|
+
```
|
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rubygems'
|
2
4
|
require 'rake'
|
3
5
|
|
@@ -12,9 +14,9 @@ RELEASE_NAME = "REL #{PKG_VERSION}"
|
|
12
14
|
|
13
15
|
PKG_SUMMARY = "URI Implementation"
|
14
16
|
PKG_DESCRIPTION = <<-TEXT
|
15
|
-
Addressable is
|
16
|
-
Ruby's standard library. It
|
17
|
-
|
17
|
+
Addressable is an alternative implementation to the URI implementation that is
|
18
|
+
part of Ruby's standard library. It is flexible, offers heuristic parsing, and
|
19
|
+
additionally provides extensive support for IRIs and URI templates.
|
18
20
|
TEXT
|
19
21
|
|
20
22
|
PKG_FILES = FileList[
|
data/addressable.gemspec
CHANGED
@@ -1,34 +1,37 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: addressable 2.
|
2
|
+
# stub: addressable 2.8.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
|
-
s.name = "addressable"
|
6
|
-
s.version = "2.
|
5
|
+
s.name = "addressable".freeze
|
6
|
+
s.version = "2.8.0"
|
7
7
|
|
8
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
|
-
s.require_paths = ["lib"]
|
10
|
-
s.authors = ["Bob Aman"]
|
11
|
-
s.date = "
|
12
|
-
s.description = "Addressable is
|
13
|
-
s.email = "bob@sporkmonger.com"
|
14
|
-
s.extra_rdoc_files = ["README.md"]
|
15
|
-
s.files = ["CHANGELOG.md", "Gemfile", "LICENSE.txt", "README.md", "Rakefile", "addressable.gemspec", "data/unicode.data", "lib/addressable.rb", "lib/addressable/idna.rb", "lib/addressable/idna/native.rb", "lib/addressable/idna/pure.rb", "lib/addressable/template.rb", "lib/addressable/uri.rb", "lib/addressable/version.rb", "spec/addressable/idna_spec.rb", "spec/addressable/net_http_compat_spec.rb"
|
16
|
-
s.homepage = "https://github.com/sporkmonger/addressable"
|
17
|
-
s.licenses = ["Apache-2.0"]
|
18
|
-
s.rdoc_options = ["--main", "README.md"]
|
19
|
-
s.required_ruby_version = Gem::Requirement.new(">=
|
20
|
-
s.rubygems_version = "
|
21
|
-
s.summary = "URI Implementation"
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
|
+
s.require_paths = ["lib".freeze]
|
10
|
+
s.authors = ["Bob Aman".freeze]
|
11
|
+
s.date = "2021-07-03"
|
12
|
+
s.description = "Addressable is an alternative implementation to the URI implementation that is\npart of Ruby's standard library. It is flexible, offers heuristic parsing, and\nadditionally provides extensive support for IRIs and URI templates.\n".freeze
|
13
|
+
s.email = "bob@sporkmonger.com".freeze
|
14
|
+
s.extra_rdoc_files = ["README.md".freeze]
|
15
|
+
s.files = ["CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE.txt".freeze, "README.md".freeze, "Rakefile".freeze, "addressable.gemspec".freeze, "data/unicode.data".freeze, "lib/addressable.rb".freeze, "lib/addressable/idna.rb".freeze, "lib/addressable/idna/native.rb".freeze, "lib/addressable/idna/pure.rb".freeze, "lib/addressable/template.rb".freeze, "lib/addressable/uri.rb".freeze, "lib/addressable/version.rb".freeze, "spec/addressable/idna_spec.rb".freeze, "spec/addressable/net_http_compat_spec.rb".freeze, "spec/addressable/security_spec.rb".freeze, "spec/addressable/template_spec.rb".freeze, "spec/addressable/uri_spec.rb".freeze, "spec/spec_helper.rb".freeze, "tasks/clobber.rake".freeze, "tasks/gem.rake".freeze, "tasks/git.rake".freeze, "tasks/metrics.rake".freeze, "tasks/profile.rake".freeze, "tasks/rspec.rake".freeze, "tasks/yard.rake".freeze]
|
16
|
+
s.homepage = "https://github.com/sporkmonger/addressable".freeze
|
17
|
+
s.licenses = ["Apache-2.0".freeze]
|
18
|
+
s.rdoc_options = ["--main".freeze, "README.md".freeze]
|
19
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze)
|
20
|
+
s.rubygems_version = "3.0.3".freeze
|
21
|
+
s.summary = "URI Implementation".freeze
|
22
22
|
|
23
23
|
if s.respond_to? :specification_version then
|
24
24
|
s.specification_version = 4
|
25
25
|
|
26
26
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
|
-
s.
|
27
|
+
s.add_runtime_dependency(%q<public_suffix>.freeze, [">= 2.0.2", "< 5.0"])
|
28
|
+
s.add_development_dependency(%q<bundler>.freeze, [">= 1.0", "< 3.0"])
|
28
29
|
else
|
29
|
-
s.add_dependency(%q<
|
30
|
+
s.add_dependency(%q<public_suffix>.freeze, [">= 2.0.2", "< 5.0"])
|
31
|
+
s.add_dependency(%q<bundler>.freeze, [">= 1.0", "< 3.0"])
|
30
32
|
end
|
31
33
|
else
|
32
|
-
s.add_dependency(%q<
|
34
|
+
s.add_dependency(%q<public_suffix>.freeze, [">= 2.0.2", "< 5.0"])
|
35
|
+
s.add_dependency(%q<bundler>.freeze, [">= 1.0", "< 3.0"])
|
33
36
|
end
|
34
37
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# encoding:utf-8
|
2
4
|
#--
|
3
|
-
# Copyright (C)
|
5
|
+
# Copyright (C) Bob Aman
|
4
6
|
#
|
5
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
8
|
# you may not use this file except in compliance with the License.
|
@@ -34,8 +36,10 @@ module Addressable
|
|
34
36
|
|
35
37
|
def self.to_ascii(value)
|
36
38
|
value.to_s.split('.', -1).map do |segment|
|
37
|
-
if segment.size > 0
|
38
|
-
IDN::Idna.toASCII(segment)
|
39
|
+
if segment.size > 0 && segment.size < 64
|
40
|
+
IDN::Idna.toASCII(segment, IDN::Idna::ALLOW_UNASSIGNED)
|
41
|
+
elsif segment.size >= 64
|
42
|
+
segment
|
39
43
|
else
|
40
44
|
''
|
41
45
|
end
|
@@ -44,8 +48,10 @@ module Addressable
|
|
44
48
|
|
45
49
|
def self.to_unicode(value)
|
46
50
|
value.to_s.split('.', -1).map do |segment|
|
47
|
-
if segment.size > 0
|
48
|
-
IDN::Idna.toUnicode(segment)
|
51
|
+
if segment.size > 0 && segment.size < 64
|
52
|
+
IDN::Idna.toUnicode(segment, IDN::Idna::ALLOW_UNASSIGNED)
|
53
|
+
elsif segment.size >= 64
|
54
|
+
segment
|
49
55
|
else
|
50
56
|
''
|
51
57
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# encoding:utf-8
|
2
4
|
#--
|
3
|
-
# Copyright (C)
|
5
|
+
# Copyright (C) Bob Aman
|
4
6
|
#
|
5
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
8
|
# you may not use this file except in compliance with the License.
|
@@ -94,7 +96,12 @@ module Addressable
|
|
94
96
|
parts = input.split('.')
|
95
97
|
parts.map! do |part|
|
96
98
|
if part =~ /^#{ACE_PREFIX}(.+)/
|
97
|
-
|
99
|
+
begin
|
100
|
+
punycode_decode(part[/^#{ACE_PREFIX}(.+)/, 1])
|
101
|
+
rescue Addressable::IDNA::PunycodeBadInput
|
102
|
+
# toUnicode is explicitly defined as never-fails by the spec
|
103
|
+
part
|
104
|
+
end
|
98
105
|
else
|
99
106
|
part
|
100
107
|
end
|
@@ -128,7 +135,7 @@ module Addressable
|
|
128
135
|
unpacked.map! { |codepoint| lookup_unicode_lowercase(codepoint) }
|
129
136
|
return unpacked.pack("U*")
|
130
137
|
end
|
131
|
-
|
138
|
+
private_class_method :unicode_downcase
|
132
139
|
|
133
140
|
def self.unicode_compose(unpacked)
|
134
141
|
unpacked_result = []
|
@@ -141,22 +148,19 @@ module Addressable
|
|
141
148
|
starter_cc = 256 if starter_cc != 0
|
142
149
|
for i in 1...length
|
143
150
|
ch = unpacked[i]
|
144
|
-
cc = lookup_unicode_combining_class(ch)
|
145
151
|
|
146
152
|
if (starter_cc == 0 &&
|
147
153
|
(composite = unicode_compose_pair(starter, ch)) != nil)
|
148
154
|
starter = composite
|
149
|
-
startercc = lookup_unicode_combining_class(composite)
|
150
155
|
else
|
151
156
|
unpacked_result << starter
|
152
157
|
starter = ch
|
153
|
-
startercc = cc
|
154
158
|
end
|
155
159
|
end
|
156
160
|
unpacked_result << starter
|
157
161
|
return unpacked_result
|
158
162
|
end
|
159
|
-
|
163
|
+
private_class_method :unicode_compose
|
160
164
|
|
161
165
|
def self.unicode_compose_pair(ch_one, ch_two)
|
162
166
|
if ch_one >= HANGUL_LBASE && ch_one < HANGUL_LBASE + HANGUL_LCOUNT &&
|
@@ -174,43 +178,45 @@ module Addressable
|
|
174
178
|
end
|
175
179
|
|
176
180
|
p = []
|
177
|
-
ucs4_to_utf8 = lambda do |ch|
|
178
|
-
if ch < 128
|
179
|
-
p << ch
|
180
|
-
elsif ch < 2048
|
181
|
-
p << (ch >> 6 | 192)
|
182
|
-
p << (ch & 63 | 128)
|
183
|
-
elsif ch < 0x10000
|
184
|
-
p << (ch >> 12 | 224)
|
185
|
-
p << (ch >> 6 & 63 | 128)
|
186
|
-
p << (ch & 63 | 128)
|
187
|
-
elsif ch < 0x200000
|
188
|
-
p << (ch >> 18 | 240)
|
189
|
-
p << (ch >> 12 & 63 | 128)
|
190
|
-
p << (ch >> 6 & 63 | 128)
|
191
|
-
p << (ch & 63 | 128)
|
192
|
-
elsif ch < 0x4000000
|
193
|
-
p << (ch >> 24 | 248)
|
194
|
-
p << (ch >> 18 & 63 | 128)
|
195
|
-
p << (ch >> 12 & 63 | 128)
|
196
|
-
p << (ch >> 6 & 63 | 128)
|
197
|
-
p << (ch & 63 | 128)
|
198
|
-
elsif ch < 0x80000000
|
199
|
-
p << (ch >> 30 | 252)
|
200
|
-
p << (ch >> 24 & 63 | 128)
|
201
|
-
p << (ch >> 18 & 63 | 128)
|
202
|
-
p << (ch >> 12 & 63 | 128)
|
203
|
-
p << (ch >> 6 & 63 | 128)
|
204
|
-
p << (ch & 63 | 128)
|
205
|
-
end
|
206
|
-
end
|
207
181
|
|
208
|
-
ucs4_to_utf8
|
209
|
-
ucs4_to_utf8
|
182
|
+
ucs4_to_utf8(ch_one, p)
|
183
|
+
ucs4_to_utf8(ch_two, p)
|
210
184
|
|
211
185
|
return lookup_unicode_composition(p)
|
212
186
|
end
|
213
|
-
|
187
|
+
private_class_method :unicode_compose_pair
|
188
|
+
|
189
|
+
def self.ucs4_to_utf8(char, buffer)
|
190
|
+
if char < 128
|
191
|
+
buffer << char
|
192
|
+
elsif char < 2048
|
193
|
+
buffer << (char >> 6 | 192)
|
194
|
+
buffer << (char & 63 | 128)
|
195
|
+
elsif char < 0x10000
|
196
|
+
buffer << (char >> 12 | 224)
|
197
|
+
buffer << (char >> 6 & 63 | 128)
|
198
|
+
buffer << (char & 63 | 128)
|
199
|
+
elsif char < 0x200000
|
200
|
+
buffer << (char >> 18 | 240)
|
201
|
+
buffer << (char >> 12 & 63 | 128)
|
202
|
+
buffer << (char >> 6 & 63 | 128)
|
203
|
+
buffer << (char & 63 | 128)
|
204
|
+
elsif char < 0x4000000
|
205
|
+
buffer << (char >> 24 | 248)
|
206
|
+
buffer << (char >> 18 & 63 | 128)
|
207
|
+
buffer << (char >> 12 & 63 | 128)
|
208
|
+
buffer << (char >> 6 & 63 | 128)
|
209
|
+
buffer << (char & 63 | 128)
|
210
|
+
elsif char < 0x80000000
|
211
|
+
buffer << (char >> 30 | 252)
|
212
|
+
buffer << (char >> 24 & 63 | 128)
|
213
|
+
buffer << (char >> 18 & 63 | 128)
|
214
|
+
buffer << (char >> 12 & 63 | 128)
|
215
|
+
buffer << (char >> 6 & 63 | 128)
|
216
|
+
buffer << (char & 63 | 128)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
private_class_method :ucs4_to_utf8
|
214
220
|
|
215
221
|
def self.unicode_sort_canonical(unpacked)
|
216
222
|
unpacked = unpacked.dup
|
@@ -234,7 +240,7 @@ module Addressable
|
|
234
240
|
end
|
235
241
|
return unpacked
|
236
242
|
end
|
237
|
-
|
243
|
+
private_class_method :unicode_sort_canonical
|
238
244
|
|
239
245
|
def self.unicode_decompose(unpacked)
|
240
246
|
unpacked_result = []
|
@@ -255,7 +261,7 @@ module Addressable
|
|
255
261
|
end
|
256
262
|
return unpacked_result
|
257
263
|
end
|
258
|
-
|
264
|
+
private_class_method :unicode_decompose
|
259
265
|
|
260
266
|
def self.unicode_decompose_hangul(codepoint)
|
261
267
|
sindex = codepoint - HANGUL_SBASE;
|
@@ -272,7 +278,7 @@ module Addressable
|
|
272
278
|
end
|
273
279
|
return l, v, t
|
274
280
|
end
|
275
|
-
|
281
|
+
private_class_method :unicode_decompose_hangul
|
276
282
|
|
277
283
|
def self.lookup_unicode_combining_class(codepoint)
|
278
284
|
codepoint_data = UNICODE_DATA[codepoint]
|
@@ -280,14 +286,14 @@ module Addressable
|
|
280
286
|
(codepoint_data[UNICODE_DATA_COMBINING_CLASS] || 0) :
|
281
287
|
0)
|
282
288
|
end
|
283
|
-
|
289
|
+
private_class_method :lookup_unicode_combining_class
|
284
290
|
|
285
291
|
def self.lookup_unicode_compatibility(codepoint)
|
286
292
|
codepoint_data = UNICODE_DATA[codepoint]
|
287
293
|
(codepoint_data ?
|
288
294
|
codepoint_data[UNICODE_DATA_COMPATIBILITY] : nil)
|
289
295
|
end
|
290
|
-
|
296
|
+
private_class_method :lookup_unicode_compatibility
|
291
297
|
|
292
298
|
def self.lookup_unicode_lowercase(codepoint)
|
293
299
|
codepoint_data = UNICODE_DATA[codepoint]
|
@@ -295,12 +301,12 @@ module Addressable
|
|
295
301
|
(codepoint_data[UNICODE_DATA_LOWERCASE] || codepoint) :
|
296
302
|
codepoint)
|
297
303
|
end
|
298
|
-
|
304
|
+
private_class_method :lookup_unicode_lowercase
|
299
305
|
|
300
306
|
def self.lookup_unicode_composition(unpacked)
|
301
307
|
return COMPOSITION_TABLE[unpacked]
|
302
308
|
end
|
303
|
-
|
309
|
+
private_class_method :lookup_unicode_composition
|
304
310
|
|
305
311
|
HANGUL_SBASE = 0xac00
|
306
312
|
HANGUL_LBASE = 0x1100
|
@@ -337,7 +343,7 @@ module Addressable
|
|
337
343
|
end
|
338
344
|
|
339
345
|
COMPOSITION_TABLE = {}
|
340
|
-
|
346
|
+
UNICODE_DATA.each do |codepoint, data|
|
341
347
|
canonical = data[UNICODE_DATA_CANONICAL]
|
342
348
|
exclusion = data[UNICODE_DATA_EXCLUSION]
|
343
349
|
|
@@ -496,7 +502,7 @@ module Addressable
|
|
496
502
|
|
497
503
|
output[0..outlen].map { |x| x.chr }.join("").sub(/\0+\z/, "")
|
498
504
|
end
|
499
|
-
|
505
|
+
private_class_method :punycode_encode
|
500
506
|
|
501
507
|
def self.punycode_decode(punycode)
|
502
508
|
input = []
|
@@ -618,22 +624,22 @@ module Addressable
|
|
618
624
|
|
619
625
|
output.pack("U*")
|
620
626
|
end
|
621
|
-
|
627
|
+
private_class_method :punycode_decode
|
622
628
|
|
623
629
|
def self.punycode_basic?(codepoint)
|
624
630
|
codepoint < 0x80
|
625
631
|
end
|
626
|
-
|
632
|
+
private_class_method :punycode_basic?
|
627
633
|
|
628
634
|
def self.punycode_delimiter?(codepoint)
|
629
635
|
codepoint == PUNYCODE_DELIMITER
|
630
636
|
end
|
631
|
-
|
637
|
+
private_class_method :punycode_delimiter?
|
632
638
|
|
633
639
|
def self.punycode_encode_digit(d)
|
634
640
|
d + 22 + 75 * ((d < 26) ? 1 : 0)
|
635
641
|
end
|
636
|
-
|
642
|
+
private_class_method :punycode_encode_digit
|
637
643
|
|
638
644
|
# Returns the numeric value of a basic codepoint
|
639
645
|
# (for use in representing integers) in the range 0 to
|
@@ -649,7 +655,7 @@ module Addressable
|
|
649
655
|
PUNYCODE_BASE
|
650
656
|
end
|
651
657
|
end
|
652
|
-
|
658
|
+
private_class_method :punycode_decode_digit
|
653
659
|
|
654
660
|
# Bias adaptation method
|
655
661
|
def self.punycode_adapt(delta, numpoints, firsttime)
|
@@ -666,7 +672,7 @@ module Addressable
|
|
666
672
|
|
667
673
|
k + (difference + 1) * delta / (delta + PUNYCODE_SKEW)
|
668
674
|
end
|
669
|
-
|
675
|
+
private_class_method :punycode_adapt
|
670
676
|
end
|
671
677
|
# :startdoc:
|
672
678
|
end
|
data/lib/addressable/idna.rb
CHANGED