البرمجة

أهم مرشحات Jinja القياسية

أهم المرشحات المتوفرة بشكل قياسي في محرك القوالب Jinja – الجزء الثاني

محرك القوالب Jinja يُعتبر من أشهر وأقوى محركات القوالب في عالم تطوير الويب باستخدام لغة بايثون، وخاصة مع أطر العمل مثل Flask وDjango. واحدة من الميزات الأساسية التي تميز Jinja هي توفر مجموعة واسعة من المرشحات (Filters) التي تسمح للمطورين بمعالجة البيانات وتنسيقها بسهولة قبل عرضها ضمن القالب.

في المقال السابق تحدثنا عن بعض المرشحات الأساسية في Jinja، أما في هذا الجزء الثاني فسنستعرض بشمولية وتفصيل مرشحات قياسية أخرى مهمة للغاية، تساعد على تطوير قوالب متقدمة وذات أداء عالٍ مع إتاحة المزيد من الخيارات المرنة لمعالجة البيانات.


مرشح replace

يعتبر replace من المرشحات الشائعة التي تسمح باستبدال جزء من النص أو السلسلة النصية بآخر.

الصيغة العامة:

jinja
{{ value | replace("old", "new") }}

هذا المرشح مفيد جداً في معالجة النصوص التي تحتاج إلى تعديل أو تحديث نصي معين بشكل سريع، مثل استبدال علامات أو كلمات داخل نص ديناميكي.


مرشح join

مرشح join من المرشحات المهمة للغاية عند التعامل مع القوائم (lists) أو المصفوفات.

هو يقوم بدمج عناصر القائمة في نص موحد مع وضع فاصل معين بين العناصر.

الصيغة:

jinja
{{ list_variable | join(", ") }}

في المثال أعلاه، يتم دمج كل عناصر القائمة باستخدام فاصلة ومسافة كفاصل. يمكن استخدام أي فاصل آخر مثل - أو \n (سطر جديد) بحسب الحاجة.


مرشح random

هذا المرشح يستخدم لاختيار عنصر عشوائي من قائمة أو مجموعة بيانات.

الصيغة:

jinja
{{ list_variable | random }}

يمكن أن يكون هذا المرشح مفيداً في الحالات التي تحتاج إلى عرض بيانات أو عناصر بشكل عشوائي في القالب، مثل اختيار صورة عشوائية، أو اقتباس، أو عنوان.


مرشح length

يرجع هذا المرشح طول النص أو عدد عناصر القائمة أو المصفوفة.

الصيغة:

jinja
{{ variable | length }}

فمثلاً عند استخدامه على نص نصي، فإنه يُرجع عدد الأحرف، وعند استخدامه على قائمة يرجع عدد العناصر داخلها.


مرشح lower و upper

هما مرشحين يستخدمان لتحويل النصوص إلى أحرف صغيرة (lower) أو أحرف كبيرة (upper).

الصيغ:

jinja
{{ variable | lower }} {{ variable | upper }}

تستخدم هذه المرشحات بكثرة عند الحاجة إلى توحيد تنسيق النصوص أو لتحسين قابلية البحث والفرز.


مرشح capitalize

يحول هذا المرشح أول حرف في النص إلى حرف كبير، مع جعل بقية الأحرف صغيرة.

الصيغة:

jinja
{{ variable | capitalize }}

مثال:

إذا كانت القيمة “python programming”، فإن النتيجة ستكون “Python programming”.


مرشح title

يشبه مرشح capitalize لكنه يغير أول حرف من كل كلمة في النص إلى حرف كبير، مما يجعله مثالياً للعناوين والنصوص التي تحتاج إلى تنسيق رسمي.

الصيغة:

jinja
{{ variable | title }}

مرشح default

من المرشحات المهمة جداً في التعامل مع القيم التي قد تكون None أو فارغة. يتيح هذا المرشح إعطاء قيمة بديلة إذا كانت القيمة الأساسية غير موجودة أو فارغة.

الصيغة:

jinja
{{ variable | default("قيمة بديلة") }}

في حال كانت variable تحتوي على قيمة فارغة أو None سيتم استبدالها بالقيمة “قيمة بديلة”.


مرشح trim

يقوم هذا المرشح بإزالة الفراغات البيضاء من بداية ونهاية النص.

الصيغة:

