some refactoring
[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 # Token format: ((name:prompt:flags))
15 pos = 1
16 madlibstr.gsub!(/\(\(([^)]+)\)\)/) do |token|
17   token.delete!("()") # clean up token
18
19   if token =~ /^(\w+):(.*)$/
20     # we have a named token, so record the name and position
21     names[$1] = pos
22     token     = $2
23   elsif names[token]
24     # we are using a named token
25     next "<<#{names[token]}>>"
26   end
27   # otherwise, we have a new token
28   if token =~ /^(.*):(\w+)$/
29     token = $1
30     flags = $2
31   else
32     flags = ""
33   end
34   tokens << { :token => token, :pos => pos, :flags => flags}
35
36   pos += 1
37   "<<#{pos - 1}>>"
38 end
39
40 # For each token, ask the user for an answer, then use the answer.
41 tokens.each do |token|
42   print "Tell me #{token[:token]}? "
43   value = $stdin.gets.chomp
44
45   value.capitalize! if token[:flags].include? ?c
46   value.upcase!     if token[:flags].include? ?u
47   value.downcase!   if token[:flags].include? ?d
48
49   madlibstr.gsub!("<<#{token[:pos]}>>", value)
50 end
51
52 # Finally, report the mad lib.
53 puts "---"
54 puts madlibstr