Module: Terminal::Ansi
- Defined in:
- lib/terminal/ansi.rb,
lib/terminal/ansi/attributes.rb,
lib/terminal/ansi/named_colors.rb
Overview
Fast ANSI control code and BBCode processing.
Class Attribute Summary collapse
-
.attributes ⇒ Array<Symbol>
readonly
Supported attribute names.
-
.colors ⇒ Array<Symbol>
readonly
Supported 3/4-bit color names.
-
.named_colors ⇒ Array<Symbol>
readonly
Supported basic 24-bit (Kitty compatible) color names.
ANSI control code generator functions collapse
-
.[](*attributes) ⇒ String
Combine given ANSI Ansi.attributes, Ansi.colors, Ansi.named_colors and color codes.
-
.ansi?(str) ⇒ true, false
Test if given String contains ANSI control codes.
-
.decorate(str, *attributes, reset: true) ⇒ String
Decorate given argument with ANSI attributes and colors.
-
.try_convert(attributes, separator: ' ') ⇒ String?
Try to combine given ANSI attributes and colors.
-
.undecorate(str) ⇒ String
Remove ANSI functions, attributes and colors from given string.
-
.valid?(*attributes) ⇒ true, false
Test if all given attributes are valid.
BBcode related functions collapse
-
.bbcode(str) ⇒ String
Replace embedded BBCode-like attributes with ANSI control codes.
-
.unbbcode(str) ⇒ String
Remove embedded BBCode-like attributes.
Other tool functions collapse
-
.plain(str) ⇒ String
Remove any BBCode-like and/or ANSI attributes.
-
.rainbow(str, frequency: 0.3, spread: 0.8, seed: 1.1) ⇒ String
Create nice colored text.
Cursor manipulation collapse
-
.cursor_back(columns = 1) ⇒ String
Move cursor given columns back.
-
.cursor_column(column = 1) ⇒ String
Move cursor to given column in the current row.
-
.cursor_down(lines = 1) ⇒ String
Move cursor given lines down.
-
.cursor_forward(columns = 1) ⇒ String
Move cursor given columns forward.
-
.cursor_hide ⇒ String
Hide cursor.
-
.cursor_next_line(lines = 1) ⇒ String
Move cursor to the beginning of the given next line.
-
.cursor_pos(row, column = nil) ⇒ String
Move to given row and column.
-
.cursor_prev_line(lines = 1) ⇒ String
Move cursor to the beginning of the given previous line.
-
.cursor_restore_pos ⇒ String
Restore saved cursor position.
-
.cursor_save_pos ⇒ String
Save current cursor position.
-
.cursor_show ⇒ String
Show cursor.
-
.cursor_up(lines = 1) ⇒ String
Move cursor given lines up.
Screen manipulation collapse
-
.screen_alternate ⇒ String
Use alternative screen buffer.
-
.screen_alternate_off ⇒ String
Do not longer use alternative screen buffer.
-
.screen_erase(part = :all) ⇒ String
Erase screen part.
-
.screen_restore ⇒ String
Restore current screen.
-
.screen_save ⇒ String
Safe current screen.
-
.screen_scroll_down(lines = 1) ⇒ String
Scroll window given lines down.
-
.screen_scroll_up(lines = 1) ⇒ String
Scroll window given lines up.
Other ANSI control functions collapse
-
.line_erase(part = :all) ⇒ String
Erase part of line.
-
.link(url, text) ⇒ String
Create a hyperlink.
-
.tab_title(title) ⇒ String
Set tab title.
-
.title(title) ⇒ String
Set window title.
Class Attribute Details
.attributes ⇒ Array<Symbol> (readonly)
Supported attribute names.
15 |
# File 'lib/terminal/ansi.rb', line 15 def attributes = ATTRIBUTES_S.keys |
.colors ⇒ Array<Symbol> (readonly)
Supported 3/4-bit color names.
23 |
# File 'lib/terminal/ansi.rb', line 23 def colors = COLORS_S.keys |
.named_colors ⇒ Array<Symbol> (readonly)
Supported basic 24-bit (Kitty compatible) color names.
31 |
# File 'lib/terminal/ansi.rb', line 31 def named_colors = NAMED_COLORS.keys.map!(&:to_sym) |
Class Method Details
.[](*attributes) ⇒ String
Combine given ANSI attributes, colors, named_colors and color codes.
Colors can specified by their name for ANSI 3-bit and 4-bit colors.
For 8-bit ANSI colors use 2-digit hexadecimal values 00
...ff
.
To use RGB ANSI colors (24-bit colors) specify 3-digit or 6-digit
hexadecimal values 000
...fff
or 000000
...ffffff
.
This represent the RRGGBB
values (or RGB
for short version) like you
may known from CSS color notation.
To use a color as background color prefix the color attribute with bg_
or on_
.
To use a color as underline color prefix the color attribute with ul_
.
To clarify that a color attribute have to be used as foreground
color use the prefix fg_
.
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/terminal/ansi.rb', line 95 def [](*attributes) return +'' if attributes.empty? "\e[#{ attributes .map do |arg| case arg when String ATTRIBUTES[arg] || COLORS[arg] || _color(arg) || _invalid(arg) when Symbol ATTRIBUTES_S[arg] || COLORS_S[arg] || _color(arg) || _invalid(arg) when (0..255) "38;5;#{arg}" when (256..511) "48;5;#{arg - 256}" when (512..767) "58;5;#{arg - 512}" else _invalid(arg) end end .join(';') }m" end |
.ansi?(str) ⇒ true, false
Test if given String contains ANSI control codes.
124 |
# File 'lib/terminal/ansi.rb', line 124 def ansi?(str) = TEST.match?(str.to_s) |
.bbcode(str) ⇒ String
Replace embedded BBCode-like attributes with ANSI control codes.
225 226 227 228 229 230 231 232 233 |
# File 'lib/terminal/ansi.rb', line 225 def bbcode(str) str = str.to_s return str.dup unless str.index('[') str.gsub(BBCODE) do |match_str| next match_str if (match = Regexp.last_match[1]).empty? next "[#{match[1..]}]" if match[0] == '\\' try_convert(match) || match_str end end |
.cursor_back(columns = 1) ⇒ String
Move cursor given columns back.
335 |
# File 'lib/terminal/ansi.rb', line 335 def cursor_back(columns = 1) = "\e[#{columns}D" |
.cursor_column(column = 1) ⇒ String
Move cursor to given column in the current row.
353 |
# File 'lib/terminal/ansi.rb', line 353 def cursor_column(column = 1) = "\e[#{column}G" |
.cursor_down(lines = 1) ⇒ String
Move cursor given lines down.
323 |
# File 'lib/terminal/ansi.rb', line 323 def cursor_down(lines = 1) = "\e[#{lines}B" |
.cursor_forward(columns = 1) ⇒ String
Move cursor given columns forward.
329 |
# File 'lib/terminal/ansi.rb', line 329 def cursor_forward(columns = 1) = "\e[#{columns}C" |
.cursor_hide ⇒ String
Hide cursor.
373 |
# File 'lib/terminal/ansi.rb', line 373 def cursor_hide = +CURSOR_HIDE |
.cursor_next_line(lines = 1) ⇒ String
Move cursor to the beginning of the given next line.
341 |
# File 'lib/terminal/ansi.rb', line 341 def cursor_next_line(lines = 1) = "\e[#{lines}E" |
.cursor_pos(row, column = nil) ⇒ String
Move to given row and column.
360 361 362 363 |
# File 'lib/terminal/ansi.rb', line 360 def cursor_pos(row, column = nil) return column ? "\e[;#{column}H" : "\e[H" unless row column ? "\e[#{row};#{column}H" : "\e[#{row}H" end |
.cursor_prev_line(lines = 1) ⇒ String
Move cursor to the beginning of the given previous line.
347 |
# File 'lib/terminal/ansi.rb', line 347 def cursor_prev_line(lines = 1) = "\e[#{lines}F" |
.cursor_restore_pos ⇒ String
Restore saved cursor position.
383 |
# File 'lib/terminal/ansi.rb', line 383 def cursor_restore_pos = +CURSOR_POS_RESTORE |
.cursor_save_pos ⇒ String
Save current cursor position.
378 |
# File 'lib/terminal/ansi.rb', line 378 def cursor_save_pos = +CURSOR_POS_SAVE |
.cursor_show ⇒ String
Show cursor.
368 |
# File 'lib/terminal/ansi.rb', line 368 def cursor_show = +CURSOR_SHOW |
.cursor_up(lines = 1) ⇒ String
Move cursor given lines up.
317 |
# File 'lib/terminal/ansi.rb', line 317 def cursor_up(lines = 1) = "\e[#{lines}A" |
.decorate(str, *attributes, reset: true) ⇒ String
Decorate given argument with ANSI attributes and colors.
142 143 144 145 |
# File 'lib/terminal/ansi.rb', line 142 def decorate(str, *attributes, reset: true) attributes = self[*attributes] attributes.empty? ? "#{str}" : "#{attributes}#{str}#{"\e[m" if reset}" end |
.line_erase(part = :all) ⇒ String
Erase part of line.
450 451 452 453 454 455 456 457 458 459 460 461 |
# File 'lib/terminal/ansi.rb', line 450 def line_erase(part = :all) "\e[#{ case part when :to_end # nop when :to_start '1' else # :all '2' end }K" end |
.link(url, text) ⇒ String
Create a hyperlink. This is not widely supported.
483 |
# File 'lib/terminal/ansi.rb', line 483 def link(url, text) = "\e]8;;#{url}\a#{text}\e]8;;\a" |
.plain(str) ⇒ String
Remove any BBCode-like and/or ANSI attributes.
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
# File 'lib/terminal/ansi.rb', line 270 def plain(str) str = str.to_s unless str.index('[') return str.index("\e") ? str.gsub(TEST, '') : str.dup end str = str.gsub(BBCODE) do |match_str| next match_str if (match = Regexp.last_match[1]).empty? next "[#{match[1..]}]" if match[0] == '\\' next match_str if (match = match.split).empty? next if match.all? { ATTRIBUTES[_1] || COLORS[_1] || _color(_1) } match_str end str.index("\e") ? str.gsub!(TEST, '') : str end |
.rainbow(str, frequency: 0.3, spread: 0.8, seed: 1.1) ⇒ String
Create nice colored text.
293 294 295 296 297 298 299 300 301 302 303 304 305 |
# File 'lib/terminal/ansi.rb', line 293 def rainbow(str, frequency: 0.3, spread: 0.8, seed: 1.1) pos = -1 str .to_s .chars .map! do |char| i = (seed + ((pos += 1) / spread)) * frequency "\e[38;2;#{(Math.sin(i) * 255).abs.to_i};" \ "#{(Math.sin(i + PI2_THIRD) * 255).abs.to_i};" \ "#{(Math.sin(i + PI4_THIRD) * 255).abs.to_i}m#{char}" end .join << RESET end |
.screen_alternate ⇒ String
Use alternative screen buffer.
422 |
# File 'lib/terminal/ansi.rb', line 422 def screen_alternate = +SCREEN_ALTERNATE |
.screen_alternate_off ⇒ String
Do not longer use alternative screen buffer.
427 |
# File 'lib/terminal/ansi.rb', line 427 def screen_alternate_off = +SCREEN_ALTERNATE_OFF |
.screen_erase(part = :all) ⇒ String
Erase screen part.
394 395 396 397 398 399 400 401 402 403 404 405 406 407 |
# File 'lib/terminal/ansi.rb', line 394 def screen_erase(part = :all) "\e[#{ case part when :below # nop when :above '1' when :scrollback '3' else # all '2' end }J" end |
.screen_restore ⇒ String
Restore current screen.
417 |
# File 'lib/terminal/ansi.rb', line 417 def screen_restore = +SCREEN_RESTORE |
.screen_save ⇒ String
Safe current screen.
412 |
# File 'lib/terminal/ansi.rb', line 412 def screen_save = +SCREEN_SAVE |
.screen_scroll_down(lines = 1) ⇒ String
Scroll window given lines down.
439 |
# File 'lib/terminal/ansi.rb', line 439 def screen_scroll_down(lines = 1) = "\e[#{lines}T" |
.screen_scroll_up(lines = 1) ⇒ String
Scroll window given lines up.
433 |
# File 'lib/terminal/ansi.rb', line 433 def screen_scroll_up(lines = 1) = "\e[#{lines}S" |
.tab_title(title) ⇒ String
Set tab title. This is not widely supported.
475 |
# File 'lib/terminal/ansi.rb', line 475 def tab_title(title) = "\e]0;#{title}\a" |
.title(title) ⇒ String
Set window title. This is not widely supported.
468 |
# File 'lib/terminal/ansi.rb', line 468 def title(title) = "\e]2;#{title}\a" |
.try_convert(attributes, separator: ' ') ⇒ String?
Try to combine given ANSI attributes and colors.
The attributes and colors have to be separated by given separator
`.
179 180 181 182 183 184 185 186 187 |
# File 'lib/terminal/ansi.rb', line 179 def try_convert(attributes, separator: ' ') return unless attributes return if (attributes = attributes.to_s.split(separator)).empty? "\e[#{ attributes .map! { ATTRIBUTES[_1] || COLORS[_1] || _color(_1) || return } .join(';') }m" end |
.unbbcode(str) ⇒ String
Remove embedded BBCode-like attributes.
245 246 247 248 249 250 251 252 253 254 255 |
# File 'lib/terminal/ansi.rb', line 245 def unbbcode(str) str = str.to_s return str.dup unless str.index('[') str.gsub(BBCODE) do |match_str| next match_str if (match = Regexp.last_match[1]).empty? next "[#{match[1..]}]" if match[0] == '\\' next match_str if (match = match.split).empty? next if match.all? { ATTRIBUTES[_1] || COLORS[_1] || _color(_1) } match_str end end |
.undecorate(str) ⇒ String
Remove ANSI functions, attributes and colors from given string.
157 158 159 160 |
# File 'lib/terminal/ansi.rb', line 157 def undecorate(str) str = str.to_s str.index("\e") ? str.gsub(TEST, '') : str.dup end |
.valid?(*attributes) ⇒ true, false
Test if all given attributes are valid.
195 196 197 198 199 200 201 202 203 204 205 206 |
# File 'lib/terminal/ansi.rb', line 195 def valid?(*attributes) attributes.all? do |arg| case arg when String ATTRIBUTES[arg] || COLORS[arg] || _color(arg) when Symbol ATTRIBUTES_S[arg] || COLORS_S[arg] || _color(arg) when (0..767) true end end end |