brakeman 3.3.5 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/bundle/load.rb +2 -1
  4. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/Gemfile +0 -0
  5. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/History.rdoc +13 -0
  6. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/Manifest +0 -0
  7. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/README.rdoc +1 -1
  8. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/Rakefile +0 -0
  9. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/Todo.rdoc +0 -0
  10. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/examples/examples.rb +0 -0
  11. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/lib/terminal-table.rb +0 -0
  12. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/lib/terminal-table/cell.rb +5 -2
  13. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/lib/terminal-table/import.rb +0 -0
  14. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/lib/terminal-table/row.rb +0 -0
  15. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/lib/terminal-table/separator.rb +0 -0
  16. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/lib/terminal-table/style.rb +0 -0
  17. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/lib/terminal-table/table.rb +13 -3
  18. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/lib/terminal-table/table_helper.rb +0 -0
  19. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/lib/terminal-table/version.rb +1 -1
  20. data/bundle/ruby/2.3.0/gems/{terminal-table-1.6.0 → terminal-table-1.7.1}/terminal-table.gemspec +2 -0
  21. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/CHANGELOG.txt +73 -0
  22. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/MIT-LICENSE.txt +22 -0
  23. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/README.md +102 -0
  24. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/Rakefile +63 -0
  25. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/data/display_width.marshal.gz +0 -0
  26. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/lib/unicode/display_width.rb +30 -0
  27. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/lib/unicode/display_width/constants.rb +8 -0
  28. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/lib/unicode/display_width/index.rb +7 -0
  29. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/lib/unicode/display_width/no_string_ext.rb +7 -0
  30. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/lib/unicode/display_width/string_ext.rb +17 -0
  31. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/spec/display_width_spec.rb +126 -0
  32. data/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/unicode-display_width.gemspec +18 -0
  33. data/lib/brakeman.rb +18 -1
  34. data/lib/brakeman/options.rb +8 -4
  35. data/lib/brakeman/processors/output_processor.rb +8 -2
  36. data/lib/brakeman/processors/slim_template_processor.rb +20 -2
  37. data/lib/brakeman/report.rb +8 -1
  38. data/lib/brakeman/report/ignore/config.rb +18 -0
  39. data/lib/brakeman/report/ignore/interactive.rb +35 -0
  40. data/lib/brakeman/report/report_base.rb +5 -0
  41. data/lib/brakeman/report/report_json.rb +4 -1
  42. data/lib/brakeman/report/report_table.rb +1 -0
  43. data/lib/brakeman/report/report_text.rb +193 -0
  44. data/lib/brakeman/tracker.rb +5 -0
  45. data/lib/brakeman/version.rb +1 -1
  46. data/lib/brakeman/warning.rb +10 -0
  47. metadata +32 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cf3ec799d00cd306891f940fec15f85f7d602ef7
4
- data.tar.gz: bdd6222232e1033f0324e9e614e4a72392d0f27d
3
+ metadata.gz: 0af994ff904b9ab144c23dfeb8e4f547cabcec39
4
+ data.tar.gz: eeb3ea20459025facc48074b483a35487eb9ba4f
5
5
  SHA512:
6
- metadata.gz: 1f5b4467e46909ff8070c9294e58455141f0f0f895461a413a2270a2b6dd0df823add37ea960e612e984d80b01e599cadbb0d4de82d12530972a198a3ff852cc
7
- data.tar.gz: 46bef08960474626ebdfab6c65a5c3447940ad7a97a934874c57b6fbeb5a496634a650698baaf919f04f8e1bfcd56759a4b7486172dd0de36ed272359ced5b2c
6
+ metadata.gz: 94a5d9d71cb022313833f3b2c364878f1f3e24e6f265023285fbdd38c90dd4f6f610498fae94fa24c9472ae74eb02d65126db1c4356d7a8c453bb15ef6de4173
7
+ data.tar.gz: bac267af1c2bf6fe1f4c5cb31a3935078c943879fd0b6a2cb76929d407591723322fdeda0fd3ee702b84c809eedfe3f4263dc10e47cda9ca4abd89b0ff5295ac
data/CHANGES CHANGED
@@ -1,3 +1,12 @@
1
+ # 3.4.0
2
+
3
+ * Add new `plain` report format
4
+ * Add option to prune ignore file with `-I`
5
+ * Improved Slim template support
6
+ * Show obsolete ignore entries in reports (Jonathan Cheatham)
7
+ * Support creating reports in non-existent paths
8
+ * Add `--no-exit-warn`
9
+
1
10
  # 3.3.5
