DiscoTOC - جدول المحتويات التلقائي

:discourse2: Summary DiscoTOC will allow you to generate an interactive table of contents for your topics with one click!
:eyeglasses: Preview Preview on Discourse Theme Creator
:hammer_and_wrench: Repository Link https://github.com/discourse/DiscoTOC
:open_book: New to Discourse Themes? Beginner’s guide to using Discourse Themes

Install this theme component

Samples

Desktop

Mobile

Features

toc = table of contents

  • Automatically generates the entire toc via a button in the composer gear menu

  • The toc will always be on the screen - scrolls with content like the topic progress widget

  • As you scroll past sections in the topic, the active element in the table of contents will be set to active (blue highlight)

  • adds id attributes to headings (you can link to a specific section from another topic / post)

  • clicking on any link in the toc will instruct the browser to navigate to relevant section (smooth-scrolling)

  • adds a copy-able link next to each heading (if you want to link to it)

  • RTL support

  • The colors are based on your current active color palette

How does it work?

In a nutshell, it looks for headings in topics which are marked to have a toc (via the composer button) and if it turns out the current topic is marked, then it takes all the headings and puts them in the toc (nested in order of heading levels) - this means that your markdown must be syntactically correct.

# heading 1
## heading 2
### heading 3
#### heading 4
##### heading 5
###### heading 6

You’re free to go back and fourth in heading levels, but the order must be correct

# heading 2 
## heading 3
## heading 3
### heading 4
## heading 3
# heading 2

etc...

In order for the links in the toc to work, headings must have id attributes. The component will check if the headings already have ids and if they do, then they are respected. This is handy if you ever manually created a toc.

If the headings don’t have ids, then it will generate an id for each heading based on its text (unwanted characters are stripped out)

once all of that is done, it will also add a link next to each button that links directly to that section:

Settings

Name Description
minimum trust level to create TOC The minimum trust level a user must have in order to see the TOC button in the composer
composer toc text Text that appears at the top of the preview pane of the composer to indicate the topic will have a table of contents
auto TOC categories Automatically enable TOC on topics in these categories
auto TOC tags Automatically enable TOC on topics with these tags
TOC min heading Minimum number of headings in a topic for the table of contents to be shown

Translations

Translation Default
table_of_contents table of contents
insert_table_of_contents Insert table of contents
jump_bottom Jump to end
toggle_toc.show_timeline Timeline
toggle_toc.show_toc Contents

The theme comes with three strings that you can translate or change.

table_of_contents: "table of contents"

this used for the button that opens the toc on mobile

insert_table_of_contents: "Insert table of contents"

this is used as the text for the toc button in the composer gear menu

topic_will_contain_a_table_of_contents: "This topic will contain a table of contents"

This is the text that shows up in the composer preview to indicate that the a toc will be generated for the topic

How do I create a toc?

  1. Write a topic with syntactically correct headings
  2. Click the toc button in the gear menu (only shows up when creating a regular topic - replies and PMs are ignored
  3. Profit.

What happens to the topic progress widget when a topic has a toc?

As you can probably guess, there’s no space to show both at the same time, so the way this component works is as follows

in a topic with a toc, the topic progress widget is hidden while the first post is on screen, and you see the toc instead.

Once you scroll past the first post, the toc will not scroll with you and the topic progress will be shown instead while you read any replies.

So, first posts get the toc, and subsequent posts get the regular topic progress widget.

The happens on both desktop and mobile.

Are there any downsides to using this component?

Nothing I am aware of, all the changes are done on the client-side. So you can easily remove the component and your posts would go back to the way they were before you installed it.

Limitations

This component assumes the standard topic layout. As such, it won’t work with themes that modify that layout such as the Vincent theme. Support for popular themes that modify the layout will come at a later stage in the form of component settings.

Credit

I started with Greg Franko’s tocify.js library. However, it looks like it’s not been updated in a while, so this is essentially a hard-fork that removes a lot of unnecessary features, integrates and styles the rest for Discourse.

So, there are no external requests and the total size is ~ 4kb gzip.

Big thanks to @erlend_sh for lots of valuable feedback and to @david for his help with translations.

:discourse2: Hosted by us? Theme components are available to use on our Pro, Business and Enterprise plans.

Last edited by @tobiaseigen 2025-06-24T03:17:08Z

Check documentPerform check on document:
181 إعجابًا

تم تقسيم 4 مشاركات إلى موضوع جديد: كيفية نقل جدول المحتويات إلى الجانب الأيسر من المنشور؟

لا أعرف كيف يتم تنفيذ هذه المكونة ولا الكثير عن هيكل الواجهة الأمامية لـ Discourse، لذا يمكنني فقط تقديم تخمين.

ألا يمكن عرض شريط التقدم فقط أ) إذا كان هناك أكثر من مشاركة واحدة في الموضوع و ب) تعديل بدايته لتبدأ من المشاركة الثانية (بدلاً من الثالثة)، ولكن أيضًا ج) إضافة هامش سفلي/علوي مريح لأحد العنصرين للتأكد من أن الآخر يظل بعيدًا بما فيه الكفاية (مثل 1vh) حتى لا يبدو غريبًا؟

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

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

