Шаблоны Mustache
Mustache — библиотека минималистичных шаблонов изначально реализованная для Ruby Крисом Ванстрасом (между прочим CEO и один из основателей GitHub). Минимализм Mustache выражается в том, что там нет управляющих конструкций вроде if и else. Циклов там тоже нет, есть только теги. Некоторые теги заменяются простыми значениями, некоторые заменяются сериями значений, показ содержимого других зависит от определенных условий. Несмотря на весь аскетизм своего синтаксиса, Mustache является мощным и полноценным движком шаблонов.
Вдохновителями Mustache послужили ctemplate и et.
Сейчас существуют реализации Mustache для огромного количества языков. Необходимо учитывать что на разных языках нюансы работы будут немного отличатся. Я сделаю обзор без привязки к конкретному языку, однако данные для примеров буду писать на JSON, т. к. думаю он всем понятен, и кроме всего прочего используется в документации к Mustache.
Теги
Тегом называется некоторая последовательность символов заключенная в двойные фигурные скобки {{это_тег}}. Идентификатором того, чем является конкретный тег является первый символ после {{. Существует возможность переопределить открывающую и закрывающую последовательность символов со скобок на что-нибудь другое.
Комментарии
Последовательность начинающаяся с «!» считается комментарием.
Шаблон:
|
|
Результат:
|
|
Переменные
Самый простой тип тега. Встретив {{name}} Mustache отобразит значение переменной name из текущего контекста. Значения переменных отображаются HTML-безопасным образом, т. е. все значимые HTML символы заменяются на их кодированные эквиваленты. Для отображения HTML-строк без изменений используются теги {{{name}}} и .
Шаблон:
|
|
Контекст:
|
|
Результат:
|
|
Секции
Секцией называется блок, открывающийся тегом {{#название_секции}} и закрывающийся тегом {{/название_секции}}. Отображение содержимого секции зависит от того, какой тип и значение имеет переменная с именем «название_секции».
Показ секции в зависимости от условий
Секция отображается, если соответствующая её переменная имеет булевый тип и её значение равно True, либо эта переменная является непустым списком.
Инвертированной секцией называется секция открывающаяся тегом {{^название_секции}}. Она имеет инверсные правила отображения. Содержимое отображается когда переменная имеет булевый тип и значение False, либо когда переменная является пустым списком.
Шаблон:
|
|
Контекст:
|
|
Результат:
|
|
Списки
Если секции соответствует список, то секция отображается для каждого элемента этого списка. При этом контекстом для отображения содержимого секции становится очередной элемент.
Шаблон:
|
|
Контекст:
|
|
Результат:
|
|
В некоторых реализациях (JavaScript например), есть возможность отобразить список значений базовых типов (строк, чисел), указав в качестве имени переменной {{.}}.
Шаблон:
|
|
Контекст:
|
|
Результат:
|
|
Функции
Секции может соответствовать функция. В этом случае содержимое секции передается в эту функцию, после чего отображается результат её работы.
Шаблон:
|
|
Контекст:
|
|
Результат:
|
|
Включение внешних файлов
Тег вида заменяется содержимым файла имя_файла (или имя_файла.mustache), к которому применяется текущий контекст.
Изменение ограничителей тегов
Можно изменить ограничители тегов с {{}} на другую последовательность символов, не содержащую пробелы и символ «равно».
Шаблон:
|
|
Контекст:
|
|
Результат:
|
|