unicode-display_width 2.3.0 → 2.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/README.md +8 -3
- data/lib/unicode/display_width/constants.rb +1 -1
- data/lib/unicode/display_width.rb +27 -11
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 26234cf1d4a965966cfab38151afe61c8f0a4c2d4f31fc006a319997af7bf076
|
4
|
+
data.tar.gz: eb5c24564cc94da5378b1d5b9065f90a70fcbcff50f914cc858634825694a544
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8687c39d5c62292c8d124ca9a3889c30f5f7d8e64b7e5ff79fc3b58137708bfeb844b36d32a5f73920f5e63a3cb60fc4a3f465f8505ccb8134e30d2445fc1af3
|
7
|
+
data.tar.gz: 37b073e36650f21bca8aa40cf9809a882fcd84642824ca8380542c80f3cb7a5f78c43eabe9abd6f09a73f6ee2cb5c49f60aa8b1ec72bcc8100cd411cdda15a5a
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 2.4.1
|
4
|
+
|
5
|
+
- Improve general performance!
|
6
|
+
- Further improve performance for ASCII strings
|
7
|
+
|
8
|
+
*You should really upgrade - it's much faster now!*
|
9
|
+
|
10
|
+
## 2.4.0
|
11
|
+
- Improve performance for ASCII-only strings, by @fatkodima
|
12
|
+
- Require Ruby 2.4
|
13
|
+
|
3
14
|
## 2.3.0
|
4
15
|
|
5
16
|
- Unicode 15.0
|
data/README.md
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
## Unicode::DisplayWidth [![[version]](https://badge.fury.io/rb/unicode-display_width.svg)](https://badge.fury.io/rb/unicode-display_width) [<img src="https://github.com/janlelis/unicode-display_width/workflows/Test/badge.svg" />](https://github.com/janlelis/unicode-display_width/actions?query=workflow%3ATest)
|
2
2
|
|
3
|
-
Determines the monospace display width of a string in Ruby. Implementation based on [EastAsianWidth.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt) and other data, 100% in Ruby. It does not rely on the OS vendor (like [wcwidth()](https://github.com/janlelis/wcswidth-ruby)) to provide an up-to-date method for measuring string width.
|
3
|
+
Determines the monospace display width of a string in Ruby. Useful for all kinds of terminal-based applications. Implementation based on [EastAsianWidth.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt) and other data, 100% in Ruby. It does not rely on the OS vendor (like [wcwidth()](https://github.com/janlelis/wcswidth-ruby)) to provide an up-to-date method for measuring string width.
|
4
4
|
|
5
5
|
Unicode version: **15.0.0** (September 2022)
|
6
6
|
|
7
7
|
Supported Rubies: **3.1**, **3.0**, **2.7**
|
8
8
|
|
9
|
-
Old Rubies which might still work: **2.6**, **2.5**, **2.4
|
9
|
+
Old Rubies which might still work: **2.6**, **2.5**, **2.4**
|
10
|
+
|
11
|
+
For even older Rubies, use version 2.3.0 of this gem: **2.3**, **2.2**, **2.1**, **2.0**, **1.9**
|
10
12
|
|
11
13
|
## Version 2.0 — Breaking Changes
|
12
14
|
|
@@ -39,7 +41,7 @@ Width | Characters | Comment
|
|
39
41
|
-------|------------------------------|--------------------------------------------------
|
40
42
|
X | (user defined) | Overwrites any other values
|
41
43
|
-1 | `"\b"` | Backspace (total width never below 0)
|
42
|
-
0 | `"\0"`, `"\x05"`, `"\a"`, `"\n"`, `"\v"`, `"\f"`, `"\r"`, `"\x0E"`, `"\x0F"` | [C0 control codes](https://en.wikipedia.org/wiki/C0_and_C1_control_codes#C0_.28ASCII_and_derivatives.29)
|
44
|
+
0 | `"\0"`, `"\x05"`, `"\a"`, `"\n"`, `"\v"`, `"\f"`, `"\r"`, `"\x0E"`, `"\x0F"` | [C0 control codes](https://en.wikipedia.org/wiki/C0_and_C1_control_codes#C0_.28ASCII_and_derivatives.29) which do not change horizontal width
|
43
45
|
1 | `"\u{00AD}"` | SOFT HYPHEN
|
44
46
|
2 | `"\u{2E3A}"` | TWO-EM DASH
|
45
47
|
3 | `"\u{2E3B}"` | THREE-EM DASH
|
@@ -89,6 +91,9 @@ You can overwrite how to handle specific code points by passing a hash (or even
|
|
89
91
|
Unicode::DisplayWidth.of("a\tb", 1, "\t".ord => 10)) # => tab counted as 10, so result is 12
|
90
92
|
```
|
91
93
|
|
94
|
+
Please note that using overwrites disables some perfomance optimizations of this gem.
|
95
|
+
|
96
|
+
|
92
97
|
#### Emoji Support
|
93
98
|
|
94
99
|
Emoji width support is included, but in must be activated manually. It will adjust the string's size for modifier and zero-width joiner sequences. You also need to add the [unicode-emoji](https://github.com/janlelis/unicode-emoji) gem to your Gemfile:
|
@@ -5,23 +5,39 @@ require_relative "display_width/index"
|
|
5
5
|
|
6
6
|
module Unicode
|
7
7
|
class DisplayWidth
|
8
|
-
|
8
|
+
INITIAL_DEPTH = 0x10000
|
9
|
+
ASCII_NON_ZERO_REGEX = /[\0\x05\a\b\n\v\f\r\x0E\x0F]/
|
9
10
|
|
10
11
|
def self.of(string, ambiguous = 1, overwrite = {}, options = {})
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
# Optimization for ASCII-only strings without certain control symbols
|
13
|
+
if overwrite.empty? && string.ascii_only?
|
14
|
+
if string.match?(ASCII_NON_ZERO_REGEX)
|
15
|
+
res = string.gsub(ASCII_NON_ZERO_REGEX, "").size - string.count("\b")
|
16
|
+
return res < 0 ? 0 : res
|
17
|
+
else
|
18
|
+
return string.size
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Sum of all chars widths
|
23
|
+
res = string.codepoints.sum{ |codepoint|
|
24
|
+
next overwrite[codepoint] if overwrite[codepoint]
|
25
|
+
next 1 if codepoint > 15 && codepoint < 161 # very common
|
26
|
+
|
27
|
+
width = INDEX
|
28
|
+
depth = INITIAL_DEPTH
|
29
|
+
while (width = width[codepoint / depth]).is_a? Array
|
30
|
+
codepoint %= depth
|
31
|
+
depth /= 16
|
32
|
+
end
|
20
33
|
width = ambiguous if width == :A
|
21
|
-
|
34
|
+
width || 1
|
22
35
|
}
|
23
36
|
|
37
|
+
# Substract emoji error
|
24
38
|
res -= emoji_extra_width_of(string, ambiguous, overwrite) if options[:emoji]
|
39
|
+
|
40
|
+
# Return result + prevent negative lengths
|
25
41
|
res < 0 ? 0 : res
|
26
42
|
end
|
27
43
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unicode-display_width
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Lelis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -62,7 +62,7 @@ homepage: https://github.com/janlelis/unicode-display_width
|
|
62
62
|
licenses:
|
63
63
|
- MIT
|
64
64
|
metadata:
|
65
|
-
changelog_uri: https://github.com/janlelis/unicode-display_width/blob/
|
65
|
+
changelog_uri: https://github.com/janlelis/unicode-display_width/blob/main/CHANGELOG.md
|
66
66
|
source_code_uri: https://github.com/janlelis/unicode-display_width
|
67
67
|
bug_tracker_uri: https://github.com/janlelis/unicode-display_width/issues
|
68
68
|
rubygems_mfa_required: 'true'
|
@@ -74,14 +74,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
74
74
|
requirements:
|
75
75
|
- - ">="
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
77
|
+
version: 2.4.0
|
78
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
requirements: []
|
84
|
-
rubygems_version: 3.
|
84
|
+
rubygems_version: 3.4.1
|
85
85
|
signing_key:
|
86
86
|
specification_version: 4
|
87
87
|
summary: Determines the monospace display width of a string in Ruby.
|