1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
require 'Win32/Console/ANSI' if RUBY_PLATFORM =~ /win32/
##
# cute.
#
# >> "this is red".red
#
# >> "this is red with a blue background (read: ugly)".red_on_blue
#
# >> "this is red with an underline".red.underline
#
# >> "this is really bold and really blue".bold.blue
#
# >> Colored.red "This is red" # but this part is mostly untested
module Colored
extend self
COLORS = {
'black' => 30,
'red' => 31,
'green' => 32,
'yellow' => 33,
'blue' => 34,
'magenta' => 35,
'cyan' => 36,
'white' => 37
}
EXTRAS = {
'clear' => 0,
'bold' => 1,
'underline' => 4,
'reversed' => 7
}
COLORS.each do |color, value|
define_method(color) do
colorize(self, :foreground => color)
end
define_method("on_#{color}") do
colorize(self, :background => color)
end
COLORS.each do |highlight, value|
next if color == highlight
define_method("#{color}_on_#{highlight}") do
colorize(self, :foreground => color, :background => highlight)
end
end
end
EXTRAS.each do |extra, value|
next if extra == 'clear'
define_method(extra) do
colorize(self, :extra => extra)
end
end
define_method(:to_eol) do
tmp = sub(/^(\e\[[\[\e0-9;m]+m)/, "\\1\e[2K")
if tmp == self
return "\e[2K" << self
end
tmp
end
def colorize(string, options = {})
colored = [color(options[:foreground]), color("on_#{options[:background]}"), extra(options[:extra])].compact * ''
colored << string
colored << extra(:clear)
end
def colors
@@colors ||= COLORS.keys.sort
end
def extra(extra_name)
extra_name = extra_name.to_s
"\e[#{EXTRAS[extra_name]}m" if EXTRAS[extra_name]
end
def color(color_name)
background = color_name.to_s =~ /on_/
color_name = color_name.to_s.sub('on_', '')
return unless color_name && COLORS[color_name]
"\e[#{COLORS[color_name] + (background ? 10 : 0)}m"
end
end unless Object.const_defined? :Colored
String.send(:include, Colored)
|