closure 1.3.1 → 1.4.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.
Files changed (67) hide show
  1. data/README.md +142 -9
  2. data/bin/closure-script +19 -0
  3. data/closure-compiler/README +18 -4
  4. data/closure-compiler/compiler.jar +0 -0
  5. data/closure-templates/SoyToJsSrcCompiler.jar +0 -0
  6. data/closure-templates/soydata.js +163 -0
  7. data/closure-templates/soyutils.js +1191 -159
  8. data/closure-templates/soyutils_usegoog.js +1107 -60
  9. data/docs/closure/Closure.html +58 -52
  10. data/docs/closure/Closure/BeanShell.html +6 -3
  11. data/docs/closure/Closure/Compiler.html +18 -15
  12. data/docs/closure/Closure/Compiler/Compilation.html +9 -3
  13. data/docs/closure/Closure/Compiler/Error.html +3 -3
  14. data/docs/closure/Closure/FileResponse.html +13 -7
  15. data/docs/closure/Closure/Goog.html +49 -85
  16. data/docs/closure/Closure/Middleware.html +5 -3
  17. data/docs/closure/Closure/Script.html +14 -5
  18. data/docs/closure/Closure/Script/NotFound.html +3 -3
  19. data/docs/closure/Closure/Script/RenderStackOverflow.html +3 -3
  20. data/docs/closure/Closure/Server.html +6 -3
  21. data/docs/closure/Closure/ShowExceptions.html +5 -3
  22. data/docs/closure/Closure/Sources.html +145 -37
  23. data/docs/closure/Closure/Templates.html +11 -10
  24. data/docs/closure/Closure/Templates/Error.html +3 -3
  25. data/docs/closure/_index.html +4 -4
  26. data/docs/closure/css/full_list.css +2 -0
  27. data/docs/closure/css/style.css +2 -0
  28. data/docs/closure/file.LICENSE.html +3 -3
  29. data/docs/closure/file.README.html +151 -10
  30. data/docs/closure/frames.html +1 -1
  31. data/docs/closure/index.html +151 -10
  32. data/docs/closure/js/full_list.js +23 -6
  33. data/docs/closure/method_list.html +91 -83
  34. data/docs/closure/top-level-namespace.html +3 -3
  35. data/lib/closure.rb +3 -16
  36. data/lib/closure/compiler.rb +135 -53
  37. data/lib/closure/goog.rb +5 -29
  38. data/lib/closure/sources.rb +22 -9
  39. data/lib/closure/version.rb +1 -1
  40. data/scripts/config.ru +0 -1
  41. data/scripts/hello/compiler_build.js +5 -5
  42. data/scripts/hello/compiler_build.map +518 -522
  43. data/scripts/hello/compiler_debug.js +7 -13
  44. data/scripts/hello/legume.js +2 -2
  45. data/scripts/index.erb +0 -3
  46. data/scripts/modules/compiler_build.js +3 -3
  47. data/scripts/modules/compiler_build.map +11569 -11476
  48. data/scripts/modules/compiler_build_api.js +1 -1
  49. data/scripts/modules/compiler_build_app.js +71 -70
  50. data/scripts/modules/compiler_build_settings.js +2 -2
  51. data/scripts/modules/compiler_debug.js +3 -3
  52. data/scripts/modules/compiler_debug_api.js +2 -2
  53. data/scripts/modules/compiler_debug_app.js +926 -1382
  54. data/scripts/modules/compiler_debug_settings.js +21 -24
  55. metadata +8 -18
  56. data/externs/chrome_extensions.externs +0 -968
  57. data/externs/jquery-1.3.2.externs +0 -718
  58. data/externs/jquery-1.4.3.externs +0 -1289
  59. data/externs/jquery-1.4.4.externs +0 -1302
  60. data/externs/jquery-1.5.externs +0 -1697
  61. data/externs/jquery-ui.externs +0 -10
  62. data/externs/jquery.externs +0 -4
  63. data/scripts/jquery/compiler.js.erb +0 -7
  64. data/scripts/jquery/compiler_out.js +0 -1
  65. data/scripts/jquery/index.erb +0 -25
  66. data/scripts/jquery/jquery_1.4.4.js +0 -167
  67. data/scripts/jquery/jquery_test.js +0 -8
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  Class: Closure::Templates
8
8
 
