Шаблонизатор статических страниц.

Термин "шаблонизатор" знаком наверное каждому WEB-программисту. Но что делать когда у нас нет возможности использовать PHP/Perl/Ruby/пр. на хостинге. Так, например, хостинг Народ.ру, которым я пользуюсь, позволяет размещать только статические страницы, без поддержки даже так называемого SSI. Конечно можно воспользоваться всякими монструозными студиями, или править каждый файл в ручную (ага, добавьте хотя бы ссылку в десятка 3 файлов). Но я пошел другим путем, и написал свой шаблонизатор статических страниц.

Почему своё?

Как уже упоминалось, существуют готовые средства для создания WEB-сайтов и их использование предпочтительнее (удобнее, больше возможностей). Но меня они не устраивают по причинам требования установки, лицензии, используемых ресурсов и пр.

Мне требуется переносимая средство разработки, что бы я не зависил от конкретного компьютера (например, только на домашнем компьютере установлена требуемая среда). Ведь этот определенный компьютер может и сломаться, или просто быть недоступен в данный момент времени.

Требуется что бы средство занимало немного места на носителе. Предполагается что все необходимое я буду иметь на своей флешке. А таскать с собой отдельную флешку для сайта, либо забить её на половину не лучший выбор. Но при этом надо сохранить максимальную простоту работы. Ибо проходить квест из 10 пунктов и печататью 15 команд в консоли для исправления одной опечатки вполне отвратительное решение.

Полезной, но не обязательной, будет кроссплатформенность. Хотя я и работаю в одной ОС, но кто знает, когда я захочу сменить систему. Не хочеться остаться без возможности обновить сайт, только из-за того что я поставил PuppyLinux, например.

Обязательным фактором так же является бесплатность и лицензионная "чистота".

Ну и в завершении, желание заняться чем-то для души. Попрактиковаться в программировании, написании скриптов. Узнать что-то новое.

Реализация

Шаблонизатор написан на языке Lua полностью в одном файле templv03.lua. Реализовация методом последовательной замены блоков в файле шаблона. Для работы требыется сам файл скрипта, файл проекта сайта, один или несколько файлов шаблона, и файлы наполнения.

Файл проекта

Файл проекта, по умолчанию применяется имя site.alt, по структуре похож на ini-файл. Разберем его формат на примере:

debug=TRUE

[Main]
# Имя файла шаблона
template=site.tpl
# Директория файлов исходников
src_dir=
# Директория для файлов результатов
out_dir=../site/

[Vars]
# Список глобальных переменных в формате:
#	name = value
# 1. Пробельные сиволы в начале строки, в конце строки и вокруг символа равенства игнорируются
# 2. Имя переменной (name) может содержать только латинские буквы и символ подчеркивания
# 3. Значение переменной (value) может содержать любые символы с поправкой на п.1 (пробелы в начале и конце быдут отброшены)
home=http://localhost/
name=Мой сайт
#title=Закомментированная переменная не будет установлена

[Files]
# Список файлов для обработки в одном из форматов
#	destination_subpath = source_subpath
#	subpath
# Второй формат для случая когда исходный и конечный внутренние пути совпадают.
# Пути исходный и конечный задается относительно значений src_dir и out_dir из секции [Main], соответственно.
index.html
about.html

[Vars]
# Имя навигационной панели
_NAVIGATE=lpc/nav.html

[Files]
# Список файлов для обработки
sub/path1.html
sub/path2.html=other/name.html

[Vars]
# Имя навигационной панели
_NAVIGATE=

[Files]
# Список файлов для обработки
path3.html

Любой текст идущий после символа # и до конца строки считается комментарием и игнорируется (вместе с пробелами ему предшествующими). Это позволяет писать в файле проекта поясняющий текст, как в отдельных строках, так и в конце строк с параметрами. Правда так же делает невозможным указание символа # в составе значений параметров.

Строки, начинающиеся с зимвола [ и завершающиеся символом ] (без учета комментарием и пробелов) считаются определением новой секции.

Все остальные строки являются параметрами последней определенной секции. Обычно имеют вид параметр=значение, за исключением секции [Files] (см.ниже). Если параметр не задан, то его значение не меняется.

С начала файла идет "секция без имени", в ней возможен только один параметр debug управляющий выводом отладочной информации. Значение "TRUE" или 1 включает вывод, любое другое отключают. Вывод достаточно скудный, но помогает обнаружить некоторые ошибки.

Секция [Main] содержит основные настройки для работы шаблонизатора. Допустимые параметры с описанием приведены в примере.

Секция [Vars] содержит определяемые вами "переменные", которые могут быть использованы для подстановки значений в файлах шаблонов/содержимого.

Секция [Files] содержит перечень файлов, подлежащих обработке. Строки секции содержат относительные пути к целевому и исходному файлам соответственно (относительно путей исходных файлов и пути назначения). Это единственная секция, где учитытваются строке без символа равенства - считается что пути совпадают.

Секции (за исключением "секции без имени") могут чередоваться в произвольном порядке и в произвольном количестве.

Обработка

Для каждого файла из секции [Files] выполняется серия подстановок.

В первую очередь если определен файл шаблона, то в шаблон будет подставляется данные исходного файла содержимого взамен текста {body}, и полученный результат будет обрабатываться далее. Если же шаблона нет, то обрабатывается только файл содержимого.

  1. Вместо будет подставлено содержимое файла, путь к которому (относительно дирректории исходных файлов) задан в пользовательской переменной _NAVIGATE.
  2. Текст вида <!--имя_переменной=значение переменной--> удаляется и создается пользовательская переменная с заданным именем и значением. Правила формирования те же что и в секции [Vars].
  3. Текст вида {имя_переменной=значение переменной} удаляется и создается пользовательская переменная с заданным именем и значением. Правила формирования те же что и в секции [Vars].
  4. Если пользовательская переменная title не задана, то она создается со значеним, содержащемся между тегами языка HTML <H3>, если таковой имеется.
  5. Текст вида {$имя_переменной} заменяется на значение соответствующей пользовательской переменной. Если таковая не задана, то произойдет ошибка.
  6. Текст ида {$имя_переменной=альтернативное значение} заменяется на значение соответствующей пользовательской переменной. Если таковая не задана, то используется альтернативное значение (может быть пустым). Предназначено для исключения ошибок при подстановке переменных.
  7. Текст в тегах <code> заключается в теги <pre>. Обусловлено необходимостью вывода кода как преформатированного, для нормального отображения на странице.
  8. HTML тегам заголовков <h1>, <h2>, <h3>,... подставляется тег <span>. Обусловлено применяемой на сайте CSS-схемой.
  9. Тег <cut> заменяется на якорь <a name="cut" ></a>.
  10. Тег <video>http://www.youtube.com/watch?v=символы<video> заменяется на код встраивания проигрывателя от YouTube для соответствующей ссылки. Для упрощения встройки видео.
  11. Текст вида подвергается обработке, которю не буду описывать. Предназначалось для вывода большого количества данных в едином формате, но реализация не лучшая и не используется на данный момент. Реализацию смотрите в коде.
Полученный после указанных шагов результат сохраняется в выходной файл. Путь к файлу должен существовать (должны быть сосданы все папки из пути, сам файл не обязательно), иначе получим ошибку.

Пример будет позже

Как видите, реализация достаточно кривая, и тяжела для понимания с наскока. К сожалению лучше описать не получилось. Для облегчения позже добавлю пример небольшого сайта, который вы можите скачать и посмотреть самостоятельно.

Файлы: templv03.lua

Hosted by uCoz