Использование шаблонизатора Pebble #
Веб-приложения формируют HTML-документы для показа пользователям. Данные документы динамически формируются на стороне сервера. Некоторые части этих документов не изменяется: навигационное меню, заголовки, подключение внешних файлов и т.д. Другая часть обычно содержит повторяющиеся элементы: списки элементов, таблицы и т.д. Эти данные обычно зависят от тех данных, которыми управляет приложение.
Для того, чтобы выполнять шаг генерации HTML-документов было удобнее, на стороне сервера применяются специальные инструменты — шаблонизаторы. В задачу любого шаблонизатора входит формирование строки на основании шаблона и конфигурации. Конкретные инструменты отличаются друг от друга возможностями и способом описания самих шаблонов, их синтаксисом.
Шаблоны обычно представляют собой обычные файлы на жёстком диске, содержащие текст на целевом языке (в нашем случае на HTML), а также управляющие конструкции на языке шаблона.
Шаблонизаторы предоставляют средства для обработки поступающих данных:
- Вставка данных в шаблон.
- Обход списков.
- Выполнение условной логики в зависимости от данных.
- Фильтрация данных.
Шаблоны также могут быть разделены между несколькими файлами и иметь сложную структуру.
В рамках данного курса будет рассмотрен шаблонизатор Pebble, т.к. он реализует синтаксис, который используется в популярных шаблонизаторах для других платформ Twig(PHP) и Jinja(Python). Вы можете использовать русскоязычные ресурсы по Twig и Jinja для ознакомления с базовым синтаксисом шаблонизатора Pebble.
Документация #
- Официальный сайт шаблонизатора Pebble
- Общий синтаксис шаблона jinja2 в Python
- Русскоязычная документация по Twig
Задача #
С использованием шаблонизатора Pebble разработайте приложение, которое создаёт связный набор HTML-файлов с информацией о расписании занятий. Файлы должны создаваться на основании конфигурации, которая описана внутри исходного кода приложения. Таким образом после изменения конфигурации должен формироваться соответствующей ей набор HTML-файлов.
Набор HTML-документов #
- Стартовая страница. На странице находятся:
- краткое описание данного ресурса.
- блок навигации, включающий ссылки на стартовую страницу, страницу со списком предметов, страницу с расписанием.
- Страница со списком курсов. На странице находятся:
- блок навигации,
- список названий курсов с ссылками на страницы с детальной информацией.
- Для каждого курса из конфигурации формируется отдельная страница. На странице находятся:
- блок навигации,
- ссылка для возвращения к странице списка предметов,
- детальная информация по курсу, включающая:
- название,
- ФИО преподавателя,
- расписание занятий по предмету.
- Страница с расписанием. На странице находятся:
- блок навигации,
- список дней недели,
- для каждого дня недели список занятий.
Требования к реализации #
- Для оформления страниц сайта используйте CSS-фреймворк. Рекомендуется использовать Foundation.
- Для разработки страниц с динамическим содержимым используйте шаблонизатор Pebble.
- В рамках данной работы «динамическое» содержимое будет зафиксировано в исходном коде приложения.
- При запуске приложения HTML-документы должны быть созданы заново.
Шаблонное приложение #
Для того, чтобы можно было сфокусироваться на изучении синтаксиса шаблонизатора Pebble, был разработано приложение. Данное приложение выполняет следующие действия:
- Формирует список данных для описания расписания.
- Подключает библиотеку Pebble.
- Создаёт объект движка Pebble.
- В качестве примера берёт шаблон
templates/some.peb
и формирует строку на основе данного шаблона. Сформированную строку выводит на стандартный поток вывода.
Приложение состоит из следующих классов:
Course
— описание курса, включающее уникальный идентификатор, название курса, ФИО преподавателя и краткое описание.ScheduleItem
— описание одного элемента расписания, включающего идентификатор курса, номер аудитории, день недели и время.ScheduleInfo
— объект, позволяющий сохранять списки объектов расписания и курсов.Main
— псевдокласс, содержащий в себе реализацию логики всего приложения.
Внутри класса Main
реализованы следующие функции:
formSchedule
— формирует набор данных для визуализации.configureEngine
— настраивает движок Pebble для работы.generateDataFromSomePeb
— формирует строку из шаблонаtemplates/some.peb
и выводит получившееся содержимое на стандартный поток вывода.main
— связывает все методы друг с другом, является точкой входа в приложение.
Исходные коды приложения можно скачать по ссылке.
Предлагаемый подход к реализации #
- Скачайте исходные коды шаблонного приложение. Распакуйте данный каталог. Откройте его в среде разработки IDEA.
- Запустите приложение и убедитесь, что оно выводит информацию из файла
templates/some.peb
на стандартный поток вывода. Для запуска приложения используйте задачуrun
системы сборки Gradle. Документация по работе с Gradle. - Разберитесь в механизме вывода информации из файла-шаблона
templates/some.peb
на стандартный поток вывода средствами приложения. Модифицируйте шаблон таким образом, чтобы он:- Выводил всю информацию на отдельных строках из передаваемого объекта, описывающего расписание.
- Выводил всю информацию на отдельных строках из передаваемого объекта, описывающего курс.
- Создайте каталог
site
в корневом каталоге исходных кодов приложения (рядом с каталогамиsrc
иtemplates
). - Поместите в данный каталог файлы CSS-фреймворка.
- Модифицируйте файл
index.html
так, чтобы он соответствовал требованиям к стартовой странице. - Создайте файл
site/course.html
, который содержит информацию о курсе «Прикладная физическая культура» согласно заданию. - Перенесите содержимое
site/course.html
в файл-шаблонtemplates/course.peb
. - Модифицируйте шаблон таким образом, чтобы он выводил информацию из следующих переменных:
course
, тип данныхCourse
.schedule
, тип данныхList<ScheduleInfo>
.
- В классе
Main
создайте новую функциюgenerateCourseFile
. Данная функция должна создавать HTML-документ, описывающий 1 курс. - Данная функция должна принимать в качестве аргументов:
- Объект класса
PebbleEngine
. - Объект класса
ScheduleInfo
. - Объект класса
Course
, для которого необходимо сформировать страницу.
- Объект класса
- Внутри функции необходимо:
- Инициализировать объект
Template
на основании файла-шаблона. - Сформировать наборы данных, которые необходимы шаблону для отображения.
- Сформировать контекст для обработки шаблона.
- Сформировать объект
FileWritter
для записи результата обработки шаблона в файлsite/course/<id>.html
. Где вместо<id>
следует использовать уникальный идентификатор курса. - Применить шаблонизатор для вывода строки в файл.
- Инициализировать объект
- Вызовите данную функцию из функции
main
, передав в качестве объектаCourse
первый элемент из списка курсов. - В классе
Main
создайте функциюgenerateAllCourcesFiles
. Данная функция должна вызывать функциюgenerateCourseFile
для всех курсов в списке данных. - В классе
Main
создайте функциюgenerateCoureListFile
. Данная функция должна создавать файлsite/couces.html
, содержащий список курсов с ссылками на файлы курсов, которые были созданы функциейgenerateAllCourcesFiles
. - В классе
Main
создайте функциюgenerateSchedule
. Данная функция должна создавать файлsite/schedule.html
, в котором необходимо отобразить расписание. В ячейках расписания расположите ссылки на файлы с конкретным расписанием.