9
- &mdash; Documentation by YARD 0.7.2
9
+ &mdash; Documentation by YARD 0.7.3
10
10
 
11
11
  </title>
12
12
 
@@ -172,13 +172,13 @@ on source filename arguments.
172
172
 
173
173
  <h4><div class='inline'></div></h4>
174
174
  <pre class="example code"><span class='const'>Closure</span><span class='op'>::</span><span class='const'>Templates</span><span class='period'>.</span><span class='id compile'>compile</span> <span class='qwords_beg'>%w{
175
- </span><span class='qwords_beg'> </span><span class='tstring_content'>--shouldProvideRequireSoyNamespaces</span><span class='words_sep'>
176
- </span><span class='words_sep'> </span><span class='tstring_content'>--cssHandlingScheme</span><span class='words_sep'> </span><span class='tstring_content'>goog</span><span class='words_sep'>
177
- </span><span class='words_sep'> </span><span class='tstring_content'>--shouldGenerateJsdoc</span><span class='words_sep'>
178
- </span><span class='words_sep'> </span><span class='tstring_content'>--outputPathFormat</span><span class='words_sep'> </span><span class='tstring_content'>{INPUT_DIRECTORY}{INPUT_FILE_NAME_NO_EXT}.js</span><span class='words_sep'>
179
- </span><span class='words_sep'> </span><span class='tstring_content'>app/javascripts/**/*.soy</span><span class='words_sep'>
180
- </span><span class='words_sep'> </span><span class='tstring_content'>vendor/javascripts/**/*.soy</span><span class='words_sep'>
181
- </span><span class='words_sep'>}</span></pre>
175
+ </span><span class='tstring_content'> --shouldProvideRequireSoyNamespaces</span><span class='words_sep'>
176
+ </span><span class='tstring_content'> --cssHandlingScheme</span><span class='words_sep'> </span><span class='tstring_content'>goog</span><span class='words_sep'>
177
+ </span><span class='tstring_content'> --shouldGenerateJsdoc</span><span class='words_sep'>
178
+ </span><span class='tstring_content'> --outputPathFormat</span><span class='words_sep'> </span><span class='tstring_content'>{INPUT_DIRECTORY}{INPUT_FILE_NAME_NO_EXT}.js</span><span class='words_sep'>
179
+ </span><span class='tstring_content'> app/javascripts/**/*.soy</span><span class='words_sep'>
180
+ </span><span class='tstring_content'> vendor/javascripts/**/*.soy</span><span class='words_sep'>
181
+ </span><span class='tstring_end'>}</span></span></pre>
182
182
 
183
183
  </div>
184
184
  <h3>Parameters:</h3>
@@ -222,6 +222,7 @@ All source filenames will be expanded to this location.
222
222
 
223
223
  </ul>
224
224
 
225
+
225
226
  </div><table class="source_code">
226
227
  <tr>
227
228
  <td>
@@ -352,9 +353,9 @@ All source filenames will be expanded to this location.
352
353
  </div>
353
354
 
354
355
  <div id="footer">
355
- Generated on Tue Jul 5 15:45:36 2011 by
356
+ Generated on Sun Oct 23 22:43:17 2011 by
356
357
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
357
- 0.7.2 (ruby-1.9.2).
358
+ 0.7.3 (ruby-1.9.2).
358
359
  </div>
359
360
 
360
361
  </body>
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  Exception: Closure::Templates::Error
8
8
 
9
- &mdash; Documentation by YARD 0.7.2
9
+ &mdash; Documentation by YARD 0.7.3
10
10
 
11
11
  </title>
