Class: Closure::Goog
- Inherits:
-
Object
- Object
- Closure::Goog
- Includes:
- Enumerable
- Defined in:
- lib/closure/goog.rb
Overview
Scripts render with an instance named goog in the context.
Instance Method Summary (collapse)
-
- add_dependency(dependency, root = nil)
You can add additional files to have their mtimes scanned.
-
- (String) base_js
The Google Closure base.js script.
-
- (Compilation) compile(args, root = nil)
Compile javascript.
-
- (String) deps_js
This is where base.js looks to find deps.js by default.
-
- (Rack::Response) deps_response
You can serve a deps.js from anywhere you want to drop a script.
-
- each
Advanced Scripts may need to know where all the sources are.
-
- (Array) files_for(namespace, filenames = nil)
Calculate files needed to satisfy a namespace.
-
- (Goog) initialize(env, sources, render_stack)
constructor
A new instance of Goog.
-
- path=(p)
Specify an explicit host or path for loading scripts.
-
- refresh
If your Script changes any javascript sources then call this.
-
- soy_to_js(args, root = nil)
Convert soy templates to javascript.
-
- (String) src_for(filename)
Calculate the deps src for a filename.
Constructor Details
- (Goog) initialize(env, sources, render_stack)
Returns a new instance of Goog
22 23 24 25 26 27 28 |
# File 'lib/closure/goog.rb', line 22 def initialize(env, sources, render_stack) @sources = sources @env = env @render_stack = render_stack @dependencies = [] @path = '' end |
Instance Method Details
- add_dependency(dependency, root = nil)
You can add additional files to have their mtimes scanned. Perhaps you want to use a .yml file to define build options. Closure::Script calls this for every render so you don't need to define compiler arguments in the same script that calls compile.
47 48 49 50 51 |
# File 'lib/closure/goog.rb', line 47 def add_dependency(dependency, root = nil) root ||= File.dirname(@render_stack.last) dependency = File. dependency, root @dependencies << dependency unless @dependencies.include? dependency end |
- (String) base_js
The Google Closure base.js script. If you use this instead of a static link, you are free to relocate relative to the Google Closure library without updating every html fixture page.
174 175 176 |
# File 'lib/closure/goog.rb', line 174 def base_js @sources.base_js(@env) end |
- (Compilation) compile(args, root = nil)
Compile javascript. Accepts every argument that compiler.jar supports. This method supports all compiler augmentations added by Closure Script. Path options are expanded relative to the script calling #compile.
-
`–ns namespace` expands in place to `–js filename` arguments which satisfy the namespace.
-
`–module name:*:dep` File count will be filled in automatically. The * is replaced with the count of files up to next –module or the end.
-
`–js_output_file file` is compared against sources modification times to determine if compilation is to be performed.
-
`–compilation_level` when not supplied, the scripts are loaded raw.
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/closure/goog.rb', line 88 def compile(args, root = nil) args = Array.new args # work on a copy root ||= File.dirname(@render_stack.last) Compiler::Util. args, root mods = Compiler::Util.augment args, @sources, @env if Compiler::Util.arg_values(args, '--compilation_level').empty? # Raw mode comp = Compiler::Compilation.new @env if mods comp << Compiler::Util.module_path(@path) comp << Compiler::Util.module_info(mods) comp << Compiler::Util.module_uris_raw(mods, @sources) end js_counter = 0 args_index = 0 while args_index < args.length option, value = args[args_index, 2] if option == '--js' value = File.(value, root) script_tag = "<script src=#{(@path+src_for(value)).dump}></script>" comp << "document.write(#{script_tag.dump});\n" js_counter += 1 # For modules, just the files for the first module break if mods and js_counter >= mods[0][:files].length end args_index = args_index + 2 end else # Compiled mode module_output_path_prefix = Compiler::Util.arg_values(args, '--module_output_path_prefix').last if mods and !module_output_path_prefix # raise this before compilation so we don't write to a weird place raise "--module_output_path_prefix is required when using --module" end comp = Compiler.compile args, @dependencies, @env if mods refresh # compilation may add new files, module_uris_compiled uses src_for prefix = File. module_output_path_prefix, root if comp.js_output_file File.open comp.js_output_file, 'w' do |f| f.write Compiler::Util.module_path @path f.write Compiler::Util.module_info mods f.write Compiler::Util.module_uris_compiled mods, @sources, prefix end else comp << Compiler::Util.module_path(@path) comp << Compiler::Util.module_info(mods) comp << Compiler::Util.module_uris_compiled(mods, @sources, prefix) end # Load the first module first_module_file = module_output_path_prefix + mods[0][:name] + '.js' first_module_file = File. first_module_file, root comp << '(function(){var e=document.createElement("script");e.type="text/javascript";e.src=' comp << (@path + src_for(first_module_file)).dump comp << ";document.body.appendChild(e);})();\n" end end comp end |
- (String) deps_js
This is where base.js looks to find deps.js by default. You will always be served a Closure Script generated deps.js from this location. Very old Library versions may get confused by the forward caching query string; either update your base.js, install a deps_response Script where it's looking, or manually set CLOSURE_BASE_PATH.
184 185 186 |
# File 'lib/closure/goog.rb', line 184 def deps_js @sources.deps_js(@env) end |
- (Rack::Response) deps_response
You can serve a deps.js from anywhere you want to drop a script.
192 193 194 |
# File 'lib/closure/goog.rb', line 192 def deps_response @sources.deps_response(File.dirname(Rack::Utils.unescape(@env["PATH_INFO"])), @env) end |
- each
Advanced Scripts may need to know where all the sources are. This has potential for a source browser, editor, and more.
200 201 202 203 204 |
# File 'lib/closure/goog.rb', line 200 def each @sources.each do |directory, path| yield directory, path end end |
- (Array) files_for(namespace, filenames = nil)
Calculate files needed to satisfy a namespace. This will be especially useful for module generation. If you pass the filenames returned from last run, additional files (if any) will be appended to satisfy the new namespace.
164 165 166 |
# File 'lib/closure/goog.rb', line 164 def files_for(namespace, filenames=nil) @sources.files_for(namespace, filenames, @env) end |
- path=(p)
Specify an explicit host or path for loading scripts. e.g. '//example.com' or '/proxy/path' You may also include a protocol and path if necessary. e.g. 'example.com:8080/proxy/path' attr_reader :path
35 36 37 38 39 40 |
# File 'lib/closure/goog.rb', line 35 def path= p @path = p if p.start_with?('/') @path = p if p.start_with?('http://') @path = p if p.start_with?('https://') raise 'goog.path not valid' unless @path == p end |
- refresh
If your Script changes any javascript sources then call this. This is a lazy refresh, you may call it repeatedly.
55 56 57 |
# File 'lib/closure/goog.rb', line 55 def refresh @sources.invalidate @env end |
- soy_to_js(args, root = nil)
Convert soy templates to javascript. Accepts all arguments that SoyToJsSrcCompiler.jar support plus it expands filename globs. All source filenames are relative to the script calling #soy_to_js.
64 65 66 67 68 |
# File 'lib/closure/goog.rb', line 64 def soy_to_js(args, root = nil) root ||= File.dirname(@render_stack.last) Templates::compile(args, root) refresh end |
- (String) src_for(filename)
Calculate the deps src for a filename.
151 152 153 154 |
# File 'lib/closure/goog.rb', line 151 def src_for(filename) filename = File. filename @sources.src_for(filename, @env) end |