In Files

  • irb/color.rb

IRB::Color

Constants

ALL

A constant of all-bit 1 to match any Ripper's state in dispatch_seq

BLUE
BOLD
CLEAR
CYAN
ERROR_TOKENS
GREEN
MAGENTA
RED
REVERSE
TOKEN_KEYWORDS
TOKEN_SEQ_EXPRS

Following pry's colors where possible, but sometimes having a compromise like making backtick and regexp as red (string's color, because they're sharing tokens).

UNDERLINE
YELLOW

Public Class Methods

clear(colorable: colorable?) click to toggle source
 
               # File irb/color.rb, line 103
def clear(colorable: colorable?)
  return '' unless colorable
  "\e[#{CLEAR}m"
end
            
colorable?() click to toggle source
 
               # File irb/color.rb, line 78
def colorable?
  $stdout.tty? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb'))
end
            
colorize(text, seq, colorable: colorable?) click to toggle source
 
               # File irb/color.rb, line 108
def colorize(text, seq, colorable: colorable?)
  return text unless colorable
  seq = seq.map { |s| "\e[#{const_get(s)}m" }.join('')
  "#{seq}#{text}#{clear(colorable: colorable)}"
end
            
colorize_code(code, complete: true, ignore_error: false, colorable: colorable?) click to toggle source

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.

 
               # File irb/color.rb, line 117
def colorize_code(code, complete: true, ignore_error: false, colorable: colorable?)
  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(colorable: colorable))
      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) click to toggle source
 
               # File irb/color.rb, line 82
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
            
There is an updated format of the API docs for this version here.