jinja
{{ variable | trim }}

يساعد هذا المرشح على تنقية النصوص المأخوذة من مصادر غير موثوقة أو بيانات المستخدم التي قد تحتوي على مسافات زائدة.


مرشح float و int

يستخدمان لتحويل القيم إلى نوع عددي معين.

الصيغ:

jinja
{{ variable | float }} {{ variable | int }}

مرشح int يحول النص أو الرقم إلى عدد صحيح، بينما float يحول القيمة إلى رقم عشري.


مرشح round

يستخدم هذا المرشح لتقريب الأعداد العشرية إلى عدد محدد من الخانات العشرية.

الصيغة:

jinja
{{ variable | round(2) }}

في المثال أعلاه يتم تقريب الرقم إلى خانتين عشريتين.


مرشح urlencode

يحول هذا المرشح النص إلى صيغة صالحة للاستخدام في عناوين URL عبر ترميز الأحرف الخاصة.

الصيغة:

jinja
{{ variable | urlencode }}

يُستخدم بشكل شائع عند إنشاء روابط تحتوي على بيانات يتم تمريرها عبر GET Parameters.


مرشح safe

واحد من أهم المرشحات التي تتيح عرض النصوص HTML كما هي دون ترميز أو تعطيل HTML فيها، ما يعني أنه يسمح بعرض المحتوى بشكل آمن (بحسب اعتقاد المبرمج).

الصيغة:

jinja
{{ variable | safe }}

يجب توخي الحذر عند استخدام هذا المرشح لأنه قد يعرض الموقع لهجمات XSS إذا كان المحتوى غير موثوق.


مرشح escape

عكس مرشح safe، فهو يقوم بتحويل الأحرف الخاصة إلى رموز HTML لكي يتم عرضها كنصوص وليس كعناصر HTML.

الصيغة:

jinja
{{ variable | escape }}

يستخدم لضمان أن أي نص يحتوي على رموز HTML يظهر نصياً بدون أن تتفاعل المتصفحات معها.


مرشح replace

يتيح هذا المرشح استبدال نص معين بنص آخر داخل سلسلة نصية.

الصيغة:

jinja
{{ variable | replace("نص_قديم", "نص_جديد") }}

تكرر ذكره لأنه مهم جداً في معالجة النصوص ديناميكياً داخل القوالب.


مرشح dictsort

يساعد هذا المرشح في فرز القوائم التي تحتوي على قواميس (dictionaries) حسب مفتاح معين داخل القاموس.

الصيغة:

jinja
{{ list_of_dicts | dictsort("key_name") }}

ينتج قائمة مرتبة حسب القيمة المرتبطة بالمفتاح المحدد.


مرشح groupby

يمكن استخدامه لتجميع عناصر قائمة حسب قيمة مفتاح معين، وينتج قائمة من المجموعات.

الصيغة:

jinja
{{ list_of_dicts | groupby("key_name") }}

هذا المرشح مفيد لتصنيف وعرض البيانات في القوالب بشكل منظم.


مرشح first و last

هما مرشحين بسيطين يستخدمان للحصول على أول عنصر أو آخر عنصر من قائمة أو نص.

الصيغ:

jinja
{{ list_variable | first }} {{ list_variable | last }}

يساعدان في الوصول السريع إلى العناصر دون الحاجة لكتابة حلقات معقدة.


مرشح reverse

يعكس ترتيب عناصر القائمة أو النص.

الصيغة:

jinja
{{ list_variable | reverse }}

يساعد في عرض البيانات بترتيب عكسي عند الحاجة.


مرشح slice

يقسم القائمة إلى شرائح أصغر بناءً على عدد العناصر في كل شريحة.

الصيغة:

jinja
{{ list_variable | slice(3) }}

يقسم القائمة إلى مجموعات من 3 عناصر لكل شريحة، ويساعد في تصميم تخطيطات شبكية أو أعمدة.


مرشح sum

يقوم بجمع كل العناصر الرقمية في القائمة وإرجاع المجموع.

الصيغة:

jinja
{{ list_variable | sum }}

مفيد جداً في العمليات الحسابية على البيانات المرسلة إلى القالب.


جدول يوضح بعض المرشحات مع وصف مختصر وصيغة الاستخدام

