Abstract away Ripper::Lexer#scan in IRB::Color#scan
because 5b64d7ac6e7cbf759b859428f125539e58bac0bd made it hard to understand #colorize_code for me and this change is needed for my next commit.
This commit is contained in:
parent
8f83fe3b02
commit
6e052817f9
@ -98,31 +98,16 @@ module IRB # :nodoc:
|
|||||||
"#{seq}#{text}#{clear}"
|
"#{seq}#{text}#{clear}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def scan(code)
|
|
||||||
Ripper::Lexer.new(code).scan
|
|
||||||
end
|
|
||||||
|
|
||||||
def colorize_code(code)
|
def colorize_code(code)
|
||||||
return code unless colorable?
|
return code unless colorable?
|
||||||
|
|
||||||
symbol_state = SymbolState.new
|
symbol_state = SymbolState.new
|
||||||
colored = +''
|
colored = +''
|
||||||
length = 0
|
length = 0
|
||||||
pos = [1, 0]
|
|
||||||
|
|
||||||
scan(code).each do |elem|
|
scan(code) do |token, str, expr|
|
||||||
token = elem.event
|
|
||||||
str = elem.tok
|
|
||||||
expr = elem.state
|
|
||||||
in_symbol = symbol_state.scan_token(token)
|
in_symbol = symbol_state.scan_token(token)
|
||||||
next if ([elem.pos[0], elem.pos[1] + str.bytesize] <=> pos) <= 0
|
|
||||||
str.each_line do |line|
|
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)
|
line = Reline::Unicode.escape_for_print(line)
|
||||||
if seq = dispatch_seq(token, expr, line, in_symbol: in_symbol)
|
if seq = dispatch_seq(token, expr, line, in_symbol: in_symbol)
|
||||||
colored << seq.map { |s| "\e[#{s}m" }.join('')
|
colored << seq.map { |s| "\e[#{s}m" }.join('')
|
||||||
@ -142,6 +127,26 @@ module IRB # :nodoc:
|
|||||||
|
|
||||||
private
|
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:)
|
def dispatch_seq(token, expr, str, in_symbol:)
|
||||||
if token == :on_parse_error or token == :compile_error
|
if token == :on_parse_error or token == :compile_error
|
||||||
TOKEN_SEQ_EXPRS[token][0]
|
TOKEN_SEQ_EXPRS[token][0]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user