تخصيص محتويات المشاركات بأنماطك الخاصة

المتطلبات

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

المقدمة

يدعم Discourse عدة طرق لتنسيق وتخصيص محتوى المنشور. يمكنك العثور على القائمة هنا:

ولكن في بعض الأحيان، قد ترغب في شيء أكثر تحديدًا، مثل رابط يبدو كزر.

زر أخضر

هذا هو نوع التعديل الذي سنتعلمه هنا.

المنطق

سأشرح باختصار المنطق وراء ذلك، لكن يمكنك الانتقال إلى الخطوة التالية والانتقال مباشرة إلى مثال عملي :slight_smile:

يسمح Discourse بأي سمة HTML تبدأ بـ data- في محتوى المنشور.
هذه هي السمات التي سنستهدفها باستخدام CSS لتخصيص محتوانا.

سأسميها سمات data- في هذا الدرس :slight_smile:

إحدى طرق إنشاء عناصر بهذه السمات هي استخدام وسم يشبه BBcode: [wrap]، سنضيف إليه قيمة من اختيارنا. هنا نختار “button” (يمكن أن يكون أي شيء آخر، حتى اسم كلبك :dog:):

[wrap=button]بعض النص[/wrap]

سيؤدي هذا إلى إخراج عنصر HTML يحمل السمة التالية: data-wrap="button".

المثال الأول: خلفية وردية

لنبدأ بمثال عملي. سننشئ نصًا بخلفية وردية.

كعنصر كتلة

في منشورك، على سطر فارغ، اكتب:

[wrap=pink]نص وردي[/wrap]

سيؤدي هذا إلى إنشاء عنصر div يحمل السمة data-wrap="pink".

ثم أضف كود CSS التالي إلى نسقك.
انتقل إلى لوحة المسؤول → تخصيص → النسق → نسقك → تحرير CSS/HTML → CSS.

ضع كود CSS التالي داخله:

[data-wrap="pink"] {
  background: pink;
}

ثم انقر على زر الحفظ.

عد إلى منشورك، ولاحظ النتيجة:

نعم، إنها جميلة بالفعل :cherry_blossom:

ستلاحظ أن الخلفية تغطي عرض المنشور بالكامل. لأن الـ wrap لدينا هو العنصر الوحيد على سطره، فإنه يُخرج عنصر كتلة.
يمكنك معرفة المزيد حول الفرق بين عناصر HTML الكتل والسطرية هنا: HTML Block and Inline Elements.

إذا كنت تريد الخلفية الوردية على عدة أسطر (لا تزال كـ كتلة)، فستحتاج إلى أن تكون وسوم [wrap] الخاصة بك خالية من أي محتوى أو نص آخر على نفس السطر:

[wrap=pink]
نص وردي
نص وردي
نص وردي
نص وردي
[/wrap]

سيظهر هذا على النحو التالي:

كعنصر سطري

الآن، لنضف بعض النص قبل [wrap]، أو بعده، أو كلاهما :smile:. على سبيل المثال:

إليك بعض [wrap=pink]النص الوردي[/wrap] وهو رائع ✨

إليك النتيجة:

إذا كان هناك نص أو عناصر أخرى على نفس السطر مع أحد وسوم [wrap] الخاصة بك، فسيتم إخراج عنصر سطري.

المثال الثاني: رابط بمظهر زر.

التلاعب بوسم [wrap] قد يؤدي أحيانًا إلى نتائج غير مرغوب فيها لأسباب مختلفة، منها أنه يمكن أن يكون عنصر كتلة أو سطرًا اعتمادًا على السياق.
لذلك، سنصف طريقتين مختلفتين تحققان نفس النتيجة، ولكن يمكنك اختيار الطريقة التي تناسبك أكثر :v:

رابط زر سطري باستخدام [wrap]

