打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C 好用的文本模板库 -- Inja

背景

概述

在 C++ 开发中,我们经常需要处理文本模板,并根据特定的数据进行动态替换。为了简化这一过程并提高代码的可维护性,Inja 库应运而生。

Inja

Inja 是用 Json 为前端的模板引擎,基于 nlohmann/json 库。它允许你使用 Json 数据轻松渲染字符串模板,它提供了一套简洁而强大的 API,使得在 C++ 中进行进行动态字符串替换变得轻而易举、可以更高效地进行模板化处理。

Inja

概述

Inja 是一个轻量级的 C++ 库,用于处理文本模板的渲染和替换。

主要特性

  • 轻量级:它是一个头文件为主的库,这意味着集成起来很容易。
  • 完全支持 Json:由于依赖于 nlohmann/json 库,inja 对 Json 数据的支持很完整。
  • 现代 C++:使用 C++11 的特性,使其更为现代化且具有可读性。
  • 支持条件和循环:除了基础的数据替换,inja 还支持条件判断和循环,使得模板渲染更加动态。
  • 自定义回调:你可以定义自己的回调函数,以扩展模板中的功能。

应用场景

Inja 库在 C++ 中有许多应用场景:

  • 配置文件生成:对于那些需要根据用户输入或外部参数动态生成配置文件的应用程序或工具,inja 是非常有用的。

  • Web 服务:如果在 C++ 中写了一个 Web 服务器或 API 服务,你可能需要动态生成 HTML、JSON 或其他格式的响应。

  • 代码生成:inja 可以被用于工具中,这些工具需要基于某些模板生成源代码。例如,根据数据库模式生成 C++ 数据结构或 ORM 代码。

  • 报告和日志:你可以使用 inja 来动态生成格式化的日志条目或报告,尤其是当这些报告需要包含很多动态数据并遵循特定的格式时。

  • 邮件通知:对于那些需要发送动态内容的邮件的应用程序,inja 可以帮助渲染邮件内容。

  • UI 渲染:对于某些 C++ 桌面应用程序,它们可能有一个 HTML/CSS/JS 的前端,inja 可以被用于渲染 HTML 内容。

  • 文件模板化:对于任何需要基于模板动态生成文件的场景,无论是配置文件、代码文件还是其他任何类型的文件,都可以使用 inja。

  • 插件和扩展系统:如果应用程序允许第三方开发者编写插件或扩展,inja 可以作为一个简单的方式让他们添加自己的模板或修改现有的模板。

源码下载

Inja 是一个 headers only 的库,只需把其源码目录中的 include 下载下来即可,另外其需要引用 nlohmann/json.hpp 文件。

  • inja

inja gitHub 仓库:https://github.com/pantor/inja

  • nlohmann/json

nlohmann/json gitHub 仓库:https://github.com/nlohmann/json#projects-using-json-for-modern-c

Inja 使用示例

概述

在 Visual Studio 中使用 inja 库,需要设置 C++ 标准为 C++ 17:

基本用法

概述

inja 使用 {{ ... }} 表示变量,从给定的 json 数据中获取变量值进行渲染。

代码示例

#include <inja.hpp>
using namespace inja;

int main()
{
 json data;
 data['name'] = 'world';
 render_to(std::cout'Hello {{ name }}!', data); 
}

运行结果如下:

使用循环

概述

for in 语句需要使用 {% ... %} 包含,另外循环中有一些特殊的变量可以使用:

  • loop.index 从 0 开始的循环下标
  • loop.index1 从 1 开始的循环下标

代码示例

#include <inja.hpp>
using namespace inja;

int main()
{
 Environment env;// 创建一个 inja 环境对象

    json data;// 定义模板数据
    data['name'] = '张三';
    data['age'] = 30;
    data['hobbies'] = nlohmann::json::array({ '读书''睡觉''吃饭' });

    // 定义模板内容
 const std::string template_str = R'(
姓名: {{ name }}
年龄: {{ age }}
爱好:
{% for hobby in hobbies %}
  - {{ loop.index1 }}: {{ hobby }}
{% endfor %}
)'
;

 const std::string result = env.render(template_str, data);
    std::cout << result << std::endl;

    return 0;
}

运行结果如下:

使用函数

概述

inja 提供了一些内置的函数可以使用。

代码示例

#include <inja.hpp>
using namespace inja;

int main()
{
    json data;// 定义模板数据
    data['name'] = '张三';
    data['age'] = 30;
    data['hobbies'] = nlohmann::json::array({ '读书''睡觉''吃饭' });

    // 读取指定元素
 render_to(std::cout' {{ at(hobbies, 0)  }} ', data);

    std::cout << std::endl;
    // 字符串拼接
    render_to(std::cout' {{ join(hobbies, \', \')  }} ', data);

    return 0;
}

运行结果如下:

自定义回调函数

概述

inja 支持自定义回调函数以实现特定的功能。

代码示例

#include <inja.hpp>
using namespace inja;

int main()
{
    Environment env;

    json data;
    data['name'] = '张三';
    data['age'] = 30;
    data['hobbies'] = nlohmann::json::array({ '读书''睡觉''吃饭' });

    env.add_callback('double'1, [](const Arguments& args) {
     const int number = args.at(0)->get<int>(); 
        return 2 * number;
        });

    const std::string result = env.render('{{ double(age) }}', data);
    std::cout << result << std::endl;

    return 0;
}

运行结果如下:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
c++ nlohmann json 解析库使用
C++中函数模板的用法详细解析---自动判断数据类型
OpenFOAM|02 C++扫盲
VC++6.0配置LUA环境和C++调用LUA的简单示例
线性算术的C++模板库 Eigen(在VS2010中的下载、配置与使用)
JSON用法简介
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服