Class: Lingo::Attendee::TextReader

Inherits:
Lingo::Attendee show all
Includes:
TextUtils
Defined in:
lib/lingo/attendee/text_reader.rb

Overview

– Der TextReader ist eine klassische Datenquelle. Er liest eine oder mehrere Dateien und gibt sie Zeilenweise in den Ausgabekanal. Der Start bzw. Wechsel einer Datei wird dabei über den Kommandokanal angekündigt, ebenso wie das Ende.

Der TextReader kann ebenfalls ein spezielles Dateiformat verarbeiten, welches zum Austausch mit dem LIR-System dient. Dabei enthält die Datei Record-basierte Informationen, die wie mehrere Dateien verarbeitet werden.

Mögliche Verlinkung

Erzeugt

Daten des Typs String (Textzeile) z.B. für Tokenizer, Textwriter

Parameter

Kursiv dargestellte Parameter sind optional (ggf. mit Angabe der Voreinstellung). Alle anderen Parameter müssen zwingend angegeben werden.

out

siehe allgemeine Beschreibung des Attendee

files

Es können eine oder mehrere Dateien angegeben werden, die nacheinander eingelesen und zeilenweise weitergeleitet werden. Die Dateien werden mit Komma voneinander getrennt, z.B.

files: 'readme.txt'
files: 'readme.txt,lingo.cfg'
records

Mit diesem Parameter wird angegeben, woran der Anfang eines neuen Records erkannt werden kann und wie die Record-Nummer identifiziert wird. Das Format einer LIR-Datei ist z.B.

[00001.]
020: ¬Die Aufgabenteilung zwischen Wortschatz und Grammatik.

[00002.]
020: Nicht-konventionelle Thesaurusrelationen als Orientierungshilfen.

Mit der Angabe von

records: "^\[(\d+)\.\]"

werden die Record-Zeilen erkannt und jeweils die Record-Nummer 00001, bzw. 00002 erkannt.

Generierte Kommandos

Damit der nachfolgende Datenstrom einwandfrei verarbeitet werden kann, generiert der TextReader Kommandos, die mit in den Datenstrom eingefügt werden.

*FILE(<dateiname>)

Kennzeichnet den Beginn der Datei <dateiname>

*EOF(<dateiname>)

Kennzeichnet das Ende der Datei <dateiname>

*LIR_FORMAT(”)

Kennzeichnet die Verarbeitung einer Datei im LIR-Format (nur bei LIR-Format).

*RECORD(<nummer>)

Kennzeichnet den Beginn eines neuen Records (nur bei LIR-Format).

Beispiele

Bei der Verarbeitung einer normalen Textdatei mit der Ablaufkonfiguration t1.cfg

meeting:
  attendees:
    - text_reader: { out: lines, files: '$(files)' }
    - debugger:    { in: lines, prompt: 'out>' }

ergibt die Ausgabe über den Debugger: lingo -c t1 test.txt

out> *FILE('test.txt')
out> "Dies ist eine Zeile."
out> "Dies ist noch eine."
out> *EOF('test.txt')

Bei der Verarbeitung einer LIR-Datei mit der Ablaufkonfiguration t2.cfg

meeting:
  attendees:
    - text_reader: { out: lines,  files: '$(files)', records: "^\[(\d+)\.\]" }
    - debugger:    { in: lines, prompt: 'out>'}

ergibt die Ausgabe mit lingo -c t2 lir.txt

out> *LIR-FORMAT('')
out> *FILE('lir.txt')
out> *RECORD('00001')
out> "020: \254Die Aufgabenteilung zwischen Wortschatz und Grammatik."
out> *RECORD('00002')
out> "020: Nicht-konventionelle Thesaurusrelationen als Orientierungshilfen."
out> *EOF('lir.txt')

++

Constant Summary

Constants included from TextUtils

TextUtils::DEFAULT_MODE, TextUtils::GZIP_RE, TextUtils::STDIN_EXT, TextUtils::STDOUT_EXT

Constants inherited from Lingo::Attendee

DEFAULT_SKIP, TERMINALS

Constants included from Language

Language::CHAR_PUNCT, Language::LA_SORTORDER, Language::TA_ABBREVIATION, Language::TA_HELP, Language::TA_HTML, Language::TA_NUMBER, Language::TA_OTHER, Language::TA_PUNCTUATION, Language::TA_SKIP, Language::TA_SPACE, Language::TA_URL, Language::TA_WIKI, Language::TA_WORD, Language::WA_COMPOUND, Language::WA_IDENTIFIED, Language::WA_MULTIWORD, Language::WA_SEQUENCE, Language::WA_UNKMULPART, Language::WA_UNKNOWN, Language::WA_UNSET

Instance Attribute Summary

Attributes inherited from Lingo::Attendee

#lingo, #subscribers

Instance Method Summary collapse

Methods inherited from Lingo::Attendee

#command, #forward, #initialize

Constructor Details

This class inherits a constructor from Lingo::Attendee

Instance Method Details

#control(cmd) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/lingo/attendee/text_reader.rb', line 123

def control(cmd, *)
  return unless cmd == :TALK

  command(:LIR) if @lir

  @files.each { |path|
    command(:FILE, path)

    io = stdin?(path) ? open_stdin : open_path(name = path)

    Progress.new(self, @progress && io.size, name) { |progress|
      pos = 0 unless pos?(io = filter(io, path, progress))

      io.each { |line|
        progress << offset = pos ? pos += line.bytesize : io.pos

        line =~ @skip ? nil : line =~ @lir ?
          command(:RECORD, $1 || $&) : begin
            line.sub!(@cut, '') if @cut
            forward(line, offset) unless line.empty?
          end
      }
    }

    io.close unless stdin?(path)

    command(:EOF, path)
  }

  command(:EOT)
  :skip_command
end

#initObject

TODO: FILE/LIR-FILE (?)



110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/lingo/attendee/text_reader.rb', line 110

def init
  get_files

  @encoding = get_enc

  @filter   = get_key('filter', false)
  @progress = get_key('progress', false)

  @lir  = get_re('records', nil, %r{^\[(\d+)\.\]})
  @cut  = get_re('fields', !!@lir, %r{^.+?:\s*})
  @skip = get_re('skip', nil)
end