class TL1::Command::OutputScanner
A helper class to extract records from output messages. Assumes records are double-quoted and separated by newlines.
Attributes
message[R]
Public Class Methods
new(message)
click to toggle source
# File lib/tl1/command.rb, line 36 def initialize(message) @message = message end
Public Instance Methods
records()
click to toggle source
# File lib/tl1/command.rb, line 40 def records records = [] scanner = StringScanner.new(message) scan_begin(scanner) loop do record = scan_next_record(scanner) break unless record records << record end records end
scan_begin(scanner)
click to toggle source
# File lib/tl1/command.rb, line 52 def scan_begin(scanner) scanner.skip_until(/^M\s+\d+\s+COMPLD$/) end
scan_characters(scanner) { |getch| ... }
click to toggle source
# File lib/tl1/command.rb, line 70 def scan_characters(scanner) loop do raise 'Unexpected end of message' if scanner.eos? yield scanner.getch end end
scan_next_record(scanner)
click to toggle source
# File lib/tl1/command.rb, line 56 def scan_next_record(scanner) scanner.skip(/\s*/) char = scanner.getch case char when '>' scan_begin(scanner) scan_next_record(scanner) when ';' nil when '"' scan_record(scanner) end end
scan_record(scanner)
click to toggle source
# File lib/tl1/command.rb, line 77 def scan_record(scanner) record = String.new scan_characters(scanner) do |char| case char when '\\' next_char = scanner.getch if next_char == '"' record << "\"#{scan_record_quoted_string(scanner)}" else record << char << next_char end when '"' return record else record << char end end end
scan_record_quoted_string(scanner)
click to toggle source
# File lib/tl1/command.rb, line 97 def scan_record_quoted_string(scanner) record = String.new scan_characters(scanner) do |char| case char when '\\' next_char = scanner.getch return "#{record}\"" if next_char == '"' record << char << next_char else record << char end end end