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