lib/pagoda/helpers.rb in pagoda-0.2.0 vs lib/pagoda/helpers.rb in pagoda-0.3.0

- old
+ new

@@ -17,13 +17,13 @@ end def display(msg="", newline=true, level=1) indent = build_indent(level) if newline - puts("#{indent}#{msg}") + puts("#{indent}#{msg}".green) else - print("#{indent}#{msg}") + print("#{indent}#{msg}".green) STDOUT.flush end end def option_value(short_hand = nil, long_hand = nil) @@ -57,41 +57,41 @@ def ask(message=nil, level=1) display("#{message}", false, level) if message gets.strip end - def confirm(message="Are you sure you wish to continue? (y/n)?", level=1) + def confirm(message="Are you sure you wish to continue? (y/n)?".blue, level=1) return true if args.include? "-f" case message when Array count = message.length iteration = 0 message.each do |m| if iteration == count - 1 - display("#{m} ", false, level) + display("#{m} ".blue, false, level) else - display("#{m} ", true, level) + display("#{m} ".blue, true, level) end iteration += 1 end when String - display("#{message} ", false, level) + display("#{message} ".blue, false, level) end ask.downcase == 'y' end def error(msg, exit=true, level=1) indent = build_indent(level) STDERR.puts case msg when Array - STDERR.puts("#{indent}** Error:") + STDERR.puts("#{indent}** Error:".red) msg.each do |m| - STDERR.puts("#{indent}** #{m}") + STDERR.puts("#{indent}** #{m}".red) end when String - STDERR.puts("#{indent}** Error: #{msg}") + STDERR.puts("#{indent}** Error: #{msg}".red) end STDERR.puts exit 1 if exit end @@ -120,8 +120,198 @@ unless String.method_defined?(:shellescape) class String def shellescape empty? ? "''" : gsub(/([^A-Za-z0-9_\-.,:\/@\n])/n, '\\\\\\1').gsub(/\n/, "'\n'") + end + end +end + + +class String + + # + # Colors Hash + # + COLORS = { + :black => 0, + :red => 1, + :green => 2, + :yellow => 3, + :blue => 4, + :magenta => 5, + :cyan => 6, + :white => 7, + :default => 9, + + :light_black => 10, + :light_red => 11, + :light_green => 12, + :light_yellow => 13, + :light_blue => 14, + :light_magenta => 15, + :light_cyan => 16, + :light_white => 17 + } + + # + # Modes Hash + # + MODES = { + :default => 0, # Turn off all attributes + #:bright => 1, # Set bright mode + :underline => 4, # Set underline mode + :blink => 5, # Set blink mode + :swap => 7, # Exchange foreground and background colors + :hide => 8 # Hide text (foreground color would be the same as background) + } + + protected + + # + # Set color values in new string intance + # + def set_color_parameters( params ) + if (params.instance_of?(Hash)) + @color = params[:color] + @background = params[:background] + @mode = params[:mode] + @uncolorized = params[:uncolorized] + self + else + nil + end + end + + public + + # + # Change color of string + # + # Examples: + # + # puts "This is blue".colorize( :blue ) + # puts "This is light blue".colorize( :light_blue ) + # puts "This is also blue".colorize( :color => :blue ) + # puts "This is light blue with red background".colorize( :color => :light_blue, :background => :red ) + # puts "This is light blue with red background".colorize( :light_blue ).colorize( :background => :red ) + # puts "This is blue text on red".blue.on_red + # puts "This is red on blue".colorize( :red ).on_blue + # puts "This is red on blue and underline".colorize( :red ).on_blue.underline + # puts "This is blue text on red".blue.on_red.blink + # puts "This is uncolorized".blue.on_red.uncolorize + # + def colorize( params ) + return self unless STDOUT.isatty + + begin + require 'Win32/Console/ANSI' if RUBY_PLATFORM =~ /win32/ + rescue LoadError + raise 'You must gem install win32console to use colorize on Windows' + end + + color_parameters = {} + + if (params.instance_of?(Hash)) + color_parameters[:color] = COLORS[params[:color]] + color_parameters[:background] = COLORS[params[:background]] + color_parameters[:mode] = MODES[params[:mode]] + elsif (params.instance_of?(Symbol)) + color_parameters[:color] = COLORS[params] + end + + color_parameters[:color] ||= @color ||= COLORS[:default] + color_parameters[:background] ||= @background ||= COLORS[:default] + color_parameters[:mode] ||= @mode ||= MODES[:default] + + color_parameters[:uncolorized] ||= @uncolorized ||= self.dup + + # calculate bright mode + color_parameters[:color] += 50 if color_parameters[:color] > 10 + + color_parameters[:background] += 50 if color_parameters[:background] > 10 + + "\033[#{color_parameters[:mode]};#{color_parameters[:color]+30};#{color_parameters[:background]+40}m#{color_parameters[:uncolorized]}\033[0m".set_color_parameters( color_parameters ) + end + + # + # Return uncolorized string + # + def uncolorize + @uncolorized || self + end + + # + # Return true if sting is colorized + # + def colorized? + !defined?(@uncolorized).nil? + end + + # + # Make some color and on_color methods + # + COLORS.each_key do | key | + next if key == :default + + define_method key do + self.colorize( :color => key ) + end + + define_method "on_#{key}" do + self.colorize( :background => key ) + end + end + + # + # Methods for modes + # + MODES.each_key do | key | + next if key == :default + + define_method key do + self.colorize( :mode => key ) + end + end + + class << self + + # + # Return array of available modes used by colorize method + # + def modes + keys = [] + MODES.each_key do | key | + keys << key + end + keys + end + + # + # Return array of available colors used by colorize method + # + def colors + keys = [] + COLORS.each_key do | key | + keys << key + end + keys + end + + # + # Display color matrix with color names. + # + def color_matrix( txt = "[X]" ) + size = String.colors.length + String.colors.each do | color | + String.colors.each do | back | + print txt.colorize( :color => color, :background => back ) + end + puts " < #{color}" + end + String.colors.reverse.each_with_index do | back, index | + puts "#{"|".rjust(txt.length)*(size-index)} < #{back}" + end + "" end end end \ No newline at end of file