Class: Whatsa::CLI

Inherits:
Object
  • Object
show all
Defined in:
lib/whatsa/cli.rb

Instance Method Summary collapse

Instance Method Details

#askObject



18
19
20
21
# File 'lib/whatsa/cli.rb', line 18

def ask
  puts "What would you like to know about?"
  gets_command
end

#display_dmb(dmb) ⇒ Object

Raises:

  • (TypeError)


57
58
59
60
61
62
63
64
65
66
67
# File 'lib/whatsa/cli.rb', line 57

def display_dmb(dmb)
  raise TypeError unless dmb.is_a?(Whatsa::Disambig)
  system("clear")
  stripped_title = dmb.title.gsub("(disambiguation)", "").strip
  puts "Hmmm... #{stripped_title} could mean a few different things:\n"
  dmb.descriptions.each_with_index do |kvp, i|
    desc = kvp[1].empty? ? "" : " - #{kvp[1]}"
    puts "#{i + 1}. #{kvp[0].to_s}" + desc
  end
  puts "\nPlease select a choice, either by name or number."
end

#display_sections(text) ⇒ Object



69
70
71
72
73
74
75
# File 'lib/whatsa/cli.rb', line 69

def display_sections(text)
  text = text.article if text.is_a?(Whatsa::Section)
  system("clear")
  puts "Here are some specific subjects about '#{text.title}':\n"
  text.section_titles.each_with_index {|title, i| puts "#{i + 1}. #{title}"}
  puts "\nPlease select a choice, either by name or number."
end

#full(text) ⇒ Object



116
117
118
119
120
121
# File 'lib/whatsa/cli.rb', line 116

def full(text)
  system("clear")
  puts word_wrap(text.full_text)
  full_text_helpline
  gets_command
end

#full_text_helplineObject



84
85
86
87
88
# File 'lib/whatsa/cli.rb', line 84

def full_text_helpline
  puts "   _______________________________________________________________"
  puts "    (type 'other' if you'd like to select a specific category of"
  puts " information on the topic, or 'new' to find out about something else)"
end

#get_dmb_choice(disambig) ⇒ Object



90
91
92
93
94
95
96
97
98
99
# File 'lib/whatsa/cli.rb', line 90

def get_dmb_choice(disambig)
  display_dmb(disambig)
  choice = nil
  loop do
    choice = gets_command
    in_choices = disambig.choices.detect { |c| c.downcase == choice }
    break if in_choices || choice.to_i > 0
  end
  disambig.choose_article(choice)
end

#get_sec_choice(article) ⇒ Object



101
102
103
104
105
# File 'lib/whatsa/cli.rb', line 101

def get_sec_choice(article)
  display_sections(article)
  choice = gets_command
  article.choose_section(choice)
end

#gets_commandObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/whatsa/cli.rb', line 23

def gets_command
  input = nil
  loop do
    print "> "
    input = gets.strip.downcase
    case input
    when "exit"
      exit
    when "help"
      instructions
    when "new"
      run
    else
      break
    end
  end
  input
end

#instructionsObject



9
10
11
12
13
14
15
16
# File 'lib/whatsa/cli.rb', line 9

def instructions
  puts "Enter a word (or phrase) to get a brief summary of that subject."
  puts "If you aren't satisfied, type 'more' to get a slightly longer"
  puts "description, or type 'other' to get a list of specific categories"
  puts "regarding that subject, which you can choose by number or name."
  puts "You can type 'exit' to close the program (or 'help' to receive"
  puts "these instructions again) at any time!"
end

#runObject



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/whatsa/cli.rb', line 123

def run
  # This is the main method for running the CLI.
  # It consists of three main parts:
  # Part one - decorative - Welcome the user, give instructions for use
  # Part two - initialize - Get a query from the user and try to make an
  #                         article out of whatever comes back (results page,
  #                         disambiguation page, or article)
  # Part three - article  - We've gotten to an article, display it to the user
  #                         and loop as long as they wish to select different
  #                         sections


  ##########
  # PART ONE

  welcome
  instructions


  ##########
  # PART TWO

  # get a search term
  input = ask
  scraper = Whatsa::Scraper.new(input)

  # get an article from the search, or restart the loop if it can't be found
  if scraper.not_found?
    print "Hmmm... I don't know what '#{input}' means!\nPress 'enter' to try something else."
    gets
    run
  elsif scraper.disambig?
    article = get_dmb_choice(scraper.make_disambig)
  else
    article = scraper.make_article
  end


  ############
  # PART THREE

  # summarize that article
  input = summarize(article)

  # the only valid input here that would go uncaught is "other", so
  # keep asking until you get a caught input (logic determined by
  # #gets_command, e.g. "help", "exit", "new") or "other"
  loop { input = input == "other" ? summarize(get_sec_choice(article)) : gets_command }
end

#summarize(text) ⇒ Object



107
108
109
110
111
112
113
114
# File 'lib/whatsa/cli.rb', line 107

def summarize(text)
  system("clear")
  return full(text) if text.summary == text.full_text
  puts word_wrap(text.summary)
  summary_helpline
  input = gets_command
  input == "more" ? full(text) : input
end

#summary_helplineObject



77
78
79
80
81
82
# File 'lib/whatsa/cli.rb', line 77

def summary_helpline
  puts "   _______________________________________________________________"
  puts "   (type 'more' for a potentially longer summary, 'other' if you'd"
  puts "   like to select a specific category of information on the topic,"
  puts "             or 'new' to find out about something else)"
end

#welcomeObject



3
4
5
6
7
# File 'lib/whatsa/cli.rb', line 3

def welcome
  system('clear')
  puts "Whatsa is a quick-and-dirty lookup utility, powered by Wikipedia!"
  puts "-----------------------------------------------------------------"
end

#word_wrap(text) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/whatsa/cli.rb', line 42

def word_wrap(text)
  count = 0
  words = text.split(/ /)
  words.each_with_index do |word, index|
    count += word.length + 1
    if count > 80
      words.insert(index, "\n")
      count = 0
    elsif word.index("\n")
      count = word.length
    end
  end
  words.join(" ").gsub(/^ /, "")
end