lingo 1.8.5 → 1.8.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +25 -0
  3. data/README +7 -5
  4. data/Rakefile +58 -55
  5. data/{lingo-call.cfg → config/lingo-call.cfg} +1 -1
  6. data/{lingo.cfg → config/lingo.cfg} +10 -2
  7. data/{lir.cfg → config/lir.cfg} +10 -2
  8. data/{de → dict/de}/lingo-abk.txt +0 -0
  9. data/{de → dict/de}/lingo-dic.txt +0 -0
  10. data/{de → dict/de}/lingo-mul.txt +0 -0
  11. data/{de → dict/de}/lingo-syn.txt +0 -0
  12. data/{de → dict/de}/test_dic.txt +0 -0
  13. data/{de → dict/de}/test_gen.txt +0 -0
  14. data/{de → dict/de}/test_mu2.txt +0 -0
  15. data/{de → dict/de}/test_mul.txt +0 -0
  16. data/{de → dict/de}/test_sgw.txt +0 -0
  17. data/{de → dict/de}/test_syn.txt +0 -0
  18. data/{de → dict/de}/user-dic.txt +0 -0
  19. data/{en → dict/en}/lingo-dic.txt +0 -0
  20. data/{en → dict/en}/lingo-irr.txt +0 -0
  21. data/{en → dict/en}/lingo-mul.txt +0 -0
  22. data/{en → dict/en}/lingo-syn.txt +0 -0
  23. data/{en → dict/en}/lingo-wdn.txt +0 -0
  24. data/{en → dict/en}/user-dic.txt +0 -0
  25. data/{ru → dict/ru}/lingo-dic.txt +0 -0
  26. data/{ru → dict/ru}/lingo-mul.txt +0 -0
  27. data/{ru → dict/ru}/lingo-syn.txt +0 -0
  28. data/{ru → dict/ru}/user-dic.txt +0 -0
  29. data/{de.lang → lang/de.lang} +1 -1
  30. data/{en.lang → lang/en.lang} +0 -0
  31. data/{ru.lang → lang/ru.lang} +0 -0
  32. data/lib/lingo.rb +14 -15
  33. data/lib/lingo/app.rb +4 -2
  34. data/lib/lingo/attendee.rb +23 -43
  35. data/lib/lingo/attendee/abbreviator.rb +5 -5
  36. data/lib/lingo/attendee/debugger.rb +39 -12
  37. data/lib/lingo/attendee/decomposer.rb +3 -4
  38. data/lib/lingo/attendee/dehyphenizer.rb +4 -4
  39. data/lib/lingo/attendee/formatter.rb +1 -3
  40. data/lib/lingo/attendee/multi_worder.rb +3 -4
  41. data/lib/lingo/attendee/noneword_filter.rb +8 -12
  42. data/lib/lingo/attendee/object_filter.rb +6 -3
  43. data/lib/lingo/attendee/sequencer.rb +5 -5
  44. data/lib/lingo/attendee/stemmer.rb +3 -2
  45. data/lib/lingo/attendee/synonymer.rb +3 -4
  46. data/lib/lingo/attendee/text_reader.rb +39 -38
  47. data/lib/lingo/attendee/text_writer.rb +10 -10
  48. data/lib/lingo/attendee/tokenizer.rb +63 -33
  49. data/lib/lingo/attendee/variator.rb +3 -7
  50. data/lib/lingo/attendee/vector_filter.rb +132 -65
  51. data/lib/lingo/attendee/word_searcher.rb +5 -3
  52. data/lib/lingo/buffered_attendee.rb +1 -3
  53. data/lib/lingo/call.rb +4 -3
  54. data/lib/lingo/cli.rb +5 -1
  55. data/lib/lingo/config.rb +11 -5
  56. data/lib/lingo/ctl.rb +3 -3
  57. data/lib/lingo/database.rb +3 -1
  58. data/lib/lingo/database/crypter.rb +1 -3
  59. data/lib/lingo/database/source.rb +3 -1
  60. data/lib/lingo/database/source/key_value.rb +3 -1
  61. data/lib/lingo/database/source/multi_key.rb +3 -1
  62. data/lib/lingo/database/source/multi_value.rb +3 -1
  63. data/lib/lingo/database/source/single_word.rb +3 -1
  64. data/lib/lingo/database/source/word_class.rb +3 -1
  65. data/lib/lingo/debug.rb +5 -5
  66. data/lib/lingo/{agenda_item.rb → deferred_attendee.rb} +21 -12
  67. data/lib/lingo/error.rb +1 -1
  68. data/lib/lingo/language.rb +1 -9
  69. data/lib/lingo/language/dictionary.rb +2 -17
  70. data/lib/lingo/language/grammar.rb +10 -10
  71. data/lib/lingo/language/lexical.rb +2 -0
  72. data/lib/lingo/language/lexical_hash.rb +2 -0
  73. data/lib/lingo/language/token.rb +17 -3
  74. data/lib/lingo/language/word.rb +13 -5
  75. data/lib/lingo/language/word_form.rb +5 -3
  76. data/lib/lingo/progress.rb +2 -2
  77. data/lib/lingo/srv.rb +1 -1
  78. data/lib/lingo/srv/lingosrv.cfg +1 -1
  79. data/lib/lingo/version.rb +1 -1
  80. data/lib/lingo/web.rb +1 -1
  81. data/lib/lingo/web/lingoweb.cfg +1 -1
  82. data/test/attendee/ts_abbreviator.rb +4 -2
  83. data/test/attendee/ts_multi_worder.rb +81 -88
  84. data/test/attendee/ts_noneword_filter.rb +2 -2
  85. data/test/attendee/ts_object_filter.rb +2 -2
  86. data/test/attendee/ts_sequencer.rb +40 -20
  87. data/test/attendee/ts_stemmer.rb +52 -26
  88. data/test/attendee/ts_text_reader.rb +75 -56
  89. data/test/attendee/ts_text_writer.rb +6 -4
  90. data/test/attendee/ts_tokenizer.rb +304 -193
  91. data/test/attendee/ts_vector_filter.rb +242 -9
  92. data/test/ref/artikel.non +3 -0
  93. data/test/ref/artikel.vec +1 -4
  94. data/test/ref/artikel.vef +940 -0
  95. data/test/ref/artikel.ven +0 -3
  96. data/test/ref/artikel.ver +0 -3
  97. data/test/ref/artikel.vet +2580 -0
  98. data/test/ref/lir.non +34 -31
  99. data/test/ref/lir.seq +14 -15
  100. data/test/ref/lir.vec +37 -37
  101. data/test/ref/lir.vef +329 -0
  102. data/test/ref/lir.ven +329 -0
  103. data/test/ref/lir.ver +329 -0
  104. data/test/ref/lir.vet +329 -0
  105. data/test/test_helper.rb +29 -16
  106. data/test/ts_language.rb +6 -47
  107. metadata +74 -87
  108. data/lingo.rb +0 -29
  109. data/spec/spec_helper.rb +0 -5
