Jinja2с ++
C ++ Implementierung der Jinja2 Python Template Engine. Diese Bibliothek unterstützt leistungsstarke Jinja2 -Vorlagenfunktionen in die C ++ - weltweit, berichtet dynamische HTML -Seiten und Quellcodegenerierung.
Einführung
Hauptmerkmale von Jinja2c ++:
- Einfach zu bedienende öffentliche Schnittstelle. Laden Sie einfach Vorlagen und rendern Sie sie.
- Konformität zur Jinja2 -Spezifikation
- Vollständige Unterstützung von Schmal- und Weitcharakterketten sowohl für Vorlagen als auch für Parameter.
- Eingebaute Reflexion für die gemeinsamen C ++-Typen, Nlohmann und Rapid JSON-Bibliotheken.
- Leistungsstarke Ausdrucksformen mit Filterung (über '|' Operator) und 'if'-Expressions.
- Kontrollanweisungen
with set for if , filter , do ). - Vorlagenerweiterung, einschließlich und Importierung
- Makros
- Reiche Fehlerberichterstattung.
- Shared Template -Umgebung mit Vorlagen -Cache -Unterstützung
Zum Beispiel dieser einfache Code:
# 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(); erzeugt die Ergebniszeichenfolge:
Helloworld!!!
Hello, world!!!
Hello; world!!!
hello; world!!!
Erste Schritte
Um Jinja2c ++ in Ihrem Projekt zu verwenden, müssen Sie:
- Klonen Sie das Jinja2c ++ Repository
- Erstellen Sie es gemäß den Anweisungen
- Link zu Ihrem Projekt.
Die Verwendung von Jinja2c ++ im Code ist ziemlich einfach:
- Deklarieren Sie das Jinja2 :: Vorlagenobjekt:
- Populieren Sie es mit Vorlage:
tpl.Load( " {{ 'Hello World' }}!!! " );- Die Vorlage rendern:
std::cout << tpl.RenderAsString({}).value() << std::endl; und bekommen:
Hello World!!!
Das ist alles!
Detailliertere Beispiele und Funktionen Beschreibung finden Sie in der Dokumentation: https://jinja2cpp.github.io/docs/usage
Aktuelle Unterstützung von Jinja2
Derzeit unterstützt Jinja2c ++ die begrenzte Anzahl von Jinja2 -Funktionen. Übrigens ist Jinja2c ++ ein vollständig Jinja2-Spezifikations-Konformant. Die aktuelle Unterstützung ist beschränkt auf:
- Ausdrücke. Sie können fast jeden Ausdrucksstil verwenden: Einfach, gefiltert, bedingt und so weiter.
- the big number of filters ( sort, default, first, last, length, max, min, reverse, unique, sum, attr, map, reject, rejectattr, select, selectattr, pprint, dictsort, abs, float, int, list, round, random, trim, title, upper, wordcount, replace, truncate, groupby, urlencode, capitalize, escape, tojson, striptags, center, xmlattr )
- Die große Anzahl von Tester ( EQ, Definiert, GE, GT, Iterable, Le, Lt, Mapping, NE, Anzahl, Sequenz, String, undefiniert, in, gleichmäßiger, ungerade, untere, obere )
- Die Anzahl der Funktionen ( Bereich , Loop.Cycle )
- 'if' Erklärung (mit 'Elif' und 'sonst' Zweigen)
- 'für' Erklärung (mit 'sonst' Branch und 'if' Teil Support)
- Aussage 'einschließen'
- 'Import'/'aus' Aussagen
- 'Set' Anweisung (sowohl Zeile als auch Block)
- Angabe von "Filter"
- 'erweitert'/'block' Anweisungen
- 'macro'/'rufen Sie Anweisungen an
- 'mit' Erklärung
- Erweiterungserklärung "do"
- rekursive Schleifen
- Space Control und 'Raw'/'Endraw' Blöcke
Vollständige Informationen zu Jinja2 Spezifikationsunterstützung und Kompatibilitätstabelle finden Sie hier: https://jinja2cpp.github.io/docs/j2_compatibility.html.
Unterstützte Compiler
Zusammenstellung von Jinja2c ++, die auf den folgenden Compilern getestet wurden (mit C ++ 14 und C ++ 17 -fähigen Funktionen):
- 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 im Standardbau, C ++ 17 mit extern bereitgestelltem Boost)
- Microsoft Visual Studio 2015 - 2019 x86, x64
- Mingw GCC Compiler 7.3
- Mingw GCC Compiler 8.1
Hinweis: Die Unterstützung der GCC -Version> = 9.x oder Clang Version> = 8.0 hängt von der Version der bereitgestellten Boost -Bibliothek ab.
Status erstellen
| Compiler | 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 Klang 5, 6, 7, 8, 9, 10, 11, 12 C ++ 14/c ++ 17/c ++ 20 | |
Bauen und installieren
Jinja2c ++ hat mehrere externe Abhängigkeiten:
-
boost Library (mindestens Version 1.65) -
nonstd::expected-lite https://github.com/martinmoene/exward-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
Beispiele für Build-Skripte und verschiedene Build-Konfigurationen finden Sie hier: https://github.com/jinja2cpp/examples-build
Im einfachsten Fall müssen Sie Jinja2c ++ kompilieren: Sie benötigen:
- Installieren Sie das CMake -Build -System (mindestens Version 3.0)
- Klon Jinja2Cpp Repository:
> git clone https://github.com/flexferrum/Jinja2Cpp.git
- Build -Verzeichnis erstellen:
> cd Jinja2Cpp
> mkdir build
- Führen Sie CMake aus und erstellen Sie die Bibliothek:
> cd build
> cmake .. -DCMAKE_INSTALL_PREFIX=<path to install folder>
> cmake --build . --target all
"Pfad zum Installieren von Ordner" hier ist ein Pfad zum Ordner, in dem Sie Jinja2c ++ lib installieren möchten.
- Bibliothek installieren:
> cmake --build . --target install
In diesem Fall wird Jinja2c ++ mit intern aufgeschlossenen Abhängigkeiten gebaut und installiert. Jinja2c ++ unterstützt jedoch Builds mit extern bereitgestellten DEPs.
Nutzung mit Conan.io Abhängigkeitsleiter
Jinja2c ++ kann als Conan.io -Paket verwendet werden. In diesem Fall sollten Sie die folgenden Schritte ausführen:
- Installieren Sie Conan.io gemäß der Dokumentation (https://docs.conan.io/en/latest/installation.html)
- Fügen Sie Ihrer ConanFile.txt,
jinja2cpp/1.2.1 oder cmakelists Zum Beispiel könnte es mit der Verwendung der conan-cmake Integration auf diese Weise geschrieben werden:
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 )
Zusätzliche CMake -Build -Flaggen
Sie können (über -d -Befehlszeilen -CMake -Option) definieren. Die folgenden Build -Flags:
- Jinja2cpp_build_tests (Standard true) - zu erstellen oder nicht zu jinja2c ++ Tests.
- Jinja2cpp_strict_warnings (Standard true) -Strict -Modus -Kompilierwarnings (-wall -schwor usw.) aktivieren.
- Jinja2cpp_msvc_runtime_type (Standard /md) - MSVC -Laufzeittyp mit (wenn Sie den Microsoft Visual Studio Compiler verwenden).
- Jinja2CPP_DEPS_MODE (Standard "interne") - Modi für die Abhängigkeitsbehandlung. Folgende Werte möglich:
-
internal diesem Modus ist Jinja2c ++ Build -Skript in diesem Modus Abhängigkeiten (include boost ) als Unterprojekt verwendet. Es muss extern nichts zur Verfügung gestellt werden. -
external-boost in diesem Modus Jinja2c ++ Build Skript verwendet nur boost als extern bereitgestellte Abhängigkeit. Alle anderen Abhängigkeiten stammen aus Unterprojekten. - In diesem Modus
external alle Abhängigkeiten sollten extern bereitgestellt werden. Pfade zum boost , nonstd-* libs usw. sollte über Standard-CMake-Variablen angegeben werden (wie CMAKE_PREFIX_PATH oder libname_dir) -
conan-build Spezialmodus zum Bau von Jinja2c ++ über Conan-Rezept.
Erstellen Sie mit C ++ 17 -Standard aktiviert Standard
Jinja2c ++ versucht Standardversionen von std::variant , std::string_view und std::optional , wenn möglich.
Anerkennung
Vielen Dank an @Flexferrum für die Erstellung dieser Bibliothek, für die einer der klügsten Köpfe in der Software -Engineering -Community. Ruhe in Frieden, Freund.
Vielen Dank an @Manu343726 für CMake -Skripte Verbesserung, Fehlerjagd und Reparatur und Conan.io -Verpackung.
Vielen Dank an @Martinmoene für die perfekt implementierten XXX-Lite-Bibliotheken.
Vielen Dank an @vitaut für die erstaunliche Textformatierungsbibliothek.
Vielen Dank an @Martinus für die Implementierung von Fast Hash Maps.
Changelog
Version 1.3.2
Was hat sich geändert
- Reparieren
- Fehlenden Lebenswutschutz für den Rückwärtsfilter (und andere) fixieren. von @jferreyra-sc in #246
- Fähigkeit, Jinjacpp-Installationsregeln von @ilya-lavrenov in #250 zu deaktivieren
- CMake findet nur Rapidjson von @ilya-lavrenov in #254 heruntergeladen
- Update Boost -Abhängigkeiten von @Cheaterdev in #253
Neue Mitwirkende
- @jferreyra-sc leistet ihren ersten Beitrag in #246
- @ilya-lavrenov leistet ihren ersten Beitrag in #250
- @Cheaterdev hat ihren ersten Beitrag in #253 geleistet
Version 1.3.1
Änderungen und Verbesserungen
- Bump Deps -Versionen
- Fügen Sie New JSON Binding hinzu - Boost :: JSON
- Geschwindigkeitsregex -Parsen durch Wechsel zum Boost :: Regex (std :: regex extrem langsam)
- Vorlagen laden jetzt schneller
Fehler behoben
- Kleine Korrekturen über die Codebasis hinweg
Veränderungen brechen
- Interne DEPs, die jetzt über CMake Fetch_Content verwendet werden
- Standard JSON Serializer/Deserializer ist auf Boost :: JSON umgeschaltet
Version 1.2.1
Änderungen und Verbesserungen
- Bump Deps -Versionen
- Unterstützen Sie moderne Compiler (bis zu Klang 12) und Standards (C ++ 20)
- Winzige Codestil -Reinigung
Fehler behoben
- Kleine Korrekturen über die Codebasis hinweg
Veränderungen brechen
- Interne DEPs deuten auf den basierten Boost -Build hin
Version 1.1.0
Änderungen und Verbesserungen
-
batch hinzugefügt -
slice hinzugefügt -
format hinzugefügt -
tojson Filter hinzugefügt -
striptags -Filter hinzugefügt -
center hinzugefügt -
xmlattr -Filter hinzugefügt -
raw / endraw -Tags hinzugefügt - Wiederholungsstraßenoperator hinzugefügt (z.
'a' * 5 produziert 'aaaaa' )) - Unterstützung für Vorlagen Metadaten (
meta / endmeta -Tags) hinzugefügt -
-fPIC Flag zur Linux -Build -Konfiguration hinzugefügt
Fehler behoben
- Beheben Sie das Verhalten der globalen Einstellungen von LstripBlock/Trimblocks. Jetzt entspricht es vollständig der Origina Jinja2
- Beheben Sie den Fehler mit dem Rendern von übergeordneten
block , wenn das Kind diesen Block nicht überschreibt - Fixierung von Kompilierungsproblemen mit benutzerdefinierten Anrufläden mit Anzahl von Argumenten mehr als 2
- Beheben Sie den Zugriff auf globale Jinja2 -Funktionen aus enthaltenen/erweiterten Vorlagen
- Bewertung des Bewertungspunkts von Makroparamemen fixieren
- Fixieren Sie das Schleifen über den Saiten
- Reinigungswarnungen
Veränderungen brechen
- Ab sofort verwendet C ++ 17 Standard -fähige Jinja2c ++ Standardversionen der
variant , string_view und optional
Version 1.0.0
Änderungen und Verbesserungen
-
default zum map (#48) hinzugefügt - Escape -Sequenzen unterstützen die String -Literale hinzu (#49)
- beliebige Bereiche, generierte Sequenzen, Eingabe -Iteratoren usw. können nun mit
GenericList -Typ verwendet werden (Nr. 66) - Nonstd :: String_View ist jetzt einer der möglichen Typen für den
Value -
filter -Tag -Unterstützung, die dem Vorlage Parser hinzugefügt wurden (#44) -
escape -Filterunterstützung, der dem Vorlage Parser hinzugefügt wurde (#140) -
capitalize den Filterunterstützung, der dem Vorlage -Parser hinzugefügt wurde (#137) - Die Multiline -Version des
set -Tags, das dem Parser hinzugefügt wurde (#45) - In eingebaute Reflexion für Nlohmann Json und Rapidjson-Bibliotheken (#78) hinzugefügt
-
loop.depth und loop.depth0 Variablen unterstützen hinzugefügt - {fmt} wird jetzt als Formatierungsbibliothek anstelle von iostreams verwendet
- Robin Hood Hash Map wird jetzt für den internen Wertspeicher verwendet
- Leistungsverbesserungen machen
- Vorlagen -Cache in
TemplateEnv implementiert - Benutzerdefinierte Anruflinge können jetzt den globalen Kontext über
*context akzeptieren - Mingw, Clang> = 7.0, Xcode> = 9, GCC> = 7.0 werden jetzt offiziell als Ziel Compiler unterstützt (#79)
Fehler behoben
- Fixed Pipe (
| ) Bediener Vorrang (#47) - Der Fehler im internen char <-> wchar_t-Konverter unter Windows behoben
- Crash im Parsing
endblock -Tag festgelegt - Fest der Umfangskontrolle
include und for Tags - Fehler mit Makros -Aufruf im Expressionskontext behoben
Veränderungen brechen
- Der MSVC -Laufzeittyp wird jetzt durch
JINJA2CPP_MSVC_RUNTIME_TYPE cmake -Variable definiert
Version 0.9.2
Hauptveränderungen
- Benutzerdefinierte Anruflinge implementiert. Jetzt können Sie Ihre eigenen aufrufbaren Objekte definieren, sie als Eingabeparameter übergeben und in Vorlagen als reguläre (globale) Funktionen, Filter oder Tester verwenden. Siehe Details hier: https://jinja2cpp.github.io/docs/usage/ud_callables.html
- Jetzt können Sie globale (Vorlagenumgebungs-) Parameter definieren, die für alle an diese Umgebung gebundenen Vorlagen zugänglich sind.
-
include , import und from implementierten Anweisungen. Jetzt ist es möglich, andere Vorlagen einzubeziehen und Makros aus anderen Vorlagen zu verwenden. -
with implementierter Erklärung -
do -Erklärung implementiert - Probe-Build-Projekte für verschiedene Jinja2C ++ -Schutzungsvarianten erstellt: https://github.com/jinja2cpp/examples-build weibliche als
- Dokumentationsseite für Jinja2c ++: https://jinja2cpp.github.io erstellt
Geringfügige Änderungen
- Fehlerhandhabung des Renders-Zeit-Fehlers hinzugefügt
- Abhängigkeitsverwaltungsmodus zum Build -Skript hinzugefügt
- Beheben von Fehler mit der Fehlerberichterstattung während der Parse -Zeit
- Verbesserte Versionen externer Abhängigkeiten
Veränderungen brechen
-
RenderAsString -Methode gibt jetzt nonstd::expected anstelle von normalem std::string zurück -
include extends import TemplateEnv - Release -Bundles (Archive) werden standardmäßig mit dem
external Abhängigkeitsverwaltungsmodus konfiguriert
Version 0.9.1
-
applymacro -Filter hinzugefügt, mit dem das Anwendung beliebiger Makro als Filter angewendet wird - Abhängigkeiten, die von der öffentlichen Schnittstelle entfernt werden sollen
- CMake -Skripte verbesserten sich
- Verschiedene Fehler behoben
- Reflexion verbessern
- Warnungen aufräumen
Version 0.9
- Unterstützung von "Auslöschungen"/"Block" -Anweisungen
- Unterstützung von 'Makro'/'Call' -Anweisungen
- Reiche Fehlerberichterstattung
- Unterstützung für rekursive Schleifen
- Unterstützung für die Raumsteuerung vor und nach Kontrollblöcken
- Reflexion verbessern
Version 0.6
- Viele Filter wurden implementiert. Vollständiger Satz unterstützter Filter, die hier aufgeführt sind: #7
- Viele Tester wurden implementiert. Vollständiger Satz unterstützter Tester, die hier aufgeführt sind: #8
- 'Concattenate als String' -Operator ('~') wurde implementiert
- Für die Schleife mit 'if' Bedingung wurde implementiert
- Einige Fehler in Parser behoben