mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
112 lines
3.5 KiB
Ruby
112 lines
3.5 KiB
Ruby
require "action_view/helpers"
|
|
|
|
module Sprockets
|
|
module Helpers
|
|
module RailsHelper
|
|
extend ActiveSupport::Concern
|
|
include ActionView::Helpers::AssetTagHelper
|
|
|
|
def asset_paths
|
|
@asset_paths ||= begin
|
|
config = self.config if respond_to?(:config)
|
|
controller = self.controller if respond_to?(:controller)
|
|
RailsHelper::AssetPaths.new(config, controller)
|
|
end
|
|
end
|
|
|
|
def javascript_include_tag(*sources)
|
|
options = sources.extract_options!
|
|
debug = options.key?(:debug) ? options.delete(:debug) : debug_assets?
|
|
body = options.key?(:body) ? options.delete(:body) : false
|
|
|
|
sources.collect do |source|
|
|
if debug && asset = asset_paths.asset_for(source, 'js')
|
|
asset.to_a.map { |dep|
|
|
javascript_include_tag(dep, :debug => false, :body => true)
|
|
}.join("\n").html_safe
|
|
else
|
|
tag_options = {
|
|
'type' => "text/javascript",
|
|
'src' => asset_path(source, 'js', body)
|
|
}.merge(options.stringify_keys)
|
|
|
|
content_tag 'script', "", tag_options
|
|
end
|
|
end.join("\n").html_safe
|
|
end
|
|
|
|
def stylesheet_link_tag(*sources)
|
|
options = sources.extract_options!
|
|
debug = options.key?(:debug) ? options.delete(:debug) : debug_assets?
|
|
body = options.key?(:body) ? options.delete(:body) : false
|
|
|
|
sources.collect do |source|
|
|
if debug && asset = asset_paths.asset_for(source, 'css')
|
|
asset.to_a.map { |dep|
|
|
stylesheet_link_tag(dep, :debug => false, :body => true)
|
|
}.join("\n").html_safe
|
|
else
|
|
tag_options = {
|
|
'rel' => "stylesheet",
|
|
'type' => "text/css",
|
|
'media' => "screen",
|
|
'href' => asset_path(source, 'css', body)
|
|
}.merge(options.stringify_keys)
|
|
|
|
tag 'link', tag_options
|
|
end
|
|
end.join("\n").html_safe
|
|
end
|
|
|
|
private
|
|
def debug_assets?
|
|
params[:debug_assets] == '1' ||
|
|
params[:debug_assets] == 'true'
|
|
end
|
|
|
|
def asset_path(source, default_ext = nil, body = false)
|
|
source = source.logical_path if source.respond_to?(:logical_path)
|
|
path = asset_paths.compute_public_path(source, Rails.application.config.assets.prefix, default_ext, true)
|
|
body ? "#{path}?body=1" : path
|
|
end
|
|
|
|
class AssetPaths < ::ActionView::AssetPaths #:nodoc:
|
|
def compute_public_path(source, dir, ext=nil, include_host=true)
|
|
super(source, Rails.application.config.assets.prefix, ext, include_host)
|
|
end
|
|
|
|
def asset_for(source, ext)
|
|
source = source.to_s
|
|
return nil if is_uri?(source)
|
|
source = rewrite_extension(source, nil, ext)
|
|
assets[source]
|
|
end
|
|
|
|
def rewrite_asset_path(source, dir)
|
|
if source[0] == ?/
|
|
source
|
|
else
|
|
assets.path(source, performing_caching?, dir)
|
|
end
|
|
end
|
|
|
|
def rewrite_extension(source, dir, ext)
|
|
if ext && File.extname(source).empty?
|
|
"#{source}.#{ext}"
|
|
else
|
|
source
|
|
end
|
|
end
|
|
|
|
def assets
|
|
Rails.application.assets
|
|
end
|
|
|
|
# When included in Sprockets::Context, we need to ask the top-level config as the controller is not available
|
|
def performing_caching?
|
|
@config ? @config.perform_caching : Rails.application.config.action_controller.perform_caching
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|