Class: Command::TextInterpreter
Instance Attribute Summary collapse
#command_set, #logger, #out_io, #subject
Instance Method Summary
collapse
#behavior, #fill_subject, #get_subject, #next_command, #pop_mode, #prep_subject, #process_input, #push_mode, #subject_requirements, #subject_template
Constructor Details
Returns a new instance of TextInterpreter.
59
60
61
62
63
64
65
|
# File 'lib/command-set/text-interpreter.rb', line 59
def initialize
super
@complete_line = false
@behavior.merge!(
:prompt => [/(?:: )?$/, "> "]
)
end
|
Instance Attribute Details
#complete_line ⇒ Object
Returns the value of attribute complete_line.
67
68
69
|
# File 'lib/command-set/text-interpreter.rb', line 67
def complete_line
@complete_line
end
|
Instance Method Details
#complete(word, line) ⇒ Object
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
# File 'lib/command-set/text-interpreter.rb', line 127
def complete(word, line)
list = current_command_set.completion_list(line, word, build_subject)
if list.length == 0
raise CommandException, "Unrecognized: #{word}"
end
return word if list[-1].empty?
if list.length == 1
return list[0]
else
raise CommandException, "Ambiguous: #{word}"
end
end
|
111
112
113
114
115
116
117
118
119
120
121
122
|
# File 'lib/command-set/text-interpreter.rb', line 111
def cook_input(line)
line = split_line(line)
if(@complete_line)
new_line = []
line.each do |word|
word = complete(word, new_line)
new_line << word
end
line = new_line
end
return CommandSetup.new(line)
end
|
#get_prompt ⇒ Object
186
187
188
189
190
191
192
193
194
|
# File 'lib/command-set/text-interpreter.rb', line 186
def get_prompt
prompt = ""
prompt.sub!(*(@command_set.prompt))
@sub_modes.each do |mode|
prompt.sub!(*(mode.prompt))
end
prompt.sub!(*(@behavior[:prompt]))
end
|
#go ⇒ Object
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
# File 'lib/command-set/text-interpreter.rb', line 69
def go
if @command_set.nil? or @subject.nil?
raise "command_set or subject unset!"
end
@stop = false
begin
old_proc = set_readline_completion do |prefix|
readline_complete(Readline.line_buffer, prefix)
end
line = readline(get_prompt, true)
next if line.empty?
process_line(line)
rescue Interrupt
@out_io.puts "Interrupt: please use \"quit\""
rescue CommandException => ce
output_exception("Error", ce)
rescue Exception => e
output_exception("Exception", e)
pause_before_dying
ensure
set_readline_completion(&old_proc)
end until @stop
end
|
#output_exception(label, ex) ⇒ Object
96
97
98
99
100
101
102
103
|
# File 'lib/command-set/text-interpreter.rb', line 96
def output_exception(label, ex)
@out_io.puts label + ": " + ex.message
@out_io.puts ex.backtrace.join("\n") if @behavior[:debug_commands]
logger.warn ex.message
ex.backtrace.each do |line|
logger.debug line
end
end
|
#pause_before_dying ⇒ Object
105
106
107
108
109
|
# File 'lib/command-set/text-interpreter.rb', line 105
def pause_before_dying
puts "Waiting for return"
$stdin.gets
stop
end
|
#prompt_user(message) ⇒ Object
200
201
202
|
# File 'lib/command-set/text-interpreter.rb', line 200
def prompt_user(message)
readline(message)
end
|
#readline_complete(buffer, prefix) ⇒ Object
143
144
145
146
147
148
149
150
151
|
# File 'lib/command-set/text-interpreter.rb', line 143
def readline_complete(buffer, prefix)
parsed_input = split_line(buffer)
unless prefix.empty?
parsed_input.pop
end
return current_command_set.completion_list(parsed_input,
prefix, build_subject)
end
|
#split_line(line) ⇒ Object
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
# File 'lib/command-set/text-interpreter.rb', line 153
def split_line(line)
line_array = []
scanner = StringScanner.new(line)
until scanner.eos?
scanner.scan(/\s*/)
quote = scanner.scan(/['"]/)
unless quote.nil?
line_array << ""
until scanner.eos?
line_array.last << scanner.scan(/[^#{quote}\\]*/)
stopped_by = scanner.scan(/[#{quote}\\]/)
break unless stopped_by == '\\'
line_array.last << scanner.getch
end
else
line_array << ""
until scanner.eos?
line_array.last << scanner.scan(/[^\s\\]*/)
stopped_by = scanner.scan(/[\s\\]/)
break unless stopped_by == '\\'
line_array.last << scanner.getch
end
end
end
return line_array
end
|
#stop ⇒ Object
196
197
198
|
# File 'lib/command-set/text-interpreter.rb', line 196
def stop
@stop = true
end
|