def self.cat!
p = Optimist::Parser.new do
version "lolcat #{Lolcat::VERSION} (c)2011 moe@busyloop.net"
banner "\nUsage: lolcat [OPTION]... [FILE]...\n\nConcatenate FILE(s), or standard input, to standard output.\nWith no FILE, or when FILE is -, read standard input.\n\n"
banner ''
opt :spread, "Rainbow spread", :short => 'p', :default => 3.0
opt :freq, "Rainbow frequency", :short => 'F', :default => 0.1
opt :seed, "Rainbow seed, 0 = random", :short => 'S', :default => 0
opt :animate, "Enable psychedelics", :short => 'a', :default => false
opt :duration, "Animation duration", :short => 'd', :default => 12
opt :speed, "Animation speed", :short => 's', :default => 20.0
opt :invert, "Invert fg and bg", :short => 'i', :default => false
opt :truecolor, "24-bit (truecolor)", :short => 't', :default => false
opt :force, "Force color even when stdout is not a tty", :short => 'f', :default => false
opt :version, "Print version and exit", :short => 'v'
opt :help, "Show this message", :short => 'h'
banner "\nExamples:\n lolcat f - g Output f's contents, then stdin, then g's contents.\n lolcat Copy standard input to standard output.\n fortune | lolcat Display a rainbow cookie.\n\nReport lolcat bugs to <https://github.com/busyloop/lolcat/issues>\nlolcat home page: <https://github.com/busyloop/lolcat/>\nReport lolcat translation bugs to <http://speaklolcat.com/>\n\n"
end
opts = Optimist::with_standard_exception_handling p do
begin
o = p.parse ARGV
rescue Optimist::HelpNeeded
buf = StringIO.new
p.educate buf
buf.rewind
opts = {
:animate => false,
:duration => 12,
:os => rand(256),
:speed => 20,
:spread => 8.0,
:freq => 0.3
}
Lol.cat buf, opts
puts
buf.close
exit 1
end
o
end
p.die :spread, "must be >= 0.1" if opts[:spread] < 0.1
p.die :duration, "must be >= 0.1" if opts[:duration] < 0.1
p.die :speed, "must be >= 0.1" if opts[:speed] < 0.1
opts[:os] = opts[:seed]
opts[:os] = rand(256) if opts[:os] == 0
begin
files = ARGV.empty? ? [:stdin] : ARGV[0..-1]
files.each do |file|
fd = $stdin if file == '-' or file == :stdin
begin
fd = File.open(file, "r") unless fd == $stdin
if $stdout.tty? or opts[:force]
Lol.cat fd, opts
else
if fd.tty?
fd.each do |line|
$stdout.write(line)
end
else
IO.copy_stream(fd, $stdout)
end
end
rescue Errno::ENOENT
puts "lolcat: #{file}: No such file or directory"
exit 1
rescue Errno::EACCES
puts "lolcat: #{file}: Permission denied"
exit 1
rescue Errno::EISDIR
puts "lolcat: #{file}: Is a directory"
exit 1
rescue Errno::EPIPE
exit 1
end
end
rescue Interrupt
end
end