summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/irb/color.rb37
1 files changed, 21 insertions, 16 deletions
diff --git a/lib/irb/color.rb b/lib/irb/color.rb
index 0dbb16b60b..41b559bc6b 100644
--- a/lib/irb/color.rb
+++ b/lib/irb/color.rb
@@ -98,31 +98,16 @@ module IRB # :nodoc:
"#{seq}#{text}#{clear}"
end
- def scan(code)
- Ripper::Lexer.new(code).scan
- end
-
def colorize_code(code)
return code unless colorable?
symbol_state = SymbolState.new
colored = +''
length = 0
- pos = [1, 0]
- scan(code).each do |elem|
- token = elem.event
- str = elem.tok
- expr = elem.state
+ scan(code) do |token, str, expr|
in_symbol = symbol_state.scan_token(token)
- next if ([elem.pos[0], elem.pos[1] + str.bytesize] <=> pos) <= 0
str.each_line do |line|
- if line.end_with?("\n")
- pos[0] += 1
- pos[1] = 0
- else
- pos[1] += line.bytesize
- end
line = Reline::Unicode.escape_for_print(line)
if seq = dispatch_seq(token, expr, line, in_symbol: in_symbol)
colored << seq.map { |s| "\e[#{s}m" }.join('')
@@ -142,6 +127,26 @@ module IRB # :nodoc:
private
+ def scan(code)
+ pos = [1, 0]
+
+ Ripper::Lexer.new(code).scan.each do |elem|
+ str = elem.tok
+ next if ([elem.pos[0], elem.pos[1] + str.bytesize] <=> pos) <= 0
+
+ str.each_line do |line|
+ if line.end_with?("\n")
+ pos[0] += 1
+ pos[1] = 0
+ else
+ pos[1] += line.bytesize
+ end
+ end
+
+ yield(elem.event, str, elem.state)
+ end
+ end
+
def dispatch_seq(token, expr, str, in_symbol:)
if token == :on_parse_error or token == :compile_error
TOKEN_SEQ_EXPRS[token][0]