rb-appscript 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/CHANGES +59 -0
  2. data/LICENSE +65 -0
  3. data/README +1 -1
  4. data/TODO +13 -13
  5. data/doc/aem-manual/04_references.html +13 -13
  6. data/doc/aem-manual/05_targettingapplications.html +7 -5
  7. data/doc/aem-manual/06_buildingandsendingevents.html +1 -1
  8. data/doc/aem-manual/08_examples.html +6 -6
  9. data/doc/aem-manual/index.html +3 -4
  10. data/doc/appscript-manual/02_aboutappscripting.html +2 -10
  11. data/doc/appscript-manual/04_gettinghelp.html +32 -18
  12. data/doc/appscript-manual/05_keywordconversion.html +7 -7
  13. data/doc/appscript-manual/06_classesandenums.html +2 -21
  14. data/doc/appscript-manual/07_applicationobjects.html +11 -2
  15. data/doc/appscript-manual/08_realvsgenericreferences.html +1 -1
  16. data/doc/appscript-manual/09_referenceforms.html +13 -13
  17. data/doc/appscript-manual/10_referenceexamples.html +7 -7
  18. data/doc/appscript-manual/11_applicationcommands.html +30 -28
  19. data/doc/appscript-manual/13_performanceissues.html +3 -3
  20. data/doc/appscript-manual/{15_notes.html → 14_notes.html} +18 -13
  21. data/doc/appscript-manual/full.css +1 -2
  22. data/doc/appscript-manual/index.html +3 -4
  23. data/doc/index.html +2 -1
  24. data/doc/mactypes-manual/index.html +23 -13
  25. data/doc/osax-manual/index.html +27 -5
  26. data/rb-appscript.gemspec +1 -1
  27. data/sample/AB_list_people_with_emails.rb +2 -1
  28. data/sample/Add_iCal_event.rb +18 -0
  29. data/sample/Export_Address_Book_phone_numbers.rb +56 -0
  30. data/sample/Hello_world.rb +9 -1
  31. data/sample/Select_all_HTML_files.rb +4 -2
  32. data/sample/iTunes_top40_to_html.rb +7 -4
  33. data/src/lib/_aem/aemreference.rb +50 -51
  34. data/src/lib/_aem/codecs.rb +148 -178
  35. data/src/lib/_aem/connect.rb +0 -2
  36. data/src/lib/_aem/findapp.rb +1 -1
  37. data/src/lib/_aem/mactypes.rb +2 -9
  38. data/src/lib/_aem/send.rb +2 -2
  39. data/src/lib/_appscript/defaultterminology.rb +2 -2
  40. data/src/lib/_appscript/referencerenderer.rb +119 -14
  41. data/src/lib/_appscript/reservedkeywords.rb +5 -0
  42. data/src/lib/_appscript/safeobject.rb +190 -0
  43. data/src/lib/_appscript/terminology.rb +195 -90
  44. data/src/lib/aem.rb +8 -9
  45. data/src/lib/appscript.rb +175 -159
  46. data/src/lib/osax.rb +65 -29
  47. data/src/rbae.c +42 -2
  48. data/test/test_aemreference.rb +3 -3
  49. data/test/test_appscriptcommands.rb +135 -0
  50. data/test/test_appscriptreference.rb +10 -8
  51. data/test/test_mactypes.rb +7 -1
  52. data/test/test_osax.rb +57 -0
  53. data/test/testall.sh +2 -1
  54. metadata +10 -9
  55. data/doc/aem-manual/09_notes.html +0 -41
  56. data/doc/appscript-manual/14_problemapps.html +0 -192
  57. data/misc/adobeunittypes.rb +0 -14
  58. data/misc/dump.rb +0 -72
  59. data/rb-appscript-0.2.0.gem +0 -0
@@ -37,11 +37,12 @@
37
37
 
38
38
  <li>Names that match the methods already defined on appscript's Application and Reference classes have an underscore appended. The reserved method names are:
39
39
 
