diff --git a/doc-src/content/help/tutorials/extending.markdown b/doc-src/content/help/tutorials/extending.markdown index e07fe249ae..67366bc829 100644 --- a/doc-src/content/help/tutorials/extending.markdown +++ b/doc-src/content/help/tutorials/extending.markdown @@ -14,6 +14,8 @@ The sprite engine is the work horse of sprite generation it's the interface for ### Requirements +A sprite engine requires a constant be defined called `VALID_EXTENSIONS` that returns and array of valid image extensions ex. `['.png', '.jpg']` + A sprite engine requires two methods `construct_sprite`, and `save(filename)` Once inside the class you have access to `images` which is a collection of [Compass::SassExtensions::Sprites::Image](http://rdoc.info/github/chriseppstein/compass/dda7c9/Compass/SassExtensions/Sprites/Image) diff --git a/lib/compass/sass_extensions.rb b/lib/compass/sass_extensions.rb index 8649ee06ab..558de793bc 100644 --- a/lib/compass/sass_extensions.rb +++ b/lib/compass/sass_extensions.rb @@ -2,7 +2,9 @@ raise LoadError, "It looks like you've got an incompatible version of Sass. This often happens when you have an old haml gem installed. Please upgrade Haml to v3.1 or above." end -module Compass::SassExtensions +module Compass + module SassExtensions + end end require 'compass/sass_extensions/functions' diff --git a/lib/compass/sass_extensions/sprites.rb b/lib/compass/sass_extensions/sprites.rb index c48cf58705..44f46b69c0 100644 --- a/lib/compass/sass_extensions/sprites.rb +++ b/lib/compass/sass_extensions/sprites.rb @@ -1,6 +1,3 @@ -require 'digest/md5' -require 'compass/sprite_importer' - module Compass module SassExtensions module Sprites @@ -8,6 +5,7 @@ module Sprites end end +require 'digest/md5' require 'compass/sass_extensions/sprites/images' require 'compass/sass_extensions/sprites/layout' require 'compass/sass_extensions/sprites/image_row' @@ -18,4 +16,5 @@ module Sprites require 'compass/sass_extensions/sprites/image_methods' require 'compass/sass_extensions/sprites/sprite_map' require 'compass/sass_extensions/sprites/engines' +require 'compass/sprite_importer' diff --git a/lib/compass/sass_extensions/sprites/engines.rb b/lib/compass/sass_extensions/sprites/engines.rb index 978a68361c..38b01e9073 100644 --- a/lib/compass/sass_extensions/sprites/engines.rb +++ b/lib/compass/sass_extensions/sprites/engines.rb @@ -1,9 +1,10 @@ + module Compass module SassExtensions module Sprites class Engine attr_accessor :width, :height, :images, :canvas - def initialize(width, height, images) + def initialize(width=nil, height=nil, images=nil) @width, @height, @images = width, height, images @canvas = nil end @@ -21,5 +22,4 @@ def save(filename) end end - -require 'compass/sass_extensions/sprites/engines/chunky_png_engine' +require 'compass/sass_extensions/sprites/engines/chunky_png_engine' \ No newline at end of file diff --git a/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb b/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb index 9c494438e6..d4af6afbf6 100644 --- a/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb +++ b/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb @@ -9,6 +9,8 @@ module SassExtensions module Sprites class ChunkyPngEngine < Compass::SassExtensions::Sprites::Engine + VALID_EXTENSIONS = ['.png'] + def construct_sprite @canvas = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT) images.each do |image| diff --git a/lib/compass/sass_extensions/sprites/sprite_map.rb b/lib/compass/sass_extensions/sprites/sprite_map.rb index d6e97d74e8..b965161664 100644 --- a/lib/compass/sass_extensions/sprites/sprite_map.rb +++ b/lib/compass/sass_extensions/sprites/sprite_map.rb @@ -32,6 +32,10 @@ def self.relative_name(sprite) end end + def self.sprite_engine_class + constantize("Compass::SassExtensions::Sprites::#{self.modulize}Engine") + end + def initialize(sprites, path, name, context, kwargs) @image_names = sprites @path = path @@ -81,10 +85,23 @@ def method_missing(meth, *args, &block) private - def modulize + def self.modulize @modulize ||= Compass::configuration.sprite_engine.to_s.scan(/([^_.]+)/).flatten.map {|chunk| "#{chunk[0].chr.upcase}#{chunk[1..-1]}" }.join end + def self.constantize(camel_cased_word) + names = camel_cased_word.split('::') + names.shift if names.empty? || names.first.empty? + + constant = Object + names.each do |name| + constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name) + end + constant + end + + + end end end diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index a5295aee2a..03b26ef3a3 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -18,7 +18,7 @@ def compute_image_metadata! end def init_engine - @engine = eval("::Compass::SassExtensions::Sprites::#{modulize}Engine.new(nil, nil, nil)") + @engine = self.class.sprite_engine_class.new @engine.width = @width @engine.height = @height @engine.images = @images diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 66081b00be..79f5ff051e 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -1,10 +1,14 @@ require 'erb' +require 'compass' require 'compass/sprite_importer/binding' + + + + module Compass class SpriteImporter < Sass::Importers::Base VAILD_FILE_NAME = /\A#{Sass::SCSS::RX::IDENT}\Z/ - SPRITE_IMPORTER_REGEX = %r{((.+/)?([^\*.]+))/(.+?)\.png} - VALID_EXTENSIONS = ['.png'] + SPRITE_IMPORTER_REGEX = %r{((.+/)?([^\*.]+))/(.+?)} TEMPLATE_FOLDER = File.join(File.expand_path('../', __FILE__), 'sprite_importer') CONTENT_TEMPLATE_FILE = File.join(TEMPLATE_FOLDER, 'content.erb') @@ -15,7 +19,7 @@ class SpriteImporter < Sass::Importers::Base # finds all sprite files def self.find_all_sprite_map_files(path) hex = "[0-9a-f]" - glob = "*-s#{hex*10}{#{VALID_EXTENSIONS.join(",")}}" + glob = "*-s#{hex*10}{#{valid_extensions.join(",")}}" Sass::Util.glob(File.join(path, "**", glob)) end @@ -53,7 +57,7 @@ def key(uri, options={}) end def self.path_and_name(uri) - if uri =~ SPRITE_IMPORTER_REGEX + if uri =~ sprite_importer_regex_with_ext [$1, $3] else raise Compass::Error, "invalid sprite path" @@ -107,6 +111,16 @@ def self.content_for_images(uri, name, skip_overrides = false) binder = Compass::Sprites::Binding.new(:name => name, :uri => uri, :skip_overrides => skip_overrides, :sprite_names => sprite_names(uri), :files => files(uri)) CONTENT_TEMPLATE.result(binder.get_binding) end + + private + + def self.valid_extensions + @valid_extensions ||= SassExtensions::Sprites::SpriteMap.sprite_engine_class::VALID_EXTENSIONS + end + + def self.sprite_importer_regex_with_ext + @importer_regex ||= %r{#{SPRITE_IMPORTER_REGEX}(#{valid_extensions.join('|')})} + end end end