четверг, 2 августа 2007 г.

Markaby vs HAML

Я уже когда-то писал о сравнении двух движков html-разметки для Ruby — Markaby и HAML. Но похоже тот комментарий потерялся, поэтому я повторю у себя в блоге.

Заметка родилась из практической попытки переверстать имеющуюся страницу и в HAML, и в Markaby.

HAML

Плюсы:

  1. Неплохое визуальное восприятие чистого кода (без конструкций ruby) для генерации html, за счет принудительного форматирования отступами и отсутствия закрывающих тегов;
  2. Наличие html2haml;
  3. Отсутствие затруднений с utf-8;
  4. Язык меняется на "ru" в теге html исходно безо всяких затруднений;
  5. Xml-пролог удаляется исходно безо всяких затруднений.
Минусы:
  1. Не валидирует генерируемый html-код!
  2. Ruby-код включается через расширения синтаксиса - сммволы "-" и "=", что при злоупотреблениях воспринимается как каша;
  3. Визуальное форматирование выходного кода - оно никому не нужно и увеличивает размер выходного файла;
  4. Как следствие - проблемы с textarea: закрывающий тег находится на следующей строке с отступом, что приводит к большому числу пробелов внутри контрола. Причем, похоже, что проблема нерешаема в принципе!
  5. В случае с rails генерируется промежуточный erb. Что затрудняет отладку и отрицательно сказывается на скорости;
  6. Иногда наблюдается неочевидность синтаксиса (например, закрывающий тег "/") и требуется наличие лишних телодвижений: например, явное указание %meta{'http-equiv' => 'content-type', :content => 'text/html; charset=UTF-8'}/
Markaby.
Базируется на builder.

Плюсы:
  1. Визуальное восприятие неплохое, причем можно поднять до уровня HAML и лучше, если в шаблоне есть много ruby-кода или если делать закрывающему "end" дополнительный отступ до уровня предыдущего кода
  2. Валидирует генерируемый html! Это супервещь - сходу нашел ошибку в верстке.
  3. Ruby-код включается органично по определению.
  4. Экономит трафик - дает на выходе сжатый html - без отступов и переводов каретки. Но при желании форматирование отступами можно включить. В общем-то это фича builder.
Минусы:
  1. Отсутсвие html2markaby;
  2. Базируется на builder и имеет его родовой минус - проблему с раздуванием кода (для кириллицы) из-за оформления символов с кодом больше 127 в конструкцию вида "&##{n};". Это лечится, но некоторые вопросы о корректности фикса мне ещё не ясны.
  3. Содержит ошибку в закрытии тега textarea. Обходится элементарно, добавлением "do; end", но осадочек остался. textarea :name => 'test[text]', :cols => '50', :rows => '20' do; end О глюке 100% знают разработчики, так что возможно это даже фича.
  4. Содержит ошибку в URL для DTD. Лечится без проблем.
  5. Нельзя сменить язык в теге html на "ru". Лечится без проблем.
  6. Для удаления xml-пролога нужны дополнительные телодвижения. Лечится без проблем.
Общий итог - я выбираю маркаби.

Кстати, встретил ещё одно интересное мнение в пользу markaby, цитирую:
I like Markaby over HAML because Markaby doesn’t create its own syntax. It’s not whitespace-sensitive; it can be highlighted by your editor already; and because it executes in Rubyspace instead of being parsed (like HAML) it supports all existing Ruby techniques, metaprogramming, and overrides (unlike HAML). This is very valuable to me. Speedwise I would guess they are comparable but I don’t have real data to go by. Unless there is a big speed difference, there is no situation in which I would use HAML over Markaby. That’s partly my personal preference, though.
A big benefit of Markaby is that strings passed as parameters get escaped by default. This means you tend to overescape rather than under, and makes it very easy to write an XSS-secure app.

2 коммент.:

9 комментирует...

Что-то синтаксис Markaby мне больше нравится :)

Павел комментирует...

Markaby очень неплохо продуман. Честно говоря, я после знакомства с ним перестал верстать в чистом HTML. Проще, быстрее и валиднее писать сразу на руби и сохранять выдачу программы в файл. Гениальная вещь.