اسم المرشح الوصف الصيغة
replace استبدال نص داخل سلسلة `{{ value
join دمج عناصر القائمة مع فاصل `{{ list
random اختيار عنصر عشوائي من قائمة `{{ list
length حساب طول النص أو عدد العناصر `{{ variable
lower تحويل النص إلى أحرف صغيرة `{{ variable
upper تحويل النص إلى أحرف كبيرة `{{ variable
capitalize تحويل أول حرف كبير فقط `{{ variable
title تحويل أول حرف من كل كلمة كبير `{{ variable
default تعيين قيمة بديلة إذا كانت فارغة `{{ variable
trim إزالة الفراغات من بداية ونهاية `{{ variable
float تحويل إلى رقم عشري `{{ variable
int تحويل إلى عدد صحيح `{{ variable
round تقريب رقم إلى عدد من الخانات `{{ variable
urlencode ترميز نص لاستخدامه في عنوان URL `{{ variable
safe عرض النص كـ HTML دون ترميز `{{ variable
escape ترميز الأحرف الخاصة في HTML `{{ variable
dictsort فرز قائمة قواميس حسب مفتاح `{{ list
groupby تجميع قائمة حسب مفتاح `{{ list
first أول عنصر في القائمة `{{ list
last آخر عنصر في القائمة `{{ list
reverse عكس ترتيب القائمة `{{ list
slice تقسيم القائمة إلى شرائح `{{ list
sum جمع عناصر القائمة الرقمية `{{ list

أهمية معرفة المرشحات في Jinja

المرشحات هي حجر الأساس في عملية التلاعب بالبيانات داخل قوالب Jinja، إذ تمكّن المبرمجين من تطبيق عمليات معالجة متعددة على البيانات بدون الحاجة لتعديل البيانات نفسها في طبقة التطبيق. هذه المرونة تقلل من الحاجة لإضافة تعقيد في كود بايثون، وتتيح فصل واضح بين منطق التطبيق وطبقة العرض، وهو من أهم مبادئ هندسة البرمجيات.

باستخدام هذه المرشحات يمكن عرض البيانات بشكل أنيق وموحد، وتحسين تجربة المستخدم، وكذلك تحسين أداء التطبيق عبر تقليل المعالجات الحسابية على الخادم.


نصائح عملية للاستفادة من المرشحات

  • تسلسل المرشحات: يمكن تطبيق عدة مرشحات متتالية على نفس المتغير، مثل:

    jinja
    {{ variable | lower | replace("a", "@") | trim }}

    هذا يعطي تحكمًا دقيقاً في تحويل النصوص.

  • تجنب الحسابات الثقيلة داخل القوالب: رغم قوة المرشحات، إلا أن العمليات الحسابية أو المنطقية الثقيلة يجب أن تبقى في الكود الخلفي (backend) وليس في القالب.

  • الاهتمام بالأمان: عند التعامل مع محتوى HTML أو مدخلات المستخدم، يجب استخدام مرشحات مثل escape و safe بحذر لتجنب هجمات XSS.

  • تحسين الأداء: بعض المرشحات مثل random أو groupby قد تكون مكلفة حسابياً على مجموعات بيانات كبيرة، فيفضل تحضير البيانات مسبقاً إذا كان ذلك ممكناً.


الخلاصة

محرك القوالب Jinja يقدم مكتبة قياسية غنية من المرشحات التي تتيح للمطورين تنسيق وعرض البيانات بسهولة ومرونة. هذه المرشحات تتنوع بين النصوص، القوائم، الأعداد، وحتى التعامل مع المحتوى الآمن. معرفة هذه المرشحات واستخدامها بشكل مدروس يوفر وقت وجهد كبيرين ويضمن أن القوالب التي تكتبها ستكون أكثر كفاءة وقابلة للصيانة.

بالإضافة إلى ما تم استعراضه في هذا المقال، فإن Jinja يدعم إنشاء مرشحات مخصصة تسمح لك بتوسيع وظائف القالب حسب احتياجات المشروع. ولكن البدء بفهم المرشحات القياسية هو الخطوة الأساسية نحو تطوير قوالب قوية ومرنة.


المصادر والمراجع


هذا المقال يركز على الجانب العملي والوظيفي لمجموعة المرشحات الأساسية في محرك القوالب Jinja، مما يمكن المطورين من تحسين جودة وأداء قوالبهم بشكل كبير.