@@ -6,9 +6,9 @@ class TestAttendeeNonewordFilter < AttendeeTestCase
6
6
 
7
7
  def test_basic
8
8
  meet({}, [
9
- wd('Eins|IDF'), wd('Zwei|?'), wd('Drei|IDF'), wd('Vier|?'), ai('EOF|')
9
+ wd('Eins|IDF'), wd('Zwei|?'), wd('Drei|IDF'), wd('Vier|?'), ai('EOF|'), ai('EOT|')
10
10
  ], [
11
- 'vier', 'zwei', ai('EOF|')
11
+ 'vier', 'zwei', ai('EOF|'), ai('EOT|')
12
12
  ])
13
13
  end
14
14
 
@@ -6,9 +6,9 @@ class TestAttendeeObjectFilter < AttendeeTestCase
6
6
 
7
7
  def test_basic
8
8
  meet({ 'objects' => 'obj.form =~ /^[A-Z]/' }, [
9
- wd('Eins|IDF'), wd('zwei|?'), wd('Drei|IDF'), wd('vier|?'), ai('EOF|')
9
+ wd('Eins|IDF'), wd('zwei|?'), wd('Drei|IDF'), wd('vier|?'), ai('EOF|'), ai('EOT|')
10
10
  ], [
11
- wd('Eins|IDF'), wd('Drei|IDF'), ai('EOF|')
11
+ wd('Eins|IDF'), wd('Drei|IDF'), ai('EOF|'), ai('EOT|')
12
12
  ])
13
13
  end
14
14
 
@@ -15,7 +15,8 @@ class TestAttendeeSequencer < AttendeeTestCase
15
15
  wd('Der|IDF', 'der|w'),
16
16
  wd('schöne|IDF', 'schön|a'),
17
17
  wd('Sonnenuntergang|KOM', 'sonnenuntergang|k', 'sonne|s+', 'untergang|s+'),
18
- ai('EOF|')
18
+ ai('EOF|'),
19
+ ai('EOT|')
19
20
  ], [
20
21
  # AS
21
22
  wd('Die|IDF', 'die|w'),
@@ -28,7 +29,8 @@ class TestAttendeeSequencer < AttendeeTestCase
28
29
  wd('schöne|IDF', 'schön|a'),
29
30
  wd('Sonnenuntergang|KOM', 'sonnenuntergang|k', 'sonne|s+', 'untergang|s+'),
30
31
  wd('sonnenuntergang, schön|SEQ', 'sonnenuntergang, schön|q'),
31
- ai('EOF|')
32
+ ai('EOF|'),
33
+ ai('EOT|')
32
34
  ])
