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滤波器,该过滤器允许将任意宏作为过滤器应用