Использование шаблонизатора Pebble #
Веб-приложения формируют HTML-документы для показа пользователям. Данные документы динамически формируются на стороне сервера. Некоторые части этих документов не изменяется: навигационное меню, заголовки, подключение внешних файлов и т.д. Другая часть обычно содержит повторяющиеся элементы: списки элементов, таблицы и т.д. Эти данные обычно зависят от тех данных, которыми управляет приложение.
Для того, чтобы выполнять шаг генерации HTML-документов было удобнее, на стороне сервера применяются специальные инструменты — шаблонизаторы. В задачу любого шаблонизатора входит формирование строки на основании шаблона и конфигурации. Конкретные инструменты отличаются друг от друга возможностями и способом описания самих шаблонов, их синтаксисом.
Шаблоны обычно представляют собой обычные файлы на жёстком диске, содержащие текст на целевом языке (в нашем случае на HTML), а также управляющие конструкции на языке шаблона.
Шаблонизаторы предоставляют средства для обработки поступающих данных:
- Вставка данных в шаблон.
- Обход списков.
- Выполнение условной логики в зависимости от данных.
- Фильтрация данных.
Шаблоны также могут быть разделены между несколькими файлами и иметь сложную структуру.
В рамках данного курса будет рассмотрен шаблонизатор Pebble, т.к. он реализует синтаксис, который используется в популярных шаблонизаторах для других платформ Twig(PHP) и Jinja(Python). Вы можете использовать русскоязычные ресурсы по Twig и Jinja для ознакомления с базовым синтаксисом шаблонизатора Pebble.
Документация #
- Официальный сайт шаблонизатора Pebble
- Общий синтаксис шаблона jinja2 в Python
- Русскоязычная документация по Twig
Постановка задачи #
Разработайте консольное приложение, которое будет брать информацию о списке треугольников из JSON-документа и создавать набор HTML-документов, предоставляющий информацию о треугольниках в формате, удобном обычному пользователю.
Предлагаемый формат входного JSON-документа:
[
{ "sideA": 5.0, "sideB": 4.0, "sideC": 3.0},
{ "sideA": 6.2, "sideB": 4.5, "sideC": 5.6}
]
После запуска приложения должен появится каталог с названием portal
, содержащий следующие документы:
- Файл
index.html
, содержащий краткую справку о всём портале. На странице должно отображаться количество треугольников, о которых известно приложению. - Файл
triangles.html
, содержащий список треугольников в краткой форме. В рамках списка достаточно вывести информацию по порядковому номеру, периметру и ссылки на документ с полной информацией о треугольнике. - Каталог
triangles
, который будет содержать отдельные файлы для каждого треугольника. - Файлы
triangles/triangles-1.html
,triangles/triangles-2.html
и т.д. по одному на каждый известный треугольник. На каждом файле должна выводиться детальная информация по треугольнику: длины его сторон, периметр и площадь. - Каталог
css
, содержащий CSS-файлы. - Каталог
js
, содержащий JavaScript-файлы CSS-фреймворка.
На каждой странице должна находится общая навигационная панель, на которой должны находится ссылки к стартовому файлу, index.html
, и к списку треугольников triangles.html
.
Необходимо обеспечить оформление элементов с помощью CSS-фреймворка.
Приложение должно корректно работать, если каталог portal
не существует в момент старта приложения.
Шаг № 1. Считывание данных из JSON-документа #
- Добавьте в приложение Jackson-библиотеку для работы с Kotlin.
- Сформируйте список треугольников в файле
triangles.json
. - Создайте класс
Triangle
, содержащий три вещественных поляsideA
,sideB
иsideC
. - Считайте данные из JSON-документа.
- Преобразуйте считанную строку к списку объектов-треугольников:
List<Triangle>
.
Шаг № 2. Создание целевого каталога #
Каталог portal
должен создаваться приложением каждый раз при запуске
- Необходимо создать каталог
portal
. - Необходимо скопировать каталог
css
, содержащий CSS-файлы фреймворка, в каталогportal
. - Необходимо скопировать каталог
js
, содержащий JavaScript-файлы фреймворка, в каталогportal
.
Шаг № 3. Добавление шаблонизатора Pebble #
Для подключения библиотеки Pebbletemplates необходимо в файле build.gradle
в разделе dependencies
добавить следующую строку:
implementation 'io.pebbletemplates:pebble:3.2.2'
При добавлении библиотеки старайтесь всегда выбирать актуальные выпуски, не содержащие критических уязвимостей. Для поиска последней версии можно воспользоваться, напирмер mvnrepository.com
Укажите, что в ресурсах проекта src/main/resources
будут находится шаблоны HTML-документов согласно официальной документации.
Шаг № 4. Создание базовой раскладки #
В каталоге src/main/resources
создайте файл Layout.peb
. Данный файл должен содержать элементы, общие для всех страниц:
- Указание типа документа.
- Заголовок с подключением CSS-файлов CSS-фреймворка.
- Тело документа с подключением JS-файлов CSS-фреймворка.
- Общая навигационная панель.
- Место для добавления содержимого наследуемых шаблонов.
Шаг № 5. Стартовая страница #
В каталоге src/main/resources
создайте файл Home.peb
. Данный файл должен содержать в себе шаблон стартовой страницы. Данный шаблон должен быть унаследован от файла-раскладки Layout.peb
.
Единственный динамический элемент — количество треугольников в системе. Далее будем считать, что данные передаются в переменной triangleCount
.
Создайте объект-шаблонизатора io.pebbletemplates.pebble.PebbleEngine
. Данный объект будет использоваться далее всеми создаваемыми функциями.
Создайте функцию по созданию стартовой страницы приложения. В качестве аргументов данная функция должна принимать:
- Объект PebbleEngine.
- Количество треугольников.
Внутри данной функции необходимо создать файл index.html
в каталоге portal
:
- Сформировать словарь с данными для передачи внутрь шаблона. Единственной парой будет строка
triangleCount
, которой соответствует переданное в качестве аргумента число. - Создать объект-шаблон. Для этих целей используйте метод
getTemplate
объектаPebbleEngine
. - Открыть файл
index.html
на запись в него данных. - Записать результат применения шаблона к сформированным данным. Для применения используйте функцию
evaluate
. - Закрыть файл
index.html
. - Вызвать данную функцию внутри функции
main
, передав ей нужные аргументы.
Шаг № 6. Страница со списком треугольников #
В каталоге src/main/resources
создайте файл TrianglesList.peb
. Данный файл должен содержать в себе шаблон страницы со списком треугольников. Данный шаблон должен быть унаследован от файла-раскладки Layout.peb
.
Единственный динамический элемент шаблона — список периметров треугольников. Для прохода по списку треугольников используйте тег for
. Обратите внимание, что внутри тела данного тега можно обратиться к переменной loop.index
, которая будет содержать порядковый номер элемента.
Используйте номер элемента в списке, чтобы сформировать путь к файлу с детальным описанием треугольника: portal/triangles/triangle-{{loop.index}}.html
.
Создайте функцию по созданию файла со списком треугольников. В качестве аргументов данная функция должна принимать список треугольников и объект PebbleEngine.
- Создайте список сторон треугольников. Для этого удобно воспользоваться функцией
map
над списком треугольников. Логику по вычислению периметра логично разместить внутри классаTriangle
. - Сформируйте данные для передачи внутрь шаблона.
- Сформируйте строку с HTML-документом списка треугольников.
Убедитесь, что пользователь может корректно переходить между стартовым файлом и списком треугольников.
Шаг № 7. Страницы с детальной информацией о треугольнике #
В каталоге src/main/resources
создайте файл Triangle.peb
. Данный файл должен содержать в себе шаблон страницы с детальной информацией о треугольнике. Данный шаблон должен быть унаследован от файла-раскладки Layout.peb
.
Шаблон принимает в качестве аргумента два объекта: объект типа Triangle и порядковый номер треугольника. Внутри шаблона используйте методы класса для получения информации по всем параметрам треугольника: длины сторон, периметр и площадь.
Создайте функцию по созданию страниц с детальной информацией о треугольнике. Данная функция должна принимать в качестве аргументов список треугольников и объект PebbleEngine. Внутри данной функции:
- Создайте объект-шаблон для формирования содержимого HTML-документа.
- Пройдите в цикле по переданному массиву треугольников. Далее для каждого элемента в массиве выполните следующие шаги.
- Сформируйте данные для передачи в шаблон: треугольник и порядковый номер.
- Запишите результат применения шаблона к данным приложения.
В результате данной операции все файлы, написанные в задании, должны успешно создаваться.
Для решения проблемы подключения CSS и JS-файлов CSS-фреймворка воспользуйтесь блоками и указанием их содержимого при наследовании шаблона.