lingo 1.8.4.2 → 1.8.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +413 -325
  3. data/README +380 -131
  4. data/Rakefile +19 -21
  5. data/de/lingo-abk.txt +15 -17
  6. data/de/lingo-dic.txt +20210 -20659
  7. data/de/lingo-mul.txt +5 -13
  8. data/de/lingo-syn.txt +5 -8
  9. data/de/test_dic.txt +2 -0
  10. data/de/test_gen.txt +8 -0
  11. data/de/{test_mul2.txt → test_mu2.txt} +0 -0
  12. data/de/{test_singleword.txt → test_sgw.txt} +0 -0
  13. data/de/user-dic.txt +5 -7
  14. data/de.lang +64 -49
  15. data/en/lingo-dic.txt +6398 -6404
  16. data/en/lingo-irr.txt +2 -3
  17. data/en/lingo-mul.txt +6 -7
  18. data/en/lingo-wdn.txt +881 -1762
  19. data/en/user-dic.txt +2 -5
  20. data/en.lang +39 -39
  21. data/lib/lingo/app.rb +10 -6
  22. data/lib/lingo/attendee/abbreviator.rb +1 -0
  23. data/lib/lingo/attendee/decomposer.rb +2 -1
  24. data/lib/lingo/attendee/multi_worder.rb +5 -6
  25. data/lib/lingo/attendee/stemmer.rb +1 -1
  26. data/lib/lingo/attendee/synonymer.rb +4 -2
  27. data/lib/lingo/attendee/text_reader.rb +77 -57
  28. data/lib/lingo/attendee/text_writer.rb +1 -1
  29. data/lib/lingo/attendee/tokenizer.rb +101 -50
  30. data/lib/lingo/attendee/variator.rb +2 -1
  31. data/lib/lingo/attendee/vector_filter.rb +28 -6
  32. data/lib/lingo/attendee/word_searcher.rb +2 -1
  33. data/lib/lingo/attendee.rb +8 -4
  34. data/lib/lingo/call.rb +7 -3
  35. data/lib/lingo/cli.rb +8 -16
  36. data/lib/lingo/config.rb +11 -6
  37. data/lib/lingo/ctl.rb +54 -3
  38. data/lib/lingo/database/crypter.rb +8 -14
  39. data/lib/lingo/database/hash_store.rb +1 -1
  40. data/lib/lingo/database/{show_progress.rb → progress.rb} +7 -8
  41. data/lib/lingo/database/source/key_value.rb +6 -5
  42. data/lib/lingo/database/source/multi_key.rb +5 -2
  43. data/lib/lingo/database/source/multi_value.rb +6 -4
  44. data/lib/lingo/database/source/single_word.rb +2 -3
  45. data/lib/lingo/database/source/word_class.rb +24 -5
  46. data/lib/lingo/database/source.rb +5 -3
  47. data/lib/lingo/database.rb +102 -41
  48. data/lib/lingo/error.rb +24 -2
  49. data/lib/lingo/language/dictionary.rb +26 -54
  50. data/lib/lingo/language/grammar.rb +19 -23
  51. data/lib/lingo/language/lexical.rb +5 -1
  52. data/lib/lingo/language/lexical_hash.rb +7 -12
  53. data/lib/lingo/language/token.rb +10 -1
  54. data/lib/lingo/language/word.rb +35 -23
  55. data/lib/lingo/language/word_form.rb +5 -4
  56. data/lib/lingo/{show_progress.rb → progress.rb} +43 -30
  57. data/lib/lingo/srv/lingosrv.cfg +1 -1
  58. data/lib/lingo/srv/public/.gitkeep +0 -0
  59. data/lib/lingo/srv.rb +11 -6
  60. data/lib/lingo/version.rb +2 -2
  61. data/lib/lingo/web/lingoweb.cfg +1 -1
  62. data/lib/lingo/web/views/index.erb +4 -4
  63. data/lib/lingo/web.rb +4 -6
  64. data/lib/lingo.rb +4 -12
  65. data/lingo.cfg +1 -1
  66. data/lir.cfg +1 -1
  67. data/ru/lingo-dic.txt +33473 -2113
  68. data/ru/lingo-mul.txt +8430 -1913
  69. data/ru/lingo-syn.txt +1634 -0
  70. data/ru/user-dic.txt +6 -0
  71. data/ru.lang +49 -47
  72. data/spec/spec_helper.rb +4 -0
  73. data/test/attendee/ts_decomposer.rb +2 -2
  74. data/test/attendee/ts_synonymer.rb +3 -3
  75. data/test/attendee/ts_tokenizer.rb +215 -2
  76. data/test/attendee/ts_variator.rb +2 -2
  77. data/test/attendee/ts_word_searcher.rb +10 -6
  78. data/test/ref/artikel.seq +2 -2
  79. data/test/ref/artikel.vec +5 -5
  80. data/test/ref/artikel.ven +11 -11
  81. data/test/ref/artikel.ver +11 -11
  82. data/test/ref/lir.seq +13 -13
  83. data/test/ref/lir.vec +31 -31
  84. data/test/test_helper.rb +19 -5
  85. data/test/ts_database.rb +206 -77
  86. data/test/ts_language.rb +86 -26
  87. metadata +93 -49
  88. data/.rspec +0 -1
  89. data/de/test_syn2.txt +0 -1