40
- <pre><code>abort_transaction instance_variable_set
41
- after instance_variables
42
- and is_in
43
- any is_not_in
44
- before keywords
40
+ <pre><code>abort_transaction instance_variable_get
41
+ after instance_variable_set
42
+ and instance_variables
43
+ any is_in
44
+ before is_not_in
45
+ by_aem_app keywords
45
46
  by_creator last
46
47
  by_id launch
47
48
  by_name le
@@ -73,8 +74,7 @@ ID to_a
73
74
  id to_s
74
75
  ignore type
75
76
  inspect untaint
76
- instance_eval wait_reply
77
- instance_variable_get</code></pre>
77
+ instance_eval wait_reply</code></pre>
78
78
  </div>
79
79
  </li>
80
80
  </ul>
@@ -47,7 +47,7 @@ AEM::AEEnum.new('xyz ')</code></pre>
47
47
 
48
48
  <h2>Common AE types</h2>
49
49
 
50
- <table width=100% summary="AE-Ruby type mappings">
50
+ <table width="100%" summary="AE-Ruby type mappings">
51
51
  <thead>
52
52
  <tr><th>AE type</th><th>appscript name</th><th>Ruby class</th></tr>
53
53
  </thead>
@@ -133,26 +133,7 @@ $KCODE = "UTF8"</code></pre>
133
133
 
134
134
  <h3>Unit types</h3>
135
135
 
136
- <p>The following unit types are defined as standard:</p>
137
-
138
- <pre><code>:centimeters :cubic_inches
139
- :meters :cubic_feet
140
- :kilometers :cubic_yards
141
- :inches
142
- :feet :liters
143
- :yards :quarts
144
- :miles :gallons
145
-
146
- :square_meters :grams
147
- :square_kilometers :kilograms
148
- :square_feet :ounces
149
- :square_yards :pounds
150
- :square_miles
151
- :degrees_Celsius
152
- :cubic_centimeters :degrees_Fahrenheit
153
- :cubic_meters :degrees_Kelvin</code></pre>
154
-
155
- <p>Values are represented by instances of the <code>MacTypes::Units</code> class, e.g. <code>MacTypes::Units.inches(3.0)</code>. See the <a href="../mactypes-manual/index.html">mactypes manual</a> for more information.</p>
136
+ <p>Unit type values are represented by instances of the <code>MacTypes::Units</code> class, e.g. <code>MacTypes::Units.inches(3.0)</code>. See the <a href="../mactypes-manual/index.html">mactypes manual</a> for more information.</p>
156
137
 
157
138
 
158
139
  <h3>Miscellaneous types</h3>
@@ -35,6 +35,8 @@ app.by_pid(pid) # Unix process id for a local process
35
35
 
36
36
  app.by_url(url) # eppc URL for a remote process
37
37
 
38
+ app.by_aem_app(aem_app) # AEM::Application instance
39
+
38
40
  app.current # the host process</code></pre>
39
41
 
40
42
  <p>For convenience, the most commonly used form, <code>app.by_name(name)</code>, can be shortened to:</p>
@@ -59,6 +61,9 @@ app.current # the host process</code></pre>
59
61
 
60
62
  <dt><code>url</code></dt>
61
63
  <dd>A URL of form <code>eppc://[user[:password]@host/Application%20Name[?[uid=#]&amp;[pid=#]</code>, e.g. <code>eppc://johnsmith:foobar@office-mac.local/TextEdit?uid=501</code>. The host name/IP address and the process name (case-sensitive) are required. The username and password are optional: if omitted, the OS will obtain this information from the user's keychain or display a dialog asking the user to input one or both values. The user id and process id are also optional; if the process id is given, the process name will be ignored.</dd>
64
+
65
+ <dt><code>aem_app</code></dt>
66
+ <dd>An <code>AEM::Application</code> instance.</dd>
62
67
  </dl>
63
68
 
64
69
 
@@ -126,9 +131,13 @@ set(reference, :to =&gt; value) -- Set an object's data.
126
131
 
127
132
  <h2>Transaction support</h2>
128
133
 
