rubyrubygemsxtermansi-escape256color

256 color terminal library for Ruby?


Is there a gem like 'Term::ANSIColor' which works with 256 color terminals? The perl script 256colors2.pl works great in my terminal, and I'd like to use some of these colors in my ruby scripts without manually inserting the ANSI codes.


Solution

  • Here's an adaptation of the 256colors2.pl script to ruby, with some help from this guide. It defines a print_color(text, foreground, background) method that should be easily applicable to your projects. It prints the string in colour, and then resets the colour to the terminal default. Should be easy enough to skip the reset if you'd prefer that.

    def rgb(red, green, blue)
      16 + (red * 36) + (green * 6) + blue
    end
    
    def gray(g)
      232 + g
    end
    
    def set_color(fg, bg)
      print "\x1b[38;5;#{fg}m" if fg
      print "\x1b[48;5;#{bg}m" if bg
    end
    
    def reset_color
      print "\x1b[0m"
    end
    
    def print_color(txt, fg, bg)
      set_color(fg, bg)
      print txt
      reset_color
    end
    
    # convenience method
    def rgb_cube
      for green in 0..5 do
        for red in 0..5 do
          for blue in 0..5 do
            yield [red, green, blue]
          end 
          print " "
        end
        puts
      end
    end
    
    # rgb list on black bg
    rgb_cube do |red, green, blue|
      print_color("%d%d%d  " % [red, green, blue], rgb(red, green, blue), nil)
    end
    puts
    
    # rgb list on white bg
    rgb_cube do |red, green, blue|
      print_color("%d%d%d  " % [red, green, blue], rgb(red, green, blue), 15)
    end
    puts
    
    # system palette:
    print "System colors:\n";
    (0..7).each do |color|
      print_color("  ", nil, color)
    end
    puts
    
    (8..15).each do |color|
      print_color("  ", nil, color)
    end
    puts
    puts
    
    # color cube
    print "Color cube, 6x6x6:\n"
    rgb_cube do |red, green, blue|
      print_color("  ", nil, rgb(red, green, blue))
    end
    puts
    
    # grayscale ramp
    print "Grayscale ramp:\n"
    for g in (0..23) do 
      print_color("  ", nil, gray(g))
    end
    
    puts
    puts