Recent Changes - Search:

Главная страница

Загрузки

Домашний WiFi роутер

Проекты

Статьи

Брошенные проекты

GitHub

SourceForge

edit SideBar

HTMLTemplate

HTML 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>. Здесь тоже все просто.

Циклы

Файлы.

Edit - History - Print - Recent Changes - Search
Page last modified on June 01, 2012, at 12:38 PM