Июльский скриптик для работы с файлами

В очередной раз надо было поставить на поток генерацию HTML-кода для списка файлов в одной категории. На этот раз, перенаправлением в консоль было не отделаться, поскольку нужно было выпечатать ряд html-ок для лежащих в директории флешевских мувиков.
Работа с файлами в ruby сделана более чем прозрачно и напоминает другие языки. Не открывая мануала, я написал что файловая переменная f у меня будет равна File.new(“filename.txt”) и это заработало. Правда, для того чтобы в файл можно было писать, нужно ставить вторым параметром букву w. Не забывайте об этом, иначе потеряете полторы минуты на отладке скрипта, как я.
Кстати, не приходит мне на ум другой язык, в котором есть такая конструкция как

dataArray = f.readlines


которая автоматом записывает каждую строку файла в массив.

Чтобы не загромождать страничку, листинг скрипта для работы с файлами вынесен под кат.
Continue reading Июльский скриптик для работы с файлами

Еще раз для популяризации Руби

Пополняя свою коллекцию полезных скриптов, в добавок к Javascript-у, YAML-скрипту и Listing-cкрипту сегодня написал еще один Watermark-скрипт.
Как понятно из названия, он берет все jpg файлы из текущей папки и добавляет к ним одно изображение. Очень удобно для пакетной обработки файлов: можно поставить на все изображения URL вашего сайта, чтобы люди знали откуда сие добро взято.
Код простой, работает консольно без всякого вывода, однако для его запуска потребуется RMagick, а следовательно и ImageMagick тоже. Если вы используете нормальный сервер или одну из правильных OS, то проблем возникнуть не должно.


require 'RMagick'
wtm_file = 'watermark.png'
wtm = Magick::Image.read(wtm_file).first
Dir.open('./').each do |file|
    next if file[-4..-1] != '.jpg'
    next if file =~ /^..?$/
    
    image = Magick::Image.read(file).first
    image.composite!(wtm, Magick::CenterGravity, 
                                Magick::HardLightCompositeOp)

    out = file.sub(/./, "-wm.")
    image.write(out)
end 

Буду благодарен любым комментариям.

Циклик

Понадобилось на одну страничку заклепать этак почти 2 сотни картинок. В ручную прописывать понятное дело муторно и не эффективно. Залил картинки в нужные папки по FTP, а для генерации написал скриптик, благо стили уже давно были. Решил, что надо завязывать со всякой php-шной фигней, а потому скриптик родил на ruby. Глядишь, будет такой же полезный и часто используемый, как тот, что на javascript-e.


puts '<ul class="products2">'
193.times do |a|
		puts '<li><div class="frame3">'
		puts '<a href="res/catalog/images/shkafi/full/sk'+
					("%04d" % (a+1))+'.jpg" 
					target="_blank">'
		puts '<img src="res/catalog/images/shkafi/thumbs/sk'+
					("%04d" % (a+1))+'_s.jpg" width="104" 
					height="104" border="0" /></a>'
		puts '</div></li>'
	end
end
puts '</ul>'

Понятное дело, что и CSS, и сам код можно было бы дооптимизировать, но дело в том, что я этим занимаюсь не ради удовольствия, а “грубо и цинично рублю бабло” (с).

C подачи начальства появилось чуть-чуть времени и скриптик был чуть более автоматизирован. Теперь он берет имена файла из текущей папки, отрубает у них разширение .jpg и вписывает в нужное место в темплейте.
Continue reading Циклик

Валидация множественных radio формы

Была необходимость написать небольшую процедурку, которая бы проверяла во всех ли радиобоксах группы пользователь поставил точку. При этом основная заморочка заключалась в том, что это тест, в котором кроме радиобоксов, еще иногда могут встречаться тестовые инпуты и чекбоксы. Думал, что за 30 минут, я найду нужную мне функцию в интернете…
Не тут-то было. Валидаторов радиобоксов там действительно как грязи, но на серьезных тестах, они почему-то сыпались. Пришлось написать свой универсальный валидатор форм.


function checkform(f)
{
var flag = true;
var prev = ""; 
for (var i = 0; i < elements.length; i++)   {
      var el = f.elements[i];
      if (el.type == 'radio') {
         if (prev != el.name)
       {         if (!flag)
          {
         alert('Warning! No answer selected');
           return false;
         }
       flag = false;
       prev = el.name;
   }
     flag = flag || el.checked; 
} }
 return true; }