33
35
  end
34
36
 
@@ -50,7 +52,8 @@ class TestAttendeeSequencer < AttendeeTestCase
50
52
  wd('Der|IDF', 'der|w'),
51
53
  wd('Sonne|IDF', 'sonne|s'),
52
54
  wd('Untergang|IDF', 'untergang|s'),
53
- ai('EOF|')
55
+ ai('EOF|'),
56
+ ai('EOT|')
54
57
  ], [
55
58
  # (AS)
56
59
  wd('Die|IDF', 'die|w'),
@@ -72,7 +75,8 @@ class TestAttendeeSequencer < AttendeeTestCase
72
75
  wd('Sonne|IDF', 'sonne|s'),
73
76
  wd('Untergang|IDF', 'untergang|s'),
74
77
  wd('sonne untergang|SEQ', 'sonne untergang|q'),
75
- ai('EOF|')
78
+ ai('EOF|'),
79
+ ai('EOT|')
76
80
  ])
77
81
  end
78
82
 
@@ -85,7 +89,8 @@ class TestAttendeeSequencer < AttendeeTestCase
85
89
  wd('Gottes|IDF', 'gott|s'),
86
90
  wd('Turm|IDF', 'turm|s'),
87
91
  tk('.|PUNC'),
88
- ai('EOF|')
92
+ ai('EOF|'),
93
+ ai('EOT|')
89
94
  ], [
90
95
  # MS
91
96
  wd('Der|IDF', 'der|w'),
@@ -95,7 +100,8 @@ class TestAttendeeSequencer < AttendeeTestCase
95
100
  wd('Turm|IDF', 'turm|s'),
96
101
  tk('.|PUNC'),
97
102
  wd('abbild gottes turm|SEQ', 'abbild gottes turm|q'),
98
- ai('EOF|')
103
+ ai('EOF|'),
104
+ ai('EOT|')
99
105
  ])
100
106
  meet({ 'sequences' => [['MS', '1 2'], ['SS', '1 2'], ['SSS', '1 2 3']] }, [
101
107
  # MS + SS + SS + SSS
@@ -109,7 +115,8 @@ class TestAttendeeSequencer < AttendeeTestCase
109
115
  wd('Abbild Gottes|MUL', 'abbild gottes|m'),
110
116
  wd('Abbild|IDF', 'abbild|s'),
111
117
  wd('Gottes|IDF', 'gott|s'),
112
- ai('EOF|')
118
+ ai('EOF|'),
119
+ ai('EOT|')
113
120
  ], [
114
121
  # MS + SS + SS + SSS
115
122
  wd('Der|IDF', 'der|w'),
@@ -127,7 +134,8 @@ class TestAttendeeSequencer < AttendeeTestCase
127
134
  wd('Abbild|IDF', 'abbild|s'),
128
135
  wd('Gottes|IDF', 'gott|s'),
129
136
  wd('abbild gott|SEQ', 'abbild gott|q'),
130
- ai('EOF|')
137
+ ai('EOF|'),
138
+ ai('EOT|')
131
139
  ])
132
140
  end
133
141
 
@@ -144,7 +152,8 @@ class TestAttendeeSequencer < AttendeeTestCase
144
152
  wd('Abbild Gottes|MUL', 'abbild gottes|m'),
145
153
  wd('Abbild|IDF', 'abbild|s'),
146
154
  wd('Gottes|IDF', 'gott|s'),
147
- ai('EOF|')
155
+ ai('EOF|'),
156
+ ai('EOT|')
148
157
  ], [
149
158
  # MS + SS + SS
150
159
  wd('Der|IDF', 'der|w'),
@@ -161,7 +170,8 @@ class TestAttendeeSequencer < AttendeeTestCase
161
170
  wd('Abbild|IDF', 'abbild|s'),
162
171
  wd('Gottes|IDF', 'gott|s'),
163
172
  wd('abbild gott|SEQ', 'abbild gott|q'),
164
- ai('EOF|')
173
+ ai('EOF|'),
174
+ ai('EOT|')
165
175
  ])
166
176
  end
167
177
 
@@ -177,7 +187,8 @@ class TestAttendeeSequencer < AttendeeTestCase
177
187
  wd('Abbild Gottes|MUL', 'abbild gottes|m'),
178
188
  wd('Abbild|IDF', 'abbild|s'),
