Jinja2с ++
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 ++ في الكود بسيط للغاية:
- إعلان كائن القالب jinja2 :::
- ملءه بالقالب:
tpl.Load( " {{ 'Hello World' }}!!! " );- جعل القالب:
std::cout << tpl.RenderAsString({}).value() << std::endl; واحصل على:
Hello World!!!
هذا كل شيء!
يمكن العثور على المزيد من الأمثلة والميزات التفصيلية في الوثائق: https://jinja2cpp.github.io/docs/usage
دعم Jinja2 الحالي
حاليًا ، يدعم Jinja2c ++ العدد المحدود من ميزات Jinja2. بالمناسبة ، من المقرر أن يكون Jinja2c ++ من مواصفات Jinja2 بالكامل. يقتصر الدعم الحالي على:
- تعبيرات. يمكنك استخدام كل نمط تعبير تقريبًا: بسيط ، مرشح ، مشروط ، وما إلى ذلك.
- العدد الكبير من المرشحات ( الفرز ، الافتراضي ، الأول ، الأخير ، الطول ، الحد الأقصى ، الدقيقة ، عكس ، فريدة من نوعها ، المبلغ ، attr ، خريطة ، رفض ، رفض ، حدد ، selectattr ، pprint ، dictsort ، abs ، تعويم ، int ، القائمة ، الجولة ، trim ، trome ، title ، wordcount ، struncate ، groupby ، urlencod
- العدد الكبير من المختبرين ( Eq ، المحدد ، GE ، GT ، ITERBLE ، LE ، LT ، رسم الخرائط ، NE ، العدد ، التسلسل ، سلسلة ، غير محددة ، في ، حتى ، غريب ، أقل ، أعلى ).
- عدد الوظائف ( المدى ، loop.cycle )
- بيان "إذا" مع فروع "أليف" و "أخرى")
- "من أجل" البيان (مع فرع "آخر" و "إذا كان" دعم جزء)
- "تشمل" بيان
- "استيراد"/"من البيانات
- بيان "SET" (كلا الخط والكتل)
- بيان "المرشح"
- عبارات "تمتد"/"كتلة"
- عبارات "الماكرو"/"الاتصال"
- "مع" بيان
- بيان التمديد "افعل"
- الحلقات العودية
- التحكم في المساحة و "الخام"/"endraw" كتل
يمكن الاطلاع على معلومات كاملة حول دعم مواصفات Jinja2 وتوافقها هنا: https://jinja2cpp.github.io/docs/j2_compatibility.html.
المترجمون المدعومون
تم اختبار تجميع Jinja2c ++ على المترجمين التاليين (مع ميزات C ++ 14 و C ++ 17):
- Linux GCC 5.5 - 9.0
- Linux Clang 5.0 - 9
- ماكوس X-Code 9
- ماكوس X-Code 10
- MacOS X-Code 11 (C ++ 14 في البناء الافتراضي ، C ++ 17 مع دفعة مقدمة من الخارج)
- Microsoft Visual Studio 2015 - 2019 x86 ، x64
- برنامج التحويل البرمجي Mingw GCC 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)
- مستودع Clone Jinja2CPP:
> 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 ++ يدعم البناء مع DEPs التي توفرها خارجيا.
الاستخدام مع مدير التبعية 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 إضافية
يمكنك تحديد (عبر خيار سطر الأوامر cmake) علامات الإنشاء التالية:
- Jinja2cpp_build_tests (صواب افتراضي) - لبناء أو عدم اختبارات Jinja2c ++.
- jinja2cpp_strict_warnings (صواب افتراضي) -تمكين الوضع الصارم الترجمة (-wall -weror ، إلخ).
- Jinja2CPP_MSVC_Runtime_Type (افتراضي /MD) - نوع وقت التشغيل MSVC للربط مع (إذا كنت تستخدم Microsoft Visual Studio Compiler).
- Jinja2cpp_deps_mode (افتراضي "داخلي") - أوضاع لمعالجة التبعية. القيم التالية الممكنة:
-
internal في هذا الوضع ، يستخدم نص Build Jinja2c ++ تبعية (تضمين boost ) مشحونة كمشروعات فرعية. لا شيء يجب توفيره خارجيا. - يستخدم
external-boost في هذا الوضع البرنامج النصي Jinja2c ++ Build فقط 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 لتنفيذ خرائط التجزئة السريعة.
Changelog
الإصدار 1.3.2
ما الذي تغير
- أصلح التحليل الحرفي الفارغ للملفات في #243
- إصلاح حماية الغضب الحياة المفقودة للمرشح العكسي (وغيرها). بواسطة @jferreyra-sc في #246
- القدرة على تعطيل قواعد تثبيت Jinjacpp بواسطة @ايليا لافينوف في #250
- يجد Cmake فقط Rapidjson الذي تم تنزيله بواسطة @Ilya-Lavrenov في #254
- تحديث التبعيات Boost بواسطة CheaterDev في #253
مساهمون جدد
- قدم @jferreyra-sc مساهمته الأولى في #246
- قدم @ilya-lavrenov مساهمته الأولى في #250
- قدم Cheaterdev مساهمته الأولى في #253
الإصدار 1.3.1
التغييرات والتحسينات
- إصدارات DEPS عثرة
- أضف New JSON Binding - Boost :: JSON
- تسريع REGEX التحليل عن طريق التبديل إلى BOOST :: Regex (STD :: Regex بطيئة للغاية)
- يتم تحميل القوالب الآن بشكل أسرع
حشرات ثابتة
- إصلاحات صغيرة عبر قاعدة الكود
كسر التغييرات
- تستخدم Deps الداخلية الآن من خلال Cmake Fetch_Content
- يتم تبديل JSON Serializer/Deserializer إلى Boost :: JSON
الإصدار 1.2.1
التغييرات والتحسينات
- إصدارات DEPS عثرة
- دعم المترجمين الحديثين (حتى Clang 12) والمعايير (C ++ 20)
- تنظيف نمط الكود الصغير
حشرات ثابتة
- إصلاحات صغيرة عبر قاعدة الكود
كسر التغييرات
- تشير DEPS الداخلية إلى إنشاء BOOST بناء
الإصدار 1.1.0
التغييرات والتحسينات
- وأضاف مرشح
batch - تمت إضافة مرشح
slice - مرشح
format إضافة - وأضاف مرشح
tojson - تمت إضافة مرشح
striptags - وأضاف مرشح
center - وأضاف مرشح
xmlattr - تمت إضافة علامات
raw / endraw - تمت إضافة مشغل السلسلة المتكرر (على سبيل المثال
'a' * 5 سوف ينتج 'aaaaa' ) - إضافة بيانات تعريف القوالب (علامات
meta / endmeta ) أضيفت - -تم إضافة علامة
-fPIC إلى تكوين إنشاء Linux
حشرات ثابتة
- إصلاح سلوك lstripblock/trimblocks الإعدادات العالمية. الآن يتوافق تمامًا مع Origina Jinja2
- إصلاح الخلل مع تقديم محتوى
block الوالدين إذا لم يتجاوز الطفل هذه الكتلة - إصلاح مشكلات التجميع مع callables المعرفة من قبل المستخدم مع عدد من الوسائط أكثر من 2
- إصلاح الوصول إلى وظائف Global Jinja2 من القوالب الممتدة/الممتدة
- إصلاح نقطة تقييم المعاملات الماكرو
- إصلاح الحلقات على الأوتار
- تحذيرات التنظيف
كسر التغييرات
- من الآن مع C ++ 17 Standard 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 Hood لتخزين القيمة الداخلية
- تقديم تحسينات الأداء
- ذاكرة التخزين المؤقت القالب التي تم تنفيذها في
TemplateEnv - يمكن الآن لـ Callables المعرفة من قبل المستخدم قبول السياق العالمي عبر
*context Special Param - mingw ، clang> = 7.0 ، xcode> = 9 ، gcc> = 7.0 يتم دعمها رسميًا كمجموعات مستهدفة (#79)
حشرات ثابتة
- الأسبقية ذات الأنابيب الثابتة (
| ) أسبقية (#47) - خطأ ثابت في محول char داخلي <-> wchar_t على Windows
- تحطم ثابت في تحليل علامة
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 charild(https://github.com/jinja2cpp/examples-build)
- موقع الوثائق الذي تم إنشاؤه لـ Jinja2c ++: https://jinja2cpp.github.io
تغييرات طفيفة
- تمت إضافة خطأ في وقت العرض
- تم إضافة وضع إدارة التبعية إلى برنامج Build Script
- إصلاح الأخطاء مع الإبلاغ عن الخطأ أثناء وقت التحليل
- إصدارات ترقية من التبعيات الخارجية
كسر التغييرات
- تقوم طريقة
RenderAsString الآن بإرجاع nonstd::expected بدلاً من std::string العادية - القوالب ذات
import ، extends include أخطاء توليد إذا تم تحليلها بدون مجموعة TemplateEnv - يتم تكوين حزم الإصدار (المحفوظات) مع وضع إدارة التبعية
external افتراضيًا
الإصدار 0.9.1
- تم إضافة مرشح
applymacro Mapplicer الذي يسمح بتطبيق الماكرو التعسفي كمرشح - التبعيات لتعزيز إزالتها من الواجهة العامة
- تحسن البرامج النصية Cmake
- الأخطاء المختلفة ثابتة
- تحسين التفكير
- تحذيرات تنظيف
الإصدار 0.9
- دعم عبارات "النطاقات"/"الكتلة"
- دعم عبارات "الماكرو"/"الاتصال"
- الإبلاغ عن الخطأ الغني
- دعم الحلقات العودية
- دعم للتحكم في المساحة قبل وبعد كتل التحكم
- تحسين التفكير
الإصدار 0.6
- تم تنفيذ الكثير من المرشحات. مجموعة كاملة من المرشحات المدعومة المدرجة هنا: #7
- تم تنفيذ الكثير من المختبرين. مجموعة كاملة من الاختبارات المدعومة المدرجة هنا: #8
- تم تنفيذ "Concatenate كسلسلة" مشغل ('~')
- من أجل تطبيق حالة "if"
- إصلاح بعض الأخطاء في محلل