Проекты GitHub SourceForge |
Проекты /
HTMLTemplateHTML Template- простой HTML шаблонизатор на C Когда-то давно мне вдруг понадобился простой HTML шаблонизатор для какой-то своей программки на C. Как это ни странно, но в opensourse а такового не нашел. Было что-то на С++ и что-то входившее в огромный пакет с библиотеками, но чего-то очень маленького и простого не было. Поэтому я решил написать его сам. Но писал я это долго, а от программы, для которой я это придумывал вообще пришлось отказаться... В общем, то что в итоге получилось вроде работает на тестах, но ни на скорость ни на надежность я это не тестировал. Тестируйте, типа, сами :) Как с этим работать.Hello, world!Начнем с небольшого примера, который покажет, как это вообще работает. hello.html <html> <body> <TMPL_VAR NAME="hello_var"> </body> </html> hello.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include "htmltpl.h" int main(int argc, char *argv[]) { struct tpl *tpl; struct enviroment *env; struct variable *root, *var; int err; /* создаем пустой шаблон */ tpl = tpl_create(); if(tpl == NULL) { fprintf(stderr, "Can't create pattern: %s\n", strerror(errno)); return -1; } /* загружаем шаблон из файла */ err = tpl_parse_file(tpl, "hello.html"); if(err) { fprintf(stderr, "can't load pattern %s: %s\n", TEST_TEMPLATE_FILENAME, tpl_error(tpl)); return err; } /* берем среду переменных шаблона */ env = tpl_get_enviroment(tpl); /* берем корневой HASH среды переменных шаблона */ root = enviroment_get_root(env); /* добавляем в корневой HASH переменные */ variable_hash_set(root, "hello_var", variable_scalar(env, "Hello, World!"), NULL); /* проверяем, не было ли в момент добавления переменных каких-либо ошибок */ err = enviroment_errno(env); if(err == 0) { /* если ошибок не было: выводим готовый документ */ tpl_output(tpl, stdout); } else { /* если ошибки были: выводим сообщение об ошибке */ fprintf(stderr, "failed to set enviroment: %s\n", strerror(err)); } /* освобождаем память из-под шаблона */ tpl_release(tpl); return 0; } И так, шаблон. Шаблон представляет собой простой текстовой файл (хотя, и не обязательно текстовой), в котором встречаются инструкции вида <TMPL_ЧТОТОТАМ> или </TMPL_ЧТОТОТАМ>. Как и HTML тэги, первая инструкция может быть либо единственной, либо открывающей, в то время, как вторая - только закрывающей. Например: <TMPL_VAR NAME="hello_var"> заставляет шаблонизатор поменять эту инструкцию на значение переменной hello_var, а <TMPL_IF NAME="loop"> идет только в паре с </TMPL_IF> и показывает заключенное между ними содержимое, если задана переменная loop. Сами инструкции должны быть написаны только в верхнем регистре латинскими буквами. Посмотрим на С исходник hello.c. Первое, что мы видим - это подключаемый заголовочный файл htmltpl.h. Для чего он там нужен, думаю, догадаться не сложно. Далее, вызовом функции tpl_create() мы создаем пустой объект шаблона tpl'. Поскольку, на данный момент tpl ничего в себе не содержит, нужно загрузить в него шаблон из файла с помощью функции tpl_parse_file(). Теперь, нужно каким-нибудь образом сообщить объекту tpl, что мы хотим сопоставить переменной по имени hello_var строку: "Hello, World!". Переменные шаблона хранятся в специальном месте, называемое: "среда переменных", указатель на которое можно получить с помощью функции tpl_get_enviroment(). В среде переменных могут храниться переменные следующих типов: скаляр (текстовая строка), хэш и список. Хэш сам по себе не интересен и используется только для доступа к другим переменным по именам. В среде переменных есть специальный главный корневой хэш, который содержит все переменные, назначенные шаблону. Синтаксис шаблона.Когда создавалась эта библиотека, за пример был взят Perl'овый модуль HTML::Template, поэтому синтаксис весьма напоминает принятый в этом модуле. Всего имеются следующие типы конструкций:
ПеременныеПеременная задается конструкцией <TMPL_VAR NAME="var_name"> и при выводе шаблона заменяется на значение переменной var_name. Здесь все просто. УсловияПоказать или скрыть блок, в зависимости от того, установлена ли соответствующая переменная. Условие задается конструкцией: <TMPL_IF NAME="var_name">Что-то там</TMPL_IF> или <TMPL_IF NAME="var_name">Что-то там<TMPL_ELSE>Что-то там иначе</TMPL_IF>. При выводе шаблона проверяется, задана ли переменная var_name. Если она задана, то выводится блок "Что-то там" между <TMPL_IF> и </TMPL_IF>, или <TMPL_IF> и </TMPL_ELSE>. Если переменная не установлена, и имеется тэг <TMPL_ELSE> то выводится блок "Что-то там иначе" между <TMPL_ELSE> и </TMPL_IF>. Здесь тоже все просто. ЦиклыФайлы.
|