Module: CLI::UI::ANSI

Extended by:
T::Sig
Defined in:
lib/cli/ui/ansi.rb

Constant Summary collapse

ESC =
"\x1b"

Class Method Summary collapse

Methods included from T::Sig

sig

Class Method Details

.clear_to_end_of_lineObject


176
177
178
# File 'lib/cli/ui/ansi.rb', line 176

def self.clear_to_end_of_line
  control('', 'K')
end

.control(args, cmd) ⇒ Object


56
57
58
# File 'lib/cli/ui/ansi.rb', line 56

def self.control(args, cmd)
  ESC + '[' + args + cmd
end

.cursor_back(n = 1) ⇒ Object


114
115
116
117
118
# File 'lib/cli/ui/ansi.rb', line 114

def self.cursor_back(n = 1)
  return '' if n.zero?

  control(n.to_s, 'D')
end

.cursor_down(n = 1) ⇒ Object


88
89
90
91
92
# File 'lib/cli/ui/ansi.rb', line 88

def self.cursor_down(n = 1)
  return '' if n.zero?

  control(n.to_s, 'B')
end

.cursor_forward(n = 1) ⇒ Object


101
102
103
104
105
# File 'lib/cli/ui/ansi.rb', line 101

def self.cursor_forward(n = 1)
  return '' if n.zero?

  control(n.to_s, 'C')
end

.cursor_horizontal_absolute(n = 1) ⇒ Object


127
128
129
130
131
# File 'lib/cli/ui/ansi.rb', line 127

def self.cursor_horizontal_absolute(n = 1)
  cmd = control(n.to_s, 'G')
  cmd += cursor_back if CLI::UI::OS.current.shift_cursor_back_on_horizontal_absolute?
  cmd
end

.cursor_restoreObject


157
158
159
# File 'lib/cli/ui/ansi.rb', line 157

def self.cursor_restore
  control('', 'u')
end

.cursor_saveObject


150
151
152
# File 'lib/cli/ui/ansi.rb', line 150

def self.cursor_save
  control('', 's')
end

.cursor_up(n = 1) ⇒ Object


75
76
77
78
79
# File 'lib/cli/ui/ansi.rb', line 75

def self.cursor_up(n = 1)
  return '' if n.zero?

  control(n.to_s, 'A')
end

.hide_cursorObject


143
144
145
# File 'lib/cli/ui/ansi.rb', line 143

def self.hide_cursor
  control('', '?25l')
end

.next_lineObject


164
165
166
# File 'lib/cli/ui/ansi.rb', line 164

def self.next_line
  cursor_down + cursor_horizontal_absolute
end

.previous_lineObject


171
172
173
# File 'lib/cli/ui/ansi.rb', line 171

def self.previous_line
  cursor_up + cursor_horizontal_absolute
end

.printing_width(str) ⇒ Object


18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/cli/ui/ansi.rb', line 18

def self.printing_width(str)
  zwj = T.let(false, T::Boolean)
  strip_codes(str).codepoints.reduce(0) do |acc, cp|
    if zwj
      zwj = false
      next acc
    end
    case cp
    when 0x200d # zero-width joiner
      zwj = true
      acc
    when "\n"
      acc
    else
      acc + 1
    end
  end
end

.sgr(params) ⇒ Object


62
63
64
# File 'lib/cli/ui/ansi.rb', line 62

def self.sgr(params)
  control(params, 'm')
end

.show_cursorObject


136
137
138
# File 'lib/cli/ui/ansi.rb', line 136

def self.show_cursor
  control('', '?25h')
end

.strip_codes(str) ⇒ Object


44
45
46
# File 'lib/cli/ui/ansi.rb', line 44

def self.strip_codes(str)
  str.gsub(/\x1b\[[\d;]+[A-z]|\r/, '')
end