129
- <p>Application objects implement three additional methods, <code>start_transaction</code>, <code>end_transaction</code> and <code>abort_transaction</code> that allow a sequence of related commands to be handled as a single operation by applications that support transactions, e.g. FileMaker Pro. Once the application object's <code>start_transaction</code> method is called, all subsequent commands to that application will be sent as part of the same transaction until <code>end_transaction</code> or <code>abort_transaction</code> is called.</p>
134
+ <p>Application objects implement three additional methods, <code>start_transaction</code>, <code>end_transaction</code> and <code>abort_transaction</code> that allow a sequence of related commands to be handled as a single operation by applications that support transactions, e.g. FileMaker Pro.</p>
135
+
136
+ <p>Once the application object's <code>start_transaction</code> method is called, all subsequent commands to that application will be sent as part of the same transaction until <code>end_transaction</code> or <code>abort_transaction</code> is called.</p>
137
+
138
+ <p>The <code>start_transaction</code> method takes an optional <code>session</code> argument that indicates the specific transaction session to open (in applications that support this).</p>
130
139
 
131
- <p class="hilitebox">Remember to call <code>end_transaction</code> or <code>abort_transaction</code> at the end of every transaction. If a transaction is accidentally left open, appscript will try to end it automatically when the application object is garbage-collected, but this is not guaranteed to succeed.</p>
140
+ <p class="hilitebox">Remember to call <code>end_transaction</code> or <code>abort_transaction</code> at the end of every transaction. (This includes transactions interrupted by a raised exception.) If a transaction is accidentally left open, appscript will try to end it automatically when the application object is garbage-collected, but this is not guaranteed to succeed.</p>
132
141
 
133
142
 
134
143
  <h2>Local application launching notes</h2>
@@ -83,4 +83,4 @@ puts app('Finder').home == app('Finder').home.get
83
83
  <!--footer-->
84
84
  <p class="footer">&copy; 2006 HAS</p>
85
85
  </body>
86
- </html>s
86
+ </html>
@@ -20,7 +20,7 @@
20
20
 
21
21
  <!-- content -->
22
22
  <div id="content">
23
- <h2>Property Reference</h2>
23
+ <h2>Property reference</h2>
24
24
 
25
25
  <p>A property either contains a simple value or represents a one-to-one relationship between two application objects. Properties either describe the application object (its name, class, size, color, preferences, etc.) or provide a convenient reference to other object(s) of interest to users (e.g. home, current_track).</p>
26
26
 
@@ -34,7 +34,7 @@ finder.<em>home</em>.files.<em>name</em></code></pre>
34
34
 
35
35
 
36
36
 
37
- <h2>Element References</h2>
37
+ <h2>Element references</h2>
38
38
 
39
39
  <p>Elements represent a one-to-many relationship between application objects. Elements usually reflect the containment structure of the application object model and generally provide multiple ways of referencing some or all of those objects (e.g. characters/words/paragraphs of documents by index/relative-position/range/filter).</p>
40
40
 
@@ -52,8 +52,8 @@ textedit.<em>documents</em>.<em>paragraphs</em>.<em>words</em></code></pre>
52
52
  <h3>by Name</h3>
53
53
 
54
54
  <p>Syntax:</p>
55
- <pre><code>elements[specifier]
56
- specifier : String -- name of object (as matches its 'name' property)</code></pre>
55
+ <pre><code>elements[selector]
56
+ selector : String -- name of object (as matches its 'name' property)</code></pre>
57
57
 
58
58
  <p>Examples:</p>
59
59
  <pre><code>disks['Macintosh HD']
@@ -65,8 +65,8 @@ files['index.html']</code></pre>
65
65
  <h3>by Index</h3>
66
66
 
67
67
  <p>Syntax:</p>
68
- <pre><code>elements[specifier]
69
- specifier : Fixnum | Bignum -- index of object</code></pre>
68
+ <pre><code>elements[selector]
69
+ selector : Fixnum | Bignum -- index of object</code></pre>
70
70
 
71
71
  <p>Examples:</p>
72
72
  <pre><code>words[3]
@@ -78,8 +78,8 @@ items[-1]</code></pre>
78
78
  <h3>by ID</h3>
79
79
 
80
80
  <p>Syntax:</p>
81
- <pre><code>elements.ID(specifier)
82
- specifier : anything -- object's id</code></pre>
81
+ <pre><code>elements.ID(selector)
82
+ selector : anything -- object's id</code></pre>
83
83
 
