$KCODE = 'u' $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) require 'rubygems' require 'httparty' module YandexInflect # Число доступных вариантов склонений INFLECTIONS_COUNT = 6 # Класс для получения данных с веб-сервиса Яндекса. class Inflection include HTTParty base_uri 'http://export.yandex.ru/' # Получить склонения для имени name def get(name) options = {} options[:query] = { :name => name } inflections = self.class.get("/inflect.xml", options) return inflections["inflections"]["inflection"] end end # Кеширование успешных результатов запроса к веб-сервису @@cache = {} # Возвращает массив склонений (размером INFLECTIONS_COUNT) для слова word. # # Если слово не найдено в словаре, будет возвращен массив размерностью INFLECTIONS_COUNT, # заполненный этим словом. def self.inflections(word) inflections = [] # TODO ugly lookup = cache_lookup(word) return lookup if lookup get = Inflection.new.get(word) rescue nil # если поднято исключение, переходим к третьему варианту и не кешируем case get when Array then # Яндекс вернул массив склонений inflections = get # Кладем в кеш cache_store(word, inflections) when String then # Яндекс не вернул массива склонений (слово не найдено в словаре), # а только строку, то забиваем этой строкой весь массив inflections.fill(get, 0..INFLECTIONS_COUNT-1) # Кладем в кеш cache_store(word, inflections) else # Забиваем варианты склонений оригиналом inflections.fill(word, 0..INFLECTIONS_COUNT-1) end inflections end def self.clear_cache @@cache.clear end private def self.cache_lookup(word) @@cache[word.to_s] end def self.cache_store(word, value) @@cache[word.to_s] = value end end