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



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

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

.colorable?Boolean

Returns:

  • (Boolean)


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

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

.colorize(text, seq) ⇒ Object



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

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.



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
137
# File 'lib/irb/color.rb', line 110

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)


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

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