12
12
 
@@ -107,9 +107,9 @@
107
107
  </div>
108
108
 
109
109
  <div id="footer">
110
- Generated on Tue Jul 5 15:45:36 2011 by
110
+ Generated on Sun Oct 23 22:43:17 2011 by
111
111
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
112
- 0.7.2 (ruby-1.9.2).
112
+ 0.7.3 (ruby-1.9.2).
113
113
  </div>
114
114
 
115
115
  </body>
@@ -4,7 +4,7 @@
4
4
  <head>
5
5
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
6
  <title>
7
- Documentation by YARD 0.7.2
7
+ Documentation by YARD 0.7.3
8
8
 
9
9
  </title>
10
10
 
@@ -52,7 +52,7 @@
52
52
 
53
53
  <iframe id="search_frame"></iframe>
54
54
 
55
- <div id="content"><h1 class="noborder title">Documentation by YARD 0.7.2</h1>
55
+ <div id="content"><h1 class="noborder title">Documentation by YARD 0.7.3</h1>
56
56
  <div id="listing">
57
57
  <h1 class="alphaindex">Alphabetic Index</h1>
58
58
 
@@ -280,9 +280,9 @@
280
280
  </div>
281
281
 
282
282
  <div id="footer">
283
- Generated on Tue Jul 5 15:45:35 2011 by
283
+ Generated on Sun Oct 23 22:43:16 2011 by
284
284
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
285
- 0.7.2 (ruby-1.9.2).
285
+ 0.7.3 (ruby-1.9.2).
286
286
  </div>
287
287
 
288
288
  </body>
@@ -16,6 +16,8 @@ h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; }
16
16
  #noresults { padding: 7px 12px; }
17
17
  #content.insearch #noresults { margin-left: 7px; }
18
18
  ul.collapsed ul, ul.collapsed li { display: none; }
19
+ ul.collapsed.search_uncollapsed { display: block; }
20
+ ul.collapsed.search_uncollapsed li { display: list-item; }
19
21
  li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; }
20
22
  li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; }
