# = Console Utilities # # ConsoleUtils provides methods that are # generally useful in the context of # creating console output. # # = Authors # # * Thomas Sawyer # # == Copying # # Copyright (c) 2006,2007 Thomas Sawyer # Ruby/GPL # = ConsoleUtils # # ConsoleUtils provides methods that are # generally useful in the context of # creating console output. # module ConsoleUtils module_function # Convenient method to get simple console reply. def ask(question, answers=nil) print "#{question}" print " [#{answers}] " if answers until inp = $stdin.gets ; sleep 1 ; end inp end # Convenience method for puts. Use this instead of # puts when the output should be supressed if the # global $QUIET option is set. #def say(statement) # puts statement #unless quiet? $QUIET #end # Ask for a password. (FIXME: only for unix so far) def password(msg=nil) msg ||= "Enter Password: " inp = '' $stdout << msg begin system "stty -echo" inp = gets.chomp ensure system "stty echo" end return inp end # Console screen width (taken from progress bar) # # TODO: Don't know how portable #screen_width is. def screen_width(out=STDERR) default_width = ENV['COLUMNS'] || 80 begin tiocgwinsz = 0x5413 data = [0, 0, 0, 0].pack("SSSS") if out.ioctl(tiocgwinsz, data) >= 0 then rows, cols, xpixels, ypixels = data.unpack("SSSS") if cols >= 0 then cols else default_width end else default_width end rescue Exception default_width end end # Print a justified line with left and right entries. # # A fill option can be given to fill in any empty space # between the two. And a ratio option can be given which defaults # to 0.8 (eg. 80/20) def print_justified(left, right, options={}) fill = options[:fill] || '.' fill = ' ' if fill == '' fill = fill[0,1] ratio = options[:ratio] || 0.8 ratio = 1 + ratio if ratio < 0 width = (@screen_width ||= screen_width) - 1 #l = (width * ratio).to_i r = (width * (1 - ratio)).to_i l = width - r left = left[0,l] right = right[0,r] str = fill * width str[0,left.size] = left str[width-right.size,right.size] = right print str end end