Jinja2 Python模板引擎的C ++實現。該庫將強大的Jinja2模板功能的支持帶入C ++世界,報告動態HTML頁面和源代碼生成。
Jinja2c ++的主要功能:
set , for , if , filter , do , with )。例如,這個簡單的代碼:
# include < jinja2cpp/template.h >
std::string source = R"(
{{ ("Hello", 'world') | join }}!!!
{{ ("Hello", 'world') | join(', ') }}!!!
{{ ("Hello", 'world') | join(d = '; ') }}!!!
{{ ("Hello", 'world') | join(d = '; ') | lower }}!!!
)" ;
Template tpl;
tpl.Load(source);
std::string result = tpl.RenderAsString({}).value();產生結果字符串:
Helloworld!!!
Hello, world!!!
Hello; world!!!
hello; world!!!
要在您的項目中使用Jinja2c ++,您必須:
代碼中使用Jinja2c ++的使用非常簡單:
jinja2::Template tpl;tpl.Load( " {{ 'Hello World' }}!!! " );std::cout << tpl.RenderAsString({}).value() << std::endl;並得到:
Hello World!!!
就這樣!
更詳細的示例和功能說明可以在文檔中找到:https://jinja2cpp.github.io/docs/usage
當前,Jinja2c ++支持有限數量的JINJA2功能。順便說一句,計劃將jinja2c ++成為完全jinja2規範符合形式。當前的支持僅限於:
有關Jinja2規範支持和兼容性表的完整信息可以在此處找到:https://jinja2cpp.github.io/docs/j2_compatibility.html。
在以下編譯器(具有C ++ 14和C ++ 17啟用的功能)上測試的Jinja2c ++的編譯:
注意: GCC版本的支持> = 9.x或Clang版本> = 8.0取決於提供的Boost庫的版本。
| 編譯器 | 地位 |
|---|---|
| MSVC 2015(X86,X64), Mingw 7(x64), Mingw 8(x64) | |
| X代碼9、10、11 | |
| MSVC 2017(X86,X64), MSVC 2019(X86,X64),C ++ 14/C ++ 17 | |
| G ++ 5、6、7、8、9、10、11 Clang 5、6、7、8、9、10、11、12 C ++ 14/C ++ 17/C ++ 20 |
Jinja2c ++具有幾個外部依賴性:
boost庫(至少1.65版)nonstd::expected-lite https://github.com/martinmoene/exped-litenonstd::variant-lite https://github.com/martinmoene/variant-litenonstd::optional-lite https://github.com/martinmoene/optional-litenonstd::string-view-lite https://github.com/martinmoene/string-view-litefmtlib::fmt https://github.com/fmtlib/fmt可以在此處找到構建腳本和不同構建配置的示例:https://github.com/jinja2cpp/examples-build
在最簡單的情況下,您需要編譯Jinja2c ++:
> git clone https://github.com/flexferrum/Jinja2Cpp.git
> cd Jinja2Cpp
> mkdir build
> cd build
> cmake .. -DCMAKE_INSTALL_PREFIX=<path to install folder>
> cmake --build . --target all
“安裝文件夾的路徑”這是要安裝jinja2c ++ lib的文件夾的路徑。
> cmake --build . --target install
在這種情況下,Jinja2c ++將分別以內部運行的依賴項構建並安裝它們。但是Jinja2c ++支持具有外部提供的DEP的構建。
Jinja2c ++可以用作conan.io軟件包。在這種情況下,您應該執行以下步驟:
jinja2cpp/1.2.1 )中,將您的conanfile.txt,conanfile.py或cmakelists.txt添加。例如,借助conan-cmake整合的使用情況,它可以通過這種方式編寫: cmake_minimum_required ( VERSION 3.24)
project (Jinja2CppSampleConan CXX)
list ( APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} )
list ( APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR} )
add_definitions ( "-std=c++14" )
if ( NOT EXISTS " ${CMAKE_BINARY_DIR} /conan.cmake" )
message ( STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan" )
file (DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/0.18.1/conan.cmake"
" ${CMAKE_BINARY_DIR} /conan.cmake"
TLS_VERIFY ON )
endif ()
include ( ${CMAKE_BINARY_DIR} /conan.cmake)
conan_cmake_autodetect(settings)
conan_cmake_run(REQUIRES
jinja2cpp/1.1.0
gtest/1.14.0
BASIC_SETUP
${CONAN_SETTINGS}
OPTIONS
jinja2cpp/*:shared= False
gtest/*:shared= False
BUILD missing)
set (TARGET_NAME jinja2cpp_build_test)
add_executable ( ${TARGET_NAME} main.cpp)
target_link_libraries ( ${TARGET_NAME} ${CONAN_LIBS} )
set_target_properties ( ${TARGET_NAME} PROPERTIES
CXX_STANDARD 14
CXX_STANDARD_REQUIRED ON )
您可以定義(通過-D命令行cmake選項)以下構建標誌:
internal在此模式下,Jinja2c ++構建腳本使用依賴項(包括boost )作為子標記。外部不需要提供任何東西。external-boost Jinja2c ++構建腳本僅使用boost作為外部提供的依賴性。所有其他依賴項均取自第次標記。external應在外部提供所有依賴項。應通過標準CMAKE變量指定boost的途徑, nonstd-* libs等(例如CMAKE_PREFIX_PATH或libname_dir)conan-build特殊模式,用於通過柯南食譜構建jinja2c ++。Jinja2c ++嘗試使用std::variant的標準版本, std::string_view和std::optional話。
感謝@flexferrum創建了這個庫,這是軟件工程社區中最聰明的頭腦之一。安息,朋友。
感謝@manu343726的cmake腳本改進,bug狩獵和修復和conan.io包裝。
感謝@martinmoene的完美實現的XXX-Lite庫。
感謝@Vitaut提供了驚人的文本格式庫。
感謝@martinus的快速哈希地圖實現。
batch過濾器slice過濾器format過濾器tojson過濾器striptags過濾器center過濾器xmlattr濾波器raw / endraw標籤'a' * 5將產生'aaaaa' )meta / endmeta標籤)添加-fPIC標誌添加到Linux構建配置中block內容修復錯誤variant的標準版本, string_view和optionaldefault屬性添加到map過濾器(#48)GenericList類型一起使用(#66)Value的可能類型之一filter標籤支持(#44)escape過濾器支持(#140)capitalize濾器支持添加到模板解析器(#137)set標籤的多琳版本(#45)loop.depth and loop.depth0變量支持添加TemplateEnv中實現的模板緩存*context特殊參數接受全局上下文| )操作員優先(#47)endblock標籤中的崩潰include和forJINJA2CPP_MSVC_RUNTIME_TYPE cmake cmake變量定義include , import from實施的語句。現在可以包括其他模板並使用其他模板的宏。with聲明實施do聲明RenderAsString方法現在返回nonstd::expected而不是常規性std::stringimport , extends並include生成錯誤的模板,如果未經TemplateEnv設置解析external依賴管理模式applymacro濾波器,該過濾器允許將任意宏作為過濾器應用