<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-DocTabs.js</id>
	<title>MediaWiki:Gadget-DocTabs.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-DocTabs.js"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-DocTabs.js&amp;action=history"/>
	<updated>2026-04-10T22:12:34Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-DocTabs.js&amp;diff=475149&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-DocTabs.js&amp;diff=475149&amp;oldid=prev"/>
		<updated>2025-11-04T17:55:11Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:55, 4 November 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-DocTabs.js&amp;diff=475148&amp;oldid=prev</id>
		<title>wikt&gt;Ioaxxere: minor cleanup &amp; use async/await</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-DocTabs.js&amp;diff=475148&amp;oldid=prev"/>
		<updated>2025-10-08T22:56:32Z</updated>

		<summary type="html">&lt;p&gt;minor cleanup &amp;amp; use async/await&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// Idea: add or remove portlet links as required, using an API query to check what needs to be redlinked beforehand.&lt;br /&gt;
// The following page types are unsupported: `Template_talk:XYZ/documentation`, `Module_talk:XYZ/documentation`, `Citations_talk:XYZ`&lt;br /&gt;
// as it is not clear whether these pages should exist at all, and if so, what portlets should be shown on them.&lt;br /&gt;
// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let portletBar = document.querySelector(&amp;quot;#p-associated-pages, #p-namespaces, #p-cactions&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (portletBar) {&lt;br /&gt;
	let actionAPI = new mw.Api({ajax: {headers: {&amp;quot;Api-User-Agent&amp;quot;: &amp;quot;Gadget developed by [[User:Ioaxxere]]&amp;quot;}}});&lt;br /&gt;
	let ns = mw.config.values.wgNamespaceNumber;&lt;br /&gt;
	let title = mw.config.values.wgTitle.replaceAll(&amp;quot; &amp;quot;, &amp;quot;_&amp;quot;);&lt;br /&gt;
	let isDocumentationPage = (ns === 10 || ns === 11 || ns === 828 || ns === 829) &amp;amp;&amp;amp; title.endsWith(&amp;quot;/documentation&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	// Remove /documentation suffix if necessary.&lt;br /&gt;
	let mainTitle = isDocumentationPage ? title.slice(0, -14) : title;&lt;br /&gt;
&lt;br /&gt;
	// Page title, display text, ID, tooltip, access key.&lt;br /&gt;
	let portletData = {&lt;br /&gt;
		&amp;quot;mainspace&amp;quot;: [mainTitle, &amp;quot;Entry&amp;quot;, &amp;quot;ca-nstab-main&amp;quot;, &amp;quot;View the content page&amp;quot;, &amp;quot;c&amp;quot;],&lt;br /&gt;
		&amp;quot;talk&amp;quot;: [`Talk:${mainTitle}`, &amp;quot;Discussion&amp;quot;, &amp;quot;ca-talk&amp;quot;, &amp;quot;Discussion about the content page&amp;quot;, &amp;quot;t&amp;quot;],&lt;br /&gt;
		&amp;quot;citations&amp;quot;: [`Citations:${mainTitle}`, &amp;quot;Citations&amp;quot;, &amp;quot;ca-nstab-citations&amp;quot;, &amp;quot;View the citations page&amp;quot;, &amp;quot;3&amp;quot;],&lt;br /&gt;
		&amp;quot;template&amp;quot;: [`Template:${mainTitle}`, &amp;quot;Template&amp;quot;, &amp;quot;ca-nstab-template&amp;quot;, &amp;quot;View the template&amp;quot;, &amp;quot;c&amp;quot;],&lt;br /&gt;
		&amp;quot;template_talk&amp;quot;: [`Template_talk:${mainTitle}`, &amp;quot;Discussion&amp;quot;, &amp;quot;ca-talk&amp;quot;, &amp;quot;Discussion about the content page&amp;quot;, &amp;quot;t&amp;quot;],&lt;br /&gt;
		&amp;quot;template_documentation&amp;quot;: [`Template:${mainTitle}/documentation`, &amp;quot;Documentation&amp;quot;, &amp;quot;ca-nstab-docs&amp;quot;, &amp;quot;View the documentation&amp;quot;, &amp;quot;3&amp;quot;],&lt;br /&gt;
		&amp;quot;module&amp;quot;: [`Module:${mainTitle}`, &amp;quot;Module&amp;quot;, &amp;quot;ca-nstab-module&amp;quot;, &amp;quot;View the module page&amp;quot;, &amp;quot;c&amp;quot;],&lt;br /&gt;
		&amp;quot;module_talk&amp;quot;: [`Module_talk:${mainTitle}`, &amp;quot;Discussion&amp;quot;, &amp;quot;ca-talk&amp;quot;, &amp;quot;Discussion about the content page&amp;quot;, &amp;quot;t&amp;quot;],&lt;br /&gt;
		&amp;quot;module_documentation&amp;quot;: [`Module:${mainTitle}/documentation`, &amp;quot;Documentation&amp;quot;, &amp;quot;ca-nstab-docs&amp;quot;, &amp;quot;View the documentation&amp;quot;, &amp;quot;3&amp;quot;]&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// Given a list of portlet types (see above), return a filtered set of portlets which need to be highlighted as redlinks.&lt;br /&gt;
	async function checkRedlinkPortlets(...portletList) {&lt;br /&gt;
		let titleList = portletList.map(portlet =&amp;gt; portletData[portlet][0]);&lt;br /&gt;
&lt;br /&gt;
		// Check whether the page titles exist.&lt;br /&gt;
		let response = await actionAPI.get({&lt;br /&gt;
			action: &amp;quot;query&amp;quot;,&lt;br /&gt;
			titles: titleList.join(&amp;quot;|&amp;quot;),&lt;br /&gt;
			format: &amp;quot;json&amp;quot;&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// Get page results which have a negative ID (i.e., do not exist).&lt;br /&gt;
		let redlinks = new Set();&lt;br /&gt;
		for (let [pageKey, pageData] of Object.entries(response.query.pages)) {&lt;br /&gt;
			if (pageKey &amp;lt; 0)&lt;br /&gt;
				redlinks.add(pageData.title.replaceAll(&amp;quot; &amp;quot;, &amp;quot;_&amp;quot;));&lt;br /&gt;
		}&lt;br /&gt;
		return new Set(portletList.filter(portlet =&amp;gt; redlinks.has(portletData[portlet][0])));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Adds a namespace link of the specified type (see above) on the portlet bar.&lt;br /&gt;
	// It uses the `redlinkPortlets` list generated by checkRedlinkPortlets().&lt;br /&gt;
	// `location` should be set to either &amp;quot;beginning&amp;quot; or &amp;quot;end&amp;quot;.&lt;br /&gt;
	// There appears to be no way to create a portlet redlink, so this implementation tries to emulate the default behaviour.&lt;br /&gt;
	// Note: adding two identical portlets is currently unsupported, as it results in duplicate IDs in the DOM.&lt;br /&gt;
	// More info: https://doc.wikimedia.org/mediawiki-core/REL1_29/js/#!/api/mw.util-method-addPortletLink&lt;br /&gt;
	function addNamespaceLink(portletType, redlinkPortlets, location, isSelected) {&lt;br /&gt;
		let data = portletData[portletType];&lt;br /&gt;
&lt;br /&gt;
		// Certain skins that have unrelated portlets in the same bar which we should always be before.&lt;br /&gt;
		// If none of the selectors match an element, the portlet is placed at the very end as desired.&lt;br /&gt;
		// If `location` is &amp;quot;beginning&amp;quot;, the selector always matches the first element.&lt;br /&gt;
		let before = location === &amp;quot;beginning&amp;quot; ? &amp;quot;li&amp;quot; : &amp;quot;#ca-edit, #ca-view, #ca-watch&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		let isRedlink = redlinkPortlets.has(portletType);&lt;br /&gt;
		let tooltip = data[3];&lt;br /&gt;
		let href = `/wiki/${data[0]}`;&lt;br /&gt;
&lt;br /&gt;
		if (isRedlink) {&lt;br /&gt;
			tooltip += &amp;quot; (page does not exist)&amp;quot;;&lt;br /&gt;
			href = `/w/index.php?title=${data[0]}&amp;amp;action=edit&amp;amp;redlink=1`;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		mw.util.addPortletLink(portletBar.id, href, data[1], data[2], tooltip, data[4], portletBar.querySelector(before));&lt;br /&gt;
&lt;br /&gt;
		let portletElem = document.getElementById(data[2]);&lt;br /&gt;
		if (isSelected) {&lt;br /&gt;
			portletElem.classList.add(&amp;quot;selected&amp;quot;);&lt;br /&gt;
		} else if (isRedlink) {&lt;br /&gt;
			portletElem.classList.add(&amp;quot;new&amp;quot;);&lt;br /&gt;
			portletElem.querySelector(&amp;quot;a&amp;quot;).classList.add(&amp;quot;new&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	(async () =&amp;gt; {&lt;br /&gt;
		if (ns === 0 || ns === 1) { // Mainspace and Talk&lt;br /&gt;
			// Add a link to the citations page.&lt;br /&gt;
			let redlinkPortlets = await checkRedlinkPortlets(&amp;quot;citations&amp;quot;);&lt;br /&gt;
			addNamespaceLink(&amp;quot;citations&amp;quot;, redlinkPortlets, &amp;quot;end&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		} else if (ns === 114) { // Citations&lt;br /&gt;
			// Add links to mainspace and talk and remove link to citations talk.&lt;br /&gt;
			let redlinkPortlets = await checkRedlinkPortlets(&amp;quot;mainspace&amp;quot;, &amp;quot;talk&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Remove link to Citations talk.&lt;br /&gt;
			portletBar.querySelectorAll(&amp;quot;li&amp;quot;)[1].remove();&lt;br /&gt;
&lt;br /&gt;
			// Set access key to &amp;quot;3&amp;quot;.&lt;br /&gt;
			let citationsLink = portletBar.querySelector(&amp;quot;li &amp;gt; a&amp;quot;);&lt;br /&gt;
			citationsLink.setAttribute(&amp;quot;accesskey&amp;quot;, 3);&lt;br /&gt;
			citationsLink.setAttribute(&amp;quot;title&amp;quot;, &amp;quot;View the citations page [alt-shift-3]&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			addNamespaceLink(&amp;quot;talk&amp;quot;, redlinkPortlets, &amp;quot;beginning&amp;quot;);&lt;br /&gt;
			addNamespaceLink(&amp;quot;mainspace&amp;quot;, redlinkPortlets, &amp;quot;beginning&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		} else if ((ns === 10 || ns === 11) &amp;amp;&amp;amp; !isDocumentationPage) { // Template and Template_talk&lt;br /&gt;
			// Add a link to the documentation.&lt;br /&gt;
			let redlinkPortlets = await checkRedlinkPortlets(&amp;quot;template_documentation&amp;quot;);&lt;br /&gt;
			addNamespaceLink(&amp;quot;template_documentation&amp;quot;, redlinkPortlets, &amp;quot;end&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		} else if (ns === 10 &amp;amp;&amp;amp; isDocumentationPage) { // Template documentation&lt;br /&gt;
			let redlinkPortlets = await checkRedlinkPortlets(&amp;quot;template&amp;quot;, &amp;quot;template_talk&amp;quot;, &amp;quot;template_documentation&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Remove existing two portlet links.&lt;br /&gt;
			portletBar.querySelector(&amp;quot;li&amp;quot;).remove();&lt;br /&gt;
			portletBar.querySelector(&amp;quot;li&amp;quot;).remove();&lt;br /&gt;
&lt;br /&gt;
			// Add links to the template, discussion, and current documentation pages.&lt;br /&gt;
			addNamespaceLink(&amp;quot;template&amp;quot;, redlinkPortlets, &amp;quot;end&amp;quot;);&lt;br /&gt;
			addNamespaceLink(&amp;quot;template_talk&amp;quot;, redlinkPortlets, &amp;quot;end&amp;quot;);&lt;br /&gt;
			addNamespaceLink(&amp;quot;template_documentation&amp;quot;, redlinkPortlets, &amp;quot;end&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
		} else if ((ns === 828 || ns === 829) &amp;amp;&amp;amp; !isDocumentationPage) { // Module and Module_talk&lt;br /&gt;
			// Add a link to the documentation.&lt;br /&gt;
			let redlinkPortlets = await checkRedlinkPortlets(&amp;quot;module_documentation&amp;quot;);&lt;br /&gt;
			addNamespaceLink(&amp;quot;module_documentation&amp;quot;, redlinkPortlets, &amp;quot;end&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		} else if (ns === 828 &amp;amp;&amp;amp; isDocumentationPage) { // Module documentation&lt;br /&gt;
			let redlinkPortlets = await checkRedlinkPortlets(&amp;quot;module&amp;quot;, &amp;quot;module_talk&amp;quot;, &amp;quot;module_documentation&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Remove existing two portlet links.&lt;br /&gt;
			portletBar.querySelector(&amp;quot;li&amp;quot;).remove();&lt;br /&gt;
			portletBar.querySelector(&amp;quot;li&amp;quot;).remove();&lt;br /&gt;
&lt;br /&gt;
			// Add links to the module, discussion, and current documentation pages.&lt;br /&gt;
			addNamespaceLink(&amp;quot;module&amp;quot;, redlinkPortlets, &amp;quot;end&amp;quot;);&lt;br /&gt;
			addNamespaceLink(&amp;quot;module_talk&amp;quot;, redlinkPortlets, &amp;quot;end&amp;quot;);&lt;br /&gt;
			addNamespaceLink(&amp;quot;module_documentation&amp;quot;, redlinkPortlets, &amp;quot;end&amp;quot;, true);&lt;br /&gt;
		}&lt;br /&gt;
	})();&lt;br /&gt;
}&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>wikt&gt;Ioaxxere</name></author>
	</entry>
</feed>