<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.walkscape.app/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-CollapsibleHeaders.js</id>
	<title>MediaWiki:Gadget-CollapsibleHeaders.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.walkscape.app/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-CollapsibleHeaders.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.walkscape.app/index.php?title=MediaWiki:Gadget-CollapsibleHeaders.js&amp;action=history"/>
	<updated>2026-06-17T15:24:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://wiki.walkscape.app/index.php?title=MediaWiki:Gadget-CollapsibleHeaders.js&amp;diff=47984&amp;oldid=prev</id>
		<title>Bonez565 at 11:05, 17 June 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.walkscape.app/index.php?title=MediaWiki:Gadget-CollapsibleHeaders.js&amp;diff=47984&amp;oldid=prev"/>
		<updated>2026-06-17T11:05:27Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:05, 17 June 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l14&quot;&gt;Line 14:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 14:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	const CONTENT_SELECTOR = &amp;#039;#mw-content-text .mw-parser-output&amp;#039;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	const CONTENT_SELECTOR = &amp;#039;#mw-content-text .mw-parser-output&amp;#039;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	const HEADING_SELECTOR = &#039;h2, h3, h4, h5, h6&#039;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	const HEADING_SELECTOR = &#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;h1, &lt;/ins&gt;h2, h3, h4, h5, h6&#039;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	const WRAPPER_SELECTOR = &amp;#039;.mw-heading&amp;#039;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	const WRAPPER_SELECTOR = &amp;#039;.mw-heading&amp;#039;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Bonez565</name></author>
	</entry>
	<entry>
		<id>https://wiki.walkscape.app/index.php?title=MediaWiki:Gadget-CollapsibleHeaders.js&amp;diff=47980&amp;oldid=prev</id>
		<title>Bonez565: Created page with &quot;/**  * CollapsibleHeaders  * Adds expand/collapse toggles to top-level article headings.  *  * Section logic:  * - Clicking a heading hides/shows everything until the next heading  *   of the same or higher level.  * - Headings remain open by default.  * - Only direct article-content headings are processed, avoiding most  *   headings inside infoboxes, navboxes, tables, and templates.  */ (function () { 	&#039;use strict&#039;;  	const CONTENT_SELECTOR = &#039;#mw-content-text .mw-pars...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.walkscape.app/index.php?title=MediaWiki:Gadget-CollapsibleHeaders.js&amp;diff=47980&amp;oldid=prev"/>
		<updated>2026-06-17T10:59:20Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;span class=&quot;autocomment&quot;&gt;*  * CollapsibleHeaders  * Adds expand/collapse toggles to top-level article headings.  *  * Section logic:  * - Clicking a heading hides/shows everything until the next heading  *   of the same or higher level.  * - Headings remain open by default.  * - Only direct article-content headings are processed, avoiding most  *   headings inside infoboxes, navboxes, tables, and templates.: &lt;/span&gt; (function () { 	&amp;#039;use strict&amp;#039;;  	const CONTENT_SELECTOR = &amp;#039;#mw-content-text .mw-pars...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * CollapsibleHeaders&lt;br /&gt;
 * Adds expand/collapse toggles to top-level article headings.&lt;br /&gt;
 *&lt;br /&gt;
 * Section logic:&lt;br /&gt;
 * - Clicking a heading hides/shows everything until the next heading&lt;br /&gt;
 *   of the same or higher level.&lt;br /&gt;
 * - Headings remain open by default.&lt;br /&gt;
 * - Only direct article-content headings are processed, avoiding most&lt;br /&gt;
 *   headings inside infoboxes, navboxes, tables, and templates.&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	const CONTENT_SELECTOR = &amp;#039;#mw-content-text .mw-parser-output&amp;#039;;&lt;br /&gt;
	const HEADING_SELECTOR = &amp;#039;h2, h3, h4, h5, h6&amp;#039;;&lt;br /&gt;
	const WRAPPER_SELECTOR = &amp;#039;.mw-heading&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	function getHeadingLevel(heading) {&lt;br /&gt;
		return Number(heading.tagName.slice(1));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getHeadingWrapper(heading) {&lt;br /&gt;
		return heading.closest(WRAPPER_SELECTOR) || heading;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getBoundaryHeading(element) {&lt;br /&gt;
		if (element.matches(HEADING_SELECTOR)) {&lt;br /&gt;
			return element;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (element.matches(WRAPPER_SELECTOR)) {&lt;br /&gt;
			return element.querySelector(HEADING_SELECTOR);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getDirectArticleHeadings(content) {&lt;br /&gt;
		const headings = [];&lt;br /&gt;
&lt;br /&gt;
		Array.from(content.children).forEach((child) =&amp;gt; {&lt;br /&gt;
			if (child.matches(HEADING_SELECTOR)) {&lt;br /&gt;
				headings.push(child);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if (child.matches(WRAPPER_SELECTOR)) {&lt;br /&gt;
				const heading = child.querySelector(HEADING_SELECTOR);&lt;br /&gt;
				if (heading) {&lt;br /&gt;
					headings.push(heading);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		return headings;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getSectionNodes(heading) {&lt;br /&gt;
		const level = getHeadingLevel(heading);&lt;br /&gt;
		const wrapper = getHeadingWrapper(heading);&lt;br /&gt;
		const nodes = [];&lt;br /&gt;
&lt;br /&gt;
		let node = wrapper.nextElementSibling;&lt;br /&gt;
&lt;br /&gt;
		while (node) {&lt;br /&gt;
			const boundaryHeading = getBoundaryHeading(node);&lt;br /&gt;
&lt;br /&gt;
			if (boundaryHeading &amp;amp;&amp;amp; getHeadingLevel(boundaryHeading) &amp;lt;= level) {&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			nodes.push(node);&lt;br /&gt;
			node = node.nextElementSibling;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return nodes;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function initCollapsibleHeaders($content) {&lt;br /&gt;
		const content = $content &amp;amp;&amp;amp; $content[0]&lt;br /&gt;
			? $content[0].querySelector(CONTENT_SELECTOR) || $content[0]&lt;br /&gt;
			: document.querySelector(CONTENT_SELECTOR);&lt;br /&gt;
&lt;br /&gt;
		if (!content || content.dataset.wsCollapsibleHeadersLoaded === &amp;#039;1&amp;#039;) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		const headings = getDirectArticleHeadings(content);&lt;br /&gt;
&lt;br /&gt;
		if (!headings.length) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		content.dataset.wsCollapsibleHeadersLoaded = &amp;#039;1&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		const sections = headings.map((heading, index) =&amp;gt; {&lt;br /&gt;
			const wrapper = getHeadingWrapper(heading);&lt;br /&gt;
			const button = document.createElement(&amp;#039;button&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			button.type = &amp;#039;button&amp;#039;;&lt;br /&gt;
			button.className = &amp;#039;ws-collapsible-header-toggle&amp;#039;;&lt;br /&gt;
			button.setAttribute(&amp;#039;aria-expanded&amp;#039;, &amp;#039;true&amp;#039;);&lt;br /&gt;
			button.setAttribute(&amp;#039;aria-label&amp;#039;, &amp;#039;Collapse section&amp;#039;);&lt;br /&gt;
			button.title = &amp;#039;Collapse section&amp;#039;;&lt;br /&gt;
			button.textContent = &amp;#039;▾&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			heading.classList.add(&amp;#039;ws-collapsible-header&amp;#039;);&lt;br /&gt;
			wrapper.classList.add(&amp;#039;ws-collapsible-header-wrapper&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			heading.insertBefore(button, heading.firstChild);&lt;br /&gt;
&lt;br /&gt;
			return {&lt;br /&gt;
				id: index,&lt;br /&gt;
				heading,&lt;br /&gt;
				wrapper,&lt;br /&gt;
				button,&lt;br /&gt;
				nodes: getSectionNodes(heading),&lt;br /&gt;
				collapsed: false&lt;br /&gt;
			};&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		function applyState() {&lt;br /&gt;
			const hiddenNodes = new Set();&lt;br /&gt;
&lt;br /&gt;
			sections.forEach((section) =&amp;gt; {&lt;br /&gt;
				if (section.collapsed) {&lt;br /&gt;
					section.nodes.forEach((node) =&amp;gt; hiddenNodes.add(node));&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			sections.forEach((section) =&amp;gt; {&lt;br /&gt;
				section.nodes.forEach((node) =&amp;gt; {&lt;br /&gt;
					const hidden = hiddenNodes.has(node);&lt;br /&gt;
					node.hidden = hidden;&lt;br /&gt;
					node.classList.toggle(&amp;#039;ws-collapsible-header-hidden&amp;#039;, hidden);&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
				section.wrapper.classList.toggle(&lt;br /&gt;
					&amp;#039;ws-collapsible-header-collapsed&amp;#039;,&lt;br /&gt;
					section.collapsed&lt;br /&gt;
				);&lt;br /&gt;
&lt;br /&gt;
				section.button.textContent = section.collapsed ? &amp;#039;▸&amp;#039; : &amp;#039;▾&amp;#039;;&lt;br /&gt;
				section.button.setAttribute(&amp;#039;aria-expanded&amp;#039;, String(!section.collapsed));&lt;br /&gt;
				section.button.setAttribute(&lt;br /&gt;
					&amp;#039;aria-label&amp;#039;,&lt;br /&gt;
					section.collapsed ? &amp;#039;Expand section&amp;#039; : &amp;#039;Collapse section&amp;#039;&lt;br /&gt;
				);&lt;br /&gt;
				section.button.title = section.collapsed ? &amp;#039;Expand section&amp;#039; : &amp;#039;Collapse section&amp;#039;;&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		sections.forEach((section) =&amp;gt; {&lt;br /&gt;
			section.button.addEventListener(&amp;#039;click&amp;#039;, (event) =&amp;gt; {&lt;br /&gt;
				event.preventDefault();&lt;br /&gt;
				event.stopPropagation();&lt;br /&gt;
&lt;br /&gt;
				section.collapsed = !section.collapsed;&lt;br /&gt;
				applyState();&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	mw.hook(&amp;#039;wikipage.content&amp;#039;).add(initCollapsibleHeaders);&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Bonez565</name></author>
	</entry>
</feed>