84
84
  <p>Examples:</p>
85
85
  <pre><code>windows.ID(4321)</code></pre>
@@ -102,9 +102,9 @@ files.any</code></pre>
102
102
  <h3>by Relative Position</h3>
103
103
 
104
104
  <p>Syntax:</p>
105
- <pre><code>elements[specifier].previous(class) -- nearest element of a given class to appear
105
+ <pre><code>elements[selector].previous(class) -- nearest element of a given class to appear
106
106
  before the specified element
107
- elements[specifier].next(class) -- nearest element of a given class to appear
107
+ elements[selector].next(class) -- nearest element of a given class to appear
108
108
  after the specified element
109
109
  class : Symbol -- class of element (see <a href="4_classesandenums.html">Classes and Enumerated Types</a>)</code></pre>
110
110
 
@@ -202,15 +202,15 @@ its.words[1].starts_with('A').or(
202
202
 
203
203
 
204
204
 
205
- <h2>Insertion Location</h2>
205
+ <h2>Insertion location</h2>
206
206
 
207
207
  <p>Insertion locations can be specified at the beginning or end of all elements, or before or after a specified element or element range.</p>
208
208
 
209
209
  <p>Syntax:</p>
210
210
  <pre><code>elements.start
211
211
  elements.end
212
- elements[specifier].before
213
- elements[specifier].after</code></pre>
212
+ elements[selector].before
213
+ elements[selector].after</code></pre>
214
214
 
215
215
  <p>Examples:</p>
216
216
  <pre><code>documents.end
@@ -32,7 +32,7 @@ app('Finder')
32
32
  app('/Applications/TextEdit.app')</code></pre>
33
33
 
34
34
 
35
- <h2>Property References</h2>
35
+ <h2>Property references</h2>
36
36
 
37
37
  <pre><code># a reference to startup disk of application &quot;Finder&quot;
38
38
  app('Finder').startup_disk
@@ -51,7 +51,7 @@ app('TextEdit').documents.text
51
51
  app('TextEdit').documents[1].text.paragraphs.characters[1].color</code></pre>
52
52
 
53
53
 
54
- <h2>All Elements References</h2>
54
+ <h2>All elements references</h2>
55
55
 
56
56
  <pre><code># a reference to disks of application &quot;Finder&quot;
57
57
  app('Finder').disks
@@ -61,7 +61,7 @@ app('Finder').disks
61
61
  app('TextEdit').documents.text.paragraphs.words</code></pre>
62
62
 
63
63
 
64
- <h2>Single Element References</h2>
64
+ <h2>Single element references</h2>
65
65
 
66
66
  <pre><code># a reference to disk 1 of application &quot;Finder&quot;
67
67
  app('Finder').disks[1]
@@ -79,7 +79,7 @@ app('TextEdit').documents.last.text.paragraphs.middle
79
79
  app('Finder').home.files.any</code></pre>
80
80
 
81
81
 
82
- <h2>Relative References</h2>
82
+ <h2>Relative references</h2>
83
83
 
84
84
  <pre><code># a reference to paragraph before paragraph 6 of text of document 1 of application &quot;TextEdit&quot;
85
85
  app('TextEdit').documents[1].text.paragraphs[6].previous(:paragraph)
@@ -88,7 +88,7 @@ app('TextEdit').documents[1].text.paragraphs[6].previous(:paragraph)
88
88
  app('Tex-Edit Plus').documents[1].characters[30].next(:paragraph)</code></pre>
89
89
 
90
90
 
91
- <h2>Element Range References</h2>
91
+ <h2>Element range references</h2>
92
92
 
93
93
  <pre><code># a reference to words 1 thru 4 of text of document 1 of application &quot;TextEdit&quot;
94
94
  app('TextEdit').documents[1].text.words[1, 4]
@@ -103,7 +103,7 @@ app('Finder').home.folders['Documents', 'Music']
103
103
  app('Tex-Edit Plus').documents[1].text[con.words[3], con.paragraphs[7]]</code></pre>
104
104
 
105
105
 
106
- <h2>Filter References</h2>
106
+ <h2>Filter references</h2>
107
107
 
108
108
  <pre><code># a reference to every document of application &quot;TextEdit&quot; whose text is &quot;\n&quot;
109
109
  app('TextEdit').documents[its.text.eq("\n")]
@@ -119,7 +119,7 @@ app('Finder').home.folders['Documents'].files[
119
119
  its.name_extension.eq('txt').AND(its.size.lt(10240))]</code></pre>
120
120
 
121
121
 
122
- <h2>Insertion Location References</h2>
122
+ <h2>Insertion location references</h2>
123
123
 
124
124
  <pre><code># a reference to end of documents of application &quot;TextEdit&quot;
125
125
  app('TextEdit').documents.end
@@ -125,13 +125,7 @@ app('Finder').home.items.get(:result_type =&gt; :alias)</code></pre>
125
125
 
126
126
  <pre><code>reference.command(direct_parameter[, keyword_parameters])</code></pre>
127
127
 
128
- <p>the reference upon which it is called will be packed as a 'subject' attribute. For example, if the <code>make</code> command is called on a reference, the application will use that reference as its insertion location if there is no <code>at</code> keyword parameter given; i.e.:</p>
129
-
130
- <pre><code>insertion_location.make(:new =&gt; some_class)</code></pre>
131
-
132
- <p>instead of:</p>
133
-
134
- <pre><code>application.make(:new =&gt; some_class, :at =&gt; insertion_location)</code></pre></li>
128
+ <p>the reference upon which it is called will be packed as the Apple event's 'subject' attribute (<code>keySubjectAttr</code>).</p></li>
135
129
 
136
130
 
137
131
  <li><p>When the <code>set</code> command is called on a reference, its <code>to</code> parameter can be written as a direct parameter; i.e.:</p>
@@ -148,6 +142,17 @@ app('Finder').home.items.get(:result_type =&gt; :alias)</code></pre>
148
142
 
149
143
  <p>The first form is preferred, although all three are supported.</p></li>
150
144
 
145
+
146
+ <li><p>If the <code>make</code> command is called on an insertion location reference, appscript will pack that reference as the Apple event's <code>at</code> parameter if it doesn't already have one; i.e.:</p>
147
+
148
+ <pre><code>insertion_location.make(:new =&gt; some_class)</code></pre>
149
+
150
+ <p>is equivalent to:</p>
151
+
152
+ <pre><code>application.make(:new =&gt; some_class, :at =&gt; insertion_location)</code></pre>
153
+
154
+ <p>If the <code>make</code> command is called on an object reference, appscript will pack that reference as the Apple event's 'subject' attribute. (Note that some applications may not handle the subject attribute correctly, in which case the reference should be passed as the <code>make</code> command's <code>at</code> parameter instead.)</p></li>
155
+
151
156
  </ol>
