diff options
Diffstat (limited to 'lib/irb/easter-egg.rb')
-rw-r--r-- | lib/irb/easter-egg.rb | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/lib/irb/easter-egg.rb b/lib/irb/easter-egg.rb index 3e79692de9..14dc93fc9c 100644 --- a/lib/irb/easter-egg.rb +++ b/lib/irb/easter-egg.rb @@ -98,18 +98,28 @@ module IRB end end + private def easter_egg_logo(type) + @easter_egg_logos ||= File.read(File.join(__dir__, 'ruby_logo.aa'), encoding: 'UTF-8:UTF-8') + .split(/TYPE: ([A-Z_]+)\n/)[1..] + .each_slice(2) + .to_h + @easter_egg_logos[type.to_s.upcase] + end + private def easter_egg(type = nil) + print "\e[?1049h" type ||= [:logo, :dancing].sample case type when :logo - File.open(File.join(__dir__, 'ruby_logo.aa')) do |f| - require "rdoc" - RDoc::RI::Driver.new.page do |io| - IO.copy_stream(f, io) - end + Pager.page do |io| + logo_type = STDOUT.external_encoding == Encoding::UTF_8 ? :unicode_large : :ascii_large + io.write easter_egg_logo(logo_type) + STDIN.raw { STDIN.getc } if io == STDOUT end when :dancing - begin + STDOUT.cooked do + interrupted = false + prev_trap = trap("SIGINT") { interrupted = true } canvas = Canvas.new(Reline.get_screen_size) Reline::IOGate.set_winch_handler do canvas = Canvas.new(Reline.get_screen_size) @@ -125,12 +135,15 @@ module IRB buff[0, 20] = "\e[0mPress Ctrl+C to stop\e[31m\e[1m" print "\e[H" + buff sleep 0.05 + break if interrupted end rescue Interrupt ensure - print "\e[0m\e[?1049l" + trap("SIGINT", prev_trap) end end + ensure + print "\e[0m\e[?1049l" end end end |