21
23
  li { color: #888; cursor: pointer; }
@@ -24,6 +24,8 @@ h2 small { font-weight: normal; font-size: 0.7em; display: block; float: right;
24
24
  .docstring h2 { font-size: 1.1em; }
25
25
  .docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; }
26
26
  .summary_desc .object_link, .docstring .object_link { font-family: monospace; }
27
+ .rdoc-term { padding-right: 25px; font-weight: bold; }
28
+ .rdoc-list p { margin: 0; padding: 0; margin-bottom: 4px; }
27
29
 
28
30
  /* style for <ul> */
29
31
  #filecontents li > p, .docstring li > p { margin: 0px; }
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  File: LICENSE
8
8
 
9
- &mdash; Documentation by YARD 0.7.2
9
+ &mdash; Documentation by YARD 0.7.3
10
10
 
11
11
  </title>
12
12
 
@@ -257,9 +257,9 @@
257
257
  limitations under the License.</pre></div></div>
258
258
 
259
259
  <div id="footer">
260
- Generated on Tue Jul 5 15:45:35 2011 by
260
+ Generated on Sun Oct 23 22:43:16 2011 by
261
261
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
262
- 0.7.2 (ruby-1.9.2).
262
+ 0.7.3 (ruby-1.9.2).
263
263
  </div>
264
264
 
265
265
  </body>
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  File: README
8
8
 
9
- &mdash; Documentation by YARD 0.7.2
9
+ &mdash; Documentation by YARD 0.7.3
10
10
 
11
11
  </title>
12
12
 
@@ -54,25 +54,166 @@
54
54
 
55
55
  <iframe id="search_frame"></iframe>
56
56
 
57
- <div id="content"><div id='filecontents'><p>Google Closure Compiler, Library, Script, and Templates.</p>
57
+ <div id="content"><div id='filecontents'><h1 id="closure-script">Closure Script</h1>
58
+
59
+ <p>A development environment for Google Closure Tools.</p>
58
60
 
59
61
  <p>Licensed under the Apache License, Version 2.0 (the “License”);
60
62
  <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a></p>
61
63
 
62
- <p>Step 1: Download to a new folder:
63
- <a href="https://github.com/dturnbull/closure-script/downloads">https://github.com/dturnbull/closure-script/downloads</a></p>
64
+ <h1 id="installing">Installing</h1>
65
+
66
+ <p>Everything you need for advanced Google Closure development is available in a
67
+ single .jar for the Java Virtual Machine. You may also run the tools on any
68
+ Ruby platform (&gt;=1.8.6) including JRuby (JVM), Rubinius (LLVM), and Ruby 1.9 (YARV).</p>
69
+
70
+ <p>It is generally easier to get started with the .jar distribution, especially
71
+ under Windows. Mac OSX and most Linux will have a compatible Ruby by default.</p>
72
+
73
+ <h2 id="java-jar">Java (.jar)</h2>
74
+
75
+ <h3 id="step-1-download-to-a-new-folder">Step 1: Download to a new folder</h3>
76
+
77
+ <pre class="code">cd ~/empty-dir
78
+ curl -LO https://github.com/downloads/dturnbull/closure-script/closure-1.4.0.jar
79
+ </pre>
80
+
81
+ <h3 id="step-2-start-server-from-the-new-folder">Step 2: Start server from the new folder</h3>
82
+
83
+ <pre class="code">java -jar closure-1.4.0.jar
84
+ </pre>
85
+
86
+ <h3 id="step-3-open-a-web-browser">Step 3: Open a web browser</h3>
87
+
88
+ <pre class="code">http://localhost:8080/
89
+ </pre>
90
+
91
+ <h2 id="ruby-gem">Ruby (.gem)</h2>
92
+
93
+ <h3 id="step-1-install-the-gem">Step 1: Install the gem</h3>
94
+
95
+ <pre class="code"><span class='id gem'>gem</span> <span class='id install'>install</span> <span class='id closure'>closure</span>
96
+ </pre>
97
+
98
+ <h3 id="step-2-start-server-from-a-new-folder">Step 2: Start server from a new folder</h3>
99
+
100
+ <pre class="code"><span class='id cd'>cd</span> <span class='op'>~</span><span class='tstring'><span class='regexp_beg'>/</span><span class='regexp_end'>empty-dir
101
+ </span></span></pre>
102
+
103
+ <h3 id="step-3-open-a-web-browser-1">Step 3: Open a web browser</h3>
104
+
105
+ <pre class="code">http://localhost:8080/
106
+ </pre>
107
+
108
+ <h1 id="the-closure-script-method">The Closure Script Method</h1>
109
+
110
+ <p>When you start the server for the first time in an empty folder, the home page
111
+ will prompt you to install scaffolding. This includes three example projects to
112
+ demonstrate soy, modules, and unobtrusive markup. Dissecting and working with
113
+ these examples is the fast track to understanding The Closure Script Method.</p>
114
+
115
+ <h2 id="the-server">The Server</h2>
116
+
117
+ <p>Closure Script is a high-performance, multi-threaded web application engineered
118
+ exclusively for the needs of Google Closure Javascript development.</p>
119
+
120
+ <p>You will be freed from the command line. All error output from the compiler
121
+ will show on the Javascript console. This avoids lost time from not being
122
+ in the correct log and missing an important error. Javascript compilation
123
+ is done just-in-time and only when source files have changed.
124
+ No need for a separate build step; just refresh the browser. Not working?
125
+ Check your Javascript console. Then back to your editor.</p>
126
+
127
+ <h2 id="easy-configuration">Easy Configuration</h2>
128
+
129
+ <p>You’ll need to supply the directories where you have source Javascript and static files.
130
+ Ruby developers will recognize that Closure Script is Rack middleware. This makes it trivial
131
+ to include the Closure Script build tool in a Rails application. If you’re not developing a
132
+ Ruby application, your <code>config.ru</code> will probably never be more complex than the following:</p>
133
+
134
+ <pre class="code"><span class='id require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>closure</span><span class='tstring_end'>'</span></span>
135
+ <span class='const'>Closure</span><span class='period'>.</span><span class='id add_source'>add_source</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>.</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>/</span><span class='tstring_end'>'</span></span>
136
+ <span class='id use'>use</span> <span class='const'>Closure</span><span class='op'>::</span><span class='const'>Middleware</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>index</span><span class='tstring_end'>'</span></span>
137
+ <span class='id run'>run</span> <span class='const'>Rack</span><span class='op'>::</span><span class='const'>File</span><span class='period'>.</span><span class='id new'>new</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>.</span><span class='tstring_end'>'</span></span>
138
+ </pre>
139
+
140
+ <p>The add_source command may be duplicated for each source Javascript folder you want to
141
+ serve. The first argument is the local filesystem path, the second is the mount point
142
+ for the http server. Make sure not to accidentally serve more than one copy of
143
+ Closure Library per Closure Script server or you’ll get an error.</p>
144
+
145
+ <h2 id="cut-and-paste-ruby">Cut-and-Paste Ruby</h2>
146
+
147
+ <p>In practice, all you do with Ruby is adjust the arguments to compiler.jar by
148
+ analyzing options on the URL query string. If you can handle conditionally appending
149
+ strings to an array in Ruby, then you’re fully qualified to use Closure Script!
150
+ There’s enough example code in the scaffolding to cut-and-paste your way to victory.</p>
151
+
152
+ <h3 id="demo-scripts">Demo Scripts</h3>
153
+
154
+ <p>The Closure Script Method is to create various demo pages to drive development. You may
155
+ also choose to use your main application instead of Closure Script for your demo pages.</p>
156
+
157
+ <p>Files ending with .erb are Closure Scripts and will have their embedded Ruby evaluated
158
+ as they are served. Scripts may also render other Scripts and pass variables if you
159
+ need that complexity. Scripts default to a MIME type of text/html so <code>demo.erb</code> is
160
+ the same as <code>demo.html.erb</code>.</p>
161
+
162
+ <pre class="code">&lt;html&gt;
163
+ &lt;head&gt;
164
+ &lt;script src='compiler.js?&lt;%= query_string %&gt;'&gt;&lt;/script&gt;
165
+ &lt;/head&gt;
166
+ </pre>
167
+
168
+ <h3 id="compiler-scripts">Compiler Scripts</h3>
169
+
170
+ <p>Compilation is performed by requesting a file that generates Javascript instead of HTML.
171
+ The goog.compile() function of Closure Script handles everything for you.</p>
172
+
173
+ <p>Note that goog.compile() does not simply call the compiler. It will monitor your source
174
+ files and skip calling the compiler if everything is up to date. The Java process will
175
+ remain running on a REPL so subsequent compilations don’t pay the Java startup cost.
176
+ The dependency tree for all your sources is known so you can build from namespaces
177
+ (–ns) as well as files (–js). Modules have been automated to find common dependencies,
178
+ like plovr, and work from namespaces so you don’t need to use filenames and counts.
179
+ The luxurious goog.compile() can serve up a loader for the raw, uncompiled files,
180
+ even when working with modules.</p>
181
+
182
+ <p>A very simple compiler.js.erb is as follows. Check the scaffold for practical examples
183
+ that use the query string.</p>
184
+
185
+ <pre class="code">&lt;%
186
+ args = %w{
187
+ --compilation_level ADVANCED_OPTIMIZATIONS
188
+ --js_output_file compiler_build.js
189
+ --ns myapp.helloWorld
190
+ }
191
+ @response = goog.compile(args).to_response
192
+ %&gt;
193
+ </pre>
194
+
195
+ <h3 id="testing">Testing</h3>
196
+
197
+ <p>Closure Script helps with testing because it can see your data in ways that
198
+ browsers are not allowed to. The <code>alltests.js</code> file in Closure Library is
199
+ generated by a program that scans the filesystem. Here’s a replacement in
200
+ Closure Script so that a manual build step never has to be executed again:</p>
64
201
 
65
- <p>Step 2: Run from the new folder with Java:
66
- <code>java -jar closure.jar</code></p>
202
+ <pre class="code">&lt;% all_test_files = Dir.glob expand_path '**/*_test.html'
203
+ json_strings = all_test_files.map { |x| relative_src(x).dump }
204
+ -%&gt;var _allTests = [&lt;%= json_strings.join(',') %&gt;];
205
+ </pre>
67
206
 
68
- <p>Step 3: Open a web browser:
69
- <code>http://localhost:8080/</code></p>
207
+ <p>Since all of Ruby is at your disposal, you could even pull fixture data from SQL
208
+ or a web service. Perhaps a fixture refresh happens when the developer pushes a
209
+ form button. The svn.erb tool is a complex example that uses threads and a
210
+ background process. You’re only limited by your imagination.</p>
70
211
  </div></div>
71
212
 
72
213
  <div id="footer">
73
- Generated on Tue Jul 5 15:45:35 2011 by
214
+ Generated on Sun Oct 23 22:43:16 2011 by
74
215
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
75
- 0.7.2 (ruby-1.9.2).
216
+ 0.7.3 (ruby-1.9.2).
76
217
  </div>
77
218
 
78
219
  </body>
@@ -4,7 +4,7 @@
4
4
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
5
  <head>
6
6
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
- <title>Documentation by YARD 0.7.2</title>
7
+ <title>Documentation by YARD 0.7.3</title>
8
8
  </head>
9
9
  <frameset cols="20%,*">
10
10
  <frame name="list" src="class_list.html" />
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  File: README
8
8
 
9
- &mdash; Documentation by YARD 0.7.2
9
+ &mdash; Documentation by YARD 0.7.3
10
10
 
11
11
  </title>
12
12
 
@@ -54,25 +54,166 @@
54
54
 
55
55
  <iframe id="search_frame"></iframe>
56
56
 
57
- <div id="content"><div id='filecontents'><p>Google Closure Compiler, Library, Script, and Templates.</p>
57
+ <div id="content"><div id='filecontents'><h1 id="closure-script">Closure Script</h1>
58
+
59
+ <p>A development environment for Google Closure Tools.</p>
58
60
 
59
61
  <p>Licensed under the Apache License, Version 2.0 (the “License”);
60
62
  <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a></p>
61
63
 
62
- <p>Step 1: Download to a new folder:
63
- <a href="https://github.com/dturnbull/closure-script/downloads">https://github.com/dturnbull/closure-script/downloads</a></p>
64
+ <h1 id="installing">Installing</h1>
65
+
66
+ <p>Everything you need for advanced Google Closure development is available in a
67
+ single .jar for the Java Virtual Machine. You may also run the tools on any
68
+ Ruby platform (&gt;=1.8.6) including JRuby (JVM), Rubinius (LLVM), and Ruby 1.9 (YARV).</p>
69
+
70
+ <p>It is generally easier to get started with the .jar distribution, especially
71
+ under Windows. Mac OSX and most Linux will have a compatible Ruby by default.</p>
72
+
73
+ <h2 id="java-jar">Java (.jar)</h2>
74
+
75
+ <h3 id="step-1-download-to-a-new-folder">Step 1: Download to a new folder</h3>
76
+
77
+ <pre class="code">cd ~/empty-dir
78
+ curl -LO https://github.com/downloads/dturnbull/closure-script/closure-1.4.0.jar
79
+ </pre>
80
+
81
+ <h3 id="step-2-start-server-from-the-new-folder">Step 2: Start server from the new folder</h3>
82
+
83
+ <pre class="code">java -jar closure-1.4.0.jar
84
+ </pre>
85
+
86
+ <h3 id="step-3-open-a-web-browser">Step 3: Open a web browser</h3>
87
+
88
+ <pre class="code">http://localhost:8080/
89
+ </pre>
90
+
91
+ <h2 id="ruby-gem">Ruby (.gem)</h2>
92
+
93
+ <h3 id="step-1-install-the-gem">Step 1: Install the gem</h3>
94
+
95
+ <pre class="code"><span class='id gem'>gem</span> <span class='id install'>install</span> <span class='id closure'>closure</span>
96
+ </pre>
97
+
98
+ <h3 id="step-2-start-server-from-a-new-folder">Step 2: Start server from a new folder</h3>
99
+
100
+ <pre class="code"><span class='id cd'>cd</span> <span class='op'>~</span><span class='tstring'><span class='regexp_beg'>/</span><span class='regexp_end'>empty-dir
101
+ </span></span></pre>
102
+
103
+ <h3 id="step-3-open-a-web-browser-1">Step 3: Open a web browser</h3>
104
+
105
+ <pre class="code">http://localhost:8080/
106
+ </pre>
107
+
108
+ <h1 id="the-closure-script-method">The Closure Script Method</h1>
109
+
110
+ <p>When you start the server for the first time in an empty folder, the home page
111
+ will prompt you to install scaffolding. This includes three example projects to
112
+ demonstrate soy, modules, and unobtrusive markup. Dissecting and working with
113
+ these examples is the fast track to understanding The Closure Script Method.</p>
114
+
115
+ <h2 id="the-server">The Server</h2>
116
+
117
+ <p>Closure Script is a high-performance, multi-threaded web application engineered
118
+ exclusively for the needs of Google Closure Javascript development.</p>
119
+
120
+ <p>You will be freed from the command line. All error output from the compiler
121
+ will show on the Javascript console. This avoids lost time from not being
122
+ in the correct log and missing an important error. Javascript compilation
123
+ is done just-in-time and only when source files have changed.
124
+ No need for a separate build step; just refresh the browser. Not working?
125
+ Check your Javascript console. Then back to your editor.</p>
126
+
127
+ <h2 id="easy-configuration">Easy Configuration</h2>
128
+
129
+ <p>You’ll need to supply the directories where you have source Javascript and static files.
130
+ Ruby developers will recognize that Closure Script is Rack middleware. This makes it trivial
131
+ to include the Closure Script build tool in a Rails application. If you’re not developing a
132
+ Ruby application, your <code>config.ru</code> will probably never be more complex than the following:</p>
133
+
134
+ <pre class="code"><span class='id require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>closure</span><span class='tstring_end'>'</span></span>
135
+ <span class='const'>Closure</span><span class='period'>.</span><span class='id add_source'>add_source</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>.</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>/</span><span class='tstring_end'>'</span></span>
136
+ <span class='id use'>use</span> <span class='const'>Closure</span><span class='op'>::</span><span class='const'>Middleware</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>index</span><span class='tstring_end'>'</span></span>
137
+ <span class='id run'>run</span> <span class='const'>Rack</span><span class='op'>::</span><span class='const'>File</span><span class='period'>.</span><span class='id new'>new</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>.</span><span class='tstring_end'>'</span></span>
138
+ </pre>
139
+
140
+ <p>The add_source command may be duplicated for each source Javascript folder you want to
141
+ serve. The first argument is the local filesystem path, the second is the mount point
142
+ for the http server. Make sure not to accidentally serve more than one copy of
143
+ Closure Library per Closure Script server or you’ll get an error.</p>
144
+
145
+ <h2 id="cut-and-paste-ruby">Cut-and-Paste Ruby</h2>
146
+
147
+ <p>In practice, all you do with Ruby is adjust the arguments to compiler.jar by
148
+ analyzing options on the URL query string. If you can handle conditionally appending
149
+ strings to an array in Ruby, then you’re fully qualified to use Closure Script!
150
+ There’s enough example code in the scaffolding to cut-and-paste your way to victory.</p>
151
+
152
+ <h3 id="demo-scripts">Demo Scripts</h3>
153
+
154
+ <p>The Closure Script Method is to create various demo pages to drive development. You may
155
+ also choose to use your main application instead of Closure Script for your demo pages.</p>
156
+
157
+ <p>Files ending with .erb are Closure Scripts and will have their embedded Ruby evaluated
158
+ as they are served. Scripts may also render other Scripts and pass variables if you
159
+ need that complexity. Scripts default to a MIME type of text/html so <code>demo.erb</code> is
160
+ the same as <code>demo.html.erb</code>.</p>
161
+
162
+ <pre class="code">&lt;html&gt;
163
+ &lt;head&gt;
164
+ &lt;script src='compiler.js?&lt;%= query_string %&gt;'&gt;&lt;/script&gt;
165
+ &lt;/head&gt;
166
+ </pre>
167
+
168
+ <h3 id="compiler-scripts">Compiler Scripts</h3>
169
+
170
+ <p>Compilation is performed by requesting a file that generates Javascript instead of HTML.
171
+ The goog.compile() function of Closure Script handles everything for you.</p>
172
+
173
+ <p>Note that goog.compile() does not simply call the compiler. It will monitor your source
174
+ files and skip calling the compiler if everything is up to date. The Java process will
175
+ remain running on a REPL so subsequent compilations don’t pay the Java startup cost.
176
+ The dependency tree for all your sources is known so you can build from namespaces
177
+ (–ns) as well as files (–js). Modules have been automated to find common dependencies,
178
+ like plovr, and work from namespaces so you don’t need to use filenames and counts.
179
+ The luxurious goog.compile() can serve up a loader for the raw, uncompiled files,
180
+ even when working with modules.</p>
181
+
182
+ <p>A very simple compiler.js.erb is as follows. Check the scaffold for practical examples
183
+ that use the query string.</p>
184
+
185
+ <pre class="code">&lt;%
186
+ args = %w{
187
+ --compilation_level ADVANCED_OPTIMIZATIONS
188
+ --js_output_file compiler_build.js
189
+ --ns myapp.helloWorld
190
+ }
191
+ @response = goog.compile(args).to_response
192
+ %&gt;
193
+ </pre>
194
+
195
+ <h3 id="testing">Testing</h3>
196
+
197
+ <p>Closure Script helps with testing because it can see your data in ways that
198
+ browsers are not allowed to. The <code>alltests.js</code> file in Closure Library is
199
+ generated by a program that scans the filesystem. Here’s a replacement in
200
+ Closure Script so that a manual build step never has to be executed again:</p>
64
201
 
65
- <p>Step 2: Run from the new folder with Java:
66
- <code>java -jar closure.jar</code></p>
202
+ <pre class="code">&lt;% all_test_files = Dir.glob expand_path '**/*_test.html'
203
+ json_strings = all_test_files.map { |x| relative_src(x).dump }
204
+ -%&gt;var _allTests = [&lt;%= json_strings.join(',') %&gt;];
205
+ </pre>
67
206
 
68
- <p>Step 3: Open a web browser:
69
- <code>http://localhost:8080/</code></p>
207
+ <p>Since all of Ruby is at your disposal, you could even pull fixture data from SQL
208
+ or a web service. Perhaps a fixture refresh happens when the developer pushes a
209
+ form button. The svn.erb tool is a complex example that uses threads and a
210
+ background process. You’re only limited by your imagination.</p>
70
211
  </div></div>
71
212
 
72
213
  <div id="footer">
73
- Generated on Tue Jul 5 15:45:35 2011 by
214
+ Generated on Sun Oct 23 22:43:16 2011 by
74
215
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
75
- 0.7.2 (ruby-1.9.2).
216
+ 0.7.3 (ruby-1.9.2).
76
217
  </div>
77
218
 
78
219
  </body>