152
157
 
153
158
 
@@ -155,39 +160,36 @@ app('Finder').home.items.get(:result_type =&gt; :alias)</code></pre>
155
160
 
156
161
  <p>Unlike AppleScript, which implicitly sends a <code>get</code> command to any unresolved application object references at the end of evaluating an expression, appscript only resolves a reference when it receives an appropriate command. For example:</p>
157
162
 
158
- <pre><code>foo = app('Finder').disks</code></pre>
163
+ <pre><code>d = app('TextEdit').documents</code></pre>
159
164
 
160
- <p>is <em>not</em> equivalent to:</p>
165
+ <p>is <em>not</em> the same as:</p>
161
166
 
162
- <pre><code>set foo to disks of application &quot;Finder&quot;</code></pre>
167
+ <pre><code>set d to documents of app &quot;TextEdit&quot;</code></pre>
163
168
 
164
- <p>even though the two may look similar. In the first case, the value assigned to variable <code>foo</code> is a reference, <code>app('Finder').disks</code>. In the second, AppleScript evaluates the <code>disks of application &quot;Finder&quot;</code> reference by performing an implicit <code>get</code> command before assigning the result, a <em>list</em> containing one or more references (one to each disk currently mounted), to variable <code>foo</code>. To assign an unresolved reference to a variable in AppleScript, the reference must be preceded by the <code>a reference to</code> operator. For example:</p>
169
+ <p>even though the two may look similar. In the first case, the value assigned to <code>d</code> is an appscript reference: <code>app('TextEdit').documents</code>. In the second, AppleScript evaluates the <code>documents of app &quot;TextEdit&quot;</code> reference by performing an implicit <code>get</code> command and then assigning its result, a list of references to individual documents, to <code>d</code>. To obtain the original reference as an AppleScript value, the literal reference must be preceded by an <code>a reference to</code> operator as shown below.</p>
165
170
 
