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