Я создал закладку для создания оглавления сообщений форума

Привет, @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();
})();