Class: Whatsa::CLI

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

Instance Method Summary collapse

Instance Method Details

#askObject



23
24
25
26
# File 'lib/whatsa/cli.rb', line 23

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

#clear_screenObject



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

def clear_screen
  50.times { puts "\n" }
  system('clear')
end

#display_dmb(dmb) ⇒ Object

Raises:

  • (TypeError)


63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/whatsa/cli.rb', line 63

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

#display_sections(text) ⇒ Object



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

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

#full(text) ⇒ Object



126
127
128
129
130
131
# File 'lib/whatsa/cli.rb', line 126

def full(text)
  clear_screen
  puts word_wrap(text.full_text)
  full_text_helpline
  gets_command
end

#full_text_helplineObject



94
95
96
97
98
# File 'lib/whatsa/cli.rb', line 94

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



100
101
102
103
104
105
106
107
108
109
# File 'lib/whatsa/cli.rb', line 100

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



111
112
113
114
115
# File 'lib/whatsa/cli.rb', line 111

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

#gets_commandObject



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/whatsa/cli.rb', line 28

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



14
15
16
17
18
19
20
21
# File 'lib/whatsa/cli.rb', line 14

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



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
172
173
174
175
176
177
178
179
180
181
# File 'lib/whatsa/cli.rb', line 133

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 word_wrap("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



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

def summarize(text)
  clear_screen
  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



87
88
89
90
91
92
# File 'lib/whatsa/cli.rb', line 87

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



8
9
10
11
12
# File 'lib/whatsa/cli.rb', line 8

def welcome
  clear_screen
  puts "Whatsa is a quick-and-dirty lookup utility, powered by Wikipedia!"
  puts "-----------------------------------------------------------------"
end

#word_wrap(text, indent = 0) ⇒ Object

setting an indent will indent the lines AFTER the first line of a paragraph



48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/whatsa/cli.rb', line 48

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