معرفات عناوين TOC والمكون

يُنشئ مكون جدول المحتويات (TOC) سمات id لعناصر العناوين بناءً على نص العنوان.

إليك عنوانًا كمثال.

main outlet

الناتج يأتي من الأنماط المطبقة على #main-outlet، وهو عنصر في تطبيق Discourse لا علاقة له بهذا المنشور.

هذا ليس نهاية العالم إذا أمكنني تحديد id بديل للعنوان. يدعم مكون جدول المحتويات ذلك:

https://github.com/discourse/DiscoTOC/blob/master/common/header.html#L293

لسوء الحظ، يقوم Discourse بحذف سمات id من عناصر المنشور قبل تنفيذ الكود المذكور أعلاه، مما يعطل المنطق.

إليك عنوانًا يستخدم <h4 id="alt-main-outlet">main outlet</h4>:

main outlet

لاحظ أنه لا يزال يستخدم main-outlet بدلاً من alt-main-outlet.

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

إذا كان هناك حل لهذه المشكلة، أو إذا كانت هذه مشكلة معروفة ومناقشة جيدًا ولم ألاحظها، فأعتذر عن الآراء غير المطلوبة التالية :slight_smile:


ملاحظة إضافية (P.S.)

شخصيًا، أعتقد أن Discourse لا ينبغي أن يحذف سمات id للعناصر. هذا هيكل أساسي في صفحات الويب ويُستخدم في التنقل عبر الصفحة باستخدام مقاطع عناوين URL. إذا أراد شخص ما إنشاء رابط إلى عنصر في منشور، فأعتقد أن هذا حقه كمؤلف.

حقيقة أن جدول المحتويات يفتح باب التلاعب بالمعرفات (ID hacking) تشير إلى أن إجراء حذف المعرفات من الأساس يمكن التخلي عنه.

إذا كان فريق Discourse قلقًا جدًا من اختطاف المعرفات، فيجب أن تُسبق جميع معرفات Discourse ببادئة، مثل discourse-main-outlet، وينطبق حذف المعرفات فقط على تلك المعرفات ذات البادئة.

يمكنني تقدير استحالة ذلك نظرًا للكود الحالي!

يمكن تخيل مجموعة من المعرفات المستبعدة (مثل main-outlet وما إلى ذلك) يتم حذفها. هذا لا يزال يترك مشكلة استخدام جدول المحتويات لتجاوز هذا الإجراء الوقائي، لكنه على الأقل سيسمح للمؤلفين بإنشاء مراسيم مفيدة.


ملاحظة إضافية ثانية (P.P.S.)

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

Topic One

Examples

Topic Two

Examples

مع جدول المحتويات، يحصل كلا العنوانين Examples على نفس المعرف (ID)، وهو أمر معطل بوضوح. يمكن لجدول المحتويات إرفاق مؤشرات تصاعدية (مثل examples، examples-2، إلخ) — وربما ينبغي أن يكون ذلك كإجراء افتراضي — ولكن الحل الأفضل سيكون معالجة المشكلة المذكورة أعلاه، والتي تسمح للمؤلفين بالقرار بشأن كيفية وصف محتواهم. مثلًا: <h5 id="topic-one-examples">Examples</h5>، وهكذا.

@Johani ما رأيك في هذا؟

إذا كنت بحاجة إلى إضافة عنوان، فيجب أن يسبقه بادئة heading--. يمكنك العثور على مزيد من المعلومات حول ذلك هنا Linking to a heading within a post or topic

سيتم إزالة المعرفات (IDs) التي لا تحمل هذه البادئة، بغض النظر عن قيمة المعرف.

العناوين ذات النص المكرر غير مدعومة حاليًا - ولم تكن مدعومة من قبل - في مكون جدول المحتويات. يقوم المكون بتوليد المعرف بناءً على نص العنوان. لذا، فإن العناوين المتطابقة تمامًا في النص ستحصل على نفس المعرف.

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

عند تنفيذ هذا في النواة (core)، أعتقد أن إضافة بادئة للعناوين المولدة يجب أن يكون كافيًا.

هذا منطقي. شكرًا لك على الشرح المفصل!