class Rouge::Lexers::ConsoleLexer
Public Class Methods
new(*)
click to toggle source
Calls superclass method
Rouge::Lexer::new
# File lib/rouge/lexers/console.rb, line 16 def initialize(*) super @prompt = list_option(:prompt) { nil } @lang = lexer_option(:lang) { 'shell' } @output = lexer_option(:output) { PlainText.new(token: Generic::Output) } @comments = bool_option(:comments) { :guess } end
Public Instance Methods
allow_comments?()
click to toggle source
whether to allow comments. if manually specifying a prompt that isn't simply “#”, we flag this to on
# File lib/rouge/lexers/console.rb, line 40 def allow_comments? case @comments when :guess @prompt && !@prompt.empty? && !end_chars.include?('#') else @comments end end
comment_regex()
click to toggle source
# File lib/rouge/lexers/console.rb, line 87 def comment_regex /\A\s*?#/ end
end_chars()
click to toggle source
# File lib/rouge/lexers/console.rb, line 30 def end_chars @end_chars ||= if @prompt.any? @prompt.reject { |c| c.empty? } else %w($ # > ;) end end
lang_lexer()
click to toggle source
# File lib/rouge/lexers/console.rb, line 57 def lang_lexer @lang_lexer ||= case @lang when Lexer @lang when nil Shell.new(options) when Class @lang.new(options) when String Lexer.find(@lang).new(options) end end
line_regex()
click to toggle source
# File lib/rouge/lexers/console.rb, line 83 def line_regex /(\\.|[^\\])*?(\n|$)/m end
output_lexer()
click to toggle source
# File lib/rouge/lexers/console.rb, line 70 def output_lexer @output_lexer ||= case @output when nil PlainText.new(token: Generic::Output) when Lexer @output when Class @output.new(options) when String Lexer.find(@output).new(options) end end
process_line(input) { |Comment, input| ... }
click to toggle source
# File lib/rouge/lexers/console.rb, line 99 def process_line(input, &output) input.scan(line_regex) if input[0] =~ /\A\s*(?:<[.]+>|[.]+)\s*\z/ puts "console: matched snip #{input[0].inspect}" if @debug output_lexer.reset! lang_lexer.reset! yield Comment, input[0] elsif prompt_regex =~ input[0] puts "console: matched prompt #{input[0].inspect}" if @debug output_lexer.reset! yield Generic::Prompt, $& # make sure to take care of initial whitespace # before we pass to the lang lexer so it can determine where # the "real" beginning of the line is $' =~ /\A\s*/ yield Text, $& unless $&.empty? lang_lexer.lex($', continue: true, &output) elsif comment_regex =~ input[0].strip puts "console: matched comment #{input[0].inspect}" if @debug output_lexer.reset! lang_lexer.reset! yield Comment, input[0] else puts "console: matched output #{input[0].inspect}" if @debug lang_lexer.reset! output_lexer.lex(input[0], continue: true, &output) end end
prompt_prefix_regex()
click to toggle source
# File lib/rouge/lexers/console.rb, line 49 def prompt_prefix_regex if allow_comments? /[^<#]*?/m else /.*?/m end end
prompt_regex()
click to toggle source
# File lib/rouge/lexers/console.rb, line 24 def prompt_regex @prompt_regex ||= begin /^#{prompt_prefix_regex}(?:#{end_chars.map(&Regexp.method(:escape)).join('|')})/ end end
stream_tokens(input, &output)
click to toggle source
# File lib/rouge/lexers/console.rb, line 91 def stream_tokens(input, &output) input = StringScanner.new(input) lang_lexer.reset! output_lexer.reset! process_line(input, &output) while !input.eos? end