Jinja2 Python 템플릿 엔진의 C ++ 구현. 이 라이브러리는 강력한 Jinja2 템플릿 기능을 C ++ 세계에 지원합니다. 동적 HTML 페이지 및 소스 코드 생성을보고합니다.
Jinja2c ++의 주요 기능 :
set , if , for , 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을 참조하십시오.
다음 컴파일러에서 테스트 된 Jinja2C ++의 컴파일 (C ++ 14 및 C ++ 17 활성화 기능) :
참고 : GCC 버전의 지원> = 9.x 또는 Clang 버전> = 8.0은 제공된 부스트 라이브러리 버전에 따라 다릅니다.
| 컴파일러 | 상태 |
|---|---|
| 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/expected-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 )에 대한 참조를 추가하십시오. 예를 들어, 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 모든 종속성은 외부에서 제공되어야합니다. boost 경로, nonstd-* libs 등은 표준 CMAKE 변수를 통해 지정해야합니다 ( CMAKE_PREFIX_PATH 또는 LIBNAME_DIR :)conan-build 특수 모드. Jinja2c ++는 std::variant , std::string_view 및 std::optional 가능한 경우 표준 버전을 사용하려고합니다.
소프트웨어 엔지니어링 커뮤니티에서 가장 밝은 마음 중 하나 인이 라이브러리를 만들어 준 @flexferrum 에게 감사드립니다. 평화롭게 쉬십시오, 친구.
CMake 스크립트 개선, 버그 사냥 및 고정 및 Conan.io 포장에 대한 @Manu343726 덕분에.
완벽하게 구현 된 XXX-Lite 라이브러리에 대한 @Martinmoene 에게 감사드립니다.
놀라운 텍스트 서식 라이브러리에 대한 @Vitaut 에게 감사드립니다.
빠른 해시 맵 구현에 대한 @martinus 에게 감사드립니다.
batch 필터가 추가되었습니다slice 필터가 추가되었습니다format 필터가 추가되었습니다tojson 필터가 추가되었습니다striptags 필터가 추가되었습니다center 필터가 추가되었습니다xmlattr 필터가 추가되었습니다raw / endraw 태그가 추가되었습니다'a' * 5 'aaaaa' 생성합니다)meta / endmeta 태그) 지원 추가-fPIC 플래그 Linux 빌드 구성에 추가되었습니다 block 콘텐츠 렌더링으로 버그 수정variant , string_view 및 optional 사용합니다.map 필터에 추가 된 default 속성 (#48)GenericList 유형 (#66)과 함께 사용할 수 있습니다.Value 에 대한 가능한 유형 중 하나입니다.filter 태그 지원 (#44)escape 필터 지지대 (#140)capitalize (#137)set 태그의 멀티 라인 버전 (#45)loop.depth 및 loop.depth0 변수 지원이 추가되었습니다TemplateEnv 에서 구현 된 템플릿 캐시*context Special Param을 통해 글로벌 컨텍스트를 수락 할 수 있습니다.| ) 연산자 우선 순위 (#47)endblock 태그에서 충돌이 수정되었습니다include 및 태그 for 대한 고정 스코프 컨트롤JINJA2CPP_MSVC_RUNTIME_TYPE CMAKE 변수로 정의됩니다.import 및 구현 from 진술을 include . 이제 다른 템플릿을 포함시키고 다른 템플릿의 매크로를 사용할 수 있습니다.with 구현되었습니다do 명세서 구현RenderAsString 메소드는 이제 일반 std::string 대신 nonstd::expected 을 반환합니다TemplateEnv 세트없이 구문 분석 된 경우 가져 import , extends 및 include 템플릿 생성 오류가 발생합니다.external 종속성 관리 모드로 구성됩니다.applymacro 필터 추가