179
189
  wd('Gottes|IDF', 'gott|s'),
180
- ai('EOF|')
190
+ ai('EOF|'),
191
+ ai('EOT|')
181
192
  ], [
182
193
  # (MS + SS + SS)
183
194
  wd('Der|IDF', 'der|w'),
@@ -189,7 +200,8 @@ class TestAttendeeSequencer < AttendeeTestCase
189
200
  wd('Abbild Gottes|MUL', 'abbild gottes|m'),
190
201
  wd('Abbild|IDF', 'abbild|s'),
191
202
  wd('Gottes|IDF', 'gott|s'),
192
- ai('EOF|')
203
+ ai('EOF|'),
204
+ ai('EOT|')
193
205
  ])
194
206
  end
195
207
 
@@ -206,7 +218,8 @@ class TestAttendeeSequencer < AttendeeTestCase
206
218
  wd('Abbild Gottes|MUL', 'abbild gottes|m'),
207
219
  wd('Abbild|IDF', 'abbild|s'),
208
220
  wd('Gottes|IDF', 'gott|s'),
209
- ai('EOF|')
221
+ ai('EOF|'),
222
+ ai('EOT|')
210
223
  ], [
211
224
  # MS + SS + SS
212
225
  wd('Der|IDF', 'der|w'),
@@ -223,7 +236,8 @@ class TestAttendeeSequencer < AttendeeTestCase
223
236
  wd('Abbild|IDF', 'abbild|s'),
224
237
  wd('Gottes|IDF', 'gott|s'),
225
238
  wd('abbild gott|SEQ', 'abbild gott|q'),
226
- ai('EOF|')
239
+ ai('EOF|'),
240
+ ai('EOT|')
227
241
  ])
228
242
  end
229
243
 
@@ -236,7 +250,8 @@ class TestAttendeeSequencer < AttendeeTestCase
236
250
  wd('Gottes|IDF', 'gott|s'),
237
251
  wd('Turm|IDF', 'turm|s'),
238
252
  tk('.|PUNC'),
239
- ai('EOF|')
253
+ ai('EOF|'),
254
+ ai('EOT|')
240
255
  ], [
241
256
  # MS + SSS + (SS) + SS
242
257
  wd('Der|IDF', 'der|w'),
@@ -249,7 +264,8 @@ class TestAttendeeSequencer < AttendeeTestCase
249
264
  wd('abbild gott turm|SEQ', 'abbild gott turm|q'),
250
265
  #wd('abbild gott|SEQ', 'abbild gott|q'), # FIXME
251
266
  wd('gott turm|SEQ', 'gott turm|q'),
252
- ai('EOF|')
267
+ ai('EOF|'),
268
+ ai('EOT|')
253
269
  ])
254
270
  end
255
271
 
@@ -262,7 +278,8 @@ class TestAttendeeSequencer < AttendeeTestCase
262
278
  wd('Gottes|IDF', 'gott|s'),
263
279
  wd('Turm|IDF', 'turm|s'),
264
280
  tk('.|PUNC'),
265
- ai('EOF|')
281
+ ai('EOF|'),
282
+ ai('EOT|')
266
283
  ], [
267
284
  # MS + SSS + (SS) + SS
268
285
  wd('Der|IDF', 'der|w'),
@@ -275,7 +292,8 @@ class TestAttendeeSequencer < AttendeeTestCase
275
292
  wd('sss:abbild^gott^turm|SEQ', 'sss:abbild^gott^turm|q'),
276
293
  #wd('ss:abbild^gott|SEQ', 'ss:abbild^gott|q'), # FIXME
277
294
  wd('ss:gott^turm|SEQ', 'ss:gott^turm|q'),
278
- ai('EOF|')
295
+ ai('EOF|'),
296
+ ai('EOT|')
279
297
  ])
280
298
  end
281
299
 
@@ -290,7 +308,8 @@ class TestAttendeeSequencer < AttendeeTestCase
290
308
  wd('Der|IDF', 'der|w'),
291
309
  wd('schöne|IDF', 'schön|a'),
292
310
  wd('Sonnenuntergang|KOM', 'sonnenuntergang|k', 'sonne|s+', 'untergang|s+'),
293
- ai('EOF|')
311
+ ai('EOF|'),
312
+ ai('EOT|')
294
313
  ], [
295
314
  # WA + AS
296
315
  wd('Die|IDF', 'die|w'),
@@ -305,7 +324,8 @@ class TestAttendeeSequencer < AttendeeTestCase
305
324
  wd('Sonnenuntergang|KOM', 'sonnenuntergang|k', 'sonne|s+', 'untergang|s+'),
306
325
  wd('der schön (wa)|SEQ', 'der schön (wa)|q'),
307
326
  wd('ak: sonnenuntergang, schön|SEQ', 'ak: sonnenuntergang, schön|q'),
308
- ai('EOF|')
327
+ ai('EOF|'),
328
+ ai('EOT|')
309
329
  ])
