# File lib/lingo/language/dictionary.rb, line 41 def initialize(config, lingo) unless config.has_key?('source') raise ArgumentError, 'Required parameter `source\ missing.' end init_cachable init_reportable @suffixes, @infixes = [], [] Array(lingo.dictionary_config['suffix']).each { |t, s| t.downcase! a = t == 'f' ? @infixes : @suffixes s.split.each { |r| f, e = r.split('/') a << [%r#{f}$/, e || '*', t] } } @src = config['source'].map { |src| lingo.lexical_hash(src) } @all = config['mode'].nil? || config['mode'].downcase == 'all' lingo.dictionaries << self end
# File lib/lingo/language/dictionary.rb, line 35 def self.open(*args) yield dictionary = new(*args) ensure dictionary.close if dictionary end
# File lib/lingo/language/dictionary.rb, line 68 def close @src.each(&:close) end
# File lib/lingo/language/dictionary.rb, line 95 def find_synonyms(obj) lex = obj.lexicals lex = [obj] if lex.empty? && obj.unknown? # multiworder optimization ref = %r{\A#{Database::KEY_REF_ESC}\d+} lex.each_with_object([]) { |l, s| next if l.attr == LA_SYNONYM next if l.attr != LA_COMPOUND && obj.attr == WA_COMPOUND select(l.form).each { |y| s << y unless y =~ ref } } end
dic.#find_word( aString ) -> aNewWord
Erstellt aus dem String ein Wort und sucht nach diesem im Wörterbuch.
# File lib/lingo/language/dictionary.rb, line 79 def find_word(str) if hit?(key = str.downcase) inc('cache hits') return retrieve(key).tap { |word| word.form = str } end word = Word.new(str, WA_UNKNOWN) unless (lexicals = select_with_suffix(str)).empty? word.lexicals = lexicals word.attr = WA_IDENTIFIED end store(key, word) end
# File lib/lingo/language/dictionary.rb, line 72 def report super.tap { |rep| @src.each { |src| rep.update(src.report) } } end
dic.select( aString ) -> ArrayOfLexicals
Sucht alle Wörterbücher durch und gibt den ersten Treffer zurück (+mode = first+), oder alle Treffer (+mode = all+)
# File lib/lingo/language/dictionary.rb, line 113 def select(str) @src.each_with_object([]) { |src, lex| l = src[str] or next lex.concat(l) break lex unless @all }.tap { |lex| lex.sort!; lex.uniq! } end
dic.#select_with_infix( aString ) -> ArrayOfLexicals
Sucht alle Wörterbücher durch und gibt den ersten Treffer zurück (+mode = first+), oder alle Treffer (+mode = all+). Sucht dabei auch Wörter, die eine Fugung am Ende haben.
# File lib/lingo/language/dictionary.rb, line 133 def select_with_infix(str) select_with_affix(:infix, str) end
dic.#select_with_suffix( aString ) -> ArrayOfLexicals
Sucht alle Wörterbücher durch und gibt den ersten Treffer zurück (+mode = first+), oder alle Treffer (+mode = all+). Sucht dabei auch Wörter, die um wortklassenspezifische Suffixe bereinigt wurden.
# File lib/lingo/language/dictionary.rb, line 125 def select_with_suffix(str) select_with_affix(:suffix, str) end
dic.#suffix_lexicals( aString ) -> ArrayOfLexicals
Gibt alle möglichen Lexicals zurück, die von der Endung her auf den String anwendbar sind:
dic.suffix_lexicals(“Hasens”) -> [(hasen/s), (hasen/e), (has/e)]
# File lib/lingo/language/dictionary.rb, line 142 def suffix_lexicals(str) affix_lexicals(:suffix, str) end
# File lib/lingo/language/dictionary.rb, line 165 def affix_lexicals(affix, str) instance_variable_get("@#{affix}es").each_with_object([]) { |(r, e, t), l| l << Lexical.new("#{$`}#{e == '*' ? '' : e}#{$'}", t) if str =~ r } end
# File lib/lingo/language/dictionary.rb, line 155 def select_with_affix(affix, str) select(str).tap { |l| if l.empty? affix_lexicals(affix, str).each { |a| select(a.form).each { |b| l << b if affix != :suffix || a.attr == b.attr } } end } end