Module: Osascript

Defined in:
lib/osascript/Key.rb,
lib/osascript.rb,
lib/osascript/Safari.rb,
lib/osascript/Preview.rb,
lib/osascript/any_app.rb,
lib/osascript/version.rb,
lib/osascript/Osascript.rb,
lib/osascript/constants.rb

Overview

Work with any application.

Defined Under Namespace

Classes: Error, Key, Preview, Safari

Constant Summary collapse

VERSION =
"0.4.5"
LIB_FOLDER =
File.dirname(__dir__)
GEM_FOLDER =
File.dirname(LIB_FOLDER)
TEST_FOLDER =
File.join(GEM_FOLDER,'test')

Class Method Summary collapse

Class Method Details

.__asrun(code, application = nil) ⇒ Object

main =

Méthode principale qui exécute le code code



8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/osascript/Osascript.rb', line 8

def self.__asrun(code, application = nil)
  if application
    code = "    tell application \"\#{application}\"\n      \#{code}\n    end tell\n    TEXT\n  end\n  resultat = `osascript <<'TEXT'\n    \#{code.strip}\n  TEXT\n  `\n  return resultat.strip\nend\n"

.get_window_properties(app_name, options = nil) ⇒ Object

Return the front window (or other window defined in options) properties.

Options Hash (options):

  • :window (String|Integer)

    Other window to consider



27
28
29
30
31
32
33
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
# File 'lib/osascript/any_app.rb', line 27

def self.get_window_properties(app_name, options = nil)
  if on?(app_name)
    window  = (options && options[:window]) || 'front window'
    code    = "return (properties of #{window})"
    ret = __asrun(code, app_name)
    # On se retrouve avec un texte du type :
    # "document:Mon doc, floating:false, bounds:4, 12, 23, 45 etc."
    # 
    ret = ret.split(/(?:, )?([a-z]+)\:/)
    ret.shift if ret[0].empty? || ret[0].nil?
    # puts "ret = #{ret.inspect}"
    table = {}
    while ret.count > 0
      prop  = ret.shift.to_sym
      value = ret.shift
      # puts "prop = #{prop.inspect} / value: #{value}::#{value.class}"
      value = case prop
      when :bounds, :position
        eval("[#{value}]")
      else
        begin
          eval(value)
        rescue NameError
          value
        rescue Exception => e
          if value.match?(',')
            value.split(',').map {|n|n.strip}
          else
            raise e
          end
        end
      end
      table.merge!(prop => value)
    end
    return table
  end
end

.on?(app_name) ⇒ Boolean



25
26
27
28
29
# File 'lib/osascript/Osascript.rb', line 25

def self.on?(app_name)
  retour = __asrun("tell application \"System Events\" to return (name of processes) contains \"#{app_name}\"")
  # puts "retour = #{retour.inspect}"
  return retour == "true"
end

.quit(app_name) ⇒ Object

Quit application app_name if it’s running



32
33
34
35
36
# File 'lib/osascript/Osascript.rb', line 32

def self.quit(app_name)
  if on?(app_name)
    __asrun("tell application \"#{app_name}\" to quit")
  end
end

.set_window(app_name, properties, options = nil) ⇒ Object

Set any properties of front window of app_name app (or other window defined in options) to properties

Options Hash (properties):

  • :bounds (Rectangle)

    Position and size of window

  • :name (String)

    The window name

  • :index (Integer)

    Index of window

  • :zoomed (Boolean)

    true if window must be zoomed

  • :miniaturized (Boolean)

    true if window must be miniaturized

  • :visible (Boolean)

    false if window must be hidden



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/osascript/any_app.rb', line 77

def self.set_window(app_name, properties, options = nil)
  if on?(app_name)
    window  = (options && options[:window]) || 'front window'
    table = properties.map do |k, v|
      "{\"#{k}\", #{v.inspect}}"
    end.join(', ')
    code = "    set table to {\#{table}}\n    tell \#{window}\n      repeat with dprop in table\n        set propName to item 1 of dprop\n        set propValue to item 2 of dprop\n        if propName is \"bounds\" then\n          set bounds of it to propValue\n        else if propName is \"name\" then\n          set name of it to propValue\n        else if propName is \"index\" then\n          set index of it to propValue\n        else if propName is \"zoomed\" then\n          set zoomed of it to propValue\n        else if propName is \"miniaturized\" then\n          set miniaturized of it to provalue\n        else if propName is \"visible\" then\n          set visible of it to propValue\n        end if\n      end repeat\n    end tell\n    CODE\n    __asrun(code, app_name)\n  end\nend\n"

.set_window_bounds(app_name, bounds, options = nil) ⇒ Object

Set bounds of front window of app_name app (or other window defined in options) to bounds



114
115
116
117
118
119
120
121
122
# File 'lib/osascript/any_app.rb', line 114

def self.set_window_bounds(app_name, bounds, options = nil)
  if on?(app_name)
    window  = (options && options[:window]) || 'front window'
    code = "    set bounds of \#{window} to {\#{bounds.join(', ')}}\n    CODE\n    __asrun(code, app_name)\n  end\nend\n"

.set_window_dimension(app_name, dim, options = nil) ⇒ Object

Set dimension of front window of app app_name (or other window defined with options) to dim



129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/osascript/any_app.rb', line 129

def self.set_window_dimension(app_name, dim, options = nil)
  if on?(app_name)
    window  = (options && options[:window]) || 'front window'
    code = "    tell \#{window}\n      set theBounds to bounds of it\n      set topRight to (item 1 of theBounds) + \#{dim[:width]}\n      set bottomRight to (item 2 of theBounds) + \#{dim[:height]}\n      set bounds of it to {item 1 of theBounds, item 2 of theBounds, topRight, bottomRight}\n    end\n    CODE\n    __asrun(code, app_name)\n  end\nend\n"

.set_window_position(app_name, pos, options = nil) ⇒ Object

Set position of front window of app_name application (or other window defined with options) to pos



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/osascript/any_app.rb', line 149

def self.set_window_position(app_name, pos, options = nil)
  if on?(app_name)
    window  = (options && options[:window]) || 'front window'
    code = "    tell \#{window}\n      set theBounds to bounds of it\n      set width to (item 3 of theBounds) - (item 1 of theBounds)\n      set topRight to \#{pos[:left]} + width\n      set height to (item 4 of theBounds) - (item 2 of theBounds)\n      set bottomRight to \#{pos[:top]} + height\n      set bounds of it to {\#{pos[:left]}, \#{pos[:top]}, topRight, bottomRight}\n    end\n    CODE\n    __asrun(code, app_name)\n  end\nend\n"