310
330
  end
311
331
 
@@ -13,12 +13,14 @@ class TestAttendeeStemmer < AttendeeTestCase
13
13
  wd('bla|IDF'),
14
14
  wd('blub|?'),
15
15
  wd('blubs|?'),
16
- ai('EOF|')
16
+ ai('EOF|'),
17
+ ai('EOT|')
17
18
  ], [
18
19
  wd('bla|IDF'),
19
20
  wd('blub|?'),
20
21
  wd('blubs|?', 'blub|z'),
21
- ai('EOF|')
22
+ ai('EOF|'),
23
+ ai('EOT|')
22
24
  ])
23
25
  end
24
26
 
@@ -27,12 +29,14 @@ class TestAttendeeStemmer < AttendeeTestCase
27
29
  wd('bla|IDF'),
28
30
  wd('blub|?'),
29
31
  wd('blubs|?'),
30
- ai('EOF|')
32
+ ai('EOF|'),
33
+ ai('EOT|')
31
34
  ], [
32
35
  wd('bla|IDF'),
33
36
  wd('blub|?'),
34
37
  wd('blubs|?', 'blub|w'),
35
- ai('EOF|')
38
+ ai('EOF|'),
39
+ ai('EOT|')
36
40
  ])
37
41
  end
38
42
 
@@ -42,13 +46,15 @@ class TestAttendeeStemmer < AttendeeTestCase
42
46
  wd('a|?'),
43
47
  wd('yet|?'),
44
48
  wd('blubs|?'),
45
- ai('EOF|')
49
+ ai('EOF|'),
50
+ ai('EOT|')
46
51
  ], [
47
52
  wd('bla|IDF'),
48
53
  wd('a|?'),
49
54
  wd('yet|?'),
50
55
  wd('blubs|?', 'blub|z'),
51
- ai('EOF|')
56
+ ai('EOF|'),
57
+ ai('EOT|')
52
58
  ])
53
59
 
54
60
  meet({ 'mode' => 'all' }, [
@@ -56,13 +62,15 @@ class TestAttendeeStemmer < AttendeeTestCase
56
62
  wd('a|?'),
57
63
  wd('yet|?'),
58
64
  wd('blubs|?'),
59
- ai('EOF|')
65
+ ai('EOF|'),
66
+ ai('EOT|')
60
67
  ], [
61
68
  wd('bla|IDF'),
62
69
  wd('a|?', 'a|z'),
63
70
  wd('yet|?', 'yet|z'),
64
71
  wd('blubs|?', 'blub|z'),
65
- ai('EOF|')
72
+ ai('EOF|'),
73
+ ai('EOT|')
66
74
  ])
67
75
  end
68
76
 
@@ -74,7 +82,8 @@ class TestAttendeeStemmer < AttendeeTestCase
74
82
  wd('ties|?'),
75
83
  wd('caress|?'),
76
84
  wd('cats|?'),
77
- ai('EOF|')
85
+ ai('EOF|'),
86
+ ai('EOT|')
78
87
  ], [
79
88
  wd('S100|IDF'),
80
89
  wd('caresses|?', 'caress|z'),
@@ -82,7 +91,8 @@ class TestAttendeeStemmer < AttendeeTestCase
82
91
  wd('ties|?', 'ti|z'), # snowball: tie
83
92
  wd('caress|?', 'caress|z'),
84
93
  wd('cats|?', 'cat|z'),
85
- ai('EOF|')
94
+ ai('EOF|'),
95
+ ai('EOT|')
86
96
  ])
87
97
  end
88
98
 
@@ -95,7 +105,8 @@ class TestAttendeeStemmer < AttendeeTestCase
95
105
  wd('bled|?'),
96
106
  wd('motoring|?'),
97
107
  wd('sing|?'),
98
- ai('EOF|')
108
+ ai('EOF|'),
109
+ ai('EOT|')
99
110
  ], [
100
111
  wd('S110|IDF'),
101
112
  wd('agreed|?', 'agre|z'),
@@ -104,7 +115,8 @@ class TestAttendeeStemmer < AttendeeTestCase
104
115
  wd('bled|?', 'bled|z'),
105
116
  wd('motoring|?', 'motor|z'),
106
117
  wd('sing|?', 'sing|z'),
107
- ai('EOF|')
118
+ ai('EOF|'),
119
+ ai('EOT|')
108
120
  ])
109
121
  end
110
122
 
