A constant of all-bit 1 to match any Ripper's state in dispatch_seq
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).
# File irb/color.rb, line 103 def clear(colorable: colorable?) return '' unless colorable "\e[#{CLEAR}m" end
# File irb/color.rb, line 78 def colorable? $stdout.tty? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb')) end
# 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
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
# 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