rb-appscript 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +243 -0
- data/LICENSE +1 -0
- data/README +42 -0
- data/TODO +31 -0
- data/doc/aem-manual/01_introduction.html +48 -0
- data/doc/aem-manual/02_apioverview.html +89 -0
- data/doc/aem-manual/03_packingandunpackingdata.html +98 -0
- data/doc/aem-manual/04_references.html +401 -0
- data/doc/aem-manual/05_targettingapplications.html +133 -0
- data/doc/aem-manual/06_buildingandsendingevents.html +175 -0
- data/doc/aem-manual/07_findapp.html +54 -0
- data/doc/aem-manual/08_examples.html +85 -0
- data/doc/aem-manual/09_notes.html +41 -0
- data/doc/aem-manual/aemreferenceinheritance.gif +0 -0
- data/doc/aem-manual/full.css +21 -0
- data/doc/aem-manual/index.html +43 -0
- data/doc/appscript-manual/01_introduction.html +82 -0
- data/doc/appscript-manual/02_aboutappscripting.html +244 -0
- data/doc/appscript-manual/03_quicktutorial.html +154 -0
- data/doc/appscript-manual/04_gettinghelp.html +101 -0
- data/doc/appscript-manual/05_keywordconversion.html +91 -0
- data/doc/appscript-manual/06_classesandenums.html +174 -0
- data/doc/appscript-manual/07_applicationobjects.html +181 -0
- data/doc/appscript-manual/08_realvsgenericreferences.html +86 -0
- data/doc/appscript-manual/09_referenceforms.html +232 -0
- data/doc/appscript-manual/10_referenceexamples.html +142 -0
- data/doc/appscript-manual/11_applicationcommands.html +204 -0
- data/doc/appscript-manual/12_commandexamples.html +129 -0
- data/doc/appscript-manual/13_performanceissues.html +115 -0
- data/doc/appscript-manual/14_problemapps.html +193 -0
- data/doc/appscript-manual/15_notes.html +84 -0
- data/doc/appscript-manual/application_architecture.gif +0 -0
- data/doc/appscript-manual/application_architecture2.gif +0 -0
- data/doc/appscript-manual/finder_to_textedit_event.gif +0 -0
- data/doc/appscript-manual/full.css +21 -0
- data/doc/appscript-manual/index.html +49 -0
- data/doc/appscript-manual/relationships_example.gif +0 -0
- data/doc/appscript-manual/ruby_to_itunes_event.gif +0 -0
- data/doc/index.html +30 -0
- data/doc/mactypes-manual/index.html +216 -0
- data/doc/osax-manual/index.html +169 -0
- data/extconf.rb +54 -0
- data/misc/adobeunittypes.rb +14 -0
- data/misc/dump.rb +72 -0
- data/rb-appscript.gemspec +20 -0
- data/sample/AB_list_people_with_emails.rb +8 -0
- data/sample/Create_daily_iCal_todos.rb +72 -0
- data/sample/Hello_world.rb +9 -0
- data/sample/List_iTunes_playlist_names.rb +7 -0
- data/sample/Make_Mail_message.rb +29 -0
- data/sample/Open_file_in_TextEdit.rb +9 -0
- data/sample/Organize_Mail_messages.rb +57 -0
- data/sample/Print_folder_tree.rb +12 -0
- data/sample/Select_all_HTML_files.rb +8 -0
- data/sample/Set_iChat_status.rb +20 -0
- data/sample/Simple_Finder_GUI_Scripting.rb +14 -0
- data/sample/Stagger_Finder_windows.rb +21 -0
- data/sample/TextEdit_demo.rb +126 -0
- data/sample/iTunes_top40_to_html.rb +64 -0
- data/src/lib/_aem/aemreference.rb +1006 -0
- data/src/lib/_aem/codecs.rb +617 -0
- data/src/lib/_aem/connect.rb +100 -0
- data/src/lib/_aem/findapp.rb +83 -0
- data/src/lib/_aem/mactypes.rb +228 -0
- data/src/lib/_aem/send.rb +257 -0
- data/src/lib/_aem/typewrappers.rb +57 -0
- data/src/lib/_appscript/defaultterminology.rb +245 -0
- data/src/lib/_appscript/referencerenderer.rb +132 -0
- data/src/lib/_appscript/reservedkeywords.rb +107 -0
- data/src/lib/_appscript/terminology.rb +314 -0
- data/src/lib/aem.rb +216 -0
- data/src/lib/appscript.rb +830 -0
- data/src/lib/kae.rb +1484 -0
- data/src/lib/osax.rb +171 -0
- data/src/rbae.c +766 -0
- data/test/README +1 -0
- data/test/test_aemreference.rb +112 -0
- data/test/test_appscriptreference.rb +102 -0
- data/test/test_codecs.rb +159 -0
- data/test/test_findapp.rb +24 -0
- data/test/test_mactypes.rb +67 -0
- data/test/testall.sh +9 -0
- metadata +143 -0
data/src/lib/osax.rb
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require "appscript"
|
4
|
+
|
5
|
+
module OSAX
|
6
|
+
|
7
|
+
# Allows scripting additions (a.k.a. OSAXen) to be called from Ruby.
|
8
|
+
|
9
|
+
######################################################################
|
10
|
+
# PRIVATE
|
11
|
+
######################################################################
|
12
|
+
|
13
|
+
require "ae"
|
14
|
+
require "kae"
|
15
|
+
require "aem"
|
16
|
+
|
17
|
+
#######
|
18
|
+
# cache; stores osax paths and previously parsed terminology (if any) by osax name
|
19
|
+
|
20
|
+
OSAXCache = {}
|
21
|
+
OSAXNames = []
|
22
|
+
|
23
|
+
se = AS.app('System Events')
|
24
|
+
[se.system_domain, se.local_domain, se.user_domain].each do |domain|
|
25
|
+
osaxen = domain.scripting_additions_folder.files[
|
26
|
+
AS.its.file_type.eq('osax').or(AS.its.name_extension.eq('osax'))]
|
27
|
+
osaxen.name.get.zip(osaxen.POSIX_path.get).each do |name, path|
|
28
|
+
name = name.sub(/(?i)\.osax$/, '') # remove name extension, if any
|
29
|
+
OSAXNames.push(name)
|
30
|
+
OSAXCache[name.downcase] = [path, nil]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
OSAXNames.sort.uniq
|
34
|
+
|
35
|
+
#######
|
36
|
+
# modified AppData class
|
37
|
+
|
38
|
+
class OSAXData < AS::AppData
|
39
|
+
|
40
|
+
def initialize(name, pid, url, terms)
|
41
|
+
super(AEM::Application, name, pid, url, terms)
|
42
|
+
end
|
43
|
+
|
44
|
+
def _connect
|
45
|
+
if @path
|
46
|
+
@target = @_aem_application_class.by_path(@path)
|
47
|
+
elsif @pid
|
48
|
+
@target = @_aem_application_class.by_pid(@pid)
|
49
|
+
elsif @url
|
50
|
+
@target = @_aem_application_class.by_url(@url)
|
51
|
+
else
|
52
|
+
@target = @_aem_application_class.current
|
53
|
+
end
|
54
|
+
begin
|
55
|
+
@target.event('ascrgdut').send(300) # make sure target application has loaded event handlers for all installed OSAXen
|
56
|
+
rescue AEM::CommandError => e
|
57
|
+
if e.number != -1708 # ignore 'event not handled' error
|
58
|
+
raise
|
59
|
+
end
|
60
|
+
end
|
61
|
+
@type_by_code, @type_by_name, @reference_by_code, @reference_by_name = @_terms
|
62
|
+
extend(AS::AppDataAccessors)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
######################################################################
|
69
|
+
# PUBLIC
|
70
|
+
######################################################################
|
71
|
+
|
72
|
+
def OSAX.scripting_additions
|
73
|
+
# list names of all currently installed scripting additions
|
74
|
+
return OSAXNames
|
75
|
+
end
|
76
|
+
|
77
|
+
def OSAX.osax(name, app_name=nil)
|
78
|
+
# convenience method; provides shortcut for creating a new ScriptingAddition instance;
|
79
|
+
# a target application's name or full path may optionally be given as well
|
80
|
+
addition = ScriptingAddition.new(name)
|
81
|
+
if app_name
|
82
|
+
addition = addition.by_name(app_name)
|
83
|
+
end
|
84
|
+
return addition
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
class ScriptingAddition < AS::Reference
|
89
|
+
# Represents a single scripting addition.
|
90
|
+
|
91
|
+
def initialize(name)
|
92
|
+
# name: string -- a scripting addition's name, e.g. "StandardAdditions";
|
93
|
+
# basically its filename minus the '.osax' suffix
|
94
|
+
#
|
95
|
+
# Note that name is case-insensitive and an '.osax' suffix is ignored if given.
|
96
|
+
@_osax_name = name
|
97
|
+
if name.is_a?(OSAXData)
|
98
|
+
osax_data = name
|
99
|
+
else
|
100
|
+
path, terms = OSAXCache[name.downcase.sub(/(?i)\.osax$/, '')]
|
101
|
+
if not path
|
102
|
+
raise ArgumentError, "Scripting addition not found: #{name.inspect}"
|
103
|
+
end
|
104
|
+
if terms
|
105
|
+
@_terms = terms
|
106
|
+
else
|
107
|
+
desc = AE.get_app_terminology(path).coerce(KAE::TypeAEList)
|
108
|
+
@_terms = OSAXCache[name.downcase][1] = \
|
109
|
+
Terminology.tables_for_aetes(DefaultCodecs.unpack(desc))
|
110
|
+
end
|
111
|
+
osax_data = OSAXData.new(nil, nil, nil, @_terms)
|
112
|
+
end
|
113
|
+
super(osax_data, AEM.app)
|
114
|
+
end
|
115
|
+
|
116
|
+
def to_s
|
117
|
+
return "#<OSAX::ScriptingAddition name=#{@_osax_name.inspect} target=#{@AS_app_data.target.inspect}>"
|
118
|
+
end
|
119
|
+
|
120
|
+
alias_method :inspect, :to_s
|
121
|
+
|
122
|
+
##
|
123
|
+
|
124
|
+
def method_missing(name, *args)
|
125
|
+
begin
|
126
|
+
super
|
127
|
+
rescue AS::CommandError => e
|
128
|
+
if e.to_i == -1713 # 'No user interaction allowed' error (e.g. user tried to send a 'display dialog' command to a non-GUI ruby process), so convert the target process to a full GUI process and try again
|
129
|
+
AE.transform_process_to_foreground_application
|
130
|
+
activate
|
131
|
+
super
|
132
|
+
else
|
133
|
+
raise
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# A client-created scripting addition is automatically targetted at the current application.
|
139
|
+
# Clients can specify another application as target by calling one of the following methods:
|
140
|
+
|
141
|
+
def by_name(name)
|
142
|
+
# name : string -- name or full path to application
|
143
|
+
return ScriptingAddition.new(OSAXData.new(FindApp.by_name(name), nil, nil, @_terms))
|
144
|
+
end
|
145
|
+
|
146
|
+
def by_id(id)
|
147
|
+
# id : string -- bundle id of application
|
148
|
+
return ScriptingAddition.new(OSAXData.new(FindApp.by_id(id), nil, nil, @_terms))
|
149
|
+
end
|
150
|
+
|
151
|
+
def by_creator(creator)
|
152
|
+
# creator : string -- four-character creator code of application
|
153
|
+
return ScriptingAddition.new(OSAXData.new(FindApp.by_creator(creator), nil, nil, @_terms))
|
154
|
+
end
|
155
|
+
|
156
|
+
def by_pid(pid)
|
157
|
+
# pid : integer -- Unix process id
|
158
|
+
return ScriptingAddition.new(OSAXData.new(nil, pid, nil, @_terms))
|
159
|
+
end
|
160
|
+
|
161
|
+
def by_url(url)
|
162
|
+
# url : string -- eppc URL of application
|
163
|
+
return ScriptingAddition.new(OSAXData.new(nil, nil, url, @_terms))
|
164
|
+
end
|
165
|
+
|
166
|
+
def current
|
167
|
+
return ScriptingAddition.new(OSAXData.new(nil, nil, nil, @_terms))
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|