@@ -6,7 +6,7 @@
6
6
  # Lingo -- A full-featured automatic indexing system #
7
7
  # #
8
8
  # Copyright (C) 2005-2007 John Vorhauer #
9
- # Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
9
+ # Copyright (C) 2007-2013 John Vorhauer, Jens Wille #
10
10
  # #
11
11
  # Lingo is free software; you can redistribute it and/or modify it under the #
12
12
  # terms of the GNU Affero General Public License as published by the Free #
@@ -46,7 +46,7 @@ class Lingo
46
46
  def initialize(config, lingo)
47
47
  @dic, @suggestions = Dictionary.new(config, lingo), []
48
48
 
49
- lingo.deprecate(:compositum, :compound, self) if lingo.dictionary_config.has_key?('compositum')
49
+ lingo.deprecate(:compositum, :compound, self) if lingo.dictionary_config.key?('compositum')
50
50
 
51
51
  cfg = lingo.dictionary_config['compound'] ||
52
52
  lingo.dictionary_config['compositum'] # DEPRECATE compositum
@@ -79,16 +79,9 @@ class Lingo
79
79
  # find_compound arbeitet in verschiedenen Leveln, da die Methode auch rekursiv aufgerufen wird. Ein Level größer 1
80
80
  # entspricht daher einem rekursiven Aufruf
81
81
  def find_compound(str, level = 1, tail = false)
82
- return permute_compound([[], [], ''], str, level, tail) if level != 1
83
-
84
- (@_compound ||= {})[str] ||= permute_compound(
85
- com = Word.new(str, WA_UNKNOWN), str, level, tail
86
- ) { |lex|
87
- com.attr = WA_COMPOUND
88
- com.lexicals = lex.each { |l|
89
- l.attr += @append_wc unless l.attr == LA_COMPOUND
90
- }
91
- }
82
+ level == 1 ? (@_compound ||= {})[str] ||=
83
+ permute_compound(Word.new(str, WA_UNKNOWN), str, level, tail) :
84
+ permute_compound([[], [], ''], str, level, tail)
92
85
  end
93
86
 
94
87
  private
@@ -115,7 +108,9 @@ class Lingo
115
108
  }
116
109
  end
117
110
 
118
- block_given? ? yield(lex) : ret = res if !lex.empty? &&
111
+ level > 1 ? ret = res : ret.identify(lex.each { |l|
112
+ l.attr += @append_wc unless l.attr == LA_COMPOUND
113
+ }, WA_COMPOUND) if !lex.empty? &&
119
114
  sta.size <= @max_parts &&
120
115
  sta.min >= @min_part_size &&
121
116
  str.length / sta.size >= @min_avg_part_size &&
@@ -131,16 +126,16 @@ class Lingo
131
126
  def test_compound(fstr, infix, bstr, level = 1, tail = false)
