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



104
105
106
107
# File 'lib/irb/color.rb', line 104

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

.colorable?Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/irb/color.rb', line 79

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

.colorize(text, seq) ⇒ Object



109
110
111
112
113
# File 'lib/irb/color.rb', line 109

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, ignore_error: false) ⇒ 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.



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/irb/color.rb', line 118

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

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

  scan(code, allow_last_error: !complete) do |token, str, expr|
    # IRB::ColorPrinter skips colorizing fragments with any invalid token
    if ignore_error && ERROR_TOKENS.include?(token)
      return Reline::Unicode.escape_for_print(code)
    end

    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_seen = true if token == :on___end__
  end

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

  colored
end

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

Returns:

  • (Boolean)


83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/irb/color.rb', line 83

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