compass/lib/compass/sprite_importer.rb
2012-01-31 04:12:36 -05:00

117 lines
3.4 KiB
Ruby

require 'erb'
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']
TEMPLATE_FOLDER = File.join(File.expand_path('../', __FILE__), 'sprite_importer')
CONTENT_TEMPLATE_FILE = File.join(TEMPLATE_FOLDER, 'content.erb')
CONTENT_TEMPLATE = ERB.new(File.read(CONTENT_TEMPLATE_FILE))
# finds all sprite files
def self.find_all_sprite_map_files(path)
hex = "[0-9a-f]"
glob = "*-s#{hex*10}{#{VALID_EXTENSIONS.join(",")}}"
Dir.glob(File.join(path, "**", glob))
end
def find(uri, options)
if uri =~ SPRITE_IMPORTER_REGEX
return self.class.sass_engine(uri, self.class.sprite_name(uri), self, options)
end
nil
end
def find_relative(uri, base, options)
nil
end
def to_s
self.class.name
end
def hash
self.class.name.hash
end
def eql?(other)
other.class == self.class
end
def mtime(uri, options)
self.class.files(uri).sort.inject(Time.at(0)) do |max_time, file|
(t = File.mtime(file)) > max_time ? t : max_time
end
end
def key(uri, options={})
[self.class.name + ":sprite:" + File.dirname(File.expand_path(uri)), File.basename(uri)]
end
def self.path_and_name(uri)
if uri =~ SPRITE_IMPORTER_REGEX
[$1, $3]
else
raise Compass::Error, "invalid sprite path"
end
end
# Name of this spite
def self.sprite_name(uri)
_, name = path_and_name(uri)
name
end
# The on-disk location of this sprite
def self.path(uri)
path, _ = path_and_name(uri)
path
end
# Returns the Glob of image files for the uri
def self.files(uri)
Compass.configuration.sprite_load_path.compact.each do |folder|
files = Dir[File.join(folder, uri)].sort
next if files.empty?
return files
end
path = Compass.configuration.sprite_load_path.to_a.join(', ')
raise Compass::SpriteException, %Q{No files were found in the load path matching "#{uri}". Your current load paths are: #{path}}
end
# Returns an Array of image names without the file extension
def self.sprite_names(uri)
files(uri).collect do |file|
filename = File.basename(file, '.png')
unless VAILD_FILE_NAME =~ filename
raise Compass::Error, "Sprite file names must be legal css identifiers. Please rename #{File.basename(file)}"
end
filename
end
end
# Returns the sass_options for this sprite
def self.sass_options(uri, importer, options)
options.merge!(:filename => uri, :syntax => :scss, :importer => importer)
end
# Returns a Sass::Engine for this sprite object
def self.sass_engine(uri, name, importer, options)
content = content_for_images(uri, name, options[:skip_overrides])
Sass::Engine.new(content, sass_options(uri, importer, options))
end
# Generates the Sass for this sprite file
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
end
end