背景
概述
在 C++ 開發(fā)中,我們經(jīng)常需要處理文本模板,,并根據(jù)特定的數(shù)據(jù)進(jìn)行動(dòng)態(tài)替換。為了簡化這一過程并提高代碼的可維護(hù)性,,Inja 庫應(yīng)運(yùn)而生,。
Inja
Inja 是用 Json 為前端的模板引擎,基于 nlohmann/json 庫,。它允許你使用 Json 數(shù)據(jù)輕松渲染字符串模板,,它提供了一套簡潔而強(qiáng)大的 API,使得在 C++ 中進(jìn)行進(jìn)行動(dòng)態(tài)字符串替換變得輕而易舉,、可以更高效地進(jìn)行模板化處理,。
Inja
概述
Inja 是一個(gè)輕量級的 C++ 庫,,用于處理文本模板的渲染和替換。
主要特性
- 輕量級:它是一個(gè)頭文件為主的庫,,這意味著集成起來很容易,。
- 完全支持 Json:由于依賴于 nlohmann/json 庫,inja 對 Json 數(shù)據(jù)的支持很完整,。
- 現(xiàn)代 C++:使用 C++11 的特性,,使其更為現(xiàn)代化且具有可讀性。
- 支持條件和循環(huán):除了基礎(chǔ)的數(shù)據(jù)替換,,inja 還支持條件判斷和循環(huán),,使得模板渲染更加動(dòng)態(tài)。
- 自定義回調(diào):你可以定義自己的回調(diào)函數(shù),,以擴(kuò)展模板中的功能,。
應(yīng)用場景
Inja 庫在 C++ 中有許多應(yīng)用場景:
配置文件生成:對于那些需要根據(jù)用戶輸入或外部參數(shù)動(dòng)態(tài)生成配置文件的應(yīng)用程序或工具,inja 是非常有用的,。
Web 服務(wù):如果在 C++ 中寫了一個(gè) Web 服務(wù)器或 API 服務(wù),,你可能需要?jiǎng)討B(tài)生成 HTML、JSON 或其他格式的響應(yīng),。
代碼生成:inja 可以被用于工具中,,這些工具需要基于某些模板生成源代碼。例如,,根據(jù)數(shù)據(jù)庫模式生成 C++ 數(shù)據(jù)結(jié)構(gòu)或 ORM 代碼,。
報(bào)告和日志:你可以使用 inja 來動(dòng)態(tài)生成格式化的日志條目或報(bào)告,,尤其是當(dāng)這些報(bào)告需要包含很多動(dòng)態(tài)數(shù)據(jù)并遵循特定的格式時(shí),。
郵件通知:對于那些需要發(fā)送動(dòng)態(tài)內(nèi)容的郵件的應(yīng)用程序,inja 可以幫助渲染郵件內(nèi)容,。
UI 渲染:對于某些 C++ 桌面應(yīng)用程序,,它們可能有一個(gè) HTML/CSS/JS 的前端,inja 可以被用于渲染 HTML 內(nèi)容,。
文件模板化:對于任何需要基于模板動(dòng)態(tài)生成文件的場景,,無論是配置文件、代碼文件還是其他任何類型的文件,,都可以使用 inja,。
插件和擴(kuò)展系統(tǒng):如果應(yīng)用程序允許第三方開發(fā)者編寫插件或擴(kuò)展,inja 可以作為一個(gè)簡單的方式讓他們添加自己的模板或修改現(xiàn)有的模板,。
源碼下載
Inja 是一個(gè) 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
Inja 使用示例
概述
在 Visual Studio 中使用 inja 庫,,需要設(shè)置 C++ 標(biāo)準(zhǔn)為 C++ 17:
基本用法
概述
inja 使用 {{ ... }} 表示變量,,從給定的 json 數(shù)據(jù)中獲取變量值進(jìn)行渲染。
代碼示例
#include <inja.hpp>
using namespace inja;
int main()
{
json data;
data['name'] = 'world';
render_to(std::cout, 'Hello {{ name }}!', data);
}
運(yùn)行結(jié)果如下:
使用循環(huán)
概述
for in 語句需要使用 {% ... %} 包含,,另外循環(huán)中有一些特殊的變量可以使用:
- loop.index 從 0 開始的循環(huán)下標(biāo)
- loop.index1 從 1 開始的循環(huán)下標(biāo)
代碼示例
#include <inja.hpp>
using namespace inja;
int main()
{
Environment env;// 創(chuàng)建一個(gè) inja 環(huán)境對象
json data;// 定義模板數(shù)據(jù)
data['name'] = '張三';
data['age'] = 30;
data['hobbies'] = nlohmann::json::array({ '讀書', '睡覺', '吃飯' });
// 定義模板內(nèi)容
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;
}
運(yùn)行結(jié)果如下:
使用函數(shù)
概述
inja 提供了一些內(nèi)置的函數(shù)可以使用,。
代碼示例
#include <inja.hpp>
using namespace inja;
int main()
{
json data;// 定義模板數(shù)據(jù)
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;
}
運(yùn)行結(jié)果如下:
自定義回調(diào)函數(shù)
概述
inja 支持自定義回調(diào)函數(shù)以實(shí)現(xiàn)特定的功能。
代碼示例
#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;
}
運(yùn)行結(jié)果如下: