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をご覧ください。
次のコンパイラでテストされたJinja2c ++の編集(C ++ 14およびC ++ 17対応機能を使用):
注: GCCバージョンのサポート> = 9.xまたはClangバージョン> = 8.0は、提供されるBoostライブラリのバージョンに依存します。
| コンパイラ | 状態 |
|---|---|
| MSVC 2015(x86、x64)、 Mingw 7(x64)、 Mingw 8(x64) | |
| X-Code 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 )、conanfile.txt、conanfile.pyまたはcmakelists.txtにconanfile.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 、すべての依存関係を外部から提供する必要があります。 boostパス、 nonstd-* libsなどは、標準のcmake変数( CMAKE_PREFIX_PATHまたはlibname_dirなど)を介して指定する必要があります。conan-build Special Mode。Jinja2c ++はstd::variant 、 std::string_view 、 std::optional可能であれば標準バージョンの標準バージョンを使用しようとします。
ソフトウェアエンジニアリングコミュニティで最も明るいマインドの1つであるこのライブラリを作成してくれた@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フラグが追加されましたblockコンテンツのレンダリングでバグを修正しますvariant 、 string_view 、およびoptionalの標準バージョンを使用しますmapフィルターに追加されたdefault属性(#48)GenericListタイプ(#66)で使用できるようになりました。Valueの可能なタイプの1つになりました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変数によって定義されるようになりましたinclude 、 importおよび実装されたステートメントfrom 。これで、他のテンプレートを含めて、他のテンプレートからマクロを使用することができます。with実装されていますdoステートメント実装RenderAsStringメソッドは、通常のstd::stringの代わりにnonstd::expectedを返すようになりましたimportを備えたテンプレート、 extendsおよびinclude TemplateEnvセットなしで解析された場合、エラーを生成しますexternal依存関係管理モードで構成されていますapplymacroフィルターが追加されました