Sat 17 Mar 2007
HTML-Шаблонизатор Будущего или Почему Большинство Существующих Шаблонизаторов — Отстой
Posted by Alex Lebedev under django, rails, инструменты, программирование
[44] Comments
Предыдущая статья про Ruby on Rails, как всегда, выродилась в грандиозный флейм вокруг PHP. Кто-то говорит, что Rails в самое ближайшее время вытеснит PHP на свалку истории, кто-то говорит, что Rails будет портирован на PHP и на свалку истории отправится как раз Ruby. Все остальные мнения — где-то посередине между этими крайностями.
Я считаю, что Rails займет нишу элитарного инструмента, а PHP продолжит доминировать в категории языков, совместимых с лоботомией. Но это тема для другой статьи…
Сегодня же давайте рассмотрим следующую по популярности тему религиозных войн Rails vs. Django vs. PHP — движки HTML-шаблонов. На самом деле, спор чаще всего идет о синтаксисе шаблонов. Такие особенности конкретных движков, как скорость рендеринга, способ обработки ошибок и т.д. с точки зрения религиозных войн не так интересны.
О важности качественного языка шаблонов
В большинстве известных мне веб-проектов от четверти до половины строк кода приходится на HTML-шаблоны. Даже с учетом того, что HTML писать проще, чем программный код, можно предположить, что до трети времени будет уходить на создание и отладку шаблонов. Следовательно, за счет использования качественного языка шаблонов и других приемов повышения эффективности можно выиграть немало времени. В некоторых проектах созданием HTML-шаблонов занимаются отдельные люди, работающие на стыке программирования и веб-дизайна. Для них потенциальный выигрыш будет еще выше.
Таким образом, проблема продуктивного создания HTML-шаблонов является одной из ключевых проблем повышения продуктивности веб-разработки вообще.
Краткая классификация
Шаблонизатор — это библиотека, позволяющая с помощью специализированного синтаксиса описывать разметку динамических HTML-страниц. Разметка описывается в виде так называемых шаблонов. На основе шаблонов и данных, как правило, предоставленных кодом бизнес-логики (клинические случаи с включением бизнес-логики в шаблоны рассматривать не будем) генерируется результирующий HTML.
Большинство языков шаблонов относится к одной из следующих категорий:
Категория 1. Винегрет из кода и HTML
Шаблонизаторы данной категории позволяют с помощью специального синтаксиса вставлять в HTML блоки исполняемого кода, написанного на языке общего назначения (Java, PHP, Ruby и т.д.).
Примеры шаблонов этой категории: PHP, ASP, JSP, ERb (стандартный шаблонизатор в Ruby on Rails).
Пример синтаксиса:
<% for recipe in @recipes %>
<tr>
<td><%= link_to %Q{#{recipe.title}}, :action => 'show', :id => recipe %>
<%= link_to '(delete)', { :action => 'destroy', :id => recipe },
:confirm => 'Are you sure?', :post => true %></td>
<td><%= link_to %Q{#{recipe.category.name}},
{:action => 'list', :category_id => recipe.category.id} %></td>
<td><%=h recipe.date %></td>
</tr>
<% end %>
</table>
Категория 2. Специализированный синтаксис + HTML
Шаблонизаторы данной категории тоже работают за счет вставки управляющих блоков в HTML. В отличие от предыдущей, категории управляющие блоки написаны не на языке общего назначения, а на узкоспециализированном языке, как правило, используемом только в данном шаблонизаторе.
Примеры шаблонов этой категории: движок шаблонов Django, Smarty
Пример синтаксиса (Django):
{% extends "base_generic.html" %}
{% block title %}{{ section.title }}{% endblock %}
{% block content %}
<h1>{{ section.title }}</h1>
{% for story in story_list %}
<h2>
<a href="{{ story.get_absolute_url }}">
{{ story.headline|upper }}
</a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}
Категория 3. Основанные на XML
Тот же самый принцип вставки управляющих элементов в HTML, что и в предыдущих категориях. Управляющие блоки выполнены в виде XML-элементов, ссылающихся на функции бизнес-логики или библиотек пользовательского интерфейса.
Примеры шаблонов этой категории: Velocity, ASP.NET
Пример синтаксиса:
<form runat="server">
Enter a number from 1 to 100:
<asp:TextBox id="tbox1" runat="server" />
<br /><br />
<asp:Button Text="Submit" runat="server" />
<br />
<asp:RangeValidator
ControlToValidate="tbox1"
MinimumValue="1"
MaximumValue="100"
Type="Integer"
EnableClientScript="false"
Text="The value must be from 1 to 100!"
runat="server" />
</form>
Категория 4. Специализированный язык разметки
Шаблоны данной категории целиком написаны на DSL (Domain-Specific Language), отвечающем за генерацию как динамического содержимого, так и, собственно, HTML-разметки.
Примеры шаблонов этой категории: HAML, Markaby
Пример синтаксиса (HAML):
!!!
%html
%head
%title= controller.controller_name
= stylesheet_link_tag 'main'
%body
#header
%h1 BoBlog
#content= yield
#footer
%p All content copyright © Bob
Я уверен, что только четвертая категория шаблонизаторов подходит для серьезного использования. Если, конечно, вы цените свое время.
Сейчас попробую объяснить, почему.
Feel the pain
Ни один из первых трех примеров нельзя назвать эстетичным. Даже близко. От кода рябит в глазах и надо внимательно вчитываться, чтобы понять, что действительно делает любой из этих шаблонов. Если сравнить синтаксис этих примеров с синтаксисом любого современного языка программирования, то можно понять, насколько все плохо в области создания эстетичных шаблонов (впрочем, надо признать, что разнообразие структурных элементов языка программирования как минимум на порядок меньше разнообразия HTML-тегов).
Вставка программного кода в той или иной форме резко нарушает структуру HTML и делает результат весьма трудным для чтения. Казалось бы, основная проблема существующих шаблонизаторов — в уродливом синтаксисе вставляемых в HTML элементов.
Ничего подобного.
Главная проблема большинства шаблонизаторов в том, что уродлив сам синтаксис HTML.
Этот кривой HTML
HTML избыточен и некрасив. Разметка содержит множество элементов, без которых можно было бы обойтись. Сами элементы тоже нельзя назвать образцом изящества. Подробности далее…
Немного истории
Давным-давно, в 60-х годах прошлого века был создан SGML, абстрактный язык разметки для представления максимально разнообразной информации в виде структурированных, пригодных для машинного чтения, данных. За универсальность SGML пришлось платить сложностью и громоздкостью синтаксиса. Этот недостаток SGML в полной мере распространяется на его потомков, HTML и XML.
HTML сложно читать.
Простота чтения языка программирования зависит, в первую очередь, от двух параметров:
Лаконичность. В первую очередь определяется количеством строк, необходимых для описания чего-либо. Во вторую очередь, длинной ключевых слов и других часто встречающихся элементов.
Пара примеров:
Java. Все плохо как с количеством строк, так и с их размером:
void cancelAll(Collection<TimerTask> c) {
for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); ) {
i.next().cancel();
}
}
Python. Практически образец лаконичности:
def cancel_all(tasks):
for task in tasks:
task.cancel()
Понятность. Хорошо, когда код лаконичен, но он должен быть еще и понятен. Для этого необходимо, чтобы язык был построен на простых принципах и обладал концептуальной целостностью. Под концептуальной целостностью я подразумеваю способность языка быть выраженным через небольшое количество принципов с минимумом исключений. Примером языка с высокой концептуальной целостностью можно назвать Python.
Именно из-за проблем с понятностью синтаксис Perl’а, часто называемого write-only языком, нельзя считать удовлетворительным. Вот здесь, например, Steve Yeggie пишет как оператор .. в Perl может, в зависимости от контекста, иметь два абсолютно разных значения. Само собой, такие фокусы способствуют читабельности кода не лучше, чем выражение goto.
Можно предположить, простота чтения языка разметки зависит от тех же ключевых параметров: лаконичности и понятности.
С понятностью у HTML все в порядке: принцип построения документа из тегов способен без особого труда понять даже ребенок. А вот с лаконичностью…
HTML — ну очень многословный язык. Многие часто используемые теги имеют весьма длинные имена. Многие типичные конструкции (например, label и legend) приходится делать с помощью отдельного тега, хотя в большинстве случаев достаточно было бы атрибута. Нет универсального обозначения конца блока, аналогичного end в Ruby или закрывающей фигурной скобке в C-подобных языках — каждый блок HTML закрывается по-своему, в соответствии с именем открывающего тега, следовательно, читателю сложнее распознавать строки, не несущие полезной информации.
Буков много (c)
HTML сложно писать.
Пример из жизни.
В WordPress для написания постов можно использовать WYSIWG-редактор (What You See Is Shat You Get, можно перевести как “что видишь в редакторе, то и получишь в результате”), а можно писать чистый HTML. В моей версии WordPress WYSIWG кривой и то что я вижу в редакторе совсем не соответствует тому, что я получаю на выходе. Причиной проблем является большое количество паразитной разметки, генерируемой упомянутым редактором: пустые теги <p>, пустые теги <b> и <i>, время от времени появляющийся в конце текста незакрытый тег <a>… В результате, для того чтобы написанный пост выглядел хорошо, приходилось руками вычищать HTML.
Через некоторое время я убедился, что вручную писать правильный HTML быстрее, чем вручную же вычищать автоматически созданный. И я стал писать посты в чистом HTML. Жизнь стала легче, но это все же нельзя было считать удовлетворительным решением. Скорость написания форматированного текста в HTML не сравнится со скоростью создания форматированного текста в том же MS Word.
Сейчас я пишу свои тексты с помощью Markdown, специализированного языка разметки. По сравнению с HTML я получаю более симпатичный и читабельный исходный текст, который, к тому же, гораздо проще писать. В результате достигнута заметная экономия времени, притом за счет упразднения самого нудного аспекта создания постов. Мои исходные затраты на поиск и изучение специализированного языка разметки давно окупились. Учтите, что на блог я трачу совсем немного времени. Использование подходящего специализированного языка разметки в работе может принести гораздо большую отдачу.
Небольшое сравнение HTML и Markdown для иллюстрации.
HTML:
<p>Small example of Markdown syntax</p>
<ol>
<li>Red</li>
<li>Green</li>
<li>Blue</li>
</ol>
<p>If you want your page to validate under XHTML 1.0 Strict,
you've got to put paragraph tags in your blockquotes:</p>
<pre><code><blockquote>
<p>For example.</p>
</blockquote>
</code></pre>
Markdown:
Small example of Markdown syntax
1. Red
2. Green
3. Blue
If you want your page to validate under XHTML 1.0 Strict,
you've got to put paragraph tags in your blockquotes:
<blockquote>
<p>For example.</p>
</blockquote>
Подводя итог, можно сказать, что использование HTML в качестве основы языка шаблонов заставляет платить читабельностью и лаконичностью синтаксиса. Появление таких платформ веб-разработки как Django и Ruby on Rails делает эту цену слишком высокой. Чтобы не путаться под ногами, язык шаблонов должен быть проще.
HAML как альфа-версия шаблонизатора будущего
Показанный выше Markdown очень эффективно решает задачу безболезненного написания HTML, но в относительно узкой нише — написание текстов. Того же самого для несколько более широкого спектра задач добиваются разнообразные wiki-разметки.
Шаблонизатор HAML пытается с использованием тех же принципов создать читабельный и лаконичный синтаксис HTML-шаблонов общего назначения. Дело, как говорится, благородное.
Посмотрим, как у него это получается?
Преимущества
HAML пронизан духом лаконичности. Сокращения, ключевые слова, обозначение блоков — все направлено на сокращение размера кода при максимальном сохранении его ясности.
Рассмотрим основные преимущества подробнее:
Наличие сокращений для большинства часто используемых элементов.
- Какие два атрибута тегов используются чаще всего? Class и id. В HAML
<tr class="odd" id="first_row">превращается в%tr#first_row.odd. Используются те же обозначения что и в CSS, что заметно упрощает обучение. - Большинство ключевых слов состоят из одного символа:
%,=,-,.,#. Думаю, не нужно говорить, насколько это сокращает получающийся в итоге код. - Любители верстки divами (а это заметная часть прогрессивного человечества) могут наслаждаться тем, что div является тегом по умолчанию.
#headerи%div#header— одно и то же.
Это только самое основные сокращения. Полный список можно посмотреть в HAML Reference
- Какие два атрибута тегов используются чаще всего? Class и id. В HAML
Способ обозначения блоков. Блоки в HAML обозначаются с помощью отступов, аналогично Python. Вот такой код: %one %two %three Hey there преобразуется в:
Hey there Можно по-разному относиться к Python’овскому стилю обозначения блоков (лично я — его большой поклонник), но нельзя не признать что этот способ гораздо удачнее, чем закрывающие теги, используемые в HTML (я уже писал про связанные с ними проблемы).
Возможность сочетать HAML и ERb в одном приложении. Допустим, нужно найти шаблон с именем ‘xyz’ (или partial, не суть важно). Плагин HAML переписывает стандартный загрузчик шаблонов так, чтобы сначала пытаться загрузить
xyz.haml, а в случае неудачи —xyz.rhtml. Соответственно, можно не переписывать все ERb-шаблоны в проекте на HAML, а заменять их по одному и только там, где это наиболее оправдано.
Проблемы
HAML пока используется относительно небольшим количеством людей. Версия 1.0 была выпущена только два месяца назад, 15 января 2007 года. В результате, общая стабильность не может, разумеется, сравниться с ERb, а ваши шансы столкнуться в своем проекте с неизвестными багами гораздо выше.
Но это только абстрактные размышления.
Из конкретных проблем я встречался только со сложностью отладки. HAML реализован таким образом, что шаблоны компилируются в ERb, который затем рендерится с помощью ERb-библиотеки. В результате, в случае ошибки Stack Trace ссылается на фрагмент ERb-шаблона, который вы никогда не увидите целиком. Диагностика проблем в таких условиях может быть очень нетривиальной.
Грядущее упрощение языков разметки?
Я считаю, что существует четкий тренд развития языков разметки в сторону упрощения чтения и редактирования человеком. У HTML и XML, сегодняшних стандартов де-факто, с этим серьезные проблемы. Их синтаксис нацелен на максимальную универсальность применения и простоту парсинга, и жертвует при этом компактностью, а следовательно, легкостью чтения и редактирования. Такая ситуация не может быть сохраняться бесконечно.
Языки программирования со сборкой мусора (garbage collection) вытеснили из большинства ниш языки с непосредственным управлением памятью. Динамические языки вытесняют языки со статической типизацией. Оба этих изменения направлены на экономию времени разработчика за счет снижения производительности. Подобное изменение ждет и языки разметки.
Предсказание будущего — штука неблагодарная. Особенно — в области высоких технологий. Я знаю, что на самом деле все будет совсем не так, как мне сейчас представляется, и через пару лет я от души посмеюсь, читая эти строки. Тем не менее, осмелюсь сделать прогноз эволюции шаблонизаторов на ближайшие годы.
Шаблонизаторы категории “Винегрет” продолжают использоваться в большинстве PHP-разработок. Разработчики, обладающие достаточной квалификацией для использования продвинутых шаблонизаторов типа Smarty (и, что важнее, достаточной квалификацией, для того чтобы понять, зачем это нужно) будут постепенно откочевывать в сторону Rails, Django и других подобных фреймворков, которые наверняка появятся в ближайшем будущем.
Шаблонизатором по умолчанию в Ruby on Rails 2.0 становится HAML, тем самым выводя Rails из группы платформ, использующих “Винегрет”.
Шаблонизаторы на основе специализированного синтаксиса + HTML также теряют часть своей аудитории в пользу HAML сотоварищи. Тем не менее, данная категория остается достаточно популярной благодаря простоте синтаксиса и возможности четкой диагностики ошибок. Именно такими шаблонизаторами, в большинстве своем. пользуются дизайнеры и HTML-верстальщики, не желающие/не способные переучиваться на без-HTML’ный DSL.
XML постепенно отступает в нишу машинной сериализации данных. С этой точки зрения громоздкость его синтаксиса не является большим недостатком (хотя и увеличивает объем трафика при передаче данных по сети). Гораздо важнее простота парсинга и возможность формальной валидации. Ruby, Python и другие динамические языки активно переходят к использованию вместо XML «облегченных» форматов, в частности YAML.
Шаблонизаторы на основе XML, вероятно, сохранят популярность в C# и Javа. Хотя замена таких шаблонизаторов на более «легкие» решения и предоставляет значительные возможности экономии времени разработчиков, сознательный выбор языка со статической типизацией говорит о том, что скорость разработки, скорее всего, не является первым приоритетом при выборе технологий в данном проекте. В таких условиях использование XML вполне адекватно.
Специализированные языки шаблонов набирают популярность. За счёт значительно повышения удобства и скорости разработки при сохранении приемлемой производительности приложений шаблонизаторы этой категории становятся наилучшим выбором для большинства задач.
Столица, разумеется, переносится в Нью-Васюки
Материалы по теме
- Серия статей Ивана Сагалаева с критикой использования XHML вместо HTML. Отлично изложены аргументы, доказывающие ущербность оптимизации парсинга разметки за счет увеличения трудоемкости ее создания.
Спасибо Артему Скорецкому и Анатолию Иванову, читавшим черновики этой статьи и внесшим немало ценных идей.
44 Responses to “ HTML-Шаблонизатор Будущего или Почему Большинство Существующих Шаблонизаторов — Отстой ”
Comments:
Leave a Reply
Trackbacks & Pingbacks:
-
Pingback from Link Splash: Ruby and Friends at Дневник борца за высшее образование
January 22nd, 2008 at 12:54[...] Пост почти годовой давности о шаблонизаторах. Ссылаюсь ибо он пропагандирует использование двух таких удобных механизмов как HAML или Markaby. Не знаю, кому как, а мне гораздо симпатичнее написать такую обертку для кусочка кода [...]

