50 lines
1.1 KiB
Ruby
50 lines
1.1 KiB
Ruby
require "thes/version"
|
|
|
|
require 'uri'
|
|
require 'cgi'
|
|
require 'open-uri'
|
|
require 'nokogiri'
|
|
require 'terminal-table'
|
|
|
|
class Thes
|
|
BASE_URL = 'http://www.thesaurus.com/browse/'.freeze
|
|
|
|
def initialize(query)
|
|
@query = query
|
|
end
|
|
|
|
def call
|
|
url = URI.join(BASE_URL, CGI.escape(@query))
|
|
html = Nokogiri::HTML.parse(open(url))
|
|
filters = html.search('.filters')
|
|
|
|
tables = filters.map do |filter|
|
|
type = filter.search('em.txt').text
|
|
desc = filter.search('em.txt ~ strong').text
|
|
|
|
groups = filter.search('.relevancy-block ul > li > a').group_by do |el|
|
|
el.attr('data-category').match(/relevant-(\d+)/)[1].to_i
|
|
end
|
|
|
|
columns = groups.values.map do |els|
|
|
els.map { |el| el.search('span.text').text }
|
|
end
|
|
|
|
columns.each(&:sort!)
|
|
|
|
max_size = columns.max_by(&:size).size
|
|
columns.each { |group| group.fill('', group.size, max_size - group.size) }
|
|
|
|
rows = columns.transpose
|
|
|
|
Terminal::Table.new(
|
|
title: "#{type}: #{desc}",
|
|
rows: rows,
|
|
style: { width: 80 }
|
|
)
|
|
end
|
|
|
|
tables.join("\n")
|
|
end
|
|
end
|