1#!/usr/bin/env ruby
2# Make the computer speaking, using AppleScript.
3
4class AppleScript
5  require 'osx/cocoa'
6  include OSX
7
8  def initialize (src, raise_err_p = true)
9    @script = NSAppleScript.alloc.initWithSource(src)
10    @errinfo = OCObject.new
11    @script.compileAndReturnError?(@errinfo)
12    @script = nil if handle_error(@errinfo, raise_err_p)
13  end
14
15  def execute (raise_err_p = false)
16    @errinfo = OCObject.new
17    result = @script.executeAndReturnError(@errinfo)
18    handle_error(@errinfo, raise_err_p)
19    return result
20  end
21
22  def source
23    @script.source.to_s
24  end
25
26  def error?
27    return nil if @errinfo.ocnil?
28    return errmsg_of(@errinfo)
29  end
30
31  private
32
33  def handle_error (errinfo, raise_err_p)
34    return false if errinfo.ocnil?
35    if raise_err_p then
36      raise "AppleScriptError: #{errmsg_of errinfo}"
37    else
38      $stderr.puts errmsg_of(errinfo)
39    end
40    return true
41  end
42
43  def errmsg_of (errinfo)
44    errinfo.objectForKey('NSAppleScriptErrorMessage').to_s
45  end
46
47end
48
49if __FILE__ == $0 then
50  ARGF.each do |str|
51    str.gsub!(/"/, '\"')
52    src = %(say "#{str}")
53    AppleScript.new(src).execute
54  end
55end
56