diff options
| author | José Valim <jose.valim@gmail.com> | 2011-04-19 22:01:25 +0200 | 
|---|---|---|
| committer | José Valim <jose.valim@gmail.com> | 2011-04-19 22:02:02 +0200 | 
| commit | 22fcef90b185199563719fc511346bf4c2f5bbff (patch) | |
| tree | 1bddc3bc8f9f077b9c2e31c4fd56ec55fedca9d8 /actionpack/lib/action_view/helpers/asset_paths.rb | |
| parent | e162e912c9f2b3ed5789a2d262c7962a67fb6b5d (diff) | |
| download | rails-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.rb | 80 | 
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  | 