166
- <ul>
167
- <li><p>Getting a reference to all disks:</p>
171
+ <p>To get a single reference to all documents:</p>
168
172
 
169
- <pre><code>set foo to a reference to every disk of application &quot;Finder&quot;
170
- return foo
171
- --&gt; a reference to every disk of application &quot;Finder&quot;</code></pre>
173
+ <pre><code>set d to a reference to documents of app &quot;TextEdit&quot;
174
+ return d
175
+ --&gt; a reference to documents of app &quot;TextEdit&quot;
172
176
 
173
- <pre><code>foo = app('Finder').disks
174
- print foo
175
- --&gt; app('Finder').disks</code></pre></li>
176
177
 
178
+ d = app('TextEdit').documents
179
+ print d
180
+ --&gt; app('TextEdit').documents</code></pre>
177
181
 
178
- <li><p>Getting a list of references to each disk:</p>
179
182
 
180
- <pre><code>set foo to get every disk of application &quot;Finder&quot; -- (the 'get' is optional here)
181
- return foo
182
- --&gt; {disk &quot;Mac HD&quot; of application &quot;Finder&quot;, disk &quot;ZIP-100&quot; of application &quot;Finder&quot;}</code></pre>
183
+ <p>To get a list of references to each document:</p>
183
184
 
184
- <pre><code>foo = app('Finder').disks.get
185
- print foo
186
- --&gt; [app('Finder').disks['Mac HD'], app('Finder').disks['ZIP-100']]</code></pre>
185
+ <pre><code>set d to get documents of app &quot;TextEdit&quot; -- (explicit 'get' is optional)
186
+ return d
187
+ --&gt; {document 1 of app &quot;TextEdit&quot;, document 2 of app &quot;TextEdit&quot;}
187
188
 
188
- </li>
189
- </ul>
190
189
 
190
+ d = app('TextEdit').documents.get -- (explicit 'get' is required)
191
+ print d
192
+ --&gt; [app('TextEdit').documents[1], app('TextEdit').documents[2]]</code></pre>
191
193
 
192
194
 
193
195
  </div>
@@ -14,13 +14,13 @@
14
14
 
15
15
  <!-- top navigation -->
16
16
  <div class="navbar">
17
- <a href="12_commandexamples.html">Previous</a> | <a href="index.html">Up</a> | <a href="14_problemapps.html">Next</a>
17
+ <a href="12_commandexamples.html">Previous</a> | <a href="index.html">Up</a> | <a href="14_notes.html">Next</a>
18
18
 
19
19
  </div>
20
20
 
21
21
  <!-- content -->
22
22
  <div id="content">
23
- <h2>About Performance</h2>
23
+ <h2>About performance</h2>
24
24
 
25
25
  <p>Application scripting is subject to a number of potential performance bottlenecks:</p>
26
26
 
@@ -108,7 +108,7 @@ p result</code></pre>
108
108
 
109
109
  <!-- bottom navigation -->
110
110
  <div class="navbar">
111
- <a href="12_commandexamples.html">Previous</a> | <a href="index.html">Up</a> | <a href="14_problemapps.html">Next</a>
111
+ <a href="12_commandexamples.html">Previous</a> | <a href="index.html">Up</a> | <a href="14_notes.html">Next</a>
112
112
 
113
113
  </div>
114
114
 
@@ -2,7 +2,7 @@
2
2
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3
3
  <head>
4
4
 
5
- <title>appscript | 15. Notes</title>
5
+ <title>appscript | 14. Notes</title>
6
6
 
