File: color.rb

package info (click to toggle)
ruby-sshkit 1.21.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 700 kB
  • sloc: ruby: 3,522; makefile: 2
file content (58 lines) | stat: -rw-r--r-- 1,881 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
53
54
55
56
57
58
module SSHKit
  # Very basic support for ANSI color, so that we don't have to rely on
  # any external dependencies. This class handles colorizing strings, and
  # automatically disabling color if the underlying output is not a tty.
  #
  class Color
    COLOR_CODES = {
      :black   => 30,
      :red     => 31,
      :green   => 32,
      :yellow  => 33,
      :blue    => 34,
      :magenta => 35,
      :cyan    => 36,
      :white   => 37,
      :light_black   => 90,
      :light_red     => 91,
      :light_green   => 92,
      :light_yellow  => 93,
      :light_blue    => 94,
      :light_magenta => 95,
      :light_cyan    => 96,
      :light_white   => 97
    }.freeze

    def initialize(output, env=ENV)
      @output, @env = output, env
    end

    # Converts the given obj to string and surrounds in the appropriate ANSI
    # color escape sequence, based on the specified color and mode. The color
    # must be a symbol (see COLOR_CODES for a complete list).
    #
    # If the underlying output does not support ANSI color (see `colorize?),
    # the string will be not be colorized. Likewise if the specified color
    # symbol is unrecognized, the string will not be colorized.
    #
    # Note that the only mode currently support is :bold. All other values
    # will be silently ignored (i.e. treated the same as mode=nil).
    #
    def colorize(obj, color, mode=nil)
      string = obj.to_s
      return string unless colorize?
      return string unless COLOR_CODES.key?(color)

      result = mode == :bold ? "\e[1;" : "\e[0;"
      result << COLOR_CODES.fetch(color).to_s
      result << ";49m#{string}\e[0m"
    end

    # Returns `true` if the underlying output is a tty, or if the SSHKIT_COLOR
    # environment variable is set.
    #
    def colorize?
      @env['SSHKIT_COLOR'] || (@output.respond_to?(:tty?) && @output.tty?)
    end
  end
end