Jinja2с ++
C ++ Implementasi mesin template python jinja2. Perpustakaan ini membawa dukungan dari fitur template Jinja2 yang kuat ke dunia C ++, melaporkan halaman HTML dinamis dan pembuatan kode sumber.
Perkenalan
Fitur utama Jinja2c ++:
- Antarmuka publik yang mudah digunakan. Muat saja templat dan render.
- Kesesuaian dengan spesifikasi Jinja2
- Dukungan penuh dari string karakter sempit dan lebar baik untuk templat dan parameter.
- Refleksi bawaan untuk tipe C ++ umum, Nlohmann dan perpustakaan JSON yang cepat.
- Ekspresi Jinja2 fitur penuh yang kuat dengan penyaringan (via '|' operator) dan 'if'-expressions.
- Pernyataan kontrol (
set , for , if , filter , do , with ). - Ekstensi template, termasuk dan mengimpor
- Makro
- Pelaporan kesalahan yang kaya.
- Lingkungan Template Bersama dengan Dukungan Templat Template
Misalnya, kode sederhana ini:
# 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(); menghasilkan string hasil:
Helloworld!!!
Hello, world!!!
Hello; world!!!
hello; world!!!
Memulai
Untuk menggunakan Jinja2c ++ dalam proyek Anda, Anda harus:
- Klon Repositori Jinja2c ++
- Membangunnya sesuai dengan instruksi
- Tautan ke proyek Anda.
Penggunaan Jinja2c ++ dalam kode cukup sederhana:
- Deklarasikan objek Jinja2 :: Template:
- POOTDE dengan template:
tpl.Load( " {{ 'Hello World' }}!!! " );- Membuat template:
std::cout << tpl.RenderAsString({}).value() << std::endl; Dan dapatkan:
Hello World!!!
Itu saja!
Contoh dan fitur yang lebih rinci deskripsi dapat ditemukan dalam dokumentasi: https://jinja2cpp.github.io/docs/usage
Dukungan Jinja2 saat ini
Saat ini, Jinja2c ++ mendukung jumlah fitur Jinja2 yang terbatas. Ngomong-ngomong, Jinja2c ++ direncanakan untuk menjadi spesifikasi JINJA2 sepenuhnya. Dukungan saat ini terbatas pada:
- ekspresi. Anda dapat menggunakan hampir setiap gaya ekspresi: sederhana, disaring, bersyarat, dan sebagainya.
- Jumlah besar filter ( sortir, default, pertama, terakhir, panjang, maksimal, min, reverse, unik, jumlah, attr, peta, tolak, tolak, pilih, selectattr, pprint, diktsort, abs, float, int, list, round, randum, judul, atas, wordcount, ganti, truncate, groupby, urlencode, capitedisasi, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan diri, melarikan
- Jumlah besar penguji ( EQ, Defined, ge, gt, iterable, le, lt, pemetaan, ne, angka, urutan, string, tidak terdefinisi, dalam, bahkan, ganjil, lebih rendah, atas )
- Jumlah fungsi ( rentang , loop.cycle )
- Pernyataan 'jika' (dengan cabang 'elif' dan 'else')
- Pernyataan 'untuk' (dengan cabang 'else' dan dukungan bagian 'jika')
- pernyataan 'termasuk'
- 'Impor'/'dari' pernyataan
- Pernyataan 'Set' (baik baris dan blok)
- Pernyataan 'Filter'
- Pernyataan 'memperluas'/'blok'
- Pernyataan 'makro'/'hubungi'
- pernyataan 'dengan'
- Pernyataan ekstensi 'lakukan'
- loop rekursif
- kontrol ruang dan blok 'mentah'/'endraw'
Informasi lengkap tentang tabel Dukungan dan Kompatibilitas Spesifikasi Jinja2 dapat ditemukan di sini: https://jinja2cpp.github.io/docs/j2_compatibility.html.
Kompiler yang didukung
Kompilasi Jinja2c ++ yang diuji pada kompiler berikut (dengan fitur yang diaktifkan C ++ 14 dan C ++ 17):
- Linux GCC 5.5 - 9.0
- Linux Clang 5.0 - 9
- MacOS X-Code 9
- MacOS X-Code 10
- MacOS X-Code 11 (C ++ 14 Dalam Bangun Default, C ++ 17 dengan Boost yang Disediakan Secara Eksternal)
- Microsoft Visual Studio 2015 - 2019 x86, x64
- Mingw GCC Compiler 7.3
- Mingw GCC Compiler 8.1
CATATAN: Dukungan versi GCC> = 9.x atau Versi Clang> = 8.0 tergantung pada versi pustaka Boost yang disediakan.
Bangun status
| Penyusun | Status |
|---|
| 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 dentang 5, 6, 7, 8, 9, 10, 11, 12 c ++ 14/c ++ 17/c ++ 20 | |
Bangun dan instal
Jinja2c ++ memiliki beberapa dependensi eksternal:
-
boost Library (setidaknya versi 1.65) -
nonstd::expected-lite https://github.com/martinmoene/expected-lite -
nonstd::variant-lite https://github.com/martinmoene/variant-lite -
nonstd::optional-lite https://github.com/martinmoene/optional-lite -
nonstd::string-view-lite https://github.com/martinmoene/string-view-lite -
fmtlib::fmt https://github.com/fmtlib/fmt
Contoh skrip build dan konfigurasi build yang berbeda dapat ditemukan di sini: https://github.com/jinja2cpp/examples-build
Dalam kasus paling sederhana untuk mengkompilasi jinja2c ++ Anda perlu:
- Instal CMake Build System (setidaknya versi 3.0)
- Klone Jinja2cpp Repository:
> git clone https://github.com/flexferrum/Jinja2Cpp.git
- Buat Direktori Bangun:
> cd Jinja2Cpp
> mkdir build
- Jalankan Cmake dan Bangun Perpustakaan:
> cd build
> cmake .. -DCMAKE_INSTALL_PREFIX=<path to install folder>
> cmake --build . --target all
"Path to Install Folder" Berikut adalah jalur ke folder tempat Anda ingin menginstal lib jinja2c ++.
- Instal Perpustakaan:
> cmake --build . --target install
Dalam hal ini, Jinja2c ++ akan dibangun dengan dependensi yang dikirim secara internal dan memasangnya masing-masing. Tetapi dukungan Jinja2c ++ dibangun dengan DEP yang disediakan secara eksternal.
Penggunaan dengan manajer ketergantungan conan.io
Jinja2c ++ dapat digunakan sebagai paket conan.io. Dalam hal ini, Anda harus melakukan langkah -langkah berikut:
- Instal Conan.io Menurut dokumentasi (https://docs.conan.io/en/latest/installation.html)
- Tambahkan referensi ke paket Jinja2c ++ (
jinja2cpp/1.2.1 ) ke conanfile.txt Anda, conanfile.py atau cmakelists.txt. Misalnya, dengan penggunaan integrasi conan-cmake dapat ditulis dengan cara ini:
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 )
Bendera build cmake tambahan
Anda dapat mendefinisikan (via -D opsi cmake baris perintah) bendera build berikut:
- Jinja2cpp_build_tests (default true) - untuk membangun atau tidak untuk tes Jinja2c ++.
- Jinja2cpp_strict_warnings (default true) -aktifkan mode kompilasi kompilasi yang ketat (-wall -werror, dll).
- Jinja2cpp_msvc_runtime_type (default /md) - Jenis runtime MSVC untuk ditautkan (jika Anda menggunakan Microsoft Visual Studio Compiler).
- Jinja2cpp_deps_mode (default "internal") - mode untuk penanganan ketergantungan. Nilai berikut mungkin:
-
internal dalam mode ini Jinja2c ++ Build Script menggunakan dependensi (termasuk boost ) yang dikirim sebagai subproyek. Tidak ada yang perlu disediakan secara eksternal. -
external-boost dalam mode ini Jinja2c ++ Build Script hanya menggunakan boost sebagai ketergantungan yang disediakan secara eksternal. Semua ketergantungan lain diambil dari subproyek. -
external dalam mode ini semua dependensi harus disediakan secara eksternal. Jalur untuk boost , nonstd-* libs, dll. Harus ditentukan melalui variabel cmake standar (seperti CMAKE_PREFIX_PATH atau libname_dir) - Mode Khusus
conan-build untuk Membangun Jinja2c ++ melalui Resep Conan.
Bangun dengan standar C ++ 17 diaktifkan
Jinja2c ++ mencoba menggunakan versi standar std::variant , std::string_view dan std::optional jika memungkinkan.
Ucapan Terima Kasih
Terima kasih kepada @FlexFerrum untuk membuat perpustakaan ini, karena menjadi salah satu pemikir paling cerdas dalam komunitas rekayasa perangkat lunak. Beristirahatlah dengan damai, teman.
Terima kasih kepada @manu343726 untuk peningkatan skrip cmake, berburu bug, dan memperbaiki dan pengemasan conan.io.
Terima kasih kepada @MartinMoene untuk perpustakaan XXX-Lite yang diimplementasikan dengan sempurna.
Terima kasih kepada @Vitaut untuk perpustakaan pemformatan teks yang luar biasa.
Terima kasih kepada @martinus untuk implementasi peta hash cepat.
Changelog
Versi 1.3.2
Apa yang berubah
- Memperbaiki dikt kosong parsing literal di #243
- Memperbaiki perlindungan amarah hidup yang hilang untuk filter terbalik (dan lainnya). oleh @jferreyra-sc di #246
- Kemampuan untuk menonaktifkan aturan instalasi jinjacpp oleh @Ilya-Lavrenov di #250
- CMake hanya menemukan RapidJson oleh @Ilya-Lavrenov di #254
- Perbarui Ketergantungan Boost oleh @CheaterDev di #253
Kontributor baru
- @jferreyra-sc membuat kontribusi pertama mereka di #246
- @Ilya-Lavrenov membuat kontribusi pertama mereka di #250
- @CheaterDev membuat kontribusi pertama mereka di #253
Versi 1.3.1
Perubahan dan perbaikan
- Versi Bump Deps
- Tambahkan JSON Binding baru - Boost :: JSON
- Parsing speedup regex dengan beralih ke Boost :: regex (std :: regex sangat lambat)
- Template sekarang memuat lebih cepat
Memperbaiki bug
- Perbaikan kecil di seluruh basis kode
Melanggar perubahan
- Dep internal sekarang digunakan melalui cmake fetch_content
- Default JSON Serializer/Deserializer dialihkan ke Boost :: JSON
Versi 1.2.1
Perubahan dan perbaikan
- Versi Bump Deps
- Dukung Kompiler Modern (Hingga Dipagari 12) dan Standar (C ++ 20)
- Pembersihan Gaya Kode Kecil
Memperbaiki bug
- Perbaikan kecil di seluruh basis kode
Melanggar perubahan
- DEP INTERNAL Titik untuk membuat boost build berbasis
Versi 1.1.0
Perubahan dan perbaikan
- filter
batch ditambahkan -
slice filter ditambahkan -
format filter ditambahkan - Filter
tojson ditambahkan - Filter
striptags ditambahkan - filter
center ditambahkan - Filter
xmlattr ditambahkan - Tag
raw / endraw ditambahkan - Ulangi operator string ditambahkan (misalnya
'a' * 5 akan menghasilkan 'aaaaa' ) - Dukungan untuk Template Metadata (
meta / endmeta Tags) Ditambahkan -
-fPIC Bendera Ditambahkan ke Konfigurasi Bangun Linux
Memperbaiki bug
- Perbaiki perilaku lstripblock/trimblocks pengaturan global. Sekarang sepenuhnya sesuai dengan origina jinja2
- Perbaiki Bug dengan Rendering Parent
block Content Jika anak tidak mengganti blok ini - Perbaiki masalah kompilasi dengan callable yang ditentukan pengguna dengan jumlah argumen lebih dari 2
- Perbaiki akses ke fungsi Jinja2 global dari templat yang disertakan/diperluas
- Perbaiki titik evaluasi params makro
- Perbaiki perulangan di atas string
- Peringatan pembersihan
Melanggar perubahan
- Mulai sekarang dengan C ++ 17 Standar yang diaktifkan Jinja2c ++ menggunakan versi standar
variant tipe, string_view dan optional
Versi 1.0.0
Perubahan dan perbaikan
- Atribut
default ditambahkan ke filter map (#48) - Dukungan Urutan Escape Ditambahkan ke String Literals (#49)
- rentang sewenang -wenang, urutan yang dihasilkan, iterator input, dll. Sekarang dapat digunakan dengan tipe
GenericList (#66) - nonstd :: string_view sekarang menjadi salah satu jenis yang mungkin untuk
Value - Dukungan tag
filter ditambahkan ke parser template (#44) - Dukungan Filter
escape Ditambahkan ke Parser Template (#140) -
capitalize Dukungan Filter Ditambahkan ke Template Parser (#137) - Versi multiline
set tag ditambahkan ke parser (#45) - Menambahkan refleksi bawaan untuk perpustakaan Nlohmann Json dan Rapidjson (#78)
-
loop.depth dan loop.depth0 variabel dukungan ditambahkan - {fmt} sekarang digunakan sebagai pustaka pemformatan alih -alih iostreams
- Peta hash robin hood sekarang digunakan untuk penyimpanan nilai internal
- memberikan peningkatan kinerja
- Template Cache Diimplementasikan di
TemplateEnv - Callable yang ditentukan pengguna sekarang dapat menerima konteks global melalui
*context - Mingw, clang> = 7.0, xcode> = 9, gcc> = 7.0 sekarang secara resmi didukung sebagai kompiler target (#79)
Memperbaiki bug
- Pipa Tetap (
| ) Operator Prioritas (#47) - Memperbaiki bug di char internal <-> konverter wchar_t di windows
- Memperbaiki crash di tag
endblock parsing - Kontrol lingkup tetap untuk
include dan for tag - Memperbaiki bug dengan panggilan makro dalam konteks ekspresi
Melanggar perubahan
- Jenis runtime msvc sekarang ditentukan oleh variabel cmake
JINJA2CPP_MSVC_RUNTIME_TYPE
Versi 0.9.2
Perubahan besar
- Callable yang ditentukan pengguna diimplementasikan. Sekarang Anda dapat mendefinisikan objek yang dapat dipanggil Anda sendiri, meneruskannya sebagai parameter input dan menggunakannya di dalam templat sebagai fungsi, global), filter atau penguji. Lihat detail di sini: https://jinja2cpp.github.io/docs/usage/ud_callables.html
- Sekarang Anda dapat mendefinisikan parameter global (templat lingkungan) yang dapat diakses untuk semua templat yang terikat dengan lingkungan ini.
-
include , import dan from pernyataan yang diterapkan. Sekarang dimungkinkan untuk memasukkan templat lain dan menggunakan makro dari templat lain. -
with pernyataan diterapkan -
do pernyataan yang diimplementasikan - Contoh Proyek Bangun untuk berbagai varian penggunaan Jinja2c ++ yang dibuat: https://github.com/jinja2cpp/examples-build MeK-mendapat
- Situs Dokumentasi Dibuat untuk Jinja2c ++: https://jinja2cpp.github.io
Perubahan kecil
- Penanganan kesalahan waktu ditambahkan
- Mode manajemen ketergantungan ditambahkan ke skrip build
- Perbaiki bug dengan pelaporan kesalahan selama waktu parse
- Versi dependensi eksternal yang ditingkatkan
Melanggar perubahan
- Metode
RenderAsString sekarang mengembalikan nonstd::expected alih -alih std::string biasa - Templat dengan
import , extends dan include kesalahan menghasilkan jika diuraikan tanpa set TemplateEnv - Bundel rilis (arsip) dikonfigurasi dengan mode manajemen ketergantungan
external secara default
Versi 0.9.1
-
applymacro filter ditambahkan yang memungkinkan penerapan makro sewenang -wenang sebagai filter - Ketergantungan untuk meningkatkan yang dihapus dari antarmuka publik
- Skrip cmake ditingkatkan
- Berbagai bug diperbaiki
- Meningkatkan refleksi
- Peringatan Pembersihan
Versi 0.9
- Dukungan pernyataan 'Extents'/'Block'
- Dukungan pernyataan 'makro'/'panggilan'
- Pelaporan kesalahan yang kaya
- Dukungan untuk loop rekursif
- Dukungan untuk kontrol ruang sebelum dan sesudah blok kontrol
- Meningkatkan refleksi
Versi 0.6
- Banyak filter telah diimplementasikan. Set lengkap filter yang didukung yang tercantum di sini: #7
- Banyak penguji telah diimplementasikan. Set lengkap penguji yang didukung yang tercantum di sini: #8
- Operator 'Concatenate As String' ('~') telah diimplementasikan
- For-loop dengan kondisi 'jika' telah diimplementasikan
- Memperbaiki beberapa bug di parser