لقد أنشأت bookmarklet لإنشاء جدول المحتويات لمنشورات المنتدى

مرحباً @RBoy، شكراً على الملاحظات والاقتراح!

ستكون إضافة لمحرر رائعة، ولكن سيتطلب الأمر الكثير من الجهد لقراءة الكود المصدري لـ discourse لفهم منطق التعامل مع الرموز التعبيرية وتحديد نص العنوان/المرساة وإنشاء مستودع للإضافة.

إضافة (تبدو) بسيطة مثل Spoiler Alert هي مستودع كبير وليس لدي وقت كافٍ للالتزام الكامل بالتطوير. لذا، آمل أن يعطي Discourse الأولوية لطلبات الميزات مثل Automatic Table of Contents generation ويطور ميزة أصلية في هذه الأثناء :folded_hands:


أدناه الإصدار مع النقاط. المسافات بين <ul> و </ul> كبيرة جدًا، لذا فضلت الإصدار الأصلي غير المنقط.

لقطة شاشة:

الكود:

javascript:(function() {
	const copyForumTocToClipboard = function() {
		const urlMatch = window.location.href.match(/\/t\/[^\\/]*\/\d+\/?(\d*)/);
		if (!urlMatch) return;

		const postIndex = 1;
		const anchors = document.querySelectorAll('#post_' + postIndex + ' div.cooked h6 a.anchor,h5 a.anchor,h4 a.anchor,h3 a.anchor,h2 a.anchor,h1 a.anchor');

		let toc = '';
		let currentLevel = 1;
		anchors.forEach(anchor => {
			newLevel = anchor.parentNode.nodeName[1];
			levelChange = newLevel - currentLevel;
			toc +=
				((levelChange >= 0) ? '<ul>'.repeat(levelChange) : '</ul>'.repeat(levelChange * -1)) +
				`<li><a href="${anchor.href}">${anchor.parentNode.textContent}</a></li>`;
			currentLevel = newLevel;
		});
		if (newLevel > 1) toc += '</ul>'.repeat(newLevel - 1);
		toc = '<details open><summary>Table of contents: </summary><ul>\n' + toc + '</ul></details>';

		navigator.clipboard.writeText(toc);
	};

	copyForumTocToClipboard();
})();
5 إعجابات