class EnglishThesaurus::Thesaurus

Constants

RELEVANCY_MAP
URL

Public Class Methods

new(word) click to toggle source
# File lib/english_thesaurus.rb, line 14
def initialize(word)
  @url = URI.encode("#{URL}#{word}")
end

Public Instance Methods

all_synonyms() click to toggle source
# File lib/english_thesaurus.rb, line 29
def all_synonyms
  doc.xpath('//div[@class="synonyms"]').map {|synonym|
    filters_block = synonym.xpath('*[@class="filters"]')

    {
      word_of_speech: filters_block.xpath('div[@class="synonym-description"]/em').text,
      description: filters_block.xpath('div[@class="synonym-description"]/strong').text
    }.merge(RELEVANCY_MAP.inject({}) {|hash, (relevant, level)|
      hash.merge!("#{relevant}_relevance_list".to_sym => filters_block.xpath(relevancy_block_xpath_query(relevancy: level)).map(&:text))
    })
  }
end
synonyms(relevancy:, word_of_speech: nil) click to toggle source
# File lib/english_thesaurus.rb, line 18
def synonyms(relevancy:, word_of_speech: nil)
  raise "illegal relevancy. choose from #{RELEVANCY_MAP}" unless RELEVANCY_MAP.include?(relevancy.to_sym)

  filtered_synonyms = all_synonyms
  if word_of_speech
    filtered_synonyms = all_synonyms.reject {|s| s[:word_of_speech] != word_of_speech }
  end

  filtered_synonyms.map {|s| s.slice(:word_of_speech, :description, "#{relevancy}_relevance_list".to_sym) }
end

Private Instance Methods

doc() click to toggle source
# File lib/english_thesaurus.rb, line 48
def doc
  @doc ||= Nokogiri::HTML.parse(open(@url).read)
end
relevancy_block_xpath_query(relevancy:) click to toggle source
# File lib/english_thesaurus.rb, line 44
def relevancy_block_xpath_query(relevancy:)
  "div[@class=\"relevancy-block\"]/div/ul/li/a[contains(@data-category, \"relevant-#{relevancy}\")]/span[1]"
end