require 'sprockets/helpers/version' require 'sprockets' module Sprockets module Helpers autoload :AssetPath, 'sprockets/helpers/asset_path' autoload :FilePath, 'sprockets/helpers/file_path' autoload :ManifestPath, 'sprockets/helpers/manifest_path' # Pattern for checking if a given path is an external URI. URI_MATCH = %r(^[-a-z]+://|^cid:|^//) class << self # When true, the asset paths will return digest paths. attr_accessor :digest # Set the Sprockets environment to search for assets. # This defaults to the context's #environment method. attr_accessor :environment # The manifest file used for lookup attr_accessor :manifest # The base URL the Sprocket environment is mapped to. # This defaults to '/assets'. def prefix @prefix ||= '/assets' end attr_writer :prefix # The path to the public directory, where the assets # not managed by Sprockets will be located. # Defaults to './public' def public_path @public_path ||= './public' end attr_writer :public_path # Convience method for configuring Sprockets::Helpers. def configure yield self end end # Returns the path to an asset either in the Sprockets environment # or the public directory. External URIs are untouched. # # ==== Options # # * :ext - The extension to append if the source does not have one. # * :dir - The directory to prepend if the file is in the public directory. # * :digest - Wether or not use the digest paths for assets. Set Sprockets::Helpers.digest for global configuration. # * :prefix - Use a custom prefix for the Sprockets environment. Set Sprockets::Helpers.prefix for global configuration. # * :body - Adds a ?body=1 flag that tells Sprockets to return only the body of the asset. # # ==== Examples # # For files within Sprockets: # # asset_path 'xmlhr.js' # => '/assets/xmlhr.js' # asset_path 'xmlhr', :ext => 'js' # => '/assets/xmlhr.js' # asset_path 'xmlhr.js', :digest => true # => '/assets/xmlhr-27a8f1f96afd8d4c67a59eb9447f45bd.js' # asset_path 'xmlhr.js', :prefix => '/themes' # => '/themes/xmlhr.js' # # For files outside of Sprockets: # # asset_path 'xmlhr' # => '/xmlhr' # asset_path 'xmlhr', :ext => 'js' # => '/xmlhr.js' # asset_path 'dir/xmlhr.js', :dir => 'javascripts' # => '/javascripts/dir/xmlhr.js' # asset_path '/dir/xmlhr.js', :dir => 'javascripts' # => '/dir/xmlhr.js' # asset_path 'http://www.example.com/js/xmlhr' # => 'http://www.example.com/js/xmlhr' # asset_path 'http://www.example.com/js/xmlhr.js' # => 'http://www.example.com/js/xmlhr.js' # def asset_path(source, options = {}) return source if source =~ URI_MATCH # Append extension if necessary if options[:ext] && File.extname(source).empty? source << ".#{options[:ext]}" end # If a manifest is present, try to grab the path from the manifest first if Helpers.manifest && Helpers.manifest.assets[source] return ManifestPath.new(Helpers.manifest.assets[source], options).to_s end # If the source points to an asset in the Sprockets # environment use AssetPath to generate the full path. assets_environment.resolve(source) do |path| return AssetPath.new(assets_environment[path], options).to_s end # Use FilePath for normal files on the file system FilePath.new(source, options).to_s end alias_method :path_to_asset, :asset_path # Computes the path to a javascript asset either in the Sprockets # environment or the public directory. If the +source+ filename has no extension, # .js will be appended. External URIs are untouched. # # ==== Examples # # For files within Sprockets: # # javascript_path 'xmlhr' # => '/assets/xmlhr.js' # javascript_path 'dir/xmlhr.js' # => '/assets/dir/xmlhr.js' # javascript_path '/dir/xmlhr' # => '/assets/dir/xmlhr.js' # # For files outside of Sprockets: # # javascript_path 'xmlhr' # => '/javascripts/xmlhr.js' # javascript_path 'dir/xmlhr.js' # => '/javascripts/dir/xmlhr.js' # javascript_path '/dir/xmlhr' # => '/dir/xmlhr.js' # javascript_path 'http://www.example.com/js/xmlhr' # => 'http://www.example.com/js/xmlhr' # javascript_path 'http://www.example.com/js/xmlhr.js' # => 'http://www.example.com/js/xmlhr.js' # def javascript_path(source, options = {}) asset_path source, { :dir => 'javascripts', :ext => 'js' }.merge(options) end alias_method :path_to_javascript, :javascript_path # Computes the path to a stylesheet asset either in the Sprockets # environment or the public directory. If the +source+ filename has no extension, # .css will be appended. External URIs are untouched. # # ==== Examples # # For files within Sprockets: # # stylesheet_path 'style' # => '/assets/style.css' # stylesheet_path 'dir/style.css' # => '/assets/dir/style.css' # stylesheet_path '/dir/style.css' # => '/assets/dir/style.css' # # For files outside of Sprockets: # # stylesheet_path 'style' # => '/stylesheets/style.css' # stylesheet_path 'dir/style.css' # => '/stylesheets/dir/style.css' # stylesheet_path '/dir/style.css' # => '/dir/style.css' # stylesheet_path 'http://www.example.com/css/style' # => 'http://www.example.com/css/style' # stylesheet_path 'http://www.example.com/css/style.css' # => 'http://www.example.com/css/style.css' # def stylesheet_path(source, options = {}) asset_path source, { :dir => 'stylesheets', :ext => 'css' }.merge(options) end alias_method :path_to_stylesheet, :stylesheet_path # Computes the path to an image asset either in the Sprockets environment # or the public directory. External URIs are untouched. # # ==== Examples # # With files within Sprockets: # # image_path 'edit.png' # => '/assets/edit.png' # image_path 'icons/edit.png' # => '/assets/icons/edit.png' # image_path '/icons/edit.png' # => '/assets/icons/edit.png' # # With files outside of Sprockets: # # image_path 'edit' # => '/images/edit' # image_path 'edit.png' # => '/images/edit.png' # image_path 'icons/edit.png' # => '/images/icons/edit.png' # image_path '/icons/edit.png' # => '/icons/edit.png' # image_path 'http://www.example.com/img/edit.png' # => 'http://www.example.com/img/edit.png' # def image_path(source, options = {}) asset_path source, { :dir => 'images' }.merge(options) end alias_method :path_to_image, :image_path protected # Returns the Sprockets environment #asset_path uses to search for # assets. This can be overridden for more control, if necessary. # Defaults to Sprockets::Helpers.environment or the envrionment # returned by #environment. def assets_environment Helpers.environment || environment end end class Context include Helpers end end