Jinja2S ++
C ++ Реализация шаблона Jinja2 Python. Эта библиотека обеспечивает поддержку мощных функций шаблона Jinja2 в мир C ++, сообщает динамические HTML -страницы и генерацию исходного кода.
Введение
Основные особенности Jinja2c ++:
- Легкий в использовании общественный интерфейс. Просто загрузите шаблоны и отображайте их.
- Соответствие спецификации Jinja2
- Полная поддержка узких и широко-характерных строк как для шаблонов, так и для параметров.
- Встроенное отражение для общих типов C ++, библиотек Nlohmann и Rapid JSON.
- Мощные полнофункциональные экспрессии Jinja2 с фильтрацией (через оператор | '') и «if'-expressions».
- Управляющие операторы (
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 ++
- Построить его в соответствии с инструкциями
- Ссылка на ваш проект.
Использование Jinja2c ++ в коде довольно просто:
- Объект объект Template Declate :: Template ::
- Заполните его шаблоном:
tpl.Load( " {{ 'Hello World' }}!!! " );- Визучите шаблон:
std::cout << tpl.RenderAsString({}).value() << std::endl; и получить:
Hello World!!!
Вот и все!
Более подробные примеры и функции описания можно найти в документации: https://jinja2cpp.github.io/docs/usage
Текущая поддержка Jinja2
В настоящее время Jinja2c ++ поддерживает ограниченное количество функций Jinja2. Кстати, планируется, что Jinja2c ++ будет полностью конфигурирующим спецификацией Jinja2. Текущая поддержка ограничена:
- выражения. Вы можете использовать практически каждый стиль выражения: простой, отфильтрованный, условный и так далее.
- Большое количество фильтров ( сортировка, по умолчанию, первое, последнее, длина, максимум, min, обратное, уникальное, сумма, атрис, карта, отверстие, Decuctattr, Select, Selectattr, Pprint, Dictsort, ABS, Float, Int, List, Round, Trim, Title, Upper, WordCount, замените, утечка, группа, urlencode, капитал, капитал, Essave, striptag, strytr, xmmstr
- Большое количество тестеров ( уравнение, определение, GE, GT, итерапильно, LE, LT, Mapping, NE, число, последовательность, строка, неопределенная, in, даже нечетная, нижняя, верхняя )
- Количество функций ( диапазон , loop.cycle )
- Утверждение «если» (с «elif» и «else» филиалы)
- Заявление «для» (с «else» филиалом и «если» поддержка части)
- «Включить» заявление
- «Импорт»/'из «утверждений»
- оператор «установить» (как строка, так и блок)
- Оператор «фильтра»
- «Extends»/'Block' операторы
- «Macro»/«Вызов»
- «С» заявлением
- Заявление о расширении «DO»
- рекурсивные петли
- Управление пространством и «RAW»/'ENDRAW' блоки
Полную информацию о таблице поддержки и совместимости Jinja2 можно найти здесь: https://jinja2cpp.github.io/docs/j2_compatibility.html.
Поддерживаемые компиляторы
Компиляция jinja2c ++, протестированного на следующих компиляторах (с функциями с включенными функциями C ++ 14 и C ++):
- Linux GCC 5,5 - 9,0
- Linux clang 5.0 - 9
- MacOS X-код 9
- MacOS X-Code 10
- MacOS X-Code 11 (C ++ 14 в сборке по умолчанию, C ++ 17 с внешне повышением)
- Microsoft Visual Studio 2015 - 2019 X86, X64
- Mingw GCC Compiler 7.3
- Mingw GCC Compiler 8.1
ПРИМЕЧАНИЕ. Поддержка версии 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-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
Примеры сценариев сборки и различных конфигураций сборки можно найти здесь: https://github.com/jinja2cpp/examples-build
В простейшем случае для компиляции Jinja2c ++ вам нужно:
- Установите систему сборки Cmake (по крайней мере, версия 3.0)
- Клон jinja2cpp Repository:
> git clone https://github.com/flexferrum/Jinja2Cpp.git
- Создать каталог сборки:
> cd Jinja2Cpp
> mkdir build
- Запустите Cmake и создайте библиотеку:
> cd build
> cmake .. -DCMAKE_INSTALL_PREFIX=<path to install folder>
> cmake --build . --target all
«Путь к установке папки» Вот путь к папке, где вы хотите установить Jinja2c ++ lib.
- Установить библиотеку:
> cmake --build . --target install
В этом случае Jinja2c ++ будет построен с внутренними зависимостями и установлением их соответственно. Но Jinja2c ++ поддерживает сборки с извне предоставленными DEP.
Использование с менеджером зависимостей CONAN.IO
Jinja2c ++ может использоваться в качестве пакета conan.io. В этом случае вы должны сделать следующие шаги:
- Установите Conan.io в соответствии с документацией (https://docs.conan.io/en/latest/installation.html)
- Добавьте ссылку на пакет Jinja2c ++ (
jinja2cpp/1.2.1 ) в ваш conanfile.txt, conanfile.py или cmakelists.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 )
Дополнительные флаги сборки Cmake
Вы можете определить (wia -d -Deam -Line Cmake Option) Следующие флаги сборки:
- Jinja2cpp_build_tests (по умолчанию true) - для создания или не для тестов Jinja2c ++.
- Jinja2cpp_strict_warnings (по умолчанию True) -включить строгие режимы компиляции (-wall -werror и т. Д.).
- Jinja2cpp_msvc_runtime_type (default /md) - тип времени выполнения MSVC для ссылки (если вы используете компилятор Microsoft Visual Studio).
- Jinja2cpp_deps_mode (по умолчанию «внутренний») - режимы для обработки зависимостей. Возможны следующие значения:
-
internal в этом режиме сценарий сценария jinja2c ++ использует зависимости (включает boost ), отправленные в качестве подпроектов. Ничего не должно быть предоставлено извне. -
external-boost в этом режиме сценария сборки jinja2c ++ использует только boost в качестве зависимости от внешней части. Все остальные зависимости взяты из подпроектов. -
external в этом режиме все зависимости должны быть предоставлены внешне. Путь для boost , nonstd-* libs и т. Д. Должны быть указаны с помощью стандартных переменных cmake (например, CMAKE_PREFIX_PATH или libname_dir) - Специальный режим
conan-build для построения Jinja2c ++ через рецепт Conan.
Строить с помощью стандарта C ++ 17
Jinja2c ++ пытается использовать стандартные версии std::variant , std::string_view и std::optional , если это возможно.
Благодарности
Спасибо @flexferrum за создание этой библиотеки, за то, что он был одним из самых ярких умов в сообществе разработки программного обеспечения. Покойся с миром, друг.
Спасибо @Manu343726 за улучшение сценариев Cmake, охоту на ошибки, а также исправление и упаковку Conan.io.
Спасибо @martinmoene за идеально реализованные библиотеки XXX-Lite.
Спасибо @Vitaut за удивительную библиотеку форматирования текста.
Спасибо @martinus за реализацию карт Fast Hash.
Изменение
Версия 1.3.2
Что изменилось
- Исправить пустой диктал буквального анализа в #243
- Исправление защиты от пропущенного срока службы для обратного фильтра (и других). @jferreyra-sc в #246
- Возможность отключить правила установки Jinjacpp от @Ilya-Lavrenov в #250
- Cmake находит только скачанный Rapidjson от @Ilya-Lavrenov в #254
- Обновить зависимости повышения @cheaterdev в #253
Новые участники
- @Jferreyra-Sc внес свой вклад в #246
- @Илья-Лавренов сделал свой первый вклад в #250
- @CheaterDev внес свой первый вклад в #253
Версия 1.3.1
Изменения и улучшения
- Bump Deps версии
- Добавить новую привязку JSON - boost :: json
- Расположение режима скорости, переключившись на Boost :: Regex (std :: regex очень медленно)
- Шаблоны сейчас загружаются быстрее
Исправлены ошибки
- Небольшие исправления по базе кода
Нарушение изменений
- Внутренние DEP, которые теперь используются через cmake fetch_content
- Serializer/Deserializer по умолчанию по умолчанию переключается на Boost :: JSON
Версия 1.2.1
Изменения и улучшения
- Bump Deps версии
- Поддержите современные компиляторы (до кланг 12) и стандарты (C ++ 20)
- Крошечная очистка стиля кода
Исправлены ошибки
- Небольшие исправления по базе кода
Нарушение изменений
- Внутренние DEP указывают на создание на основе настройки
Версия 1.1.0
Изменения и улучшения
- Добавлен
batch фильтр -
slice фильтр добавлен -
format фильтр добавлен -
tojson Filter добавлен -
striptags фильтр добавлен -
center фильтр добавлен -
xmlattr Filter добавлен - Добавлены теги
raw / endraw - Повторный оператор строки добавлен (например
'a' * 5 будет создавать 'aaaaa' ) - Поддержка шаблонов Metadata (
meta / endmeta Tags) добавлена -
-fPIC Flag добавлен в конфигурацию Linux Build
Исправлены ошибки
- Исправлено поведение LSTRIPBLOCK/TRIMBLOCKS GLOBAL SET. Теперь это полностью соответствует Origina Jinja2
- Исправьте ошибку с помощью содержимого родительского
block , если ребенок не переопределяет этот блок - Исправить проблемы компиляции с определенными пользователями Callables с количеством аргументов более 2
- Исправить доступ к глобальным функциям Jinja2 из включенных/расширенных шаблонов
- Исправлена точка оценки макромама
- Исправьте зацикливание по струнам
- Уборка предупреждений
Нарушение изменений
- С этого момента с C ++ 17 стандартная включенная Jinja2c ++ использует стандартные версии типов
variant , string_view и optional
Версия 1.0.0
Изменения и улучшения
- Атрибут
default добавлен в фильтр map (#48) - Поддержка последовательностей побега добавлена в строковые литералы (#49)
- произвольные диапазоны, сгенерированные последовательности, входные итераторы и т. Д. Теперь можно использовать с типом
GenericList (#66) - nonstd :: string_view теперь является одним из возможных типов для
Value - Поддержка тега
filter добавлена в анализатор шаблона (#44) - Поддержка фильтра
escape Добавлена к анализатору шаблона (#140) - Поддержка
capitalize добавлена в анализатор шаблона (#137) - Многослойная версия тега
set добавлена в анализатор (#45) - Добавлено встроенное отражение для библиотек Nlohmann Json и Rapidjson (#78)
-
loop.depth и loop.depth0 . - {fmt} теперь используется в качестве библиотеки форматирования вместо iostreams
- Хэш -карта Robin Good теперь используется для хранения внутренних значений
- Создание улучшения производительности
- шаблонный кэш, реализованный в
TemplateEnv - Определенные пользователем Callables теперь могут принять глобальный контекст через
*context Специальный параметр - Mingw, Clang> = 7.0, Xcode> = 9, GCC> = 7.0 теперь официально поддерживаются в качестве целевых компиляторов (#79)
Исправлены ошибки
- Приоритет оператора фиксированной трубы (
| ) (#47) - Исправлена ошибка во внутреннем углу
- Исправленная сбоя в метке
endblock - Фиксированное управление масштабами для
include и for тегов - Исправлена ошибка с вызовом макросов в контексте выражения
Нарушение изменений
- Тип времени выполнения MSVC теперь определяется
JINJA2CPP_MSVC_RUNTIME_TYPE cmake переменная
Версия 0.9.2
Основные изменения
- Пользовательские Callables реализованы. Теперь вы можете определить свои собственные вызывчивые объекты, передавать их в качестве входных параметров и использовать их внутри шаблонов в качестве регулярных (глобальных) функций, фильтров или тестеров. См. Подробности здесь: https://jinja2cpp.github.io/docs/usage/ud_callables.html
- Теперь вы можете определить глобальные (шаблонные среды) параметры, которые доступны для всех шаблонов, связанных с этой средой.
-
include , import и from реализации заявлений. Теперь можно включить другие шаблоны и использовать макросы из других шаблонов. -
with реализованным заявлением -
do Реализовано заявление - Образец строительства проектов для различных вариантов использования Jinja2c ++: https://github.com/jinja2cpp/examples-build^(https://github.com/jinja2cpp/examples-build)
- Сайт документации, созданный для jinja2c ++: https://jinja2cpp.github.io
Незначительные изменения
- Добавлена обработка ошибок в рамках рендеринга
- Режим управления зависимостями, добавленный в сценарий сборки
- Исправьте ошибки с отчетностью об ошибках во время анализа
- Модернизированные версии внешних зависимостей
Нарушение изменений
- Метод
RenderAsString теперь возвращает nonstd::expected вместо обычного std::string - Шаблоны с
import , extends и include генерирующие ошибки, если они проанализированы без TemplateEnv - Основные пакеты (архивы) настроены с помощью режима управления
external управлением зависимостями по умолчанию
Версия 0.9.1
-
applymacro FILTER, который позволяет применять произвольный макрос в качестве фильтра - Зависимости для повышения удаленного от общественного интерфейса
- Сценарии Cmake улучшились
- Исправлены различные ошибки
- Улучшить размышление
- Уборка предупреждений
Версия 0.9
- Поддержка операторов «extents»/'block'
- Поддержка операторов «макро»/«вызов»
- Богатая отчетность об ошибках
- Поддержка рекурсивных петлей
- Поддержка управления пространством до и после управления блоками
- Улучшить размышление
Версия 0.6
- Много фильтров было реализовано. Полный набор поддерживаемых фильтров, перечисленных здесь: #7
- Много тестеров было реализовано. Полный набор поддерживаемых тестеров, перечисленных здесь: #8
- 'Concatenate As String' Operator ('~') был реализован
- Для петли с условием «если» было реализовано
- Исправлены некоторые ошибки в анализаторе