132
127
  sta, seq, empty = [fstr.length, bstr.length], %w[? ?], [[], [], '']
133
128
 
134
- if !Lingo.sort!(blex = @dic.select_with_suffix(bstr)).empty?
129
+ if !(blex = @dic.select_with_suffix(bstr)).empty?
135
130
  # 1. Word w/ suffix
136
131
  bform, seq[1] = tail ? bstr : blex.first.form, blex.first.attr
137
- elsif tail && !Lingo.sort!(blex = @dic.select_with_infix(bstr)).empty?
132
+ elsif tail && !(blex = @dic.select_with_infix(bstr)).empty?
138
133
  # 2. Word w/ infix, unless tail part
139
134
  bform, seq[1] = bstr, blex.first.attr
140
135
  elsif infix == '-'
141
136
  blex, bsta, bseq = find_compound(bstr, level + 1, tail)
142
137
 
143
- if !Lingo.sort!(blex).empty?
138
+ if !blex.empty?
144
139
  # 3. Compound
145
140
  bform, seq[1], sta[1..-1] = blex.first.form, bseq, bsta
146
141
  else
@@ -151,13 +146,13 @@ class Lingo
151
146
  return empty
152
147
  end
153
148
 
154
- if !Lingo.sort!(flex = @dic.select_with_infix(fstr)).empty?
149
+ if !(flex = @dic.select_with_infix(fstr)).empty?
155
150
  # 1. Word w/ infix
156
151
  fform, seq[0] = fstr, flex.first.attr
157
152
  else
158
153
  flex, fsta, fseq = find_compound(fstr, level + 1, true)
159
154
 
160
- if !Lingo.sort!(flex).empty?
155
+ if !flex.empty?
161
156
  # 2. Compound
162
157
  fform, seq[0], sta[0..0] = flex.first.form, fseq, fsta
163
158
  elsif infix == '-'
@@ -168,14 +163,15 @@ class Lingo
168
163
  end
169
164
  end
170
165
 
