Module: VisualWidth

Defined in:
lib/visual_width/data.rb,
lib/visual_width.rb,
lib/visual_width/version.rb,
lib/visual_width/string_refine.rb

Overview

THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT IT!

Unicode version 6.3.0 of EastAsianWidth characters

see www.unicode.org/reports/tr11/ for specification see www.unicode.org/Public/UNIDATA/EastAsianWidth.txt for data

Constant Summary collapse

EAST_ASIAN =
true
Wide =
'[' +
'\u{1100}-\u{115F}' +
'\u{2329}-\u{232A}' +
'\u{2E80}-\u{2FFF}' +
'\u{3001}-\u{303E}' +
'\u{3041}-\u{3247}' +
'\u{3250}-\u{4DBF}' +
'\u{4E00}-\u{A4CF}' +
'\u{A960}-\u{A97F}' +
'\u{AC00}-\u{D7AF}' +
'\u{F900}-\u{FAFF}' +
'\u{FE10}-\u{FE1F}' +
'\u{FE30}-\u{FE6F}' +
'\u{1B000}-\u{1CFFF}' +
'\u{1F200}-\u{1F2FF}' +
'\u{20000}-\u{E0000}' +
']'
Fullwide =
'[' +
'\u{3000}' +
'\u{FF01}-\u{FF60}' +
'\u{FFE0}-\u{FFE7}' +
']'
Ambiguous =
'[' +
'\u{00A1}' +
'\u{00A4}' +
'\u{00A7}-\u{00A8}' +
'\u{00AA}' +
'\u{00AD}-\u{00AE}' +
'\u{00B0}-\u{00B4}' +
'\u{00B6}-\u{00BA}' +
'\u{00BC}-\u{00BF}' +
'\u{00C6}' +
'\u{00D0}' +
'\u{00D7}-\u{00D8}' +
'\u{00DE}-\u{00E1}' +
'\u{00E6}' +
'\u{00E8}-\u{00EA}' +
'\u{00EC}-\u{00ED}' +
'\u{00F0}' +
'\u{00F2}-\u{00F3}' +
'\u{00F7}-\u{00FA}' +
'\u{00FC}' +
'\u{00FE}' +
'\u{0101}' +
'\u{0111}' +
'\u{0113}' +
'\u{011B}' +
'\u{0126}-\u{0127}' +
'\u{012B}' +
'\u{0131}-\u{0133}' +
'\u{0138}' +
'\u{013F}-\u{0142}' +
'\u{0144}' +
'\u{0148}-\u{014B}' +
'\u{014D}' +
'\u{0152}-\u{0153}' +
'\u{0166}-\u{0167}' +
'\u{016B}' +
'\u{01CE}' +
'\u{01D0}' +
'\u{01D2}' +
'\u{01D4}' +
'\u{01D6}' +
'\u{01D8}' +
'\u{01DA}' +
'\u{01DC}' +
'\u{0251}' +
'\u{0261}' +
'\u{02C4}' +
'\u{02C7}' +
'\u{02C9}-\u{02CB}' +
'\u{02CD}' +
'\u{02D0}' +
'\u{02D8}-\u{02DB}' +
'\u{02DD}' +
'\u{02DF}' +
'\u{0300}-\u{036F}' +
'\u{0391}-\u{03A9}' +
'\u{03B1}-\u{03C1}' +
'\u{03C3}-\u{03C9}' +
'\u{0401}' +
'\u{0410}-\u{044F}' +
'\u{0451}' +
'\u{2010}' +
'\u{2013}-\u{2016}' +
'\u{2018}-\u{2019}' +
'\u{201C}-\u{201D}' +
'\u{2020}-\u{2022}' +
'\u{2024}-\u{2027}' +
'\u{2030}' +
'\u{2032}-\u{2033}' +
'\u{2035}' +
'\u{203B}' +
'\u{203E}' +
'\u{2074}' +
'\u{207F}' +
'\u{2081}-\u{2084}' +
'\u{20AC}' +
'\u{2103}' +
'\u{2105}' +
'\u{2109}' +
'\u{2113}' +
'\u{2116}' +
'\u{2121}-\u{2122}' +
'\u{2126}' +
'\u{212B}' +
'\u{2153}-\u{2154}' +
'\u{215B}-\u{215E}' +
'\u{2160}-\u{216B}' +
'\u{2170}-\u{2179}' +
'\u{2189}-\u{2199}' +
'\u{21B8}-\u{21B9}' +
'\u{21D2}' +
'\u{21D4}' +
'\u{21E7}' +
'\u{2200}' +
'\u{2202}-\u{2203}' +
'\u{2207}-\u{2208}' +
'\u{220B}' +
'\u{220F}' +
'\u{2211}' +
'\u{2215}' +
'\u{221A}' +
'\u{221D}-\u{2220}' +
'\u{2223}' +
'\u{2225}' +
'\u{2227}-\u{222C}' +
'\u{222E}' +
'\u{2234}-\u{2237}' +
'\u{223C}-\u{223D}' +
'\u{2248}' +
'\u{224C}' +
'\u{2252}' +
'\u{2260}-\u{2261}' +
'\u{2264}-\u{2267}' +
'\u{226A}-\u{226B}' +
'\u{226E}-\u{226F}' +
'\u{2282}-\u{2283}' +
'\u{2286}-\u{2287}' +
'\u{2295}' +
'\u{2299}' +
'\u{22A5}' +
'\u{22BF}' +
'\u{2312}' +
'\u{2460}-\u{24E9}' +
'\u{24EB}-\u{254B}' +
'\u{2550}-\u{2573}' +
'\u{2580}-\u{258F}' +
'\u{2592}-\u{2595}' +
'\u{25A0}-\u{25A1}' +
'\u{25A3}-\u{25A9}' +
'\u{25B2}-\u{25B3}' +
'\u{25B6}-\u{25B7}' +
'\u{25BC}-\u{25BD}' +
'\u{25C0}-\u{25C1}' +
'\u{25C6}-\u{25C8}' +
'\u{25CB}' +
'\u{25CE}-\u{25D1}' +
'\u{25E2}-\u{25E5}' +
'\u{25EF}' +
'\u{2605}-\u{2606}' +
'\u{2609}' +
'\u{260E}-\u{260F}' +
'\u{2614}-\u{2615}' +
'\u{261C}' +
'\u{261E}' +
'\u{2640}' +
'\u{2642}' +
'\u{2660}-\u{2661}' +
'\u{2663}-\u{2665}' +
'\u{2667}-\u{266A}' +
'\u{266C}-\u{266D}' +
'\u{266F}' +
'\u{269E}-\u{269F}' +
'\u{26BE}-\u{26BF}' +
'\u{26C4}-\u{26CD}' +
'\u{26CF}-\u{26E1}' +
'\u{26E3}' +
'\u{26E8}-\u{2700}' +
'\u{273D}' +
'\u{2757}' +
'\u{2776}-\u{277F}' +
'\u{2B55}-\u{2BFF}' +
'\u{3248}-\u{324F}' +
'\u{E000}-\u{F8FF}' +
'\u{FE00}-\u{FE0F}' +
'\u{FFFD}-\u{FFFF}' +
'\u{1F100}-\u{1F12D}' +
'\u{1F130}-\u{1F169}' +
'\u{1F170}-\u{1F1E5}' +
']'
VERSION =
"0.0.1"
@@c1 =
/( (?:#{Fullwide} | #{Wide} | #{Ambiguous})+ )/x
@@c0 =
/( (?:#{Fullwide} | #{Wide}               )+ )/x
@@t1 =
/( (?:#{Fullwide} | #{Wide} | #{Ambiguous}) ) | ./x
@@t0 =
/( (?:#{Fullwide} | #{Wide}               ) ) | ./x

Class Method Summary collapse

Class Method Details

.count(str, east_asian: EAST_ASIAN) ⇒ Object



15
16
17
18
19
20
21
22
# File 'lib/visual_width.rb', line 15

def count(str, east_asian: EAST_ASIAN)
  rx = east_asian ? @@c1 : @@c0
  full_width = 0
  str.scan(rx) do |w,|
    full_width += w.length
  end
  (full_width * 2) + (str.length - full_width)
end

.truncate(str, max_length, omission: '...', east_asian: EAST_ASIAN) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/visual_width.rb', line 24

def truncate(str, max_length, omission: '...', east_asian: EAST_ASIAN)
  max = max_length - omission.length
  rx = east_asian ? @@t1 : @@t0
  pos = 0
  width = 0
  str.scan(rx) do |wide,|
    if wide
      width += 2
    else
      width += 1
    end

    if width > max
      break
    end

    pos += 1

    if width == max
      break
    end
  end

  if width < str.length
    str.slice(0, pos) + omission
  else
    str
  end
end