From 9d139bf8132a8318afb7c4838cdef6c17f894d5c Mon Sep 17 00:00:00 2001 From: Edwin van der Graaf Date: Tue, 17 May 2016 12:14:13 +0200 Subject: [PATCH] Add 'inline-base' asset function for base64 inlining assets --- lib/roger_sassc/sassc/asset_functions.rb | 16 ++++++++++++++++ roger_sassc.gemspec | 1 + test/asset_functions_test.rb | 7 +++++++ .../inline_base_absolute_path.scss | 3 +++ 4 files changed, 27 insertions(+) create mode 100644 test/fixtures/asset_functions/inline_base_absolute_path.scss diff --git a/lib/roger_sassc/sassc/asset_functions.rb b/lib/roger_sassc/sassc/asset_functions.rb index 1c2903f..e37dc87 100644 --- a/lib/roger_sassc/sassc/asset_functions.rb +++ b/lib/roger_sassc/sassc/asset_functions.rb @@ -1,4 +1,6 @@ require "sassc" +require "base64" +require "mime/types" require "digest" module RogerSassc @@ -21,6 +23,20 @@ def asset_path(path) ::SassC::Script::String.new("url(#{finger_printed_path})", :identifier) end + def inline_base64(path) + file = find_file(path) + + if File.exist?(file) + encoded_file = Base64.encode64(File.open(file, "rb").read) + mime_type = MIME::Types.type_for(File.basename(file)).first + base64_string = "data:#{mime_type};base64,#{encoded_file}" + else + base64_string = path.value + end + + ::SassC::Script::String.new("url(\"#{base64_string}\")", :identifier) + end + private # Translate the given path to a path on disk diff --git a/roger_sassc.gemspec b/roger_sassc.gemspec index c536ff0..49f2dd5 100644 --- a/roger_sassc.gemspec +++ b/roger_sassc.gemspec @@ -19,6 +19,7 @@ Gem::Specification.new do |spec| spec.add_dependency "sassc", "~> 1.2.0" spec.add_dependency "roger", "~> 1.0" + spec.add_dependency "mime-types", ["~> 2.2"] spec.add_dependency "rack" spec.add_development_dependency "rake", "~> 10.0" diff --git a/test/asset_functions_test.rb b/test/asset_functions_test.rb index 94a3136..0868e43 100644 --- a/test/asset_functions_test.rb +++ b/test/asset_functions_test.rb @@ -48,6 +48,13 @@ def test_asset_path_fingerprinting_absolute_path # rubocop:enable LineLength end + def test_inline_base_absolute_path + scss_path = "test/fixtures/asset_functions/inline_base_absolute_path.scss" + engine = get_engine_for(scss_path) + + assert_match 'background-image: url("data:image/svg+xml;base64,', engine.render + end + private def get_engine_for(scss_path) diff --git a/test/fixtures/asset_functions/inline_base_absolute_path.scss b/test/fixtures/asset_functions/inline_base_absolute_path.scss new file mode 100644 index 0000000..e01000a --- /dev/null +++ b/test/fixtures/asset_functions/inline_base_absolute_path.scss @@ -0,0 +1,3 @@ +div { + background-image: inline-base64('/images/logo.svg'); +}