Skip to content

Commit ccf8411

Browse files
jcoynedhh
andauthored
Process css files so that they get digested paths for asset files (#476)
* Process css files so that they get digested paths for asset files This is required so that we can use cssbundling-rails and reference images that will receive digested paths * Style * $1 is calculated before calling #gsub Co-authored-by: David Heinemeier Hansson <david@basecamp.com>
1 parent 118ce60 commit ccf8411

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module Sprockets
2+
module Rails
3+
# Rewrites urls in CSS files with the digested paths
4+
class AssetUrlProcessor
5+
REGEX = /url\(\s*["']?(?!(?:\#|data|http))([^"'\s)]+)\s*["']?\)/
6+
7+
def self.call(input)
8+
context = input[:environment].context_class.new(input)
9+
data = input[:data].gsub(REGEX) { |_match| "url(#{context.asset_path($1)})" }
10+
11+
{ data: data }
12+
end
13+
end
14+
end
15+
end

lib/sprockets/railtie.rb

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
require 'active_support/core_ext/module/remove_method'
55
require 'active_support/core_ext/numeric/bytes'
66
require 'sprockets'
7+
8+
require 'sprockets/rails/asset_url_processor'
79
require 'sprockets/rails/context'
810
require 'sprockets/rails/helper'
911
require 'sprockets/rails/quiet_assets'
@@ -116,6 +118,10 @@ def configure(&block)
116118
end
117119
end
118120

121+
initializer :asset_url_processor do |app|
122+
Sprockets.register_postprocessor "text/css", ::Sprockets::Rails::AssetUrlProcessor
123+
end
124+
119125
config.assets.version = ""
120126
config.assets.debug = false
121127
config.assets.compile = true

test/test_asset_url_processor.rb

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
require 'minitest/autorun'
2+
require 'sprockets/railtie'
3+
4+
5+
Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test)
6+
class TestAssetUrlProcessor < Minitest::Test
7+
def setup
8+
@env = Sprockets::Environment.new
9+
@env.context_class.class_eval do
10+
def asset_path(path, options = {})
11+
'image-hexcodegoeshere.png'
12+
end
13+
end
14+
end
15+
16+
def test_basic
17+
input = { environment: @env, data: 'background: url(image.png);', filename: 'url2.css', metadata: {} }
18+
output = Sprockets::Rails::AssetUrlProcessor.call(input)
19+
assert_equal({ data: "background: url(image-hexcodegoeshere.png);" }, output)
20+
end
21+
22+
def test_spaces
23+
input = { environment: @env, data: 'background: url( image.png );', filename: 'url2.css', metadata: {} }
24+
output = Sprockets::Rails::AssetUrlProcessor.call(input)
25+
assert_equal({ data: "background: url(image-hexcodegoeshere.png);" }, output)
26+
end
27+
28+
def test_single_quote
29+
input = { environment: @env, data: "background: url('image.png');", filename: 'url2.css', metadata: {} }
30+
output = Sprockets::Rails::AssetUrlProcessor.call(input)
31+
assert_equal({ data: "background: url(image-hexcodegoeshere.png);" }, output)
32+
end
33+
34+
def test_double_quote
35+
input = { environment: @env, data: 'background: url("image.png");', filename: 'url2.css', metadata: {} }
36+
output = Sprockets::Rails::AssetUrlProcessor.call(input)
37+
assert_equal({ data: "background: url(image-hexcodegoeshere.png);" }, output)
38+
end
39+
end

0 commit comments

Comments
 (0)