2
11
 
3
12
  * Fix bug in reports when using --debug option
@@ -1,7 +1,9 @@
1
1
  path = File.expand_path('../..', __FILE__)
2
2
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/haml-4.0.7/lib"
3
+ $:.unshift "#{path}/bundle/ruby/2.3.0/gems/terminal-table-1.7.1/lib"
3
4
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/highline-1.7.8/lib"
4
5
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/temple-0.7.7/lib"
6
+ $:.unshift "#{path}/bundle/ruby/2.3.0/gems/unicode-display_width-1.1.1/lib"
5
7
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/ruby_parser-3.8.2/lib"
6
8
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/ruby2ruby-2.3.0/lib"
7
9
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/sexp_processor-4.7.0/lib"
@@ -9,6 +11,5 @@ $:.unshift "#{path}/bundle/ruby/2.3.0/gems/slim-3.0.7/lib"
9
11
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/sass-3.4.22/lib"
10
12
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/sass-3.4.22/vendor/listen/lib"
11
13
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/erubis-2.7.0/lib"
12
- $:.unshift "#{path}/bundle/ruby/2.3.0/gems/terminal-table-1.6.0/lib"
13
14
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib"
14
15
  $:.unshift "#{path}/bundle/ruby/2.3.0/gems/tilt-2.0.5/lib"
