2012-04-25 26 views
9

Sass ve pusula kullanıyorum ve belirli bir desene uyan görüntüler için css sınıfları oluşturmaya çalışıyorum. amaçlanan/Elde css çoğunlukla şuna benzer:Sass/pusula içindeki dosyaların bir listesini alma

.class1 { background-image: url(class1.png); } 
.class2 { background-image: url(class2.png); } 

o (yeni dosyalar oluşturur gibi) görüntülerdir olarak benim durumumda zahmetlidir pusula sprite işlevselliği (http://compass-style.org/help/tutorials/spriting/) kullanmak mümkün olsa da zaten kendilerini sprite ediyor.

Yani iyi olurdu

@each $clazz in listFiles("images/*") { 
    .#{$clazz} { 
    background-image: url('#{$clazz}.png'); 
    } 
} 

böyle bir şey yapmak mümkün. Bunu yapmak için aşağı yukarı kolay bir yol var mı?

cevap

21

Bunu, yerleşik SASS/Pusula işlevlerini kendi özel Ruby işlevinizle tamamlayarak gerçekleştirebilirsiniz. (SUKDÖ'nün referans here "Özel Fonksiyonlar ekleme" başlıklı bölüme bakın.) Sadece bir Ruby dosyası define (diyelim "liste files.rb") özel kod ile şöyle:

Sonra
module Sass::Script::Functions 
    def listFiles(path) 
     return Sass::Script::List.new(
      Dir.glob(path.value).map! { |x| Sass::Script::String.new(x) }, 
      :comma 
     ) 
    end 
end 

, Eğer bu pusula yapılandırma dosyasından dosya (diyelim ki, "config.rb") içerebilir: yalnızca istediğiniz gibi SUKDÖ'nün stil

require File.join(File.dirname(__FILE__), 'list-files.rb') 

Ve erişimi o kadar:

@each $clazz in listFiles("images/*") { 
    .#{$clazz} { 
    background-image: url('#{$clazz}.png'); 
    } 
} 

Daha sonra compass compile -c config.rb'u kullanarak normal olarak derleyebilirsiniz.

+0

Bu, benim için tüm dosya yollarının bir listesini yapar (örn. Images/filename1.png). Ruby newbies için sadece basename almak için basit bir yolu var mı? – morewry

+5

@morewry Elbette, sadece Ruby's [File.basename] (http://www.ruby-doc.org/core/File.html#method-c-basename) yöntemini kullanın: Sass :: Script :: String.new (File.basename (x)) '. – hopper

+2

Ayrıca, Sass :: Script :: String.new (File.basename (x, ". *")) 'I, uzantılama olmadan sadece dosya adını almak için de kullanabilirsiniz. –

İlgili konular