171
- { flex => fform, blex => bform }.each { |a, f|
172
- a.each { |l| l.src ||= f }
166
+ forms = [[flex, fform], [blex, bform]].each { |ary|
167
+ ary.shift.each { |lex| lex.src ||= ary.first }
173
168
  }
174
169
 
175
- flex.concat(blex).delete_if { |l| l.attr == LA_COMPOUND }.
176
- push(Lexical.new(fform + infix + bform, LA_COMPOUND))
170
+ flex.concat(blex).delete_if { |lex| lex.attr == LA_COMPOUND }
177
171
 
178
- [Lingo.sort!(flex), sta, seq.join]
172
+ [forms.shift.product(*forms).map { |front, back|
173
+ Lexical.new(front + infix + back, LA_COMPOUND)
174
+ }.concat(flex), sta, seq.join]
179
175
  end
180
176
 
181
177
  end
@@ -6,7 +6,7 @@
6
6
  # Lingo -- A full-featured automatic indexing system #
7
7
  # #
8
8
  # Copyright (C) 2005-2007 John Vorhauer #
9
- # Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
9
+ # Copyright (C) 2007-2014 John Vorhauer, Jens Wille #
10
10
  # #
11
11
  # Lingo is free software; you can redistribute it and/or modify it under the #
12
12
  # terms of the GNU Affero General Public License as published by the Free #
@@ -36,6 +36,10 @@ class Lingo
36
36
 
37
37
  class Lexical < WordForm
38
38
 
39
+ def attr?(attr)
40
+ self.attr.start_with?(attr)
41
+ end
42
+
39
43
  def <=>(other)
40
44
  return 1 unless other.is_a?(self.class)
41
45
 
@@ -6,7 +6,7 @@
6
6
  # Lingo -- A full-featured automatic indexing system #
7
7
  # #
8
8
  # Copyright (C) 2005-2007 John Vorhauer #
9
- # Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
9
+ # Copyright (C) 2007-2014 John Vorhauer, Jens Wille #
10
10
  # #
11
11
  # Lingo is free software; you can redistribute it and/or modify it under the #
12
12
  # terms of the GNU Affero General Public License as published by the Free #
@@ -34,6 +34,8 @@ class Lingo
34
34
 
35
35
  class LexicalHash
36
36
 
37
+ KEY_REF_RE = %r{\A#{Regexp.escape(Database::KEY_REF)}(\d+)\z}o
38
+
37
39
  def self.open(*args)
38
40
  yield lexical_hash = new(*args)
39
41
  ensure
@@ -41,7 +43,6 @@ class Lingo
41
43
  end
42
44
 
43
45
  def initialize(id, lingo)
44
- @wc = lingo.database_config(id).fetch('def-wc', LA_UNKNOWN)
45
46
  @src = Database.open(id, lingo)
46
47
  end
47
48
 
@@ -50,22 +51,16 @@ class Lingo
50
51
  end
51
52
 
52
53
  def [](key)
53
- rec = @src[key = Unicode.downcase(key)] or return
54
+ rec = @src[Unicode.downcase(key)] or return
54
55
 
55
56
  res = rec.map { |str|
56
- case str
57
- when /^\*\d+$/ then str
58
- when /^#(.)$/ then Lexical.new(key, $1)
59
- when /^([^#]+?)\s*#(.)$/ then Lexical.new($1, $2)
60
- when /^([^#]+)$/ then Lexical.new($1, @wc)
61
- else str
57
+ str =~ KEY_REF_RE ? $1.to_i : begin
58
+ k, *w = str.split('#')
59
+ Lexical.new(k.strip, w)
62
60
  end
63
61
  }
64
62
 
65
- res.compact!
66
- res.sort!
67
63
  res.uniq!
68
-
69
64
  res
70
65
  end
71
66
 
@@ -6,7 +6,7 @@
6
6
  # Lingo -- A full-featured automatic indexing system #
7
7
  # #
8
8
  # Copyright (C) 2005-2007 John Vorhauer #
9
- # Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
9
+ # Copyright (C) 2007-2014 John Vorhauer, Jens Wille #
10
10
  # #
11
11
  # Lingo is free software; you can redistribute it and/or modify it under the #
12
12
  # terms of the GNU Affero General Public License as published by the Free #
@@ -37,6 +37,15 @@ class Lingo
37
37
 
38
38
  class Token < WordForm
39
39
 
40
+ def self.clean(attr)
41
+ attr.sub(/:.*/, '')
42
+ end
43
+
44
+ def initialize(*)
45
+ super
46
+ @attr = self.class.clean(attr)
47
+ end
48
+
40
49
  def word?
41
50
  attr == TA_WORD
42
51
  end
@@ -6,7 +6,7 @@
6
6
  # Lingo -- A full-featured automatic indexing system #
7
7
  # #
8
8
  # Copyright (C) 2005-2007 John Vorhauer #
9
- # Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
9
+ # Copyright (C) 2007-2013 John Vorhauer, Jens Wille #
10
10
  # #
11
11
  # Lingo is free software; you can redistribute it and/or modify it under the #
12
12
  # terms of the GNU Affero General Public License as published by the Free #
@@ -43,6 +43,20 @@ class Lingo
43
43
  new_lexicals(form, attr, Lexical.new(form, lex_attr))
44
44
  end
45
45
 
46
+ def new_compound_head(lex, attr = WA_UNSET)
47
+ form, head_lex = nil, []
48
+
49
+ lex.reverse_each { |l|
50
+ src = l.src ||= l.form
51
+ form ||= src
52
+ form != src ? break : head_lex.unshift(l.dup)
53
+ }
54
+
55
+ head_lex.each { |l| l.attr = l.attr[/\w+/] }.uniq!
56
+
57
+ new_lexicals(form, attr, head_lex) if form
58
+ end
59
+
46
60
  end
47
61
 
48
62
  # Exakte Representation der originären Zeichenkette, so wie sie im Satz
@@ -63,6 +77,8 @@ class Lingo
63
77
  @lexicals = []
64
78
  end
65
79
 
80
+ attr_writer :lexicals
81
+
66
82
  def lexicals(compound_parts = true)
67
83
  if !compound_parts && attr == WA_COMPOUND
68
84
  @lexicals.select { |lex| lex.attr == LA_COMPOUND }
@@ -71,31 +87,30 @@ class Lingo
71
87
  end
72
88
  end
73
89
 
74
- def lexicals=(lex)
75
- if lex.is_a?(Array)
76
- @lexicals = Lingo.sort(lex).uniq
77
- else
78
- raise TypeError, "wrong argument type #{lex.class} (expected Array)"
79
- end
90
+ def add_lexicals(lex)
91
+ @lexicals.concat(lex - @lexicals)
80
92
  end
81
93
 
82
- def add_lexicals(lex)
83
- unless lex.empty?
84
- @lexicals.concat(lex).uniq!
85
- Lingo.sort!(@lexicals)
86
- end
94
+ def attr?(*attr)
95
+ !(attrs & attr).empty?
87
96
  end
88
97
 
89
98
  def attrs(compound_parts = true)
90
99
  lexicals(compound_parts).map { |i| i.attr }
91
100
  end
92
101
 
93
- def parts
94
- 1
102
+ def genders(compound_parts = true)
103
+ lexicals(compound_parts).map { |i| i.gender }
95
104
  end
96
105
 
97
- def min_part_size
98
- form.length
106
+ def identify(lex, wc = nil)
107
+ return self if lex.empty?
108
+
109
+ self.lexicals = lex
110
+ self.attr = wc ||= attr?(LA_COMPOUND) ? WA_COMPOUND : WA_IDENTIFIED
111
+ self.head = self.class.new_compound_head(lex) if wc == WA_COMPOUND
112
+
113
+ self
99
114
  end
100
115
 
101
116
  # Gibt genau die Grundform der Wortklasse zurück, die der RegExp des Übergabe-Parameters
@@ -103,11 +118,8 @@ class Lingo
103
118
  def get_class(wc_re)
104
119
  wc_re = Regexp.new(wc_re) unless wc_re.is_a?(Regexp)
105
120
 
106
- unless lexicals.empty?
121
+ lexicals.empty? ? attr =~ wc_re ? [self] : [] :
107
122
  lexicals.select { |lex| lex.attr =~ wc_re }
108
- else
109
- attr =~ wc_re ? [self] : []
110
- end
111
123
  end
112
124
 
113
125
  def norm
@@ -126,9 +138,9 @@ class Lingo
126
138
  lex = get_class(wc_re).first and lex.form.count(' ') + 1
127
139
  end
128
140
 
129
- def <<(*other)
130
- other.flatten!
131
- lexicals.concat(other)
141
+ def <<(*lex)
142
+ lex.flatten!
143
+ @lexicals.concat(lex)
132
144
  self
133
145
  end
134
146
 
@@ -6,7 +6,7 @@
6
6
  # Lingo -- A full-featured automatic indexing system #
7
7
  # #
8
8
  # Copyright (C) 2005-2007 John Vorhauer #
9
- # Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
9
+ # Copyright (C) 2007-2013 John Vorhauer, Jens Wille #
10
10
  # #
11
11
  # Lingo is free software; you can redistribute it and/or modify it under the #
12
12
  # terms of the GNU Affero General Public License as published by the Free #
@@ -36,12 +36,13 @@ class Lingo
36
36
 
37
37
  include Comparable
38
38
 
39
- attr_accessor :form, :attr, :src
40
-
41
39
  def initialize(form, attr = WA_UNSET, src = nil)
40
+ attr, @gender = attr
42
41
  @form, @attr, @src = form || '', attr || '', src
43
42
  end
44
43
 
44
+ attr_accessor :form, :attr, :gender, :src, :head
45
+
45
46
  def unknown?
46
47
  [WA_UNKNOWN, WA_UNKMULPART].include?(attr)
47
48
  end
@@ -55,7 +56,7 @@ class Lingo
55
56
  end
56
57
 
57
58
  def to_a
58
- [form, attr]
59
+ [form, attr, gender].compact
59
60
  end
60
61
 
61
62
  def to_s
@@ -26,53 +26,66 @@
26
26
 
27
27
  class Lingo
28
28
 
29
- class ShowProgress
29
+ class Progress
30
30
 
31
- def initialize(obj, max, name = nil, doit = true, text = 'progress', nl = true)
32
- return yield self unless max && doit
31
+ def initialize(obj, max, name = nil, doit = true, text = 'progress', nl = true, &block)
32
+ @doit, @out = doit, obj.lingo.config.stderr
33
33
 
34
- @out = obj.instance_variable_get(:@lingo).config.stderr
34
+ if max && doit
35
+ format = ' [%3d%%]'
36
+ length = (format % 0).length
35
37
 
36
- # To get the length of the formatted string we have
37
- # to actually substitute the placeholder.
38
- fmt = ' [%3d%%]'
39
- len = (fmt % 0).length
38
+ erase = "\b" * length
39
+ @format = format + erase
40
40
 
41
- # Now we know how far to "go back" to
42
- # overwrite the formatted string...
43
- back = "\b" * len
41
+ print name, ': ' if name
42
+ print text
44
43
 
45
- @fmt = fmt + back
46
- @clr = ' ' * len + back
44
+ init(max)
47
45
 
48
- print name, ': ' if name
46
+ msg = %w[done aborted]
47
+ end
48
+
49
+ suc = false
50
+
51
+ res = catch(:cancel) {
52
+ int = trap(:INT) { throw(:cancel) }
49
53
 
50
- @rat, @cnt, @next = max / 100.0, 0, 0
51
- print text
52
- step
54
+ begin
55
+ yield self
56
+ ensure
57
+ trap(:INT, &int)
58
+ end
53
59
 
54
- yield self
60
+ suc = true
61
+ nil
62
+ }
55
63
 
56
- print "#{@clr} done."
57
- print "\n" if nl
64
+ print ' ' * length + erase, ' ', msg[suc ? 0 : 1], '.' if msg
65
+ print "\n" if msg && res
66
+
67
+ print Array(res).join("\n") if res
68
+ print "\n" if nl && (msg || res)
58
69
  end
59
70
 
60
- def [](value)
61
- if defined?(@cnt)
62
- @cnt = value
63
- step if @cnt >= @next
71
+ def init(max, doit = @doit)
72
+ if max && doit
73
+ @ratio, @next = max / 100.0, 0
74
+ self << @count = 0
64
75
  end
65
76
  end
66
77
 
67
- private
78
+ def <<(value)
79
+ if defined?(@count) && (@count = value) >= @next
80
+ percent = @count / @ratio
81
+ @next = (percent + 1) * @ratio
68
82
 
69
- def step
70
- percent = @cnt / @rat
71
- @next = (percent + 1) * @rat
72
-
73
- print @fmt % percent if percent.finite?
83
+ print @format % percent if percent.finite?
84
+ end
74
85
  end
75
86
 
87
+ private
88
+
76
89
  def print(*args)
77
90
  @out.print(*args)
78
91
  end
@@ -10,5 +10,5 @@ meeting:
10
10
  - sequencer: { stopper: 'PUNC,OTHR' }
11
11
  - synonymer: { skip: '?,t', source: sys-syn }
12
12
 
13
- - vector_filter: { debug: 'true', prompt: '' }
13
+ - vector_filter: { debug: 'true', prompt: '', preamble: false }
14
14
  - text_writer: { ext: STDOUT, sep: "\n" }
File without changes
data/lib/lingo/srv.rb CHANGED
@@ -42,6 +42,11 @@ class Lingo
42
42
  get('/') { doit }
43
43
  post('/') { doit }
44
44
 
45
+ post('/raw') {
46
+ content_type :text
47
+ LINGO.talk(request.body, true)
48
+ }
49
+
45
50
  def doit
46
51
  to_json(q = params[:q], case q
47
52
  when String then talk(q)
@@ -53,14 +58,14 @@ class Lingo
53
58
  r = LINGO.talk(q) unless q.empty?
54
59
  return r unless r && SRC_SEP
55
60
 
56
- r.inject(Hash.new { |h, k| h[k] = [] }) { |h, s|
57
- a, b = s.split(SRC_SEP, 2); h[b] << a; h
61
+ s = Hash.new { |h, k| h[k] = [] }
62
+
63
+ r.each { |t|
64
+ a, b = t.split(SRC_SEP, 2)
65
+ s[b] << a
58
66
  }
59
- end
60
67
 
61
- if ENV['LINGO_NO_SORT']
62
- alias_method :_talk, :talk
63
- def talk(q) _talk(q).to_a end
68
+ ENV['LINGO_NO_SORT'] ? s.to_a : s
64
69
  end
65
70
 
66
71
  end
data/lib/lingo/version.rb CHANGED
@@ -4,13 +4,13 @@ class Lingo
4
4
 
5
5
  MAJOR = 1
6
6
  MINOR = 8
7
- TINY = 4
7
+ TINY = 5
8
8
 
9
9
  class << self
10
10
 
11
11
  # Returns array representation.
12
12
  def to_a
13
- [MAJOR, MINOR, TINY] << '2'
13
+ [MAJOR, MINOR, TINY]
14
14
  end
15
15
 
16
16
  # Short-cut for version string.
@@ -10,5 +10,5 @@ meeting:
10
10
  - sequencer: { stopper: 'PUNC,OTHR' }
11
11
  - synonymer: { skip: '?,t', source: sys-syn }
12
12
 
13
- - vector_filter: { debug: 'true', prompt: '' }
13
+ - vector_filter: { debug: 'true', prompt: '', preamble: false }
14
14
  - text_writer: { ext: STDOUT, sep: "\n" }
@@ -41,18 +41,18 @@
41
41
  <form action="<%= url_for '/' %>" method="post">
42
42
  <div>
43
43
  <fieldset><legend><strong><%= t 'Input', 'Eingabe', 'ввод данных' %></strong></legend>
44
- <textarea name="q" rows="20" cols="50"><%= @q %></textarea>
44
+ <textarea name="q" rows="20" cols="50"><%=h @q %></textarea>
45
45
  </fieldset>
46
46
 
47
47
  <fieldset><legend><strong><%= t 'Output', 'Ausgabe', 'вывод данных' %></strong></legend>
48
- <textarea readonly="readonly" rows="20" cols="50"><%= @r %></textarea>
48
+ <textarea readonly="readonly" rows="20" cols="50"><%=h @r %></textarea>
49
49
  </fieldset>
50
50
 
51
51
  <br />
52
52
 
53
53
  <strong><%= t 'Language', 'Sprache', 'язык' %></strong> = <select name="l">
54
54
  <% for l in L %>
55
- <option value="<%= l %>"<%= ' selected="selected"' if l == @l %>><%= l %></option>
55
+ <option value="<%=h l %>"<%= ' selected="selected"' if l == @l %>><%=h l %></option>
56
56
  <% end %>
57
57
  </select>
58
58
 
@@ -144,7 +144,7 @@
144
144
  <div id="footer">
145
145
  <em>powered by</em> <a href="http://lex-lingo.de">Lingo</a>
146
146
  <em>and</em> <a href="http://www.sinatrarb.com">Sinatra</a>
147
- -- <strong>v<%= Lingo::VERSION %></strong>
147
+ <strong>v<%=h Lingo::VERSION %></strong>
148
148
  </div>
149
149
  </body>
150
150
  </html>
data/lib/lingo/web.rb CHANGED
@@ -6,7 +6,7 @@
6
6
  # Lingo -- A full-featured automatic indexing system #
7
7
  # #
8
8
  # Copyright (C) 2005-2007 John Vorhauer #
9
- # Copyright (C) 2007-2012 John Vorhauer, Jens Wille #
9
+ # Copyright (C) 2007-2014 John Vorhauer, Jens Wille #
10
10
  # #
11
11
  # Lingo is free software; you can redistribute it and/or modify it under the #
12
12
  # terms of the GNU Affero General Public License as published by the Free #
@@ -50,8 +50,8 @@ class Lingo
50
50
 
51
51
  LINGO = Hash.new { |h, k| h[k] = Lingo.call(cfg, ['-l', k]) }
52
52
 
53
- CFG, s = '', StringScanner.new('')
54
- c = lambda { |n| %Q{<span style="color:#{n}">#{s.matched}</span>} }
53
+ CFG, s, h = '', StringScanner.new(''), ERB::Util.method(:h)
54
+ c = lambda { |n| %Q{<span style="color:#{n}">#{h[s.matched]}</span>} }
55
55
 
56
56
  File.foreach(cfg) { |line|
57
57
  s.string = line.chomp
@@ -79,13 +79,11 @@ class Lingo
79
79
  }
80
80
 
81
81
  before do
82
- @hl = if v = params[:hl] || cookies[:hl] || env['HTTP_ACCEPT_LANGUAGE']
82
+ @hl = if v = params[:hl] || env['HTTP_ACCEPT_LANGUAGE']
83
83
  v = v.split(',').map { |l| l.split('-').first.strip }
84
84
  (v & HL).first
85
85
  end || HL.first
86
86
 
87
- cookies[:hl] = @hl unless cookies[:hl] == @hl
88
-
89
87
  @q = params[:q]
90
88
  @l = params[:l] || @hl
91
89
  @l = L.first unless L.include?(@l)
data/lib/lingo.rb CHANGED
@@ -65,14 +65,6 @@ class Lingo
65
65
 
66
66
  class << self
67
67
 
68
- if ENV['LINGO_NO_SORT']
69
- def sort!(x) x end
70
- def sort(x) x.dup end
71
- else
72
- def sort!(x) x.sort! end
73
- def sort(x) x.sort end
74
- end
75
-
76
68
  def talk(*args)
77
69
  new(*args).talk
78
70
  end
@@ -242,18 +234,18 @@ class Lingo
242
234
 
243
235
  def config
244
236
  @config ||= Config.new(*@config_args)
237
+ rescue => err
238
+ raise ConfigLoadError.new(err)
245
239
  end
246
240
 
247
241
  def dictionary_config
248
242
  @dictionary_config ||= config['language/dictionary']
249
- rescue => err
250
- raise ConfigLoadError.new(err)
251
243
  end
252
244
 
253
245
  def database_config(id)
254
246
  dictionary_config['databases'][id].tap { |cfg|
255
247
  raise NoDatabaseConfigError.new(id) unless cfg
256
- raise InvalidDatabaseConfigError.new(id) unless cfg.has_key?('name')
248
+ raise InvalidDatabaseConfigError.new(id) unless cfg.key?('name')
257
249
  }
258
250
  end
259
251
 
@@ -327,7 +319,7 @@ require_relative 'lingo/error'
327
319
  require_relative 'lingo/debug'
328
320
  require_relative 'lingo/config'
329
321
  require_relative 'lingo/agenda_item'
330
- require_relative 'lingo/show_progress'
322
+ require_relative 'lingo/progress'
331
323
  require_relative 'lingo/database'
332
324
  require_relative 'lingo/language'
333
325
  require_relative 'lingo/attendee'
data/lingo.cfg CHANGED
@@ -52,7 +52,7 @@ meeting:
52
52
  ########################################
53
53
  # Datenstrom anzeigen
54
54
  #
55
- # - debugger: { eval: 'true', ceval: 'cmd!="EOL"', prompt: 'lex:) ' }
55
+ # - debugger: { eval: 'true', ceval: 'obj.cmd!="EOL"', prompt: 'lex:) ' }
56
56
 
57
57
 
58
58
  ########################################
data/lir.cfg CHANGED
@@ -57,7 +57,7 @@ meeting:
57
57
  ########################################
58
58
  # Datenstrom anzeigen
59
59
  #
60
- # - debugger: { eval: 'true', ceval: 'cmd!="EOL"', prompt: 'lex:) ' }
60
+ # - debugger: { eval: 'true', ceval: 'obj.cmd!="EOL"', prompt: 'lex:) ' }
61
61
 
62
62
 
63
63
  ########################################