Статьи

Документация

Дополнительно

Шаблонизатор Pug

Шаблонизатор (stappler_webserver_pug) использует формат Pug. Использует интерфейс пулов памяти.

Не поддерживается наследование шаблонов в любом виде. Все остальные функции поддерживаются с ограничением в виде отсутсвия Javascript (доступны только простейшие операции).

Для работы создаётся кеш шаблонов pug::Cache (вебсервер предоставляет его как часть хоста web::Host). После, в него добавляются шаблоны и файлы, которые могут клчаться шаблонами (см. tests/common/src/PugTest.cpp).

    _cache = new (p) pug::Cache(pug::Template::Options::getDefault(), [&] (StringView err) {
        onError(err);
    });

    _cache->addContent(StringView("include.css"), s_cssData.str<mem_pool::Interface>());
    _cache->addTemplate(StringView("include1.pug"), s_templateData1.str<mem_pool::Interface>());
    _cache->addTemplate(StringView("include2.pug"), s_templateData2.str<mem_pool::Interface>(), opts);

    _cache->addTemplate(StringView("err1.pug"), s_err1.str<mem_pool::Interface>());
    _cache->addTemplate(StringView("err2.pug"), s_err2.str<mem_pool::Interface>());

При запуске шаблона нужно заполнить объект pug::Context текущими данными:

    _cache->runTemplate(path, [] (pug::Context &exec, const pug::Template &) {
        pug::VarClass serenityClass;
        serenityClass.staticFunctions.emplace("prettify", [] (pug::VarStorage &, pug::Var *var, size_t argc) -> pug::Var {
            if (var && argc == 1) {
                return pug::Var(Value(data::toString(var->readValue(), true)));
            }
            return pug::Var();
        });
        serenityClass.staticFunctions.emplace("timeToHttp", [] (pug::VarStorage &, pug::Var *var, size_t argc) -> pug::Var {
            if (var && argc == 1 && var->readValue().isInteger()) {
                return pug::Var(Value(Time::microseconds(var->readValue().asInteger()).toHttp<Interface>()));
            }
            return pug::Var();
        });
        serenityClass.staticFunctions.emplace("uuidToString", [] (pug::VarStorage &, pug::Var *var, size_t argc) -> pug::Var {
            if (var && argc == 1 && var->readValue().isBytes()) {
                return pug::Var(Value(memory::uuid(var->readValue().getBytes()).str()));
            }
            return pug::Var();
        });
        ctx.set("serenity", std::move(serenityClass));
        ctx.set("window", Value{
            pair("location", Value({
                pair("href", Value(toString(getFullHostname(), info.unparserUri))),
                pair("hostname", Value(info.url.host)),
                pair("pathname", Value(info.url.path)),
                pair("protocol", Value(_config->isSecureConnection() ? "https:" : "http:")),
            }))
        });
        return true;
    }, [&] (StringView str) {
        std::cout << str;
    });

Опции шаблона pug::Template::Options определяют параметры работы шаблонизатора. Режим Pretty заставляет выводить человекочитаемый код.