@@ -1,3 +1,16 @@
1
+ 1.7.1 / 2016-08-29
2
+ ==================
3
+
4
+ * Update `unicode-display_width` to fix behavior with signal traps [#78, @jrmhaig]
5
+
6
+ 1.7.0 / 2016-08-29
7
+ ==================
8
+
9
+ All props to @vizv for this release!
10
+
11
+ * Fixed some spec failures
12
+ * Added support for full-width characters (East Asian alphabets, etc)
13
+
1
14
  1.6.0 / 2016-06-06
2
15
  ==================
3
16
 
@@ -190,7 +190,7 @@ And change styles on the fly:
190
190
 
191
191
  To change the default style options:
192
192
 
193
- Terminal::Style.defaults = {:width => 80}
193
+ Terminal::Table::Style.defaults = {:width => 80}
194
194
 
195
195
  All Table objects created afterwards will inherit these defaults.
196
196
 
@@ -1,3 +1,5 @@
1
+ require 'unicode/display_width'
2
+
1
3
  module Terminal
2
4
  class Table
3
5
  class Cell
@@ -55,7 +57,8 @@ module Terminal
55
57
  def render(line = 0)
56
58
  left = " " * @table.style.padding_left
57
59
  right = " " * @table.style.padding_right
58
- render_width = lines[line].to_s.size - escape(lines[line]).size + width
60
+ display_width = Unicode::DisplayWidth.of(escape(lines[line]))
61
+ render_width = lines[line].to_s.size - display_width + width
59
62
  align("#{left}#{lines[line]}#{right}", alignment, render_width + @table.cell_padding)
60
63
  end
61
64
  alias :to_s :render
@@ -65,7 +68,7 @@ module Terminal
65
68
  # removes all ANSI escape sequences (e.g. color)
66
69
 
67
70
  def value_for_column_width_recalc
68
- lines.map{ |s| escape(s) }.max_by{ |s| s.size }
71
+ lines.map{ |s| escape(s) }.max_by{ |s| Unicode::DisplayWidth.of(s) }
69
72
  end
70
73
 
71
74
  ##
@@ -1,3 +1,5 @@
1
+ require 'unicode/display_width'
2
+
1
3
  module Terminal
2
4
  class Table
3
5
 
@@ -57,7 +59,15 @@ module Terminal
57
59
 
58
60
  def column n, method = :value, array = rows
59
61
  array.map { |row|
60
- cell = row[n]
62
+ # for each cells in a row, find the column with index
63
+ # just greater than the required one, and go back one.
64
+ index = col = 0
65
+ row.cells.each do |cell|
66
+ break if index > n
67
+ index += cell.colspan
68
+ col += 1
69
+ end
70
+ cell = row[col - 1]
61
71
  cell && method ? cell.__send__(method) : cell
62
72
  }.compact
63
73
  end
@@ -126,7 +136,7 @@ module Terminal
126
136
  buffer += @rows
127
137
  buffer << separator
128
138
  end
129
- buffer.map { |r| style.margin_left + r.render }.join("\n")
139
+ buffer.map { |r| style.margin_left + r.render.rstrip }.join("\n")
130
140
  end
131
141
  alias :to_s :render
132
142
 
@@ -192,7 +202,7 @@ module Terminal
192
202
  colspan = cell.colspan
193
203
  cell_value = cell.value_for_column_width_recalc
194
204
  colspan.downto(1) do |j|
195
- cell_length = cell_value.to_s.length
205
+ cell_length = Unicode::DisplayWidth.of(cell_value.to_s)
196
206
  if colspan > 1
197
207
  spacing_length = cell_spacing * (colspan - 1)
198
208
  length_in_columns = (cell_length - spacing_length)
@@ -1,5 +1,5 @@
1
1
  module Terminal
2
2
  class Table
3
- VERSION = '1.6.0'
3
+ VERSION = '1.7.1'
4
4
  end
5
5
  end
@@ -21,4 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "rspec", ">= 3.0"
22
22
  spec.add_development_dependency "term-ansicolor"
23
23
  spec.add_development_dependency "pry"
24
+
25
+ spec.add_runtime_dependency "unicode-display_width", "~> 1.1.1"
24
26
  end
@@ -0,0 +1,73 @@
1
+ # CHANGELOG
2
+
3
+ ## 1.1.1
4
+
5
+ * Always load index into memory, fixes #9
6
+
7
+ ## 1.1.0
8
+
9
+ * Support Unicode 9.0
10
+
11
+ ## 1.0.5
12
+
13
+ * Actually include new index from 1.0.4
14
+
15
+ ## 1.0.4
16
+
17
+ * New index format (much smaller) and internal API changes
18
+ * Move index generation to a builder plugin for the unicoder gem
19
+ * No public API changes
20
+
21
+ ## 1.0.3
22
+
23
+ * Avoid circular dependency warning
24
+
25
+ ## 1.0.2
26
+
27
+ * Fix error that gemspec might be invalid under some circumstances (see gh#6)
28
+
29
+ ## 1.0.1
30
+
31
+ * Inofficially allow Ruby 1.9
32
+
33
+ ## 1.0.0
34
+
35
+ * Faster than 0.3.1
36
+ * Advanced determination of character width
37
+ * This includes: Treat width of most chars of general categories (Mn, Me, Cf) as 0
38
+ * This includes: Introduce list of characters with special widths
39
+ * Allow custom overrides for specific codepoints
40
+ * Set required Ruby version to 2.0
41
+ * Add NO_STRING_EXT mode to disable monkey patching
42
+ * Internal API & index format changed drastically
43
+ * Remove require 'unicode/display_size' (use 'unicode/display_width' instead)
44
+
45
+ ## 0.3.1
46
+
47
+ * Faster than 0.3.0
48
+ * Deprecate usage of aliases: String#display_size and String#display_length
49
+ * Eliminate Ruby warnings (@amatsuda)
50
+
51
+ ## 0.3.0
52
+
53
+ * Update EastAsianWidth from 7.0 to 8.0
54
+ * Add rake task to update EastAsianWidth.txt
55
+ * Move code to generate index from library to Rakefile
56
+ * Update project's meta files
57
+ * Deprecate requiring 'unicode-display_size'
58
+
59
+ ## 0.2.0
60
+
61
+ * Update EastAsianWidth from 6.0 to 7.0
62
+ * Don't build index table automatically when not available
63
+ * Don't include EastAsianWidth.txt in gem (only index)
64
+
65
+
66
+ ## 0.1.0
67
+
68
+ * Fix github issue #1
69
+
70
+
71
+ ## 0.1.0
72
+
73
+ * Initial release
@@ -0,0 +1,22 @@
1
+ The MIT LICENSE
2
+
3
+ Copyright (c) 2011, 2015-2016 Jan Lelis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,102 @@
1
+ ## Unicode::DisplayWidth [![[version]](https://badge.fury.io/rb/unicode-display_width.svg)](http://badge.fury.io/rb/unicode-display_width) [<img src="https://travis-ci.org/janlelis/unicode-display_width.png" />](https://travis-ci.org/janlelis/unicode-display_width)
2
+
3
+ Determines the monospace display width of a string in Ruby. Implementation based on [EastAsianWidth.txt](http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt) and other data, 100% in Ruby. Other than [wcwidth()](https://github.com/janlelis/wcswidth-ruby), which fulfills a similar purpose, it does not rely on the OS vendor to provide an up-to-date method for measuring string width.
4
+
5
+ Unicode version: **9.0.0**
6
+
7
+ ## Introduction to Character Widths
8
+
9
+ Guesing the correct space a character will consume on terminals is not easy. There is no single standard. Most implementations combine data from [East Asian Width](http://www.unicode.org/reports/tr11/), some [General Categories](https://en.wikipedia.org/wiki/Unicode_character_property#General_Category), and hand-picked adjustments.
10
+
11
+ ### How this Library Handles Widths
12
+
13
+ Further at the top means higher precedence. Please expect changes to this algorithm with every MINOR version update (the X in 1.X.0)!
14
+
15
+ Width | Characters | Comment
16
+ -------|------------------------------|--------------------------------------------------
17
+ X | (user defined) | Overwrites any other values
18
+ -1 | `"\b"` | Backspace (total width never below 0)
19
+ 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) that do not change horizontal width
20
+ 1 | `"\u{00AD}"` | SOFT HYPHEN
21
+ 2 | `"\u{2E3A}"` | TWO-EM DASH
22
+ 3 | `"\u{2E3B}"` | THREE-EM DASH
23
+ 0 | General Categories: Mn, Me, Cf (non-arabic) | Excludes ARABIC format characters
24
+ 0 | `"\u{1160}".."\u{11FF}"` | HANGUL JUNGSEONG
25
+ 2 | East Asian Width: F, W | Full-width characters
26
+ 1 or 2 | East Asian Width: A | Ambiguous characters, user defined, default: 1
27
+ 1 | All other codepoints | -
28
+
29
+ ## Install
30
+
31
+ Install the gem with:
32
+
33
+ gem install unicode-display_width
34
+
35
+ Or add to your Gemfile:
36
+
37
+ gem 'unicode-display_width'
38
+
39
+ ## Usage
40
+
41
+ ```ruby
42
+ require 'unicode/display_width'
43
+
44
+ Unicode::DisplayWidth.of("⚀") # => 1
45
+ Unicode::DisplayWidth.of("一") # => 2
46
+ ```
47
+
48
+ ### Ambiguous Characters
49
+
50
+ The second parameter defines the value returned by characterrs defined as ambiguous:
51
+
52
+ ```ruby
53
+ Unicode::DisplayWidth.of("·", 1) # => 1
54
+ Unicode::DisplayWidth.of("·", 2) # => 2
55
+ ```
56
+
57
+ ### Custom Overwrites
58
+
59
+ You can overwrite how to handle specific code points by passing a hash (or even a proc) as third parameter:
60
+
61
+ ```ruby
62
+ Unicode::DisplayWidth.of("a\tb", 1, 0x09 => 10)) # => 12
63
+ ```
64
+
65
+ ### Usage with String Extension
66
+
67
+ Activated by default. Will be deactivated in version 2.0:
68
+
69
+ ```ruby
70
+ require 'unicode/display_width/string_ext'
71
+
72
+ "⚀".display_width #=> 1
73
+ '一'.display_width #=> 2
74
+ ```
75
+
76
+ You can actively opt-out from the string extension with: `require 'unicode/display_width/no_string_ext'`
77
+
78
+ ### Usage From the CLI
79
+
80
+ Use this one-liner to print out display widths for strings from the command-line:
81
+
82
+ ```
83
+ $ gem install unicode-display_width
84
+ $ ruby -r unicode/display_width -e 'puts Unicode::DisplayWidth.of $*[0]' -- "一"
85
+ ```
86
+ Replace "一" with the actual string to measure
87
+
88
+ ## Other Implementations & Discussion
89
+
90
+ - Python: https://github.com/jquast/wcwidth
91
+ - JavaScript: https://github.com/mycoboco/wcwidth.js
92
+ - C: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
93
+ - C for Julia: https://github.com/JuliaLang/utf8proc/issues/2
94
+
95
+ See [unicode-x](https://github.com/janlelis/unicode-x) for more Unicode related micro libraries.
96
+
97
+ ## Copyright & Info
98
+
99
+ - Copyright (c) 2011, 2015-2016 Jan Lelis, http://janlelis.com, released under the MIT
100
+ license
101
+ - Early versions based on runpaint's unicode-data interface: Copyright (c) 2009 Run Paint Run Run
102
+ - Unicode data: http://www.unicode.org/copyright.html#Exhibit1
@@ -0,0 +1,63 @@
1
+ # # #
2
+ # Get gemspec info
3
+
4
+ gemspec_file = Dir['*.gemspec'].first
5
+ gemspec = eval File.read(gemspec_file), binding, gemspec_file
6
+ info = "#{gemspec.name} | #{gemspec.version} | " \
7
+ "#{gemspec.runtime_dependencies.size} dependencies | " \
8
+ "#{gemspec.files.size} files"
9
+
10
+
11
+ # # #
12
+ # Gem build and install task
13
+
14
+ desc info
15
+ task :gem do
16
+ puts info + "\n\n"
17
+ print " "; sh "gem build #{gemspec_file}"
18
+ FileUtils.mkdir_p 'pkg'
19
+ FileUtils.mv "#{gemspec.name}-#{gemspec.version}.gem", 'pkg'
20
+ puts; sh %{gem install --no-document pkg/#{gemspec.name}-#{gemspec.version}.gem}
21
+ end
22
+
23
+
24
+ # # #
25
+ # Start an IRB session with the gem loaded
26
+
27
+ desc "#{gemspec.name} | IRB"
28
+ task :irb do
29
+ sh "irb -I ./lib -r #{gemspec.name.gsub '-','/'}"
30
+ end
31
+
32
+ # # #
33
+ # Run all specs
34
+
35
+
36
+ desc "#{gemspec.name} | Test"
37
+ task :test do
38
+ sh "rspec spec"
39
+ end
40
+ task :default => :test
41
+
42
+ # # #
43
+ # Update index table
44
+
45
+ namespace :update do
46
+ desc "#{gemspec.name} | Update index"
47
+ task :index do
48
+ require File.dirname(__FILE__) + '/lib/unicode/display_width/index_builder'
49
+ Unicode::DisplayWidth::IndexBuilder.build!
50
+ end
51
+ end
52
+
53
+ # # #
54
+ # Update data file
55
+
56
+ namespace :update do
57
+ desc "#{gemspec.name} | Update unicode data"
58
+ task :data do
59
+ require File.dirname(__FILE__) + '/lib/unicode/display_width/index_builder'
60
+ Unicode::DisplayWidth::IndexBuilder.fetch!
61
+ end
62
+ end
63
+
@@ -0,0 +1,30 @@
1
+ require_relative 'display_width/constants'
2
+ require_relative 'display_width/index'
3
+
4
+ module Unicode
5
+ module DisplayWidth
6
+ def self.of(string, ambiguous = 1, overwrite = {})
7
+ res = string.unpack('U*').inject(0){ |total_width, codepoint|
8
+ index_or_value = INDEX
9
+ codepoint_depth_offset = codepoint
10
+ [0x10000, 0x1000, 0x100, 0x10].each{ |depth|
11
+ index_or_value = index_or_value[codepoint_depth_offset / depth]
12
+ codepoint_depth_offset = codepoint_depth_offset % depth
13
+ break unless index_or_value.is_a? Array
14
+ }
15
+ width = index_or_value.is_a?(Array) ? index_or_value[codepoint_depth_offset] : index_or_value
16
+ width = ambiguous if width == :A
17
+ total_width + (overwrite[codepoint] || width || 1)
18
+ }
19
+
20
+ res < 0 ? 0 : res
21
+ end
22
+ end
23
+ end
24
+
25
+ # Allows you to opt-out of the default string extension. Will eventually be removed,
26
+ # so you must opt-in for the core extension by requiring 'display_width/string_ext'
27
+ unless defined?(Unicode::DisplayWidth::NO_STRING_EXT) && Unicode::DisplayWidth::NO_STRING_EXT
28
+ require_relative 'display_width/string_ext'
29
+ end
30
+