summaryrefslogtreecommitdiff
path: root/lib/irb/input-method.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/irb/input-method.rb')
-rw-r--r--lib/irb/input-method.rb65
1 files changed, 58 insertions, 7 deletions
diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb
index 7227df4ca0..e1a680847c 100644
--- a/lib/irb/input-method.rb
+++ b/lib/irb/input-method.rb
@@ -12,34 +12,39 @@ require 'irb/src_encoding'
require 'irb/magic-file'
module IRB
- #
- # InputMethod
- # StdioInputMethod
- # FileInputMethod
- # (ReadlineInputMethod)
- #
- STDIN_FILE_NAME = "(line)"
+ STDIN_FILE_NAME = "(line)" # :nodoc:
class InputMethod
@RCS_ID='-$Id$-'
+ # Creates a new input method object
def initialize(file = STDIN_FILE_NAME)
@file_name = file
end
+ # The file name of this input method, usually given during initialization.
attr_reader :file_name
+ # The irb prompt associated with this input method
attr_accessor :prompt
+ # Reads the next line from this input method.
+ #
+ # See IO#gets for more information.
def gets
IRB.fail NotImplementedError, "gets"
end
public :gets
+ # Whether this input method is still readable when there is no more data to
+ # read.
+ #
+ # See IO#eof for more information.
def readable_atfer_eof?
false
end
end
class StdioInputMethod < InputMethod
+ # Creates a new input method object
def initialize
super
@line_no = 0
@@ -48,40 +53,67 @@ module IRB
@stdout = IO.open(STDOUT.to_i, 'w', :external_encoding => IRB.conf[:LC_MESSAGES].encoding, :internal_encoding => "-")
end
+ # Reads the next line from this input method.
+ #
+ # See IO#gets for more information.
def gets
print @prompt
line = @stdin.gets
@line[@line_no += 1] = line
end
+ # Whether the end of this input method has been reached, returns +true+ if
+ # there is no more data to read.
+ #
+ # See IO#eof? for more information.
def eof?
@stdin.eof?
end
+ # Whether this input method is still readable when there is no more data to
+ # read.
+ #
+ # See IO#eof for more information.
def readable_atfer_eof?
true
end
+ # Returns the current line number for #io.
+ #
+ # #line counts the number of times #gets is called.
+ #
+ # See IO#lineno for more information.
def line(line_no)
@line[line_no]
end
+ # The external encoding for standard input.
def encoding
@stdin.external_encoding
end
end
+ # Use a File for IO with irb, see InputMethod
class FileInputMethod < InputMethod
+ # Creates a new input method object
def initialize(file)
super
@io = IRB::MagicFile.open(file)
end
+ # The file name of this input method, usually given during initialization.
attr_reader :file_name
+ # Whether the end of this input method has been reached, returns +true+ if
+ # there is no more data to read.
+ #
+ # See IO#eof? for more information.
def eof?
@io.eof?
end
+ # Reads the next line from this input method.
+ #
+ # See IO#gets for more information.
def gets
print @prompt
l = @io.gets
@@ -89,6 +121,7 @@ module IRB
l
end
+ # The external encoding for standard input.
def encoding
@io.external_encoding
end
@@ -98,6 +131,7 @@ module IRB
require "readline"
class ReadlineInputMethod < InputMethod
include Readline
+ # Creates a new input method object using Readline
def initialize
super
@@ -109,6 +143,9 @@ module IRB
@stdout = IO.open(STDOUT.to_i, 'w', :external_encoding => IRB.conf[:LC_MESSAGES].encoding, :internal_encoding => "-")
end
+ # Reads the next line from this input method.
+ #
+ # See IO#gets for more information.
def gets
Readline.input = @stdin
Readline.output = @stdout
@@ -121,18 +158,32 @@ module IRB
end
end
+ # Whether the end of this input method has been reached, returns +true+
+ # if there is no more data to read.
+ #
+ # See IO#eof? for more information.
def eof?
@eof
end
+ # Whether this input method is still readable when there is no more data to
+ # read.
+ #
+ # See IO#eof for more information.
def readable_atfer_eof?
true
end
+ # Returns the current line number for #io.
+ #
+ # #line counts the number of times #gets is called.
+ #
+ # See IO#lineno for more information.
def line(line_no)
@line[line_no]
end
+ # The external encoding for standard input.
def encoding
@stdin.external_encoding
end