aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/helpers/asset_paths.rb
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2011-04-19 22:01:25 +0200
committerJosé Valim <jose.valim@gmail.com>2011-04-19 22:02:02 +0200
commit22fcef90b185199563719fc511346bf4c2f5bbff (patch)
tree1bddc3bc8f9f077b9c2e31c4fd56ec55fedca9d8 /actionpack/lib/action_view/helpers/asset_paths.rb
parente162e912c9f2b3ed5789a2d262c7962a67fb6b5d (diff)
downloadrails-22fcef90b185199563719fc511346bf4c2f5bbff.tar.gz
rails-22fcef90b185199563719fc511346bf4c2f5bbff.tar.bz2
rails-22fcef90b185199563719fc511346bf4c2f5bbff.zip
Actually add an abstract class, so it is easier to get rid of old asset paths in the future.
Diffstat (limited to 'actionpack/lib/action_view/helpers/asset_paths.rb')
-rw-r--r--actionpack/lib/action_view/helpers/asset_paths.rb80
1 files changed, 80 insertions, 0 deletions
diff --git a/actionpack/lib/action_view/helpers/asset_paths.rb b/actionpack/lib/action_view/helpers/asset_paths.rb
new file mode 100644
index 0000000000..55a4c442fd
--- /dev/null
+++ b/actionpack/lib/action_view/helpers/asset_paths.rb
@@ -0,0 +1,80 @@
+require 'active_support/core_ext/file'
+require 'action_view/helpers/asset_paths'
+
+module ActionView
+ module Helpers
+
+ class AssetPaths #:nodoc:
+ attr_reader :config, :controller
+
+ def initialize(config, controller)
+ @config = config
+ @controller = controller
+ end
+
+ # Add the extension +ext+ if not present. Return full URLs otherwise untouched.
+ # Prefix with <tt>/dir/</tt> if lacking a leading +/+. Account for relative URL
+ # roots. Rewrite the asset path for cache-busting asset ids. Include
+ # asset host, if configured, with the correct request protocol.
+ def compute_public_path(source, dir, ext = nil, include_host = true)
+ source = source.to_s
+ return source if is_uri?(source)
+
+ source = rewrite_extension(source, dir, ext) if ext
+ source = "/#{dir}/#{source}" unless source[0] == ?/
+ source = rewrite_asset_path(source, dir)
+
+ if controller && include_host
+ has_request = controller.respond_to?(:request)
+ source = rewrite_host_and_protocol(source, has_request)
+ end
+
+ source
+ end
+
+ def is_uri?(path)
+ path =~ %r{^[-a-z]+://|^cid:}
+ end
+
+ private
+
+ def rewrite_extension(source, dir, ext)
+ raise NotImplementedError
+ end
+
+ def rewrite_asset_path(source, path = nil)
+ raise NotImplementedError
+ end
+
+ def rewrite_host_and_protocol(source, has_request)
+ host = compute_asset_host(source)
+ if has_request && host && !is_uri?(host)
+ host = "#{controller.request.protocol}#{host}"
+ end
+ "#{host}#{source}"
+ end
+
+ # Pick an asset host for this source. Returns +nil+ if no host is set,
+ # the host if no wildcard is set, the host interpolated with the
+ # numbers 0-3 if it contains <tt>%d</tt> (the number is the source hash mod 4),
+ # or the value returned from invoking the proc if it's a proc or the value from
+ # invoking call if it's an object responding to call.
+ def compute_asset_host(source)
+ if host = config.asset_host
+ if host.is_a?(Proc) || host.respond_to?(:call)
+ case host.is_a?(Proc) ? host.arity : host.method(:call).arity
+ when 2
+ request = controller.respond_to?(:request) && controller.request
+ host.call(source, request)
+ else
+ host.call(source)
+ end
+ else
+ (host =~ /%d/) ? host % (source.hash % 4) : host
+ end
+ end
+ end
+ end
+
+ end
+end \ No newline at end of file