@@ -121,7 +133,8 @@ class TestAttendeeStemmer < AttendeeTestCase
121
133
  wd('fizzed|?'),
122
134
  wd('failing|?'),
123
135
  wd('filing|?'),
124
- ai('EOF|')
136
+ ai('EOF|'),
137
+ ai('EOT|')
125
138
  ], [
126
139
  wd('S111|IDF'),
127
140
  wd('conflated|?', 'conflat|z'),
@@ -134,7 +147,8 @@ class TestAttendeeStemmer < AttendeeTestCase
134
147
  wd('fizzed|?', 'fizz|z'),
135
148
  wd('failing|?', 'fail|z'),
136
149
  wd('filing|?', 'file|z'),
137
- ai('EOF|')
150
+ ai('EOF|'),
151
+ ai('EOT|')
138
152
  ])
139
153
  end
140
154
 
@@ -143,12 +157,14 @@ class TestAttendeeStemmer < AttendeeTestCase
143
157
  wd('S120|IDF'),
144
158
  wd('happy|?'),
145
159
  wd('sky|?'),
146
- ai('EOF|')
160
+ ai('EOF|'),
161
+ ai('EOT|')
147
162
  ], [
148
163
  wd('S120|IDF'),
149
164
  wd('happy|?', 'happi|z'),
150
165
  wd('sky|?', 'sky|z'),
151
- ai('EOF|')
166
+ ai('EOF|'),
167
+ ai('EOT|')
152
168
  ])
153
169
  end
154
170
 
@@ -176,7 +192,8 @@ class TestAttendeeStemmer < AttendeeTestCase
176
192
  wd('formality|?'),
177
193
  wd('sensitivity|?'),
178
194
  wd('sensibility|?'),
179
- ai('EOF|')
195
+ ai('EOF|'),
196
+ ai('EOT|')
180
197
  ], [
181
198
  wd('S200|IDF'),
182
199
  wd('relational|?', 'relat|z'),
@@ -200,7 +217,8 @@ class TestAttendeeStemmer < AttendeeTestCase
200
217
  wd('formality|?', 'formal|z'),
201
218
  wd('sensitivity|?', 'sensit|z'),
202
219
  wd('sensibility|?', 'sensibl|z'),
203
- ai('EOF|')
220
+ ai('EOF|'),
221
+ ai('EOT|')
204
222
  ])
205
223
  end
206
224
 
@@ -214,7 +232,8 @@ class TestAttendeeStemmer < AttendeeTestCase
214
232
  wd('electrical|?'),
215
233
  wd('hopeful|?'),
216
234
  wd('goodness|?'),
217
- ai('EOF|')
235
+ ai('EOF|'),
236
+ ai('EOT|')
218
237
  ], [
219
238
  wd('S300|IDF'),
220
239
  wd('triplicate|?', 'triplic|z'),
@@ -224,7 +243,8 @@ class TestAttendeeStemmer < AttendeeTestCase
224
243
  wd('electrical|?', 'electr|z'),
225
244
  wd('hopeful|?', 'hope|z'),
226
245
  wd('goodness|?', 'good|z'),
227
- ai('EOF|')
246
+ ai('EOF|'),
247
+ ai('EOT|')
228
248
  ])
229
249
  end
230
250
 
@@ -250,7 +270,8 @@ class TestAttendeeStemmer < AttendeeTestCase
250
270
  wd('homologous|?'),
251
271
  wd('effective|?'),
252
272
  wd('bowdlerize|?'),
253
- ai('EOF|')
273
+ ai('EOF|'),
274
+ ai('EOT|')
254
275
  ], [
255
276
  wd('S400|IDF'),
256
277
  wd('revival|?', 'reviv|z'),
@@ -272,7 +293,8 @@ class TestAttendeeStemmer < AttendeeTestCase
272
293
  wd('homologous|?', 'homolog|z'),
273
294
  wd('effective|?', 'effect|z'),
274
295
  wd('bowdlerize|?', 'bowdler|z'),
275
- ai('EOF|')
296
+ ai('EOF|'),
297
+ ai('EOT|')
276
298
  ])
277
299
  end
278
300
 
@@ -282,13 +304,15 @@ class TestAttendeeStemmer < AttendeeTestCase
282
304
  wd('probate|?'),
283
305
  wd('rate|?'),
284
306
  wd('cease|?'),
285
- ai('EOF|')
307
+ ai('EOF|'),
308
+ ai('EOT|')
286
309
  ], [
287
310
  wd('S500|IDF'),
288
311
  wd('probate|?', 'probat|z'),
289
312
  wd('rate|?', 'rate|z'),
290
313
  wd('cease|?', 'ceas|z'),
291
- ai('EOF|')
314
+ ai('EOF|'),
315
+ ai('EOT|')
292
316
  ])
