rb-scpt 1.0.1 → 1.0.2
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.
- checksums.yaml +4 -4
- data/bin/rb-scpt-1.0.1.gem +0 -0
- data/extconf.rb +12 -12
- data/rb-scpt.gemspec +10 -10
- data/sample/AB_export_vcard.rb +16 -16
- data/sample/AB_list_people_with_emails.rb +4 -4
- data/sample/Add_iCal_event.rb +12 -12
- data/sample/Create_daily_iCal_todos.rb +28 -28
- data/sample/Export_Address_Book_phone_numbers.rb +52 -52
- data/sample/Hello_world.rb +10 -10
- data/sample/List_iTunes_playlist_names.rb +3 -3
- data/sample/Make_Mail_message.rb +24 -24
- data/sample/Open_file_in_TextEdit.rb +5 -5
- data/sample/Organize_Mail_messages.rb +46 -46
- data/sample/Print_folder_tree.rb +5 -5
- data/sample/Select_all_HTML_files.rb +6 -6
- data/sample/Set_iChat_status.rb +12 -12
- data/sample/Simple_Finder_GUI_Scripting.rb +6 -6
- data/sample/Stagger_Finder_windows.rb +9 -9
- data/sample/TextEdit_demo.rb +71 -71
- data/sample/iTunes_top40_to_html.rb +28 -30
- data/src/SendThreadSafe.c +293 -293
- data/src/SendThreadSafe.h +108 -108
- data/src/lib/_aem/aemreference.rb +997 -998
- data/src/lib/_aem/codecs.rb +609 -610
- data/src/lib/_aem/connect.rb +197 -197
- data/src/lib/_aem/encodingsupport.rb +67 -67
- data/src/lib/_aem/findapp.rb +75 -75
- data/src/lib/_aem/mactypes.rb +241 -242
- data/src/lib/_aem/send.rb +268 -268
- data/src/lib/_aem/typewrappers.rb +52 -52
- data/src/lib/_appscript/defaultterminology.rb +266 -266
- data/src/lib/_appscript/referencerenderer.rb +230 -233
- data/src/lib/_appscript/reservedkeywords.rb +106 -106
- data/src/lib/_appscript/safeobject.rb +125 -125
- data/src/lib/_appscript/terminology.rb +448 -449
- data/src/lib/aem.rb +238 -238
- data/src/lib/kae.rb +1487 -1487
- data/src/lib/osax.rb +647 -647
- data/src/lib/rb-scpt.rb +1065 -1065
- data/src/rbae.c +595 -595
- data/test/test_aemreference.rb +104 -107
- data/test/test_appscriptcommands.rb +131 -134
- data/test/test_appscriptreference.rb +96 -99
- data/test/test_codecs.rb +166 -168
- data/test/test_findapp.rb +13 -16
- data/test/test_mactypes.rb +70 -72
- data/test/test_osax.rb +46 -48
- data/test/testall.sh +4 -4
- metadata +8 -7
@@ -8,238 +8,235 @@ require "_aem/aemreference"
|
|
8
8
|
|
9
9
|
|
10
10
|
class ReferenceRenderer
|
11
|
-
|
12
|
-
|
13
|
-
private_class_method :new
|
14
|
-
attr_reader :result
|
15
|
-
|
16
|
-
def initialize(app_data)
|
17
|
-
@_app_data = app_data
|
18
|
-
@result = ""
|
19
|
-
end
|
20
|
-
|
21
|
-
def _format(val)
|
22
|
-
if val.is_a?(AEMReference::Query)
|
23
|
-
return ReferenceRenderer.render(@_app_data, val)
|
24
|
-
else
|
25
|
-
return val.inspect
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
##
|
30
|
-
|
31
|
-
def property(code)
|
32
|
-
name = @_app_data.reference_by_code.fetch('p'+code) { @_app_data.reference_by_code.fetch('e'+code) }
|
33
|
-
@result += ".#{name}"
|
34
|
-
return self
|
35
|
-
end
|
36
|
-
|
37
|
-
def elements(code)
|
38
|
-
name = @_app_data.reference_by_code.fetch('e'+code) { @_app_data.reference_by_code.fetch('p'+code) }
|
39
|
-
@result += ".#{name}"
|
40
|
-
return self
|
41
|
-
end
|
42
|
-
|
43
|
-
def by_name(name)
|
44
|
-
@result += "[#{_format(name)}]"
|
45
|
-
return self
|
46
|
-
end
|
47
|
-
|
48
|
-
def by_index(index)
|
49
|
-
@result += "[#{_format(index)}]"
|
50
|
-
return self
|
51
|
-
end
|
52
|
-
|
53
|
-
def by_id(id)
|
54
|
-
@result += ".ID(#{_format(id)})"
|
55
|
-
return self
|
56
|
-
end
|
57
|
-
|
58
|
-
def by_range(sel1, sel2)
|
59
|
-
@result += "[#{_format(sel1)}, #{_format(sel2)}]"
|
60
|
-
return self
|
61
|
-
end
|
62
|
-
|
63
|
-
def by_filter(sel)
|
64
|
-
@result += "[#{_format(sel)}]"
|
65
|
-
return self
|
66
|
-
end
|
67
|
-
|
68
|
-
def previous(sel)
|
69
|
-
@result += ".previous(#{_format(@_app_data.type_by_code[sel])})"
|
70
|
-
return self
|
71
|
-
end
|
72
|
-
|
73
|
-
def next(sel)
|
74
|
-
@result += ".next(#{_format(@_app_data.type_by_code[sel])})"
|
75
|
-
return self
|
76
|
-
end
|
77
|
-
|
78
|
-
##
|
79
|
-
|
80
|
-
def custom_root(value)
|
81
|
-
app
|
82
|
-
@result += ".AS_new_reference(#{value.inspect})"
|
83
|
-
return self
|
84
|
-
end
|
85
|
-
|
86
|
-
def app
|
87
|
-
case @_app_data.constructor
|
88
|
-
when :current
|
89
|
-
@result = "app.current"
|
90
|
-
when :by_path
|
91
|
-
@result = "app(#{@_app_data.identifier.inspect})"
|
92
|
-
else
|
93
|
-
@result = "app.#{@_app_data.constructor}(#{@_app_data.identifier.inspect})"
|
94
|
-
end
|
95
|
-
return self
|
96
|
-
end
|
97
|
-
|
98
|
-
def con
|
99
|
-
@result = "con"
|
100
|
-
return self
|
101
|
-
end
|
102
|
-
|
103
|
-
def its
|
104
|
-
@result = "its"
|
105
|
-
return self
|
106
|
-
end
|
107
|
-
|
108
|
-
##
|
109
|
-
|
110
|
-
def beginning
|
111
|
-
@result += ".beginning"
|
112
|
-
return self
|
113
|
-
end
|
114
|
-
|
115
|
-
def end
|
116
|
-
@result += ".end"
|
117
|
-
return self
|
118
|
-
end
|
119
|
-
|
120
|
-
def before
|
121
|
-
@result += ".before"
|
122
|
-
return self
|
123
|
-
end
|
124
|
-
|
125
|
-
def after
|
126
|
-
@result += ".after"
|
127
|
-
return self
|
128
|
-
end
|
129
|
-
|
130
|
-
##
|
131
|
-
|
132
|
-
def first
|
133
|
-
@result += ".first"
|
134
|
-
return self
|
135
|
-
end
|
136
|
-
|
137
|
-
def middle
|
138
|
-
@result += ".middle"
|
139
|
-
return self
|
140
|
-
end
|
141
|
-
|
142
|
-
def last
|
143
|
-
@result += ".last"
|
144
|
-
return self
|
145
|
-
end
|
146
|
-
|
147
|
-
def any
|
148
|
-
@result += ".any"
|
149
|
-
return self
|
150
|
-
end
|
151
|
-
|
152
|
-
##
|
153
|
-
|
154
|
-
def gt(val)
|
155
|
-
@result += ".gt(#{_format(val)})"
|
156
|
-
return self
|
157
|
-
end
|
158
|
-
|
159
|
-
def ge(val)
|
160
|
-
@result += ".ge(#{_format(val)})"
|
161
|
-
return self
|
162
|
-
end
|
163
|
-
|
164
|
-
def eq(val)
|
165
|
-
@result += ".eq(#{_format(val)})"
|
166
|
-
return self
|
167
|
-
end
|
168
|
-
|
169
|
-
def ne(val)
|
170
|
-
@result += ".ne(#{_format(val)})"
|
171
|
-
return self
|
172
|
-
end
|
173
|
-
|
174
|
-
def lt(val)
|
175
|
-
@result += ".lt(#{_format(val)})"
|
176
|
-
return self
|
177
|
-
end
|
178
|
-
|
179
|
-
def le(val)
|
180
|
-
@result += ".le(#{_format(val)})"
|
181
|
-
return self
|
182
|
-
end
|
183
|
-
|
184
|
-
def begins_with(val)
|
185
|
-
@result += ".begins_with(#{_format(val)})"
|
186
|
-
return self
|
187
|
-
end
|
188
|
-
|
189
|
-
def ends_with(val)
|
190
|
-
@result += ".ends_with(#{_format(val)})"
|
191
|
-
return self
|
192
|
-
end
|
193
|
-
|
194
|
-
def contains(val)
|
195
|
-
@result += ".contains(#{_format(val)})"
|
196
|
-
return self
|
197
|
-
end
|
198
|
-
|
199
|
-
def is_in(val)
|
200
|
-
@result += ".is_in(#{_format(val)})"
|
201
|
-
return self
|
202
|
-
end
|
203
|
-
|
204
|
-
def and(*operands)
|
205
|
-
@result += ".and(#{(operands.map { |val| _format(val) }).join(', ')})"
|
206
|
-
return self
|
207
|
-
end
|
208
|
-
|
209
|
-
def or(*operands)
|
210
|
-
@result += ".or(#{(operands.map { |val| _format(val) }).join(', ')})"
|
211
|
-
return self
|
212
|
-
end
|
213
|
-
|
214
|
-
def not
|
215
|
-
@result += ".not"
|
216
|
-
return self
|
217
|
-
end
|
218
|
-
|
219
|
-
# public
|
220
|
-
|
221
|
-
def ReferenceRenderer.render(app_data, aem_reference)
|
222
|
-
# Take an aem reference, e.g.:
|
223
|
-
#
|
224
|
-
# app.elements('docu').by_index(1).property('ctxt')
|
225
|
-
#
|
226
|
-
# and an AppData instance containing application's location and terminology,
|
227
|
-
# and render an appscript-style reference string, e.g.:
|
228
|
-
#
|
229
|
-
# "AS.app('/Applications/TextEdit.app').documents[1].text"
|
230
|
-
#
|
231
|
-
# Used by AS::Reference#to_s
|
232
|
-
#
|
233
|
-
f = new(app_data)
|
234
|
-
begin
|
235
|
-
aem_reference.AEM_resolve(f)
|
236
|
-
return f.result
|
237
|
-
rescue
|
238
|
-
return "#{new(app_data).app.result}.AS_new_reference(#{aem_reference.inspect})"
|
239
|
-
end
|
240
|
-
end
|
11
|
+
# Generates string representations of appscript references from aem object specifiers.
|
241
12
|
|
242
|
-
|
13
|
+
private_class_method :new
|
14
|
+
attr_reader :result
|
15
|
+
|
16
|
+
def initialize(app_data)
|
17
|
+
@_app_data = app_data
|
18
|
+
@result = ""
|
19
|
+
end
|
20
|
+
|
21
|
+
def _format(val)
|
22
|
+
if val.is_a?(AEMReference::Query)
|
23
|
+
return ReferenceRenderer.render(@_app_data, val)
|
24
|
+
else
|
25
|
+
return val.inspect
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
|
31
|
+
def property(code)
|
32
|
+
name = @_app_data.reference_by_code.fetch('p'+code) { @_app_data.reference_by_code.fetch('e'+code) }
|
33
|
+
@result += ".#{name}"
|
34
|
+
return self
|
35
|
+
end
|
36
|
+
|
37
|
+
def elements(code)
|
38
|
+
name = @_app_data.reference_by_code.fetch('e'+code) { @_app_data.reference_by_code.fetch('p'+code) }
|
39
|
+
@result += ".#{name}"
|
40
|
+
return self
|
41
|
+
end
|
42
|
+
|
43
|
+
def by_name(name)
|
44
|
+
@result += "[#{_format(name)}]"
|
45
|
+
return self
|
46
|
+
end
|
47
|
+
|
48
|
+
def by_index(index)
|
49
|
+
@result += "[#{_format(index)}]"
|
50
|
+
return self
|
51
|
+
end
|
52
|
+
|
53
|
+
def by_id(id)
|
54
|
+
@result += ".ID(#{_format(id)})"
|
55
|
+
return self
|
56
|
+
end
|
57
|
+
|
58
|
+
def by_range(sel1, sel2)
|
59
|
+
@result += "[#{_format(sel1)}, #{_format(sel2)}]"
|
60
|
+
return self
|
61
|
+
end
|
62
|
+
|
63
|
+
def by_filter(sel)
|
64
|
+
@result += "[#{_format(sel)}]"
|
65
|
+
return self
|
66
|
+
end
|
67
|
+
|
68
|
+
def previous(sel)
|
69
|
+
@result += ".previous(#{_format(@_app_data.type_by_code[sel])})"
|
70
|
+
return self
|
71
|
+
end
|
72
|
+
|
73
|
+
def next(sel)
|
74
|
+
@result += ".next(#{_format(@_app_data.type_by_code[sel])})"
|
75
|
+
return self
|
76
|
+
end
|
77
|
+
|
78
|
+
##
|
79
|
+
|
80
|
+
def custom_root(value)
|
81
|
+
app
|
82
|
+
@result += ".AS_new_reference(#{value.inspect})"
|
83
|
+
return self
|
84
|
+
end
|
85
|
+
|
86
|
+
def app
|
87
|
+
case @_app_data.constructor
|
88
|
+
when :current
|
89
|
+
@result = "app.current"
|
90
|
+
when :by_path
|
91
|
+
@result = "app(#{@_app_data.identifier.inspect})"
|
92
|
+
else
|
93
|
+
@result = "app.#{@_app_data.constructor}(#{@_app_data.identifier.inspect})"
|
94
|
+
end
|
95
|
+
return self
|
96
|
+
end
|
97
|
+
|
98
|
+
def con
|
99
|
+
@result = "con"
|
100
|
+
return self
|
101
|
+
end
|
102
|
+
|
103
|
+
def its
|
104
|
+
@result = "its"
|
105
|
+
return self
|
106
|
+
end
|
107
|
+
|
108
|
+
##
|
109
|
+
|
110
|
+
def beginning
|
111
|
+
@result += ".beginning"
|
112
|
+
return self
|
113
|
+
end
|
114
|
+
|
115
|
+
def end
|
116
|
+
@result += ".end"
|
117
|
+
return self
|
118
|
+
end
|
119
|
+
|
120
|
+
def before
|
121
|
+
@result += ".before"
|
122
|
+
return self
|
123
|
+
end
|
124
|
+
|
125
|
+
def after
|
126
|
+
@result += ".after"
|
127
|
+
return self
|
128
|
+
end
|
243
129
|
|
244
|
-
|
245
|
-
|
130
|
+
##
|
131
|
+
|
132
|
+
def first
|
133
|
+
@result += ".first"
|
134
|
+
return self
|
135
|
+
end
|
136
|
+
|
137
|
+
def middle
|
138
|
+
@result += ".middle"
|
139
|
+
return self
|
140
|
+
end
|
141
|
+
|
142
|
+
def last
|
143
|
+
@result += ".last"
|
144
|
+
return self
|
145
|
+
end
|
146
|
+
|
147
|
+
def any
|
148
|
+
@result += ".any"
|
149
|
+
return self
|
150
|
+
end
|
151
|
+
|
152
|
+
##
|
153
|
+
|
154
|
+
def gt(val)
|
155
|
+
@result += ".gt(#{_format(val)})"
|
156
|
+
return self
|
157
|
+
end
|
158
|
+
|
159
|
+
def ge(val)
|
160
|
+
@result += ".ge(#{_format(val)})"
|
161
|
+
return self
|
162
|
+
end
|
163
|
+
|
164
|
+
def eq(val)
|
165
|
+
@result += ".eq(#{_format(val)})"
|
166
|
+
return self
|
167
|
+
end
|
168
|
+
|
169
|
+
def ne(val)
|
170
|
+
@result += ".ne(#{_format(val)})"
|
171
|
+
return self
|
172
|
+
end
|
173
|
+
|
174
|
+
def lt(val)
|
175
|
+
@result += ".lt(#{_format(val)})"
|
176
|
+
return self
|
177
|
+
end
|
178
|
+
|
179
|
+
def le(val)
|
180
|
+
@result += ".le(#{_format(val)})"
|
181
|
+
return self
|
182
|
+
end
|
183
|
+
|
184
|
+
def begins_with(val)
|
185
|
+
@result += ".begins_with(#{_format(val)})"
|
186
|
+
return self
|
187
|
+
end
|
188
|
+
|
189
|
+
def ends_with(val)
|
190
|
+
@result += ".ends_with(#{_format(val)})"
|
191
|
+
return self
|
192
|
+
end
|
193
|
+
|
194
|
+
def contains(val)
|
195
|
+
@result += ".contains(#{_format(val)})"
|
196
|
+
return self
|
197
|
+
end
|
198
|
+
|
199
|
+
def is_in(val)
|
200
|
+
@result += ".is_in(#{_format(val)})"
|
201
|
+
return self
|
202
|
+
end
|
203
|
+
|
204
|
+
def and(*operands)
|
205
|
+
@result += ".and(#{(operands.map { |val| _format(val) }).join(', ')})"
|
206
|
+
return self
|
207
|
+
end
|
208
|
+
|
209
|
+
def or(*operands)
|
210
|
+
@result += ".or(#{(operands.map { |val| _format(val) }).join(', ')})"
|
211
|
+
return self
|
212
|
+
end
|
213
|
+
|
214
|
+
def not
|
215
|
+
@result += ".not"
|
216
|
+
return self
|
217
|
+
end
|
218
|
+
|
219
|
+
# public
|
220
|
+
|
221
|
+
def ReferenceRenderer.render(app_data, aem_reference)
|
222
|
+
# Take an aem reference, e.g.:
|
223
|
+
#
|
224
|
+
# app.elements('docu').by_index(1).property('ctxt')
|
225
|
+
#
|
226
|
+
# and an AppData instance containing application's location and terminology,
|
227
|
+
# and render an appscript-style reference string, e.g.:
|
228
|
+
#
|
229
|
+
# "AS.app('/Applications/TextEdit.app').documents[1].text"
|
230
|
+
#
|
231
|
+
# Used by AS::Reference#to_s
|
232
|
+
#
|
233
|
+
f = new(app_data)
|
234
|
+
begin
|
235
|
+
aem_reference.AEM_resolve(f)
|
236
|
+
return f.result
|
237
|
+
rescue
|
238
|
+
return "#{new(app_data).app.result}.AS_new_reference(#{aem_reference.inspect})"
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
end
|