Module: Lowline

Defined in:
lib/lowline.rb

Instance Method Summary collapse

Instance Method Details

#ask(q, opts = {}) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/lowline.rb', line 69

def ask q, opts={}
  default_s = case opts[:default]
    when nil; nil
    when ""; " (enter for none)"
    else; " (enter for #{opts[:default].inspect})"
  end

  tail = case q
    when /[:?]$/; " "
    when /[:?]\s+$/; ""
    else; ": "
  end

  while true
    prompt = [q, default_s, tail].compact.join
    if Ditz::has_readline?
      ans = Readline::readline(prompt)
    else
      print prompt
      ans = gets.strip
    end
    if opts[:default]
      ans = opts[:default] if ans.blank?
    else
      next if ans.blank? && !opts[:empty_ok]
    end
    break ans unless (opts[:restrict] && ans !~ opts[:restrict])
  end
end

#ask_for_many(plural_name, name = nil) ⇒ Object



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
# File 'lib/lowline.rb', line 150

def ask_for_many plural_name, name=nil
  name ||= plural_name.gsub(/s$/, "")
  stuff = []

  while true
    puts
    puts "Current #{plural_name}:"
    if stuff.empty?
      puts "None!"
    else
      stuff.each_with_index { |c, i| puts "  #{i + 1}) #{c}" }
    end
    puts
    ans = ask "(A)dd #{name}, (r)emove #{name}, or (d)one"
    case ans
    when "a", "A"
      ans = ask "#{name.capitalize} name", ""
      stuff << ans unless ans =~ /^\s*$/
    when "r", "R"
      ans = ask "Remove which #{name}? (1--#{stuff.size})"
      stuff.delete_at(ans.to_i - 1) if ans
    when "d", "D"
      break
    end
  end
  stuff
end

#ask_for_selection(stuff, name, to_string = :to_s) ⇒ Object



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/lowline.rb', line 178

def ask_for_selection stuff, name, to_string=:to_s
  puts "Choose a #{name}:"
  stuff.each_with_index do |c, i|
    pretty = case to_string
    when block_given? && to_string # heh
      yield c
    when Symbol
      c.send to_string
    when Proc
      to_string.call c
    else
      raise ArgumentError, "unknown to_string argument type; expecting Proc or Symbol"
    end
    puts "  #{i + 1}) #{pretty}"
  end

  j = while true
    i = ask "#{name.capitalize} (1--#{stuff.size})"
    break i.to_i if i && (1 .. stuff.size).member?(i.to_i)
  end

  stuff[j - 1]
end

#ask_multiline(q) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/lowline.rb', line 111

def ask_multiline q
  puts "#{q} (ctrl-d, ., or /stop to stop, /edit to edit, /reset to reset):"
  ans = ""
  while true
    if Ditz::has_readline?
      line = Readline::readline('> ')
    else
      (line = gets) && line.strip!
    end
    if line
      if Ditz::has_readline?
        Readline::HISTORY.push(line)
      end
      case line
      when /^\.$/, "/stop"
        break
      when "/reset"
        return ask_multiline(q)
      when "/edit"
        return ask_via_editor(q, ans)
      else
        ans << line + "\n"
      end
    else
      puts
      break
    end
  end
  ans.multistrip
end

#ask_via_editor(q, default = nil) ⇒ Object



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

def ask_via_editor q, default=nil
  fn = run_editor do |f|
    f.puts q.gsub(/^/, "## ")
    f.puts "##"
    f.puts "## Enter your text below. Lines starting with a '#' will be ignored."
    f.puts
    f.puts default if default
  end
  return unless fn
  IO.read(fn).gsub(/^#.*$/, "").multistrip
end

#ask_yon(q) ⇒ Object



142
143
144
145
146
147
148
# File 'lib/lowline.rb', line 142

def ask_yon q
  while true
    print "#{q} (y/n): "
    a = gets.strip
    break a if a =~ /^[yn]$/i
  end =~ /y/i
end

#run_editor {|f| ... } ⇒ Object

Yields:

  • (f)


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

def run_editor
  f = Tempfile.new "ditz"
  yield f
  f.close

  editor = ENV["EDITOR"] || "/usr/bin/vi"
  cmd = "#{editor} #{f.path.inspect}"

  mtime = File.mtime f.path
  system cmd or raise Error, "cannot execute command: #{cmd.inspect}"

  File.mtime(f.path) == mtime ? nil : f.path
end