3 إعجابات

مرحباً! لقد قمنا مؤخراً بتثبيت DiscoTOC لمنتدياتنا وكنا نتساءل عما إذا كان من الممكن جعل المكون يقرأ النص البديل (alt text) في الصور؟ لقد استخدمنا صوراً لبعض رؤوس ملاحظات الإصدار…

على هذا النحو:
Performance and Stability

وللأسف، لا يبدو أن نظام جدول المحتويات (TOC) قادر على تحليل صورة كرأس، مما يؤدي إلى إنشاء إدخال فارغ في القائمة وإنشاء رابط يأخذك إلى صفحة فارغة. هل هناك أي حل بديل لهذا بخلاف “عدم استخدام الصور”؟ شكراً جزيلاً! نحن نحب النظام بخلاف ذلك.

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

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

3 إعجابات

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

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

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

تعمل وظيفة مرساة العنوان (heading anchor) في هذا المكون على التعارض قليلاً مع وظيفة روابط العنوان التلقائية (Automatic header links) المضافة في 2.7.0beta6، حيث تحصل العناوين على أيقونتين عند التمرير فوقها، واحدة من Discourse والأخرى من DiscoTOC. هل هناك طريقة لتجاوز هذا؟

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

مرحباً،

يمكنك إخفاء مرساة Automatic header links باستخدام

.anchor {
  display: none;
}

مرحباً dodesz،

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

:heart: شكراً!

Selection_839

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

على منتدى يعمل بإصدار Discourse 2.8.0.beta4 (90232af778)، يؤدي تضمين مكون DiscoTOC إلى ظهور رسالة خطأ:

oops

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

هل يمكنك العثور على أي رسائل خطأ متعلقة بالمشكلة في سجلات أخطاء موقعك؟

رسالة الخطأ تلك هي خطأ في الواجهة الخلفية (backend)، بينما DiscoTOC هو مكون سمة للواجهة الأمامية (front-end)، لذا من الصعب أن يكونا مرتبطين. هل لديك أي إضافات (plugins) مثبتة؟

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

للأسف، لم أتمكن من العثور على أي شيء مفيد في /logs.

لدي، إليك المقتطف ذي الصلة من app.yml:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-openid-connect.git
          - git clone https://github.com/discourse/discourse-checklist.git
          - git clone https://github.com/discourse/discourse-push-notifications.git
          - git clone https://github.com/discourse/discourse-characters-required.git
          - git clone https://github.com/angusmcleod/discourse-news.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/DNOeV/discourse-watch-category.git
          - git clone https://github.com/discourse/discourse-footnote.git
          - git clone https://github.com/discourse/discourse-knowledge-explorer.git
إعجاب واحد (1)

عندما يكون العنوان داخل اقتباس، لا يظهر العنوان في جدول المحتويات. هل يمكن تغيير هذا السلوك؟

هذا العنوان لن يظهر في جدول المحتويات

محتوى مقتبس

هذا العنوان يظهر في جدول المحتويات

محتوى مقتبس

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

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

هل يمكنك المحاولة باستخدام وسم HTML <blockquote> بدلاً من ذلك؟ سيسمح ذلك للعنوان # بأن يكون في بداية السطر.

مثال:

<blockquote>

### عنوان المرساة
 
</blockquote>

عنوان المرساة

لم أجربه في جدول المحتويات (TOC)، ولكنه يبدو أنه يعمل مع العناوين ذاتية الربط في منشور عادي.

لماذا تريد أن تظهر العناوين داخل علامات الاقتباس في جدول المحتويات؟ ما هي حالة الاستخدام الخاصة بك؟

شكرًا لك على الفكرة. لكنها لم تنجح معي.

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

3 إعجابات

لماذا تستخدم الاقتباس بهذه الطريقة؟ إخبار المصدر يكفي. بالإضافة إلى أن هذا خطأ نحويًا، حتى في اللغة الإنجليزية.

هل هذه مشكلة (bug) أم مجرد مستخدم آخر، ولكن… كيف يجب أن أغلق جدول المحتويات (TOC)؟ كنت أبحث عن بعض التعليمات الأساسية حول كيفية استخدام الرسائل الخاصة من قبل المستخدم النهائي وبالطبع ذهبت إلى وثيقة المستخدمين الجدد وفتحت جدول المحتويات لمعرفة ما إذا كان هناك أي معلومات.

كنت أستخدم جهاز iPad وDiscourseHub.

لقد حصلت على هذا:

kuva

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