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

المتطلبات

:information_source: لكي تتمكن من استخدام هذه النصائح والحيل، يجب أن تكون مديرًا إما لنسخة Discourse مُستضافة ذاتيًا أو لباقة Discourse-hosted أعلى من Basic.

مقدمة

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

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

Green button

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

المنطق

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

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

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

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

[wrap=button]some text[/wrap]

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

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

لنبدأ بمثال عملي. سنقوم بإنشاء نص بخلفية وردية.

كعنصر كتلة (Block)

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

[wrap=pink]pink text[/wrap]

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

ثم، أضف كود CSS التالي إلى سمتك.
اذهب إلى لوحة الإدارة → التخصيص → السمات → سمتك → تحرير CSS/HTML → CSS.

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

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

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

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

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

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

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

[wrap=pink]
pink text
pink text
pink text
pink text
[/wrap]

سيبدو الأمر هكذا:

كعنصر مضمّن (Inline)

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

Here is some [wrap=pink]pink text[/wrap] and it's awesome ✨

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

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

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

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

رابط زر مضمّن باستخدام [wrap]

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

This [[wrap=button]nice link[/wrap]](https://discourse.org/) is a blue button 🐳 !

لنعلّق على ما يُخرجه هذا الكود. أنت تعرف ذلك لأنك كتبت [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-.

اكتب:

This <span data-button>[link](https://discourse.org/)</span> is a green button 🐸 !

سيؤدي هذا إلى إخراج رابط داخل وسم <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 إلى حد أقل).

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

النص:

[wrap=cat]

- Felix
- Garfield
- Nat's cat
  [/wrap]

CSS:

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

النتيجة:

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

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

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

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

النص:

This [[wrap=button]nice link[/wrap]](https://discourse.org/) is a button 🌈 !

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)