Skip to content

Commit

Permalink
Easter egg for autocomplete mode (#737)
Browse files Browse the repository at this point in the history
* Show easter-egg inside document dialog in autocomplete mode

* Show more easter_egg(dancing or logo) when Alt+d is pressed in autocomplete mode
  • Loading branch information
tompng authored Oct 28, 2023
1 parent 4b7dcdf commit a8e5cc7
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 10 deletions.
16 changes: 11 additions & 5 deletions lib/irb/easter-egg.rb
Original file line number Diff line number Diff line change
Expand Up @@ -98,15 +98,21 @@ def render_frame(i)
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)
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
require "rdoc"
RDoc::RI::Driver.new.page do |io|
io.write easter_egg_logo(:large)
end
when :dancing
STDOUT.cooked do
Expand Down
22 changes: 17 additions & 5 deletions lib/irb/input-method.rb
Original file line number Diff line number Diff line change
Expand Up @@ -303,15 +303,20 @@ def show_doc_dialog_proc
return nil if result.nil? or pointer.nil? or pointer < 0

name = doc_namespace.call(result[pointer])
show_easter_egg = name&.match?(/\ARubyVM/) && !ENV['RUBY_YES_I_AM_NOT_A_NORMAL_USER']

options = {}
options[:extra_doc_dirs] = IRB.conf[:EXTRA_DOC_DIRS] unless IRB.conf[:EXTRA_DOC_DIRS].empty?
driver = RDoc::RI::Driver.new(options)

if key.match?(dialog.name)
begin
driver.display_names([name])
rescue RDoc::RI::Driver::NotFoundError
if show_easter_egg
IRB.__send__(:easter_egg)
else
begin
driver.display_names([name])
rescue RDoc::RI::Driver::NotFoundError
end
end
end

Expand Down Expand Up @@ -374,8 +379,15 @@ def show_doc_dialog_proc
formatter.width = width
dialog.trap_key = alt_d
mod_key = RUBY_PLATFORM.match?(/darwin/) ? "Option" : "Alt"
message = "Press #{mod_key}+d to read the full document"
contents = [message] + doc.accept(formatter).split("\n")
if show_easter_egg
type = STDOUT.external_encoding == Encoding::UTF_8 ? :unicode : :ascii
contents = IRB.send(:easter_egg_logo, type).split("\n")
message = "Press #{mod_key}+d to see more"
contents[0][0, message.size] = message
else
message = "Press #{mod_key}+d to read the full document"
contents = [message] + doc.accept(formatter).split("\n")
end
contents = contents.take(preferred_dialog_height)

y = cursor_pos_to_render.y
Expand Down
43 changes: 43 additions & 0 deletions lib/irb/ruby_logo.aa
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
TYPE: LARGE

-+smJYYN?mm-
HB"BBYT TQg NggT
Expand Down Expand Up @@ -35,3 +36,45 @@
m7 NW H N HSVO1z=?11-
NgTH bB kH WBHWWHBHWmQgg&gggggNNN
NNggggggNN
TYPE: ASCII
,,,;;;;''''';;;'';,
,,;'' ';;,;;; ',
,,'' ;;'';'''';;;;;;
,;' ;; ',, ;
,;' ,;' ';, ;
;' ,;; ',,,;
,' ,;;,,,,,,,,,,,;;;;
;' ;;';;;; ,;;
;' ,;' ;; '',, ,;;;
;; ,;' ; '';, ,; ;'
;; ,;;' ;; ;; ;;
;;, ,,;;' ; ;'; ;;
;';;,,,,;;;;;;;,,, ;; ,' ; ;;
; ;;''' ,;'; ''';,,, ; ,;' ;;;;
;;;;, ; '; ''';;;' ';;;
;'; ;, ;' '; ,;' ', ;;;
;;; ; ,; '; ,,' ',, ;;
;;; '; ;' ';,,'' ';,;;
'; ';,; ,,;''''''''';;;;;;,,;;;
';,,;;,,;;;;;;;;;;''''''''''''''
TYPE: UNICODE
⣀⣤⣴⣾⣿⣿⣿⡛⠛⠛⠛⠛⣻⣿⠿⠛⠛⠶⣤⡀
⣀⣴⠾⠛⠉⠁ ⠙⣿⣶⣤⣶⣟⣉ ⠈⠻⣦
⣀⣴⠟⠋ ⢸⣿⠟⠻⣯⡙⠛⠛⠛⠶⠶⠶⢶⣽⣇
⣠⡾⠋⠁ ⣾⡿ ⠈⠛⢦⣄ ⣿
⣠⡾⠋ ⣰⣿⠃ ⠙⠷⣤⡀ ⣿
⢀⡾⠋ ⣰⣿⡏ ⠈⠻⣦⣄⢠⣿
⣰⠟⠁ ⣴⣿⣿⣁⣀⣠⣤⣤⣤⣤⣤⣤⣤⣴⠶⠿⣿⡏
⣼⠏ ⢀⣾⣿⠟⣿⠿⣯⣍⠁ ⣰⣿⡇
⢀⣼⠋ ⢀⣴⣿⠟⠁ ⢸⡇ ⠙⠻⢦⣄⡀ ⢠⡿⣿⡇
⢀⣾⡏ ⢀⣴⣿⠟⠁ ⣿ ⠉⠻⢶⣄⡀⣰⡟ ⣿⠃
⣾⣿⠁ ⣠⣶⡿⠋⠁ ⢹⡇ ⠈⣿⡏ ⢸⣿
⣿⣿⡆ ⢀⣠⣴⣿⡿⠋ ⠈⣿ ⢀⡾⠋⣿ ⢸⣿
⣿⠸⣿⣶⣤⣤⣤⣤⣶⣾⠿⠿⣿⣿⠶⣤⣤⣀⡀ ⢹⡇ ⣴⠟⠁ ⣿⡀⢸⣿
⣿⢀⣿⣟⠛⠋⠉⠁ ⢰⡟⠹⣧ ⠈⠉⠛⠻⠶⢦⣤⣀⡀ ⠈⣿ ⣠⡾⠃ ⢸⡇⢸⡇
⣿⣾⣿⢿⡄ ⣿⠁ ⠘⣧ ⠉⠙⠛⠷⣿⣿⡋ ⠸⣇⣸⡇
⣿⠃⣿⠈⢿⡄ ⣸⠇ ⠘⣧ ⢀⣤⠾⠋⠈⠻⣦⡀ ⣿⣿⡇
⣿⢸⡏ ⠈⣷⡀ ⢠⡿ ⠘⣧⡀ ⣠⡴⠟⠁ ⠈⠻⣦⣀ ⢿⣿⠁
⢻⣾⡇ ⠘⣷ ⣼⠃ ⠘⣷⣠⣴⠟⠋ ⠙⢷⣄⢸⣿
⠻⣧⡀ ⠘⣧⣰⡏ ⢀⣠⣤⠶⠛⠉⠛⠛⠛⠛⠛⠛⠻⢶⣶⣶⣶⣶⣶⣤⣤⣽⣿⣿
⠈⠛⠷⢦⣤⣽⣿⣥⣤⣶⣶⡿⠿⠿⠶⠶⠶⠶⠾⠛⠛⠛⠛⠛⠛⠛⠋⠉⠉⠉⠉⠉⠉⠁

0 comments on commit a8e5cc7

Please sign in to comment.