7
7
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
8
8
  <style type="text/css" media="all"><!--@import url(full.css);--></style>
@@ -10,17 +10,23 @@
10
10
  </head>
11
11
  <body>
12
12
 
13
- <h1>15. Notes</h1>
13
+ <h1>14. Notes</h1>
14
14
 
15
15
  <!-- top navigation -->
16
16
  <div class="navbar">
17
- <a href="14_problemapps.html">Previous</a> | <a href="index.html">Up</a>
17
+ <a href="13_performanceissues.html">Previous</a> | <a href="index.html">Up</a>
18
18
 
19
19
  </div>
20
20
 
21
21
  <!-- content -->
22
22
  <div id="content">
23
- <h2>Security Issues</h2>
23
+
24
+ <h2>Dealing with problem applications</h2>
25
+
26
+ <p>Appscript provides a number of mechanisms for dealing with problematic applications. See the <a href="http://rb-appscript.rubyforge.org">appscript website</a> for more information.</p>
27
+
28
+
29
+ <h2>Security issues</h2>
24
30
 
25
31
  <p>If including user names and/or passwords in remote application URLs, please note that appscript retains these URLs in both the <code>Terminology</code> module's internal cache and in the Application and Reference objects subsequently created from those URLs. Security here is the user's responsibility, as it's their code that creates and retains these objects.</p>
26
32
 
@@ -49,32 +55,31 @@
49
55
 
50
56
  <p>Many thanks to Bill Birkett, Jordan Breeding, FUJIMOTO Hisakuni, Alexander Kellett, Chris Nebel, Matt Neuburg, Laurent Sansonetti and Michelle Steiner, and to all those who have contributed comments, suggestions and bug reports to py-appscript.</p>
51
57
 
58
+ <p>Thanks also to <a href="http://www.macosforge.org/">Mac OS Forge</a> and <a href="http://rubyforge.org/">RubyForge</a> for providing project hosting and support.</p>
59
+
52
60
 
53
61
  <h2>Donations</h2>
54
62
 
55
63
  <p>You can <a href="http://sourceforge.net/donate/index.php?group_id=175009">donate to the appscript project</a> via SourceForge.net. Special thanks to all those appscript users who have already contributed.</p>
56
64
 
57
65
 
58
- <h2>Copyright</h2>
59
-
60
- <p>(C) 2006 HAS -- hhas -at- users - sourceforge - net; <a href="http://rb-appscript.rubyforge.org">http://rb-appscript.rubyforge.org</a></p>
66
+ <h2>Website</h2>
61
67
 
62
- <p>Appscript is released under the <a href="License.txt">MIT License</a>.</p>
68
+ <p><a href="http://rb-appscript.rubyforge.org">http://rb-appscript.rubyforge.org</a></p>
63
69
 
64
70
 
65
- <h2>Useful Links</h2>
71
+ <h2>Copyright</h2>
66
72
 
67
- <ul>
68
- <li><a href="http://www.cs.utexas.edu/users/wcook/papers/AppleScript/AppleScript95.pdf">The Open Scripting Architecture: Automating, Integrating, and Customizing Applications</a> (Cook &amp; Harris, 1993) -- An excellent overview of the OSA infrastructure, which includes Apple event-based application scripting. (PDF)</li>
73
+ <p>(C) 2006 HAS -- hhas -at- users - sourceforge - net</p>
69
74
 
70
- </ul>
75
+ <p>Appscript is released under the MIT License.</p>
71
76
 
72
77
 
73
78
  </div>
74
79
 
75
80
  <!-- bottom navigation -->
76
81
  <div class="navbar">
77
- <a href="14_problemapps.html">Previous</a> | <a href="index.html">Up</a>
82
+ <a href="13_performanceissues.html">Previous</a> | <a href="index.html">Up</a>
78
83
 
79
84
  </div>
80
85
 
@@ -17,5 +17,4 @@ th {text-align:left; font-size:0.95em; color:#225; background-color:#ccd;}
17
17
  thead {background-color:#ccd;}
18
18
 
19
19
 
20
- h1+.navbar {margin-top:0;
21
- }
20
+ h1+.navbar {margin-top:0;}