Ruby Language

Ruby ve Dosya İşlemleri

Bu yazımızda ruby dilinde dizin, dosya işlemlerine hızlı bir giriş yapacağız. Örnek bir olay olması açısından bir icon seti için .css dosyası hazırlamayı göstereceğim. Böylelikle hem basit bir ruby programımız olacak hem de ruby dilinde dosya ve dizin işlemlerini öğreneceğiz. İlk önce kodumuz görelim Satır satır anlatırsak. Yukarıda ki satır konsolda “Hi, program is starting” […]

Bu yazımızda ruby dilinde dizin, dosya işlemlerine hızlı bir giriş yapacağız. Örnek bir olay olması açısından bir icon seti için .css dosyası hazırlamayı göstereceğim. Böylelikle hem basit bir ruby programımız olacak hem de ruby dilinde dosya ve dizin işlemlerini öğreneceğiz.

İlk önce kodumuz görelim

puts "Hi, program is starting"

Dir['*/'].each do |directory|
   
    css_file_name = 'icons-' + directory.chop + '.css'
    
    puts 'lets create ' + css_file_name + ' files.'

    File.open(css_file_name, 'w') do |css_file| 
        Dir.chdir(directory)
        Dir.glob("*.png").each do |icon|
            pixel = directory.chop == '16' ? '' : '-' + directory.chop
            css_file.puts '.icon-'+ icon.chomp('.png') + pixel +' {'
            css_file.puts "    background : url('" + directory + icon + "')"
            css_file.puts '}'
            css_file.puts ''

        end # endof Dir.glob
        Dir.chdir('..')
    end # endof File.open
end

puts "Program finished. Bye"

Satır satır anlatırsak.

puts "Hi, program is starting"

Yukarıda ki satır konsolda “Hi, program is starting” yazısını yazar. puts methodu methodun sonuna \n yeni satır ifadesini ekler. Print ile en belirgin farkı budur. Bir çok dilde println ye denk gelir.

Dir['*/'].each do |directory|
   
    css_file_name = 'icons-' + directory.chop + '.css'
    
    puts 'lets create ' + css_file_name + ' files.'

    File.open(css_file_name, 'w') do |css_file| 
        Dir.chdir(directory)
        Dir.glob("*.png").each do |icon|
            pixel = directory.chop == '16' ? '' : '-' + directory.chop
            css_file.puts '.icon-'+ icon.chomp('.png') + pixel +' {'
            css_file.puts "    background : url('" + directory + icon + "')"
            css_file.puts '}'
            css_file.puts ''

        end # endof Dir.glob
        Dir.chdir('..')
    end # endof File.open
end

3. satırda başlayan ve 21. satırda biten blog mevcut kodun çalıştırıldığı dizinin altındaki dizinleri listeler ve bu blokta directory diye bir değişkene atar. Burada Dir[‘*/’] alt dizinleri bir array olarak alır. .each do |directory| ise bu blok için array’in elemanlarına directory değişkeni ile erişmeyi sağlar.

css_file_name = 'icons-' + directory.chop + '.css'
puts 'lets create ' + css_file_name + ' files.'

5. satırda yaratılacak dosyaların isimleri atanıyor. Burada directory 16/ veya 32/ gibi olduğundan son karakteri atmak içinde .chop methodu kullanıyor. Şöyle düşünebilirsiniz
’32/’.chop == ’32’ veya ’16/’.chop == ’16’ dir. Sonuna .css ekliyoruz. Yani /16 ve /32 olan dizinler için icons-16.css ve icons-32.css gibi iki adet dosya ismi değişkeni oluşturuyoruz.

6. satırda bunları kullanıcıya beyan ediyoruz.

    File.open(css_file_name, 'w') do |css_file| 
        Dir.chdir(directory)
        Dir.glob("*.png").each do |icon|
            pixel = directory.chop == '16' ? '' : '-' + directory.chop
            css_file.puts '.icon-'+ icon.chomp('.png') + pixel +' {'
            css_file.puts "    background : url('" + directory + icon + "')"
            css_file.puts '}'
            css_file.puts ''

        end # endof Dir.glob
        Dir.chdir('..')
    end # endof File.open

9. satırda başlayan ve 20 satırda biten blok iki adet yeni dosya yaratır. Bu işlemi File.open komutu yapar. Birinci parametre dosya ismi yani css_file_name ikinci parametre ne için dosyanın oluşturulduğudur. w değişkeni burada dosyayı yazmak için oluşturduğumuzu beyan eder. Bunun anlamı kodu her çalıştırdığımızda dosyanın içeriği silenecekdir. Yani yeniden oluşturmak için eski verileri silmektedir. |css_file| ise File.open ile oluşturulan dosyadır.

10. satırda Dir.chdir(directory) ile çalışılan dizin directory değişkeni ile aynı yapırlır. Yani birinci döngü için /16 dizinine girilir, ikinci döngü için /32’inci dizine gilirir.

11. satırda Dir.glob(“*.png”) sonu .png ile biten pwd (path work directory) yani çalışılan dizindekide ki .png olan dosyaları array olarak getirir. .each do |css_file| ise bunları altta ki blokta (11 – 18 arasında) kullanılmak üzere atar.

12. satırda kullanılacak ikonun pixeli ayarlanır. Normalde 16 pixellik ikonlar /16 dizindedir. 32 pixellik ikonlar /32 pixeldedir. Yalnız .css ustası kardeşim Tayfun Öziş ERİKAN en sık kullanılan 16 pixellik iconlar için 16 yazmaya gerek olmadığını düşünmektedir. Bu yüzden 12. satırda dizin 16 ise pixeli boş bir string, 32 ve benzeri dizinlerde -32 -48 yaptık.

13 – 14 – 15 – 16. satırlarda dosyanın içine


...

.icon-brain_trainer {
background : url('16/brain_trainer.png')
}

...

yazmaktadır.

13. satırdaki icon.chomp(‘.png’) dosya isminin sonundaki .png ifadesini stringden siler. yani brain_trainer.png ifadesi brain_trainer olur. Bunu ‘icon-‘ stringi ve pixel değeri ile birleştirir. Sonuç olarak brain_trainer.png 16 pixel için .icon-brain_trainer olur. 32 pixel için .icon-brain_trainer-32 olur.

14. satırda directory ve icon değişkenleri kullanılarak path yazılır.

19. satırda ise bu dizindeki işlem bittiğinden diğer dizine girebilmek üzere bir üst dizine çıkılır.

puts "Program finished. Bye"

23. satırda ise kullanıcıya güle güle denir.

İcon linki http://www.iconarchive.com/download/s1628/fatcow/farm-fresh/fatcow-hosting-icons-2000.zip dir. Ruby kodunu css çıktılarını bu linkten ruby-css-generator indirebilirsiniz.

Umarım faydalı olmuştur.