Hastache 0.6.0. Новый мейнтейнер
Вышла новая версия hastache 0.6.0. Самое заметное изменение — переход от использования ByteString к использованию Text.
А самое заметное изменение для меня самого в том, что теперь у hastache новый мейнтейнер, который вот эту новую версию и выпустил. Это Daniil Frumin. Я отошел от разработки hastache просто по причине отсутствия у меня активных проектов с его использованием, а людям надо, кто-то пользуется, вот Daniil и попросился на эту роль. Теперь у меня такое странное чувство по этому поводу. С одной стороны приятно, что там что-то такое написал, а вот теперь оно совсем своей жизнью зажило. С другой стороны, эх времени бы мне немного свободного, сесть и переписать все совсем по другому, по правильному, API можно еще немного обобщить, парсер переписать...
Доступ к элементам списка по номеру в Hastache
Это конечно очень приятно когда что-то полезное делаешь. Пользователей Hastache в мире может и не очень много, но они точно есть. Вот недавно Christiaan Baaij прислал сообщение о функции которая есть во многих реализациях шаблонизатора Mustache, а в Hastache нет. Это обращение к элементам списка по номеру, т.е. как-то так:
|
|
Полезная штука, мне ни разу пока не пригодилась (поэтому и не сделал), однако легко можно придумать ей применение и кому-то такое точно понадобится.
Пользоваться так:
|
|
Результат:
|
|
Примеры использования Hastache
Выложил примеров для hastache: README.md (этот файл, кстати, хасташем же и собирается — mkReadme.hs). Эти же примеры россыпью файлов: examples.
Hastache растёт и развивается
Новости хасташестроения:
Во-первых, Akaspin прислал полезный патч, позволяющий с помощью mkGenericContext создавать контексты для типов с полями MonadIO m => (Byte)String -> m (Byte)String, за что ему выдаётся очередной плюс в карму. Сам я о такой возможности думал, но не осилил, ура опенсорсу. Пример использования тут.
Во-вторых, я обобщил конструктор MuLambda до MuVar a => MuLambda (ByteString -> a), раньше можно было только ByteString возвращать, а теперь любой тип, для которого есть инстанс класса MuVar. Удобно, как-то я раньше не сообразил так сделать.
В-третьих, Сам Bryan O'Sullivan (один из авторов книги Real World Haskell), прислал небольшой патч для hastache и посоветовал использовать blaze-builder для записи результата работы шаблонизатора. Blaze-builder предназначен для генерации Lazy ByteString с контролем минимального размера фрагментов этой строки. За счет этого достигается существенное увеличение скорости дальнейшей работы с этой строкой. Вместо кучи мелких блоков (а именно так и получается при работе hastache), имеем несколько крупных, которые, к примеру, по сети уедут быстрее (за счет минимизации количества системных вызовов). Так что теперь и обычный результат hastache состоит из удобных крупных блоков внутри Lazy ByteString, и, также, можно получить непосредственно объект Builder библиотеки blaze-builder и дальше уже работать прямо с ним.
Hastache — вложенные контексты
Akaspin зарепортил один неприятный баг в hastache, за что ему выражается всяческая благодарность с занесением в карму. Проблема заключалась в том, что достаточно часто нужно иметь возможность обратиться из вложенного блока шаблона к переменной определенной где-то выше в иерархии контекстов. В оригинальном Mustache такая функция есть, а я это дело благополучно проворонил. Исправляюсь. Можно почитать подробности, и посмотреть ещё один пример из тестов.
Новая версия hastache
Выложил новую версию шаблонизатора hastache. Добавил возможность генерировать контекст из типов содержащих функции типа String -> String и ByteString -> ByteString. Смотрите пример использования кому интересно.
Hastache — реализация Mustache для Haskell
Довел до ума и выложил в open source свою реализация шаблонизатора Mustache, на которой, в частности, крутится сайт с которого вы это сейчас читаете.
Взять можно либо на GitHub, либо из HackageDB:
Шаблоны Mustache
Mustache — библиотека минималистичных шаблонов изначально реализованная для Ruby Крисом Ванстрасом (между прочим CEO и один из основателей GitHub). Минимализм Mustache выражается в том, что там нет управляющих конструкций вроде if и else. Циклов там тоже нет, есть только теги. Некоторые теги заменяются простыми значениями, некоторые заменяются сериями значений, показ содержимого других зависит от определенных условий. Несмотря на весь аскетизм своего синтаксиса, Mustache является мощным и полноценным движком шаблонов.
Вдохновителями Mustache послужили ctemplate и et.
Сейчас существуют реализации Mustache для огромного количества языков. Необходимо учитывать что на разных языках нюансы работы будут немного отличатся. Я сделаю обзор без привязки к конкретному языку, однако данные для примеров буду писать на JSON, т. к. думаю он всем понятен, и кроме всего прочего используется в документации к Mustache.