293
317
  end
294
318
 
@@ -297,12 +321,14 @@ class TestAttendeeStemmer < AttendeeTestCase
297
321
  wd('S510|IDF'),
298
322
  wd('controll|?'),
299
323
  wd('roll|?'),
300
- ai('EOF|')
324
+ ai('EOF|'),
325
+ ai('EOT|')
301
326
  ], [
302
327
  wd('S510|IDF'),
303
328
  wd('controll|?', 'control|z'),
304
329
  wd('roll|?', 'roll|z'),
305
- ai('EOF|')
330
+ ai('EOF|'),
331
+ ai('EOT|')
306
332
  ])
307
333
  end
308
334
 
@@ -6,111 +6,130 @@ class TestAttendeeTextReader < AttendeeTestCase
6
6
 
7
7
  def test_lir_file
8
8
  meet({ 'files' => 'test/lir.txt', 'records' => true, 'fields' => false }, nil, [
9
- ai('LIR-FORMAT|'), ai("FILE|#{path = File.expand_path('test/lir.txt')}"),
9
+ ai('LIR|'), ai("FILE|#{path = File.expand_path('test/lir.txt')}"),
10
10
  ai('RECORD|00237'),
11
- '020: GERHARD.',
12
- '025: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
13
- '056: Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.',
11
+ li('020: GERHARD.', 25),
12
+ li('025: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 140),
13
+ li('056: Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.', 264),
14
+ li('', 266),
14
15
  ai('RECORD|00238'),
15
- '020: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
16
- '025: das DFG-Projekt GERHARD.',
16
+ li('020: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 391),
17
+ li('025: das DFG-Projekt GERHARD.', 422),
18
+ li('', 424),
17
19
  ai('RECORD|00239'),
18
- '020: Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.',
19
- '056: "Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.',
20
- ai("EOF|#{path}")
20
+ li('020: Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.', 510),
21
+ li('056: "Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.', 634),
22
+ ai("EOF|#{path}"),
23
+ ai('EOT|')
21
24
  ])
22
25
  end
23
26
 
24
27
  def test_lir_file_another_pattern
25
28
  meet({ 'files' => 'test/lir2.txt', 'records' => '^\021(\d+)\022', 'fields' => false }, nil, [
26
- ai('LIR-FORMAT|'), ai("FILE|#{path = File.expand_path('test/lir2.txt')}"),
29
+ ai('LIR|'), ai("FILE|#{path = File.expand_path('test/lir2.txt')}"),
27
30
  ai('RECORD|00237'),
28
- '020: GERHARD.',
29
- '025: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
30
- '056: Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.',
31
+ li('020: GERHARD.', 24),
32
+ li('025: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 139),
33
+ li('056: Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.', 263),
34
+ li('', 265),
31
35
  ai('RECORD|00238'),
32
- '020: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
33
- '025: das DFG-Projekt GERHARD.',
36
+ li('020: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 389),
37
+ li('025: das DFG-Projekt GERHARD.', 420),
38
+ li('', 422),
34
39
  ai('RECORD|00239'),
35
- '020: Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.',
36
- '056: "Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.',
37
- ai("EOF|#{path}")
40
+ li('020: Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.', 507),
41
+ li('056: "Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.', 631),
42
+ ai("EOF|#{path}"),
43
+ ai('EOT|')
38
44
  ])
39
45
  end
40
46
 
41
47
  def test_lir_file_no_capture
42
48
  meet({ 'files' => 'test/lir.txt', 'records' => '^\[\d+\.\]', 'fields' => false }, nil, [
43
- ai('LIR-FORMAT|'), ai("FILE|#{path = File.expand_path('test/lir.txt')}"),
49
+ ai('LIR|'), ai("FILE|#{path = File.expand_path('test/lir.txt')}"),
44
50
  ai('RECORD|[00237.]'),
45
- '020: GERHARD.',
46
- '025: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
47
- '056: Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.',
51
+ li('020: GERHARD.', 25),
52
+ li('025: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 140),
53
+ li('056: Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.', 264),
54
+ li('', 266),
48
55
  ai('RECORD|[00238.]'),
49
- '020: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
50
- '025: das DFG-Projekt GERHARD.',
56
+ li('020: Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 391),
57
+ li('025: das DFG-Projekt GERHARD.', 422),
58
+ li('', 424),
51
59
  ai('RECORD|[00239.]'),
52
- '020: Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.',
53
- '056: "Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.',
54
- ai("EOF|#{path}")
60
+ li('020: Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.', 510),
61
+ li('056: "Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.', 634),
62
+ ai("EOF|#{path}"),
63
+ ai('EOT|')
55
64
  ])
56
65
  end
57
66
 
58
67
  def test_lir_file_fields
59
68
  meet({ 'files' => 'test/lir.txt', 'records' => true }, nil, [
60
- ai('LIR-FORMAT|'), ai("FILE|#{path = File.expand_path('test/lir.txt')}"),
69
+ ai('LIR|'), ai("FILE|#{path = File.expand_path('test/lir.txt')}"),
61
70
  ai('RECORD|00237'),
62
- 'GERHARD.',
63
- 'Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
64
- 'Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.',
71
+ li('GERHARD.', 25),
72
+ li('Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 140),
73
+ li('Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.', 264),
74
+ li('', 266),
65
75
  ai('RECORD|00238'),
66
- 'Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
67
- 'das DFG-Projekt GERHARD.',
76
+ li('Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 391),
77
+ li('das DFG-Projekt GERHARD.', 422),
78
+ li('', 424),
68
79
  ai('RECORD|00239'),
69
- 'Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.',
70
- '"Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.',
71
- ai("EOF|#{path}")
80
+ li('Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.', 510),
81
+ li('"Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.', 634),
82
+ ai("EOF|#{path}"),
83
+ ai('EOT|')
72
84
  ])
73
85
  end
74
86
 
75
87
  def test_lir_file_fields_another_pattern
76
88
  meet({ 'files' => 'test/lir.txt', 'records' => true, 'fields' => '^\d+:' }, nil, [
77
- ai('LIR-FORMAT|'), ai("FILE|#{path = File.expand_path('test/lir.txt')}"),
89
+ ai('LIR|'), ai("FILE|#{path = File.expand_path('test/lir.txt')}"),
78
90
  ai('RECORD|00237'),
79
- ' GERHARD.',
80
- ' Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
81
- ' Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.',
91
+ li(' GERHARD.', 25),
92
+ li(' Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 140),
93
+ li(' Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.', 264),
94
+ li('', 266),
82
95
  ai('RECORD|00238'),
83
- ' Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
84
- ' das DFG-Projekt GERHARD.',
96
+ li(' Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 391),
97
+ li(' das DFG-Projekt GERHARD.', 422),
98
+ li('', 424),
85
99
  ai('RECORD|00239'),
86
- ' Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.',
87
- ' "Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.',
88
- ai("EOF|#{path}")
100
+ li(' Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.', 510),
101
+ li(' "Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.', 634),
102
+ ai("EOF|#{path}"),
103
+ ai('EOT|')
89
104
  ])
90
105
  end
91
106
 
92
107
  def test_lir_file_fields_no_capture
93
108
  meet({ 'files' => 'test/lir.txt', 'records' => '^\[\d+\.\]' }, nil, [
94
- ai('LIR-FORMAT|'), ai("FILE|#{path = File.expand_path('test/lir.txt')}"),
109
+ ai('LIR|'), ai("FILE|#{path = File.expand_path('test/lir.txt')}"),
95
110
  ai('RECORD|[00237.]'),
96
- 'GERHARD.',
97
- 'Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
98
- 'Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.',
111
+ li('GERHARD.', 25),
112
+ li('Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 140),
113
+ li('Die intellektuelle Erschließung des Internet befindet sich in einer Krise. GERHARD ist derzeit weltweit der einzige.', 264),
114
+ li('', 266),
99
115
  ai('RECORD|[00238.]'),
100
- 'Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.',
101
- 'das DFG-Projekt GERHARD.',
116
+ li('Automatisches Sammeln, Klassifizieren und Indexieren von wissenschaftlich relevanten Informationsressourcen.', 391),
117
+ li('das DFG-Projekt GERHARD.', 422),
118
+ li('', 424),
102
119
  ai('RECORD|[00239.]'),
103
- 'Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.',
104
- '"Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.',
105
- ai("EOF|#{path}")
120
+ li('Information Retrieval und Dokumentmanagement im Multimedia-Zeitalter.', 510),
121
+ li('"Das Buch ist ein praxisbezogenes VADEMECUM für alle, die in einer Welt der Datennetze Wissen/Informationen sammeln.', 634),
122
+ ai("EOF|#{path}"),
123
+ ai('EOT|')
106
124
  ])
107
125
  end
108
126
 
109
127
  def test_normal_file
110
128
  meet({ 'files' => 'test/mul.txt' }, nil, [
111
129
  ai("FILE|#{path = File.expand_path('test/mul.txt')}"),
112
- 'Die abstrakte Kunst ist schön.',
113
- ai("EOF|#{path}")
130
+ ['Die abstrakte Kunst ist schön.', 31],
131
+ ai("EOF|#{path}"),
132
+ ai('EOT|')
114
133
  ])
115
134
  end
116
135