Skip to content

Commit

Permalink
Process css files so that they get digested paths for asset files (#476)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
jcoyne and dhh committed Nov 5, 2021
1 parent 118ce60 commit ccf8411
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 0 deletions.
15 changes: 15 additions & 0 deletions lib/sprockets/rails/asset_url_processor.rb
@@ -0,0 +1,15 @@
module Sprockets
module Rails
# Rewrites urls in CSS files with the digested paths
class AssetUrlProcessor
REGEX = /url\(\s*["']?(?!(?:\#|data|http))([^"'\s)]+)\s*["']?\)/

def self.call(input)
context = input[:environment].context_class.new(input)
data = input[:data].gsub(REGEX) { |_match| "url(#{context.asset_path($1)})" }

{ data: data }
end
end
end
end
6 changes: 6 additions & 0 deletions lib/sprockets/railtie.rb
Expand Up @@ -4,6 +4,8 @@
require 'active_support/core_ext/module/remove_method'
require 'active_support/core_ext/numeric/bytes'
require 'sprockets'

require 'sprockets/rails/asset_url_processor'
require 'sprockets/rails/context'
require 'sprockets/rails/helper'
require 'sprockets/rails/quiet_assets'
Expand Down Expand Up @@ -116,6 +118,10 @@ def configure(&block)
end
end

initializer :asset_url_processor do |app|
Sprockets.register_postprocessor "text/css", ::Sprockets::Rails::AssetUrlProcessor
end

config.assets.version = ""
config.assets.debug = false
config.assets.compile = true
Expand Down
39 changes: 39 additions & 0 deletions test/test_asset_url_processor.rb
@@ -0,0 +1,39 @@
require 'minitest/autorun'
require 'sprockets/railtie'


Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test)
class TestAssetUrlProcessor < Minitest::Test
def setup
@env = Sprockets::Environment.new
@env.context_class.class_eval do
def asset_path(path, options = {})
'image-hexcodegoeshere.png'
end
end
end

def test_basic
input = { environment: @env, data: 'background: url(image.png);', filename: 'url2.css', metadata: {} }
output = Sprockets::Rails::AssetUrlProcessor.call(input)
assert_equal({ data: "background: url(image-hexcodegoeshere.png);" }, output)
end

def test_spaces
input = { environment: @env, data: 'background: url( image.png );', filename: 'url2.css', metadata: {} }
output = Sprockets::Rails::AssetUrlProcessor.call(input)
assert_equal({ data: "background: url(image-hexcodegoeshere.png);" }, output)
end

def test_single_quote
input = { environment: @env, data: "background: url('image.png');", filename: 'url2.css', metadata: {} }
output = Sprockets::Rails::AssetUrlProcessor.call(input)
assert_equal({ data: "background: url(image-hexcodegoeshere.png);" }, output)
end

def test_double_quote
input = { environment: @env, data: 'background: url("image.png");', filename: 'url2.css', metadata: {} }
output = Sprockets::Rails::AssetUrlProcessor.call(input)
assert_equal({ data: "background: url(image-hexcodegoeshere.png);" }, output)
end
end

1 comment on commit ccf8411

@tvdeyen
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This broke relative URLs. See #478

Please sign in to comment.