unicode-display_width 2.4.0 → 2.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e64e9230d9a0df4076a18bb935b6f1aeac16e079544aa65097b1ddb967b4960c
4
- data.tar.gz: 17d5cf547c89859318bc578e3e15a63ce0ab94d8801f2928097bb29d27cb6da0
3
+ metadata.gz: 26234cf1d4a965966cfab38151afe61c8f0a4c2d4f31fc006a319997af7bf076
4
+ data.tar.gz: eb5c24564cc94da5378b1d5b9065f90a70fcbcff50f914cc858634825694a544
5
5
  SHA512:
6
- metadata.gz: 1ea3ee4075d687ac1708a095ffe82e833389db1ec613ef43c9f8aa3aeeb5983d585cf6ad22e7d00d1020378344d9e9450096d6b7a04f27358d5418466b7fdf41
7
- data.tar.gz: 00a75b4f46daa89186bde97d5e2da86d197e5ef8704876c16085dd9a503620dc2aaf6e6e9030b9a438417f54d48070d0df06ca2b3e1530bc6d2d1be761f21054
6
+ metadata.gz: 8687c39d5c62292c8d124ca9a3889c30f5f7d8e64b7e5ff79fc3b58137708bfeb844b36d32a5f73920f5e63a3cb60fc4a3f465f8505ccb8134e30d2445fc1af3
7
+ data.tar.gz: 37b073e36650f21bca8aa40cf9809a882fcd84642824ca8380542c80f3cb7a5f78c43eabe9abd6f09a73f6ee2cb5c49f60aa8b1ec72bcc8100cd411cdda15a5a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
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
+
3
10
  ## 2.4.0
4
11
  - Improve performance for ASCII-only strings, by @fatkodima
5
12
  - Require Ruby 2.4
data/README.md CHANGED
@@ -91,6 +91,9 @@ You can overwrite how to handle specific code points by passing a hash (or even
91
91
  Unicode::DisplayWidth.of("a\tb", 1, "\t".ord => 10)) # => tab counted as 10, so result is 12
92
92
  ```
93
93
 
94
+ Please note that using overwrites disables some perfomance optimizations of this gem.
95
+
96
+
94
97
  #### Emoji Support
95
98
 
96
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:
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Unicode
4
4
  class DisplayWidth
5
- VERSION = "2.4.0"
5
+ VERSION = "2.4.1"
6
6
  UNICODE_VERSION = "15.0.0"
7
7
  DATA_DIRECTORY = File.expand_path(File.dirname(__FILE__) + "/../../../data/")
8
8
  INDEX_FILENAME = DATA_DIRECTORY + "/display_width.marshal.gz"
@@ -5,27 +5,33 @@ require_relative "display_width/index"
5
5
 
6
6
  module Unicode
7
7
  class DisplayWidth
8
- DEPTHS = [0x10000, 0x1000, 0x100, 0x10].freeze
8
+ INITIAL_DEPTH = 0x10000
9
9
  ASCII_NON_ZERO_REGEX = /[\0\x05\a\b\n\v\f\r\x0E\x0F]/
10
10
 
11
11
  def self.of(string, ambiguous = 1, overwrite = {}, options = {})
12
- # Optimization for ASCII-only strings without control symbols.
13
- if overwrite.empty? && string.ascii_only? && !string.match?(ASCII_NON_ZERO_REGEX)
14
- return string.size
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
15
20
  end
16
21
 
17
- # Add width of each char
18
- res = string.codepoints.inject(0){ |total_width, codepoint|
19
- index_or_value = INDEX
20
- codepoint_depth_offset = codepoint
21
- DEPTHS.each{ |depth|
22
- index_or_value = index_or_value[codepoint_depth_offset / depth]
23
- codepoint_depth_offset = codepoint_depth_offset % depth
24
- break unless index_or_value.is_a? Array
25
- }
26
- width = index_or_value.is_a?(Array) ? index_or_value[codepoint_depth_offset] : index_or_value
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
27
33
  width = ambiguous if width == :A
28
- total_width + (overwrite[codepoint] || width || 1)
34
+ width || 1
29
35
  }
30
36
 
31
37
  # Substract emoji error
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unicode-display_width
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Lelis
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  requirements: []
84
- rubygems_version: 3.3.7
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.