在 C++ 开发中,我们经常需要处理文本模板,并根据特定的数据进行动态替换。为了简化这一过程并提高代码的可维护性,Inja 库应运而生。
Inja 是用 Json 为前端的模板引擎,基于 nlohmann/json 库。它允许你使用 Json 数据轻松渲染字符串模板,它提供了一套简洁而强大的 API,使得在 C++ 中进行进行动态字符串替换变得轻而易举、可以更高效地进行模板化处理。
Inja 是一个轻量级的 C++ 库,用于处理文本模板的渲染和替换。
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 gitHub 仓库:https://github.com/pantor/inja
nlohmann/json gitHub 仓库:https://github.com/nlohmann/json#projects-using-json-for-modern-c
在 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 语句需要使用 {% ... %} 包含,另外循环中有一些特殊的变量可以使用:
#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;
}
运行结果如下:
联系客服