add finished quiz #1, madlibs
[ruby_quiz.git] / madlibs.rb
1 #!/usr/bin/env ruby
2
3 tokens = []  # a list of tokens
4 names  = {}  # a hash to hold reusable tokens
5
6 unless ARGV.length > 0 and test(?e, ARGV[0])
7   $stderr.puts "usage: #{$PROGRAM_NAME} mad_lib_file"
8   exit 1
9 end
10
11 madlibstr = IO.read(ARGV[0]) # the madlib
12
13 # Parse and replace the tokens with unique placeholder strings.
14 pos = 1
15 madlibstr.gsub!(/\(\(([^)]+)\)\)/) do |token|
16   token.delete!("()") # clean up token
17
18   if token =~ /^(\w+):(.*)$/
19     # we have a named token, so record the name and position
20     names[$1] = pos
21     token = $2
22   elsif names[token]
23     # we are using a named token
24     next "<<#{names[token]}>>"
25   end
26   # otherwise, we have a new token
27   tokens << { :token => token, :pos => pos }
28
29   pos += 1
30   "<<#{pos - 1}>>"
31 end
32
33 # For each token, ask the user for an answer, then use the answer.
34 tokens.each do |token|
35   print "Tell me #{token[:token]}? "
36   value = $stdin.gets.chomp
37   madlibstr.gsub!("<<#{token[:pos]}>>", value)
38 end
39
40 # Finally, report the mad lib.
41 puts "---"
42 puts madlibstr