Class: Whatsa::CLI

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

Instance Method Summary collapse

Methods included from Format

#bulletize_lines, #heading_to_title, #remove_citation_markers, #url_friendly, #word_wrap

Instance Method Details

#askObject

[View source]

29
30
31
32
# File 'lib/whatsa/cli.rb', line 29

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

#clear_screenObject

[View source]

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

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

#display_dmb(dmb) ⇒ Object

Raises:

  • (TypeError)
[View source]

71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/whatsa/cli.rb', line 71

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

[View source]

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

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

[View source]

139
140
141
142
143
144
# File 'lib/whatsa/cli.rb', line 139

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

#full_text_helplineObject

[View source]

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

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

[View source]

108
109
110
111
112
113
114
115
116
117
118
# File 'lib/whatsa/cli.rb', line 108

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
    puts "Hmm... I don't think that's a valid choice. Try again!"
  end
  disambig.choose_article(choice)
end

#get_sec_choice(article) ⇒ Object

[View source]

120
121
122
123
124
125
126
127
128
# File 'lib/whatsa/cli.rb', line 120

def get_sec_choice(article)
  display_sections(article)
  loop do
    choice = gets_command
    section = article.choose_section(choice)
    return section if section
    puts "Hmm... I don't think that's a valid section. Try again!"
  end
end

#gets_command(treat_as_query = false) ⇒ Object

[View source]

34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/whatsa/cli.rb', line 34

def gets_command(treat_as_query = false)
  command_type = {
    "exit" => "exit",
    "quit" => "exit",
    "q"    => "exit",

    "help"         => "help",
    "h"            => "help",
    "instructions": ("help" unless treat_as_query),

    "new"            => "new",
    "different"      => ("new" unless treat_as_query),
    "something else" => ("new" unless treat_as_query),
    "again"          => ("new" unless treat_as_query),

    "other"      => ("other" unless treat_as_query),
    "categories" => ("other" unless treat_as_query),
    "category"   => ("other" unless treat_as_query),
    "dig"        => ("other" unless treat_as_query),

    "" => "blank"
  }

  loop do
    print "> "
    input = gets.strip.downcase
    case command_type[input]
    when "exit"  then exit
    when "help"  then instructions
    when "new"   then return run
    when "other" then return "other"
    when ""      then next
    else return input
    end
  end
end

#instructionsObject

[View source]

19
20
21
22
23
24
25
26
27
# File 'lib/whatsa/cli.rb', line 19

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!"
  puts ""
end

#runObject

[View source]

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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/whatsa/cli.rb', line 146

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

  if ARGV.empty?

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

    welcome
    instructions

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

    # get a search term
    input = ask

  else
    input = ARGV.join(" ")
    ARGV.clear
  end

  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

[View source]

130
131
132
133
134
135
136
137
# File 'lib/whatsa/cli.rb', line 130

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

[View source]

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

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

[View source]

13
14
15
16
17
# File 'lib/whatsa/cli.rb', line 13

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