From 21faf54420eee4199c3c490bed2fe65d09f4a98d Mon Sep 17 00:00:00 2001 From: Justin Coyne Date: Mon, 18 Oct 2021 10:48:33 -0500 Subject: [PATCH 1/3] 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 --- lib/sprockets/rails/asset_url_processor.rb | 16 +++++++++ lib/sprockets/railtie.rb | 6 ++++ test/test_asset_url_processor.rb | 39 ++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 lib/sprockets/rails/asset_url_processor.rb create mode 100644 test/test_asset_url_processor.rb diff --git a/lib/sprockets/rails/asset_url_processor.rb b/lib/sprockets/rails/asset_url_processor.rb new file mode 100644 index 00000000..dbc92328 --- /dev/null +++ b/lib/sprockets/rails/asset_url_processor.rb @@ -0,0 +1,16 @@ +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) do |_match| + "url(#{context.asset_path($1)})" + end + { data: data } + end + end + end +end diff --git a/lib/sprockets/railtie.rb b/lib/sprockets/railtie.rb index da5275ad..d7434523 100644 --- a/lib/sprockets/railtie.rb +++ b/lib/sprockets/railtie.rb @@ -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' @@ -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 diff --git a/test/test_asset_url_processor.rb b/test/test_asset_url_processor.rb new file mode 100644 index 00000000..75ae5610 --- /dev/null +++ b/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 From 408aae2f7183503cc3048b067d49deaa8719b6bb Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 18 Oct 2021 20:38:33 +0200 Subject: [PATCH 2/3] Style --- lib/sprockets/rails/asset_url_processor.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/sprockets/rails/asset_url_processor.rb b/lib/sprockets/rails/asset_url_processor.rb index dbc92328..e41fb5da 100644 --- a/lib/sprockets/rails/asset_url_processor.rb +++ b/lib/sprockets/rails/asset_url_processor.rb @@ -6,9 +6,8 @@ class AssetUrlProcessor def self.call(input) context = input[:environment].context_class.new(input) - data = input[:data].gsub(REGEX) do |_match| - "url(#{context.asset_path($1)})" - end + data = input[:data].gsub(REGEX, "url(#{context.asset_path($1)})") + { data: data } end end From 3d2e98268f3490dc7be3616267a8e577baadc180 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 5 Nov 2021 17:55:24 +0100 Subject: [PATCH 3/3] $1 is calculated before calling #gsub --- lib/sprockets/rails/asset_url_processor.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sprockets/rails/asset_url_processor.rb b/lib/sprockets/rails/asset_url_processor.rb index e41fb5da..c55f4166 100644 --- a/lib/sprockets/rails/asset_url_processor.rb +++ b/lib/sprockets/rails/asset_url_processor.rb @@ -6,7 +6,7 @@ class AssetUrlProcessor def self.call(input) context = input[:environment].context_class.new(input) - data = input[:data].gsub(REGEX, "url(#{context.asset_path($1)})") + data = input[:data].gsub(REGEX) { |_match| "url(#{context.asset_path($1)})" } { data: data } end