الصيغة لإنشاء رابط باستخدام Markdown هي: [بعض النص](https://some-link.etc).
لتخصيص النص وجعله يظهر كزر، سنقوم بإدراج wrap داخل الأقواس المربعة. إليك مثال:

هذا [[wrap=button]رابط رائع[/wrap]](https://discourse.org/) هو زر أزرق 🐳 !

لن نتطرق إلى ما ينتج عنه هذا الكود. أنت تعرف ذلك لأنك كتبت [wrap=button]، سيكون عليك استهداف [data-wrap="button"] في CSS الخاص بك.

لذا، هيا بنا، لنضيف بعض CSS المميز لجعله جميلًا! :sparkles:

[data-wrap="button"] {
  display: inline-block;
  padding: 0.5em 1em;
  background: DodgerBlue;
  color: White;
}

لن نوضح قواعد CSS هنا. هناك العديد من موارد CSS على الإنترنت، لذا إذا كنت تريد إجراء تعديلات أكثر تحديدًا، فستحتاج إلى تعلم ذلك أولاً. :slight_smile:

النتيجة :magic_wand: :

يبدو ذلك جيدًا، أليس كذلك؟

رابط زر سطري باستخدام محتوى HTML عادي

بما أن Discourse يقبل كود HTML، يمكننا أن نقرر عدم استخدام وسوم [wrap] واستخدام HTML مع سمة data-. في هذا المثال، سنستخدم صيغة Markdown العادية للرابط ونحيطه بوسوم span.
:information_source: لا يمكننا استخدام وسم رابط <a> مباشرة لأنه استثناء ولن يسمح بأي سمة data-.

اكتب:

هذا <span data-button>[رابط](https://discourse.org/)</span> هو زر أخضر 🐸 !

سيؤدي هذا إلى إخراج رابط داخل وسم <span> يحمل سمة data-button، مما يعني أن CSS سيكون أكثر تعقيدًا قليلاً. سنحتاج إلى استهداف كل من data-button والرابط:

[data-button] {
  display: inline-block;
  padding: 0.5em 1em;
  background: ForestGreen;
  a {
    color: White;
  }
}

وإليك النتيجة!

للمضي قدمًا

قائمة مخصصة باستخدام [wrap]

يمكن استخدام وسوم [wrap] وسمات data- في سياقات عديدة ويمكنك تخصيص محتوى أكثر تقدمًا. الحد هو في الغالب معرفتك بـ CSS (وHTML إلى حد أقل).

سأعطي مثالًا واحدًا بدون شرح من خلال تخصيص قائمة سيتم إضافة رمز تعبيري لقط في بداية كل عنصر:

النص:

[wrap=cat]

- فيليكس
- غارفيلد
- قطة نات
  [/wrap]

CSS:

[data-wrap="cat"] ul {
  list-style: none;
  li:before {
    content: "🐈";
    margin-right: 0.25em;
  }
}

النتيجة:

استخدام متغيرات الألوان الخاصة بنسقك

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

من الممارسات الجيدة استخدام متغيرات ألوان Discourse بدلاً من الألوان “المشفرة يدويًا” مثل red، #FF0000 أو rgb(255,0,0).

إليك مثال حيث سيتم استخدام اللون الأساسي للمجموعة الحالية لخلفية الزر، وسيتم استخدام اللون الثانوي للنص:

النص:

هذا [[wrap=button]رابط رائع[/wrap]](https://discourse.org/) هو زر 🌈 !

CSS:

[data-wrap="button"] {
  display: inline-block;
  padding: 0.5em 1em;
  background: var(--primary);
  color: var(--secondary);
}

إليك كيف سيبدو لمستخدم يستخدم مخطط ألوان Solarized Light:

وإذا استخدموا مخطط ألوان Solarized Dark:

الخاتمة

لديك الآن الأساسيات لإنشاء عناصر مخصصة باستخدام عنصر [wrap] وسمات data-.

لإجراء تخصيصات أكثر تقدمًا، فإن تعلم CSS أمر أساسي. ستجد العديد من الدروس على الإنترنت.

يمكن أن يكون الدليل التالي الخاص بـ Discourse مفيدًا أيضًا: Making custom CSS changes on your site.
استخدام أدوات المطور في متصفح الإنترنت الخاص بك سيوضح لك بسهولة قائمة متغيرات ألوان Discourse الخاصة بك وكيف يبدو كل منها:


:raised_hand_with_fingers_splayed: لا تتردد في اقتراح أي تعديلات على هذا الدليل!


يتم التحكم في إصدار هذا المستند - اقترح تغييرات على GitHub.

23 إعجابًا

شكرا لك @Canapin

مثال جيد لمكون سمة يستخدم بعض هذه المفاهيم هو هذا:

4 إعجابات

عمل رائع!

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


هل هناك أي ميزة لاستخدام <span> data-button في HTML مقارنة بـ [wrap="button"] في BBCode؟

إعجابَين (2)

بدون التفكير في الأمر كثيرًا، أود أن أقول إن استخدام <span> يسمح لك بوضع عنصر سطري كمحتوى وحيد في سطر واحد.

استخدام [wrap] في سطر واحد بدون أي محتوى آخر بجانبه سيؤدي تلقائيًا إلى إخراج عنصر كتلة. سيتم أيضًا تغليف النص بداخله بعلامات الفقرة <p>.

بخلاف ذلك، ربما يكون الأمر مسألة ذوق. لم أذكر أيضًا أن [wrap] وعنصر HTML يمكن أن يحتويان على سمات -data متعددة لأنني لا أعتقد أن ذلك مفيد جدًا لمعظم الأغراض.

3 إعجابات

كيفية إضافة “بطاقات” Bootstrap في منشوراتك/مواضيعك

…قد يقول البعض أن هذا جنون، أو معقد للغاية، أو مبالغ فيه ولكني أحبه :smiley:

  • تمت إضافة بعض الألوان لرؤية تداخل BBCode بشكل أفضل.

توقف! لا تستخدم الكود الخاص بي

بدلاً من ذلك، استخدم الكود المحسن الذي نشره @Canapin انقر هنا

كود BBCode لتضمينه في الموضوع/المنشور

[wrap="card"]
[wrap="card-header"]**عنوان البطاقة**[/wrap]
[wrap="card-body"]
[wrap="card-title"]**عنوان البطاقة**[/wrap]
[wrap="card-text"]نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة، نص البطاقة[/wrap]
[/wrap]
[/wrap]

كود CSS لإضافته إلى السمة.

// Bootstrap Card Box
[data-wrap="card"] {
    position: relative;
    display: flex;
    flex-direction: column;
    min-width: 0;
    word-wrap: break-word;
    background-color: #fff;
    background-clip: border-box;
    border: 1px solid rgba(0,0,0,.125);
    border-radius: 0.25rem;
}

// Bootstrap Card Header
[data-wrap="card-header"] {
    padding: 0.5rem 1rem;
    margin-bottom: 0;
    border-bottom: 1px solid rgba(0,0,0,.125);
    background: #007bff;
    color: #fff;
    border-radius: 5px 5px 0px 0px;
    
}

// Bootstrap Card Body
[data-wrap="card-body"] {
    flex: 1 1 auto;
    padding: 1rem 1rem;
}

// Bootstrap Card Title
[data-wrap="card-title"] {
    margin-bottom: 0.5rem;
}

// Bootstrap Card Text
[data-wrap="card-text"] {
    margin-top: 0;
    margin-bottom: 1rem;
}
4 إعجابات

بالطبع، يعتمد الأمر على ما تنوي وضعه فيه، ولكن لتحقيق نفس المظهر البصري تمامًا كمثالِك، يمكنك تحسين الكود الخاص بك كثيرًا:

[wrap="card-header"]**Card Header**[/wrap]
[wrap="card-body"]
**Card Title**

Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text
[/wrap]
[data-wrap="card-header"] {
    padding: 0.5em 1em;
    border: 1px solid rgba(0,0,0,.125);
    border-bottom: 0;
    background: #007bff;
    color: #fff;
    border-radius: 5px 5px 0 0;
}

[data-wrap="card-body"] {
    padding: 1em;    
    border: 1px solid rgba(0,0,0,.125);
    border-radius: 0 0 5px 5px;
}

5 إعجابات

آه! هذا أفضل بكثير! شكراً جزيلاً على إجراء التحسينات! :heart:

جميل! متى تتم معالجة تنسيق ماركداون في العنصر [wrap]...[/wrap]، أم أن هناك حيلة للحصول عليه ليتم عرضه قبل تضمينه في الـ wrap؟

على سبيل المثال، لقد حاولت تنسيق بعض النصوص في العنصر كـ غامق أو مائل، ولم يتم عرضها بهذه الطريقة - بل أرى فقط _text_ أو **text** على الصفحة في متصفحي، بمجرد حفظها :frowning:

إعجاب واحد (1)

يبدو بالفعل أن التنسيق (سواء كان HTML أو Markdown أو BBcode) لن يعمل في [wrap] إذا كان عنصرًا مضمنًا (إذا كان هناك محتوى آخر في نفس السطر):\n\n

\n\nستحتاج إلى إنشاء <span> لهذا."

إعجابَين (2)