1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
# frozen_string_literal: true
module Roadie
module Rails
class AssetPipelineProvider
include Roadie::AssetProvider
attr_reader :pipeline
def initialize(pipeline)
unless pipeline
raise(
ArgumentError,
"You need to pass a pipeline to initialize AssetPipelineProvider"
)
end
super()
@pipeline = pipeline
end
def find_stylesheet(name)
if (asset = find_asset_in_pipeline(name))
Stylesheet.new("#{filename(asset)} (live compiled)", asset.to_s)
end
end
private
def filename(asset)
if asset.respond_to?(:filename) # sprockets 4 or later
asset.filename
else
asset.pathname
end
end
def find_asset_in_pipeline(name)
normalized_name = normalize_asset_name(name)
@pipeline[normalized_name] ||
@pipeline[remove_asset_digest(normalized_name)]
end
def normalize_asset_name(href)
remove_asset_prefix(href.split("?").first)
end
DIGEST_PATTERN = /
- # Digest comes after a dash
(?:
[a-z0-9]{32} | # Old style is 32 character hash
[a-z0-9]{64} # New style is 64 characters
)
\. # Dot for the file extension
/x
private_constant :DIGEST_PATTERN
def remove_asset_digest(path)
path.gsub(DIGEST_PATTERN, ".")
end
def remove_asset_prefix(path)
path.sub(Regexp.new("^#{Regexp.quote(asset_prefix)}/?"), "")
end
def asset_prefix
::Rails.application.try(:config).try(:assets).try(:prefix) || "/assets"
end
end
end
end
|