Module: CLI::UI::ANSI
- Defined in:
- lib/cli/ui/ansi.rb
Constant Summary collapse
- ESC =
"\x1b"
Class Method Summary collapse
- .clear_to_end_of_line ⇒ Object
-
.control(args, cmd) ⇒ Object
Returns an ANSI control sequence.
-
.cursor_back(n = 1) ⇒ Object
Move the cursor back n columns.
-
.cursor_down(n = 1) ⇒ Object
Move the cursor down n lines.
-
.cursor_forward(n = 1) ⇒ Object
Move the cursor forward n columns.
-
.cursor_horizontal_absolute(n = 1) ⇒ Object
Move the cursor to a specific column.
-
.cursor_restore ⇒ Object
Restore the saved cursor position.
-
.cursor_save ⇒ Object
Save the cursor position.
-
.cursor_up(n = 1) ⇒ Object
Move the cursor up n lines.
-
.hide_cursor ⇒ Object
Hide the cursor.
-
.next_line ⇒ Object
Move to the next line.
-
.previous_line ⇒ Object
Move to the previous line.
-
.printing_width(str) ⇒ Object
ANSI escape sequences (like x1b[31m) have zero width. when calculating the padding width, we must exclude them. This also implements a basic version of utf8 character width calculation like we could get for real from something like utf8proc..
- .sgr(params) ⇒ Object
-
.show_cursor ⇒ Object
Show the cursor.
-
.strip_codes(str) ⇒ Object
Strips ANSI codes from a str.
Class Method Details
.clear_to_end_of_line ⇒ Object
148 149 150 |
# File 'lib/cli/ui/ansi.rb', line 148 def self.clear_to_end_of_line control('', 'K') end |
.control(args, cmd) ⇒ Object
Returns an ANSI control sequence
Attributes
-
args
- Argument to pass to the ANSI control sequence -
cmd
- ANSI control sequence Command
47 48 49 |
# File 'lib/cli/ui/ansi.rb', line 47 def self.control(args, cmd) ESC + "[" + args + cmd end |
.cursor_back(n = 1) ⇒ Object
Move the cursor back n columns
Attributes
-
n
- number of columns by which to move the cursor back
97 98 99 100 |
# File 'lib/cli/ui/ansi.rb', line 97 def self.cursor_back(n = 1) return '' if n.zero? control(n.to_s, 'D') end |
.cursor_down(n = 1) ⇒ Object
Move the cursor down n lines
Attributes
-
n
- number of lines by which to move the cursor down
75 76 77 78 |
# File 'lib/cli/ui/ansi.rb', line 75 def self.cursor_down(n = 1) return '' if n.zero? control(n.to_s, 'B') end |
.cursor_forward(n = 1) ⇒ Object
Move the cursor forward n columns
Attributes
-
n
- number of columns by which to move the cursor forward
86 87 88 89 |
# File 'lib/cli/ui/ansi.rb', line 86 def self.cursor_forward(n = 1) return '' if n.zero? control(n.to_s, 'C') end |
.cursor_horizontal_absolute(n = 1) ⇒ Object
Move the cursor to a specific column
Attributes
-
n
- The column to move to
108 109 110 |
# File 'lib/cli/ui/ansi.rb', line 108 def self.cursor_horizontal_absolute(n = 1) control(n.to_s, 'G') end |
.cursor_restore ⇒ Object
Restore the saved cursor position
132 133 134 |
# File 'lib/cli/ui/ansi.rb', line 132 def self.cursor_restore control('', 'u') end |
.cursor_save ⇒ Object
Save the cursor position
126 127 128 |
# File 'lib/cli/ui/ansi.rb', line 126 def self.cursor_save control('', 's') end |
.cursor_up(n = 1) ⇒ Object
Move the cursor up n lines
Attributes
-
n
- number of lines by which to move the cursor up
64 65 66 67 |
# File 'lib/cli/ui/ansi.rb', line 64 def self.cursor_up(n = 1) return '' if n.zero? control(n.to_s, 'A') end |
.hide_cursor ⇒ Object
Hide the cursor
120 121 122 |
# File 'lib/cli/ui/ansi.rb', line 120 def self.hide_cursor control('', "?25l") end |
.next_line ⇒ Object
Move to the next line
138 139 140 |
# File 'lib/cli/ui/ansi.rb', line 138 def self.next_line cursor_down + control('1', 'G') end |
.previous_line ⇒ Object
Move to the previous line
144 145 146 |
# File 'lib/cli/ui/ansi.rb', line 144 def self.previous_line cursor_up + control('1', 'G') end |
.printing_width(str) ⇒ Object
ANSI escape sequences (like x1b[31m) have zero width. when calculating the padding width, we must exclude them. This also implements a basic version of utf8 character width calculation like we could get for real from something like utf8proc.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/cli/ui/ansi.rb', line 13 def self.printing_width(str) zwj = false 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 else acc + 1 end end end |
.sgr(params) ⇒ Object
52 53 54 |
# File 'lib/cli/ui/ansi.rb', line 52 def self.sgr(params) control(params.to_s, 'm') end |
.show_cursor ⇒ Object
Show the cursor
114 115 116 |
# File 'lib/cli/ui/ansi.rb', line 114 def self.show_cursor control('', "?25h") end |
.strip_codes(str) ⇒ Object
Strips ANSI codes from a str
Attributes
-
str
- The string from which to strip codes
36 37 38 |
# File 'lib/cli/ui/ansi.rb', line 36 def self.strip_codes(str) str.gsub(/\x1b\[[\d;]+[A-z]|\r/, '') end |