Module: IRB::Color

Defined in:
lib/irb/color.rb

Constant Summary collapse

CLEAR =
0
BOLD =
1
UNDERLINE =
4
REVERSE =
7
RED =
31
GREEN =
32
YELLOW =
33
BLUE =
34
MAGENTA =
35
CYAN =
36

Class Method Summary collapse

Class Method Details

.clearObject


95
96
97
98
# File 'lib/irb/color.rb', line 95

def clear
  return '' unless colorable?
  "\e[#{CLEAR}m"
end

.colorable?Boolean

Returns:

  • (Boolean)

70
71
72
# File 'lib/irb/color.rb', line 70

def colorable?
  $stdout.tty? && supported? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb'))
end

.colorize(text, seq) ⇒ Object


100
101
102
103
104
# File 'lib/irb/color.rb', line 100

def colorize(text, seq)
  return text unless colorable?
  seq = seq.map { |s| "\e[#{const_get(s)}m" }.join('')
  "#{seq}#{text}#{clear}"
end

.colorize_code(code, complete: true) ⇒ Object

If `complete` is false (code is incomplete), this does not warn compile_error. This option is needed to avoid warning a user when the compile_error is happening because the input is not wrong but just incomplete.


109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/irb/color.rb', line 109

def colorize_code(code, complete: true)
  return code unless colorable?

  symbol_state = SymbolState.new
  colored = +''
  length = 0

  scan(code, allow_last_error: !complete) do |token, str, expr|
    in_symbol = symbol_state.scan_token(token)
    str.each_line do |line|
      line = Reline::Unicode.escape_for_print(line)
      if seq = dispatch_seq(token, expr, line, in_symbol: in_symbol)
        colored << seq.map { |s| "\e[#{s}m" }.join('')
        colored << line.sub(/\Z/, clear)
      else
        colored << line
      end
    end
    length += str.bytesize
  end

  # give up colorizing incomplete Ripper tokens
  if length != code.bytesize
    return Reline::Unicode.escape_for_print(code)
  end

  colored
end

.inspect_colorable?(obj, seen: {}.compare_by_identity) ⇒ Boolean

Returns:

  • (Boolean)

74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/irb/color.rb', line 74

def inspect_colorable?(obj, seen: {}.compare_by_identity)
  case obj
  when String, Symbol, Regexp, Integer, Float, FalseClass, TrueClass, NilClass
    true
  when Hash
    without_circular_ref(obj, seen: seen) do
      obj.all? { |k, v| inspect_colorable?(k, seen: seen) && inspect_colorable?(v, seen: seen) }
    end
  when Array
    without_circular_ref(obj, seen: seen) do
      obj.all? { |o| inspect_colorable?(o, seen: seen) }
    end
  when Range
    inspect_colorable?(obj.begin, seen: seen) && inspect_colorable?(obj.end, seen: seen)
  when Module
    !obj.name.nil?
  else
    false
  end
end