[ruby/irb] Easter egg for autocomplete mode

(https://github.com/ruby/irb/pull/737)

* Show easter-egg inside document dialog in autocomplete mode

* Show more easter_egg(dancing or logo) when Alt+d is pressed in autocomplete mode

https://github.com/ruby/irb/commit/a8e5cc7354
This commit is contained in:
tomoya ishida 2023-10-28 23:47:40 +09:00 коммит произвёл git
Родитель a447a6d1a9
Коммит db7a4be846
3 изменённых файлов: 71 добавлений и 10 удалений

Просмотреть файл

@ -98,15 +98,21 @@ 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)
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
begin

Просмотреть файл

@ -303,15 +303,20 @@ module IRB
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
@ -374,8 +379,15 @@ module IRB
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

Просмотреть файл

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