Jinja2с ++
Implementación de C ++ del motor de plantilla Jinja2 Python. Esta biblioteca trae soporte de potentes características de plantilla Jinja2 en el mundo C ++, informa páginas dinámicas HTML y generación de código fuente.
Introducción
Características principales de Jinja2c ++:
- Interfaz pública fácil de usar. Simplemente cargue las plantillas y las renderice.
- Conformidad con la especificación Jinja2
- Soporte completo de cadenas de características estrechas y amplias tanto para plantillas como para parámetros.
- Reflexión incorporada para los tipos comunes de C ++, Nlohmann y Bibliotecas Rapid JSON.
- Poderosas expresiones de Jinja2 con Filtrado (a través de '|' Operador) y 'If'-Expressions.
- Declaraciones de control (
set , for , if , filter , do , with ). - Extensión de plantillas, incluida e importación
- Macros
- Riches informes de errores.
- Entorno de plantilla compartida con plantillas soporte de caché
Por ejemplo, este simple código:
# 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(); produce la cadena de resultados:
Helloworld!!!
Hello, world!!!
Hello; world!!!
hello; world!!!
Empezando
Para usar jinja2c ++ en su proyecto, debe:
- Clon el repositorio Jinja2c ++
- Construirlo de acuerdo con las instrucciones
- Enlace a su proyecto.
El uso de Jinja2c ++ en el código es bastante simple:
- Declarar el objeto Jinja2 :: Template:
- Públalo con plantilla:
tpl.Load( " {{ 'Hello World' }}!!! " );- Renderizar la plantilla:
std::cout << tpl.RenderAsString({}).value() << std::endl; Y consigue:
Hello World!!!
¡Eso es todo!
Se pueden encontrar ejemplos y características más detallados en la documentación: https://jinja2cpp.github.io/docs/usage
Soporte actual de Jinja2
Actualmente, Jinja2c ++ admite el número limitado de características de Jinja2. Por cierto, Jinja2c ++ está planeado para ser un conformador de especificaciones Jinja2 totalmente. El soporte actual se limita a:
- Expresiones. Puede usar casi todos los estilo de expresión: simple, filtrado, condicional, etc.
- El gran número de filtros ( ordenar, predeterminado, primero, último, longitud, max, min, reverso, único, suma, attr, map, rechazar, rechazar, seleccionar, selectAttr, pPrint, dictsort, ABS, float, int, list, ronda, aleatory, Title, superior, word, reemplazar, truncar, groupby, innerdodo, capitalizar, escapar, tojson, striptags, centro, centro, xmlattr )
- El gran número de probadores ( EQ, definido, GE, GT, Itererable, LE, LT, Mapeo, NE, Número, Secuencia, Cadena, Undefined, In, incluso, impar, inferior, superior )
- el número de funciones ( rango , bucle.cycle )
- 'If' Declaración (con ramas 'Elif' y 'Else')
- 'para' Declaración (con 'else' rama y 'si' soporta de pieza)
- 'Incluir' Declaración
- 'Importar'/'desde' declaraciones
- Declaración de 'Establecer' (tanto línea como bloque)
- Declaración de 'filtrar'
- 'extiende'/'bloquear' declaraciones
- Declaraciones de 'macro'/'llamar'
- 'con' Declaración
- Declaración de extensión de 'hacer'
- bucles recursivos
- Control de espacio y bloques 'Raw'/'Endraw'
Se puede encontrar información completa sobre la tabla de soporte de especificaciones y compatibilidad de Jinja2 aquí: https://jinja2cpp.github.io/docs/j2_compatibility.html.
Compiladores compatibles
Compilación de Jinja2c ++ probada en los siguientes compiladores (con características habilitadas C ++ 14 y 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 en compilación predeterminada, C ++ 17 con impulso proporcionado externamente)
- Microsoft Visual Studio 2015 - 2019 x86, x64
- Compilador Mingw GCC 7.3
- Compilador Mingw GCC 8.1
Nota: Soporte de la versión GCC> = 9.x o la versión de Clang> = 8.0 depende de la versión de la biblioteca BOOST proporcionada.
Estado de construcción
| Compilador | Estado |
|---|
| MSVC 2015 (x86, x64), Mingw 7 (x64), Mingw 8 (x64) | |
| Código 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 | |
Construir e instalar
Jinja2c ++ tiene varias dependencias externas:
- Biblioteca
boost (al menos la versión 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
Se pueden encontrar ejemplos de scripts de compilación y diferentes configuraciones de compilación: https://github.com/jinja2cpp/examples-build
En el caso más simple para compilar Jinja2c ++ necesitas:
- Instale el sistema de compilación Cmake (al menos la versión 3.0)
- Repositorio Clone Jinja2CPP:
> git clone https://github.com/flexferrum/Jinja2Cpp.git
- Crear directorio de compilación:
> cd Jinja2Cpp
> mkdir build
- Ejecute cmake y construya la biblioteca:
> cd build
> cmake .. -DCMAKE_INSTALL_PREFIX=<path to install folder>
> cmake --build . --target all
"Ruta para instalar la carpeta" Aquí hay una ruta a la carpeta donde desea instalar Jinja2c ++ lib.
- Instalar biblioteca:
> cmake --build . --target install
En este caso, Jinja2c ++ se construirá con dependencias enviadas internamente e instalará respectivamente. Pero Jinja2c ++ admite compilaciones con DEPs proporcionados externamente.
Uso con Conan.io Dependency Manager
Jinja2c ++ se puede usar como paquete Conan.io. En este caso, debe hacer los siguientes pasos:
- Instale Conan.io de acuerdo con la documentación (https://docs.conan.io/en/latest/installation.html)
- Agregue una referencia al paquete jinja2c ++ (
jinja2cpp/1.2.1 ) a su conanfile.txt, conanfile.py o cmakelists.txt. Por ejemplo, con el uso de la integración conan-cmake podría escribirse de esta manera:
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 )
Banderas de construcción de cmake adicionales
Puede definir (a través de la opción CMake de línea de comandos -d) los siguientes indicadores de compilación:
- Jinja2cpp_build_tests (predeterminado verdadero) - para construir o no a las pruebas Jinja2c ++.
- Jinja2cpp_strict_warnings (predeterminado verdadero) -Habilitar el modo estricto compile -warnings (-wall -werror, etc.).
- Jinja2cpp_msvc_runtime_type (default /md) - type de ejecución msvc para vincular (si usa el compilador de Microsoft Visual Studio).
- Jinja2cpp_deps_mode (predeterminado "interno") - modos para el manejo de la dependencia. Los siguientes valores posibles:
-
internal en este modo Jinja2C ++ Build Script utiliza dependencias (incluir boost ) enviadas como subprojects. No es necesario proporcionar nada externamente. -
external-boost en este modo Jinja2c ++ Build script usa solo boost como una dependencia proporcionada externamente. Todas las demás dependencias se toman de subproyectos. -
external en este modo todas las dependencias deben proporcionarse externamente. Las rutas para boost , nonstd-* libs, etc. deben especificarse a través de variables CMake estándar (como CMAKE_PREFIX_PATH o Libname_Dir) - Modo especial
conan-build para construir Jinja2c ++ a través de la receta de Conan.
Construir con c ++ 17 estándar habilitado
Jinja2c ++ intenta usar versiones estándar de std::variant , std::string_view y std::optional si es posible.
Expresiones de gratitud
Gracias a @FlexFerrum por crear esta biblioteca, por ser una de las mentes más brillantes en la comunidad de ingeniería de software. Descansa en paz, amigo.
Gracias a @manu343726 por la mejora de los scripts de Cmake, la caza de errores y la reparación y el empaque de Conan.io.
Gracias a @martinmoene por las bibliotecas XXX-Lite perfectamente implementadas.
Gracias a @Vitaut por la increíble biblioteca de formato de texto.
Gracias a @martinus por la implementación de mapas de hash rápido.
Colegio de cambios
Versión 1.3.2
Lo que ha cambiado
- Arreglar el análisis literal de dict vacío en el #243
- Arreglando la protección de la ira de la vida faltante para el filtro inverso (y otros). por @jferreyra-sc en #246
- Capacidad para deshabilitar las reglas de instalación de Jinjacpp por @Ilya-Lavrenov en #250
- Cmake solo encuentra Rapidjson descargado por @Ilya-Lavrenov en #254
- Actualizar dependencias de refuerzo por @CheaterDev en #253
Nuevos contribuyentes
- @Jferreyra-SC hizo su primera contribución en el #246
- @Ilya-Lavrenov hizo su primera contribución en el #250
- @CheaterDev hizo su primera contribución en el #253
Versión 1.3.1
Cambios y mejoras
- Versiones de Bump Deps
- Agregar New JSON Binding - Boost :: JSON
- Speedup Regex analizando cambiando a Boost :: Regex (std :: regex extremadamente lento)
- Las plantillas ahora se están cargando más rápido
Se corrigieron errores
- Pequeñas correcciones a través de la base del código
Cambios de ruptura
- Deps internos ahora se usan a través de cmake fetch_content
- JSON Serializer/Deserializer predeterminado se cambia a Boost :: JSON
Versión 1.2.1
Cambios y mejoras
- Versiones de Bump Deps
- Apoye a los compiladores modernos (hasta el rango 12) y los estándares (C ++ 20)
- Tiny Code Style Cleanup
Se corrigieron errores
- Pequeñas correcciones a través de la base del código
Cambios de ruptura
- Los Deps internos apuntan a hacer una construcción de impulso basado
Versión 1.1.0
Cambios y mejoras
- Filtro
batch agregado - Filtro
slice agregado - Filtro
format agregado - Filtro
tojson agregado - Filtro
striptags agregado - Filtro
center agregado - Filtro
xmlattr agregado - Tags
raw / endraw agregados - Operador de cadena de repetición agregado (por ejemplo
'a' * 5 producirá 'aaaaa' ) - Soporte para los metadatos de plantillas (etiquetas
meta / endmeta ) agregadas -
-fPIC Bandera agregada a la configuración de compilación de Linux
Se corrigieron errores
- Arreglar el comportamiento de la configuración global LstripBlock/Trimblocks. Ahora corresponde completamente al origina Jinja2
- Se corrige el error con el contenido
block de los padres si el niño no anula este bloque - Arreglar problemas de compilación con llamadas definidas por el usuario con un número de argumentos más de 2
- Arreglar el acceso a las funciones globales de Jinja2 de plantillas incluidas/extendidas
- FIJO PUNTO DE EVALUACIÓN DE MACRO PARAMS
- Arreglar el bucle sobre las cuerdas
- Advertencias de limpieza
Cambios de ruptura
- A partir de ahora, con C ++ 17 estándar habilitado Jinja2C ++ utiliza versiones estándar de tipos
variant , string_view y optional
Versión 1.0.0
Cambios y mejoras
- Atributo
default agregado al filtro map (#48) - Soporte de secuencias de escape agregado a los literales de cadena (#49)
- rangos arbitrarios, secuencias generadas, iteradores de entrada, etc. Ahora se pueden usar con el tipo de
GenericList (#66) - sinstd :: string_view es ahora uno de los tipos posibles para el
Value - Soporte de la etiqueta de
filter agregado al analizador de plantilla (#44) - Soporte de filtro
escape agregado al analizador de plantilla (#140) - Soporte de filtro
capitalize agregada al analizador de plantilla (#137) - La versión multiline de la etiqueta
set agregada al analizador (#45) - Se agregó una reflexión incorporada para las bibliotecas Nlohmann Json y Rapidjson (#78)
-
loop.depth y loop.depth0 Variables Soporte agregado - {fmt} ahora se usa como una biblioteca de formato en lugar de iostreams
- El mapa de hash Robin Hood ahora se usa para el almacenamiento de valor interno
- Renderizar mejoras de rendimiento
- Cache de plantilla implementado en
TemplateEnv - Los llamados definidos por el usuario ahora pueden aceptar el contexto global a través de
*context - Mingw, clang> = 7.0, xcode> = 9, gcc> = 7.0 ahora se admiten oficialmente como compiladores de destino (#79)
Se corrigieron errores
- Precedencia del operador de tubería fija (
| ) (#47) - Se corrigió el error en el convertidor interno de char <-> wchar_t en Windows
- Frasco fijo en la etiqueta
endblock de análisis - Control de alcance fijo para
include y for etiquetas - Se corrigió el error con la llamada de las macros dentro del contexto de expresión
Cambios de ruptura
- El tipo de tiempo de ejecución de MSVC ahora está definido por
JINJA2CPP_MSVC_RUNTIME_TYPE cmake variable
Versión 0.9.2
Cambios importantes
- Callables definidos por el usuario implementados. Ahora puede definir sus propios objetos llamables, pasarlos como parámetros de entrada y usarlos dentro de las plantillas como funciones regulares (globales), filtros o probadores. Vea los detalles aquí: https://jinja2cpp.github.io/docs/usage/ud_callables.html
- Ahora puede definir los parámetros globales (de plantilla en todo el entorno) a los que se puede acceder para todas las plantillas unidas a este entorno.
-
include , import y from declaraciones implementadas. Ahora es posible incluir otras plantillas y usar macros de otras plantillas. -
with declaración implementada - Declaración
do - Ejemplo de proyectos de construcción para varias variantes de uso Jinja2c ++ creadas: https://github.com/jinja2cpp/examples-buildfont>(https://github.com/jinja2cpp/examples-build)
- Sitio de documentación creado para jinja2c ++: https://jinja2cpp.github.io
Cambios menores
- Manejo de errores de tiempo de renderizado agregado
- Modo de gestión de dependencias agregado al script de compilación
- Corrige errores con informes de errores durante el tiempo de análisis
- Versiones actualizadas de dependencias externas
Cambios de ruptura
- El método
RenderAsString ahora devuelve nonstd::expected en lugar de std::string regular - Plantillas con
import , extends e include errores de generación si se analiza sin TemplateEnv - Los paquetes de liberación (archivos) se configuran con el modo de administración de dependencia
external de forma predeterminada
Versión 0.9.1
-
applymacro Filtro de Macro agregado que permite aplicar la macro arbitraria como filtro - dependencias para aumentar la interfaz pública
- Los scripts de cmake mejoraron
- Varios errores solucionados
- Mejorar la reflexión
- Limpieza de advertencias
Versión 0.9
- Soporte de 'extensiones'/'bloquear' declaraciones
- Soporte de declaraciones 'macro'/'llamar'
- Informes de errores ricos
- Soporte para bucles recursivos
- Soporte para el control del espacio antes y después de los bloques de control
- Mejorar la reflexión
Versión 0.6
- Se han implementado muchos filtros. Conjunto completo de filtros compatibles enumerados aquí: #7
- Se han implementado muchos probadores. Conjunto completo de probadores compatibles en la lista aquí: #8
- Se ha implementado el operador 'concatenate as string' ('~')
- For-loop con la condición 'si' se ha implementado
- Se corrigió algunos errores en el analizador