March 17th, 2007 at 05:56
Мысли:
Back to GML?
Хорошо, что нет Latex-подобных вывертов
\begin{table}
\for{recipe}{@recipes}
\link_to{recipe.title}{action='show',id=recipe} &
\link_to{ "(delete)" }{action='destroy',id=recipe}{confirm='Are you sure?',post=true} &
\link_to{recipe.category.name}{action= 'list',category_id=recipe.category.id} &
{\h recipe.date }
\
\end
\end
А почему Velocity отнесена к XML а не винегрету? XML – это скорее Tapestry.
March 17th, 2007 at 12:42
Спасибо за статью. Очень интересно, но пожалуйста, сверху допишите, что читать лучше на сайте, так как в rss очень бьётся… Так по крайней мере у меня.
March 17th, 2007 at 12:48
Можно поподробнее про RSS? Чем и где читаете?
Я проверял только поток, отображаемый FeedBurner’ом, там все нормально.
March 17th, 2007 at 02:26
Интересно. Мне понравился общий настрой про тенденцию к использованию упрощенных языков разметки. Но вот пример в виду HAML меня совсем не впечатлил: на мой взгляд замена слов на спецсимволы как раз ухудшает читаемость. Мне всегда казалось, что Питон хорошо читается как раз во многом из-за отсутствия всяких долларов с процентами.
March 17th, 2007 at 03:15
Вообще-то в Java и Python у вас не равнозначные примеры кода написаны
аналогом
def cancel_all(tasks):
for task in tasks:
task.cancel()
в джаве будет не
void cancelAll(Collection c) {
for (Iterator i = c.iterator(); i.hasNext(); ) {
i.next().cancel();
}
}
, а
void cancelAll(Collection c) {
for (TimerTask tt : c) {
tt.cancel();
}
}
March 17th, 2007 at 03:32
Я буду резок — но то, что HAML читается лучше того же Питоновского Kid, язык не у кого не повернется.
Но и это все мышинные войны, хотя бы потому что нормальная система должна отдавать XML, и парситься XSLT. (это одна из тех причин, по которым мне не нравяться ни Рельсы, не Джанго), и тут меня тоже никто не переубедит, поскольку это совершенно нативный метод работы с данными, в отличии от шаблонизаторов вышедших из Perl и PHP, не имевших нормальных средств для работы с XML.
March 17th, 2007 at 03:49
С выводами согласен. Только небольшое уточнение: сравнивая ERb и шаблоны Django, вы приводите не равноценные примеры (не в пользу ERb
.
%Q{#{recipe.title}} == recipe.title(зачем такие извращения?)(:action => \'destroy\', :id => recipe)нельзя сравнивать сstory.get_absolute_url, т.к. в рельсах есть именованные URL:destroy_recipe_url(:id=>recipe)Иван Сагалаев: в случае с HTML-разметкой, \”доллары с процентами\” удобны тем, что согласуются с CSS-синтаксисом, экономят пространство и время на чтение. Сравните:
и:
March 17th, 2007 at 06:13
Спасибо за статью, много и с мыслями.
Если предметно, то HAML не так однозначен. Как в него вставить form_tag ?
March 17th, 2007 at 06:17
То есть все шаблонизаторы, не использующие XML+XSLT неправильны, потому что они не используют XML+XSLT. Другая аргументация будет?
March 17th, 2007 at 06:28
HAML позволяет исполнять произвольный Ruby-код, соответственно, он может все что может ERb. Недостатки HAML, скорее, связаны не с недостатком функционала, а со зрелостью библиотеки.
form_tagможно использовать следующим образом:Это будет эквивалетом вот такой ERb-разметке:
March 17th, 2007 at 08:58
Интересная статья.
А что скажете насчет Breve? Это питоновский шаблонизатор из четвертой категории, но без “долларов с процентами”.
March 17th, 2007 at 10:43
Breve производит хорошее первое впечатление. Синтаксис хорош. Пригодность к использованию в production будет определяться качеством реализации — стабильностью, способом обработки ошибок синтаксиса, производительностью…
March 18th, 2007 at 02:29
А как вы относитесь к языкам типа parser, которые “сам себе шаблон”?
March 18th, 2007 at 05:04
2 Aceler: для таких целей уже давно существует PHP.
March 18th, 2007 at 08:10
Для каких целей???
Parser позволяет сбросить работу с html на любое визуальное приложение, разделяя шаблон от языка. В PHP я такого не видел – там нет автоматического подключения функций.
March 18th, 2007 at 10:38
Ссылка на HAML выглядит так :
http://alexlebedev.com/blog/on-html-templates/haml.hamptoncatlin.com/
Я думаю. это не то, что имелось в виду
March 20th, 2007 at 04:53
У HAML по сравнению с шаблонами из второй категории есть один {{ степень_важности }} минус – его нельзя дать дизайнеру/верстальщику.
ИМХО Поэтому он прочно ляжет в нишу мелких веб-приложений.
March 20th, 2007 at 08:48
Прочел я ваши словесные баталии.
Странно то что о Smarty не самого высокого мнения. И я в очердной раз убеждаюсь в том, что так говорят люди не потрудившиеся немного в нем разобраться.
Крайне удобный шаблонизатор. Проверено не единожды, работая с разными верстальщиками и дизайнерами.
Хотя стоит заметить, что каждая примочка должна использоваться к месту.
March 21st, 2007 at 03:46
Фигня на постном масле.
Как-то ты ловко повернул. Начал про шаблонизаторы (причем все они, по сути, представляют собой тот самый винегрет, отличаясь только синтаксисом и возможностями) а закончил – про языки разметки.
Нарисовал новый язык разметки и рассказал всем, что это… крутой новый шаблонизатор. При этом о самих возможностях шаблонизации – ни слова. Только про разметку.
В итоге куча воды и ни слова по сути.
Ты бы определился, о чем пишешь.
О шаблонизации или о разметке?
О разметке целиком HTML страницы или разметке текста?
примеры шаблонизаторов у тебя иллюстрируют разметку страницы. пример HAML – текста.
Нормальное сравнение можно сделать, только приведя примеры шаблонов, выдающих один и тот же HTML. Но тогда ведь выяснится, что хваленая панацея – тот же самый винегрет + ещё и замена стандартного HTML на какой-то новодел.
March 22nd, 2007 at 01:05
Дизайнеру — возможно. А профессиональный верстальщик, как я уже писал, наооборот, выиграет от HAML гораздо больше чем разработчик. Ибо занимается только версткой и всякое усовершенствование инструментов даст ему гораздо большую отдачу, чем программисту, занимающемуся много-еще-чем-помимо-верстки.
April 8th, 2007 at 07:39
Тем не менее, этот блог на php-шном Вордпрессе, а не на крутом Руби
)
April 8th, 2007 at 08:57
На Ruby написан Typo, отличный движок для блоггинга.
Другое дело, что WordPress на данный момент распространеннее. Поскольку на блог я трачу не очень много времени, меня вполне устраивает решение общепринятый вариант.
April 28th, 2007 at 04:48
Когда читал про HAML у вас, вспомнил старый добрый sxml… Очень удобен в CL/scheme. В python, насколько я знаю, макросов нет, поэтому прямого порта не сделать, но всё равно приятно за python, что там более-менее удобные штуки есть.
May 12th, 2007 at 01:38
Очень понравилась статья. Давно искал, что-то подобное, но все никак не находилось. Теперь знаю куда копать, gem install уже запущен.
Кстати, а для typo Aksimet есть? или TP-FeedBurner какой-нибудь?
May 13th, 2007 at 01:01
Судя по release notes, появился аж год назад, в версии 4.0:
http://typogarden.com/articles/2006/07/24/typo-4-0-is-out
May 22nd, 2007 at 07:53
Проблема самая главная заключается в том, что шаблонизатор используется для интеграции сверстанного макета, который уже изначально имеет html+css код, в нечто, способное восприниматься системой.
Удобство пользования шаблонизатора – как раз в сложности процесса самой интеграции. Сложность эта зависит и от функционала (нет возможности = есть геморрой). *Smarty хорош, но можно и лучше. Но писать дивы через css селекторы – это лишнее. Лучше придумать грамотные управляющие коструции. Типа foreach и if.
А использование новой разметки подразумевает переход дизайнера на новый редактор (коего нет еще, похоже, для хамл), что не по душе придется профессионалам-верстальщикам, т.к. они привыкли к своему. А у нового редактора будет n в n-ной степени багов в первой преальфе и т.п. И через два года он станет более-менее сгодным к употреблению, однако все еще не будет в нем той самой фичи, “что мне так нравицца”. Ну не в блокноте ж писать…
Проблема же написания статьи в систему ИМХО лучше всего как раз решается либо грамотным WYSIWYG, который не дает наделать делов не шибко грамотному юзверю, дабы не положить существующую верстку, либо тем же самым Markdown.
Кстати, этот блог на PHP и есть возможность писать под Markdown. Алекс, где взять php порт? Оригинал-то на перле…
May 22nd, 2007 at 10:04
Если макеты верстки в HTML+CSS, то, действительно, нет большого смысла переходить на HAML. Впрочем, Rails позволяет в рамках приложения сочетать разные шаблонизаторы, так что HAML, например, идеально подходит для шаблонов мелких вставок (partial’ов).
Особой проблемы с редактором не вижу. Потому что:
Профессионалы, которых волнует качество получившейся разметки, не редактируют в WYSIWYG. Кроме того, ни один WYSIWYG-редактор все равно не сможет корректно отобразить то, как будет выглядеть страница, собранная из нескольких составных частей.
Поскольку WYSIWG-редактор не нужен, подойдет любой продвинутый блокнот: PSPad, Edit+ и т.д. Плохо, что не будет подсветки синтаксиса, но двухкратное сокращение размера шаблонов это с лихвой компенсируют.
May 22nd, 2007 at 10:09
Реализация Markdown существует практически для всех популярных языков. Список можно посмотреть в статье о Markdown из Wikiped\’ии.
June 29th, 2007 at 10:19
HAML конечно хорош тем, что мало текста.
Но он и недостаточно функционален ведь как шаблонизатор.
В пользу XSLT играет то, что он официально стандартизирован (а значит не меняется от платформы к платформе), очень гибкий и полностью соответствует концепции отделения слоев app logic, domain logic и presentation logic. Недаром же его все прорабатывают (XSLT 2.0 – офииальная рекомендация).
Программист вообще не должен заниматься версткой. Оставьте ее верстальщикам и XSLT-верстальщикам.
June 29th, 2007 at 10:22
Да, кстати, Oleg
Давно придумали и стандартизировали:
http://www.w3.org/Style/XSL/
September 26th, 2007 at 11:54
Чесно говоря я и HTML синтаксис вполне нормально читаю и никаких проблем с читабельностью, не наблюдаю. scc селекторы в HTML – это удобно, но как раз они на мой взгляд и ухудшат читабельность, так как от кучи тех самых селекторов в глазах и зарядит. #.%$%@# – Рябит
?
На самом деле статья на мой взгляд однобокая какая-то, получаться автор жестко пропагандирует новорожденный HAML, а всё что есть поливает понятно чем и говорит что оно вымрет.
October 14th, 2007 at 02:36
Действительно смахивает на пустую попытку пропаганды и некое подобие рекламы нового способа написания.
Причем написания того же html в принципе – ибо на выходе он у нас и ожидается ))
По поводу простоты для вёрстки – уже есть куча замечательных редакторов для html+xml+css…. где процесс написания тегов почти полностью автоматизирован и от верстальщика или дизайнера нужно только нажатие клавиши \”< \" остальное будет писать редактор - ну вы в курсе, чего жевать.
По поводу читабельности,на мой взгляд ,-читабельность кода в html а тем более xhtml проста до безобразия.Система отступов принятая в различных языках делает своё дело.
Моё личное мнение: Данная реализация двигается только в сторону укорачивания строки кода при написании и неболее.
Думаю что создатели html думали об этом ,но но пошли по другому пути.
Конечно код вида:
#column
#content
%h1 Hello!
Выглядит заманчиво,но если его усложнить у несколько раз получится винегрет похуже html.
пример:
#column
#content
%table
%tr
%td
#two_2
%table
%tr
%td
#two_3
%p
%td
#two_6
%table
%tr
%td
#two_4
%p
%tr
%td
#one_1
%td
#one_2
%table
%tr
%td
#one_3
%p
Читабельность такого кода катастрафически падает по мере разрастания размера кода и его сложности – при системе вложенных элементов порядка 20 и более с различными параметрами – сам написавший код прочитать его сможет с большим трудом через 10 минут после написания.А это неактуально на 100% для языка разметки.
Конечно многое тут сказанное актуально для каждого человека в отдельности – ибо у каждого свой опыт и свои пристрастия.
October 14th, 2007 at 02:43
в примерах отступы отвалились – извиняйте
October 14th, 2007 at 07:07
1а. Важнно не то, как выглядит разметка с 20 (30, 99, 9999 — нужное подчеркнуть) уровнями вложенности, а то, как выглядит типичная разметка типичной страницы.
1б. Мы говорим об HTML-шаблонах в веб-приложениях. Layout’ы, partial’ы и CSS-верстка позволяют собирать дизайн любой сложности из простых блоков. 20 уровней вложенности в разметке пахнут не лучше, чем методы длинной в полторы сотни строк кода.
2а. Большинство людей не понимает, что важна не скорость написания первой версии, а скорость чтения и исправления в дальнейшем.
P.S. Для правильной расстановки отступов в цитируемом коде надо заключать блок в
<pre><code>, одного<code>мало.May 6th, 2008 at 01:46
ну и бред про 4 тип. Это худший вариант, потому что требует изучения.
А самый лучший шаблонизатор это xml + xslt
Вопервых есть стандарты для этого
Во вторых парсеры
В третьих полное разделение данных и форматирования
В четвертых удобная работа с данными
И в пятых внутренний язык для логики работы.
В шестых есть валидаторы
В седьмых полно средств разработки, обучающих пособий, курсов и т.д. но это важно конечно если мы занимаемся не мозгоковырянием, а серезной работой в команде, которая растет и в которую надо находить квалифицированных работников.
А все эти надстройки-шаблонизаторы полное гавно и делали их криворукие дебилы.
May 6th, 2008 at 04:24
spall, вам не кажется что тем, для кого “требует изучения” является непреодолимым препятствием, стоит сменить облать деятельности на что-нибудь попроще?
Еще интересно было бы узнать, почему наличие парсеров является уникальной фичей XML+XSLT. Как вообще возможен работающий шаблонизатор без парсера?
May 14th, 2008 at 12:43
Max Replace – мой шаблонизатор, пока на файлах, и платный, увы(
June 1st, 2008 at 08:21
Странные подходы. Правильно, что шаблонизатор не должен использовать собственную систему разметок. Поскольку большинство верстальщиков не возьметься перекодировать шаблоны, так же верно как и то что программист, который перекодирует шаблон может его начисто запороть, он же не верстальщик. Получаеться надо брать чела который будет заниматься перекодировкой, будет и верстальщиком и програмистом… Даже Смарти не всегда подходит, иногда надо изобретать свой уникальный велосипед, с “треугольными колесами” под отдельные проекты. Но и xml не являеться никаким стандартом в web, его хотели таковым сделать, но кроме rss применения нигде не получил толком, гораздо правильнее использовать JSON, и парситься он в разы быстрее и проще и реализовать в нем можно все тоже что и в xml. Посему пишите свои шаблонизаторы и чем больше тем лучше, но именно шаблонизаторы, а не скрипты для вывода контента типа HAML.
July 2nd, 2008 at 02:11
Ключевое слово, по-моему, “парсеров“, то есть имеется в виду, что много разных парсеров, а главное для многих языков.
Почитал статью, думаю “надо попробовать HAML” – концепция понравилась, а как раз нужно шаблонизатор выбрать для одного небольшого проекта, открыл сайт – а парсера для PHP (де-факто самый распространенный язык серверных веб-скриптов) и нету, значит не получится интегрировать этот шаблонизатор (если это вообще шаблонизатор) с моими скриптами.
P.S. Пошел выбирать между смарти, xslt и “винегретом”
July 2nd, 2008 at 11:11
Для начала представлюсь. Фрилансером был 2 года, в основном верстал и программил сайты.
Скажу лишь одну фразу.
Грядущие переменны мерещатся ему))) придеться переписать http протокол, дабы перезалить весь инет. Матрица.
HTML – язык разметки, который понимает весь интернет. Php – та же ситуация, шаблонизаторы со своими парсерами просто уродство, тема ни о чем, автор жжет, его и в топку))))
Автор не различает языка разметки от языка программирования)))))
Такой глупой темы я еще не встречал нигде.
Заголовок
July 2nd, 2008 at 11:30
Это был последний в этом блоге неаргументированный комментарий содержания “автор дурак”.
В дальнейшем весь подобный мусор будет удаляться.
August 16th, 2008 at 01:04
я лично не считаю автора дураком ибо когда-то верх шаблонизации для меня был банальный инклуд в пхп.
но речь не об этом, а о том что смари и прочие хорошо себя проявляют когда нужно затратить миниум усилий и в короткие сроки получить результат. когда над проектами работают несколько прогеров все начинает усложняться. особенно явно это проявляется в постоянно расширяющемся проекте. но и тут прогеры справляются, пишут СВОИ модули(к смари например) и их нельзя обозвать дураками, ибо они тянут проект над которым работают. и тут вроде бы стоит закончить словами – и жили они долго и счастливо, как один, два прогера берут и уволняются, или проект продают/передают, ну в общем он попадает в чужые руки.
уже другие нанятые прогеры содяться за проект и получают первое задание добавить/изменить что-то где-то, но никакой документации по проекту нет, и тут как раз и начинается настоящее волшебство:) громадный проект, написанный не на одном языке с обрывистыми логичекими конструкциями, припаянными от других проектов модулями, перемешанным кодом и прочем прочем. опять же я не говорю что писали проект дураки:), но писали первые прогеры под себя, под то как они считают правильно, логично и как было выражено в статье – лаконично.
но сколько людей столько и мнений о том как ПРАВИЛЬНО все сделать. и тут свежая команда разработчиков подпирает рукой голову и начинает вподать в ступор при виде этой лаконичности.
смысл сей басни в том, что может XSLT не так легок в изучении, как смари, не так быстр как самопальный шаблонизатор, но XSLT – СТАНДАРТ. разделяющий бизнеслогику от визуализации по принципу MVC.
помните что кодите вы не только для себя, но и для других, и от качества вашей работы и ваших знаний зависит ваша з/п.
September 26th, 2009 at 01:20
Хм. Почитал автора, почитал комменты. И знаете что я думаю, все эти шаблонизаторы – это типо советские времена, девиз “приведем” к стандарту. Не думаю что уважающий себя программист будет юзать какой то шаблонизатор, скорее он напишет свой, понятный и удобный, под конкретный проект или группы проекторв, а потом доработает и будет использовать в массовом производстве. Что касаеться спец-символов – моё мнение, чем их больше тем сложнее жить. Нафика заменять стандартные тэги на какие то иероглифы? Можно использовать комментарии как маркеры в шаблоне, будет и читабельно, и дураку понятно
А что касается языков программирования, то за много лет уже убедился, что в мире есть JavaScript и PHP. JavaScript для динамики на стороне клиента, PHP – для динамики на стороне сервера.