Permalink
Browse files

A classic.

  • Loading branch information...
0 parents commit 15df0795f7962b61bc95c344a3f361629ad5dc84 @defunkt committed Nov 28, 2009
Showing with 158 additions and 0 deletions.
  1. +23 −0 README
  2. +91 −0 lib/colored.rb
  3. +44 −0 test/colored_test.rb
23 README
@@ -0,0 +1,23 @@
+cute.
+
+ >> puts "this is red".red
+
+ >> puts "this is red with a blue background (read: ugly)".red_on_blue
+
+ >> puts "this is red with an underline".red.underline
+
+ >> puts "this is really bold and really blue".bold.blue
+
+ >> logger.debug "hey this is broken!".red_on_yellow # in rails
+
+ >> puts Color.red "This is red" # but this part is mostly untested
+
+Windows users:
+ You will need the Win32 Console Ansi gem. Get it:
+
+ $ sudo gem install win32console-1.0.0 --source require.errtheblog.com
+
+ (We're trying to make it official. Hang in there.)
+
+>> chris[at]ozmm[dot]org
+=> http://errtheblog.com/
@@ -0,0 +1,91 @@
+require 'Win32/Console/ANSI' if 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)
@@ -0,0 +1,44 @@
+require 'test/unit'
+require File.dirname(__FILE__) + '/../lib/colored'
+
+class TestColor < Test::Unit::TestCase
+ def test_one_color
+ assert_equal "\e[31mred\e[0m", "red".red
+ end
+
+ def test_two_colors
+ assert_equal "\e[34m\e[31mblue\e[0m\e[0m", "blue".red.blue
+ end
+
+ def test_background_color
+ assert_equal "\e[43mon yellow\e[0m", "on yellow".on_yellow
+ end
+
+ def test_hot_color_on_color_action
+ assert_equal "\e[31m\e[44mred on blue\e[0m", "red on blue".red_on_blue
+ end
+
+ def test_modifier
+ assert_equal "\e[1mway bold\e[0m", "way bold".bold
+ end
+
+ def test_modifiers_stack
+ assert_equal "\e[4m\e[1munderlined bold\e[0m\e[0m", "underlined bold".bold.underline
+ end
+
+ def test_modifiers_stack_with_colors
+ assert_equal "\e[36m\e[4m\e[1mcyan underlined bold\e[0m\e[0m\e[0m", "cyan underlined bold".bold.underline.cyan
+ end
+
+ def test_eol
+ assert_equal "\e[2Knothing to see here really.", "nothing to see here really.".to_eol
+ end
+
+ def test_eol_with_with_two_colors
+ assert_equal "\e[34m\e[31m\e[2Kblue\e[0m\e[0m", "blue".red.blue.to_eol
+ end
+
+ def test_eol_with_modifiers_stack_with_colors
+ assert_equal "\e[36m\e[4m\e[1m\e[2Kcyan underlined bold\e[0m\e[0m\e[0m", "cyan underlined bold".bold.underline.cyan.to_eol
+ end
+end

0 comments on commit 15df079

Please sign in to comment.