<?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-CodeLinks.js</id>
	<title>MediaWiki:Gadget-CodeLinks.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-CodeLinks.js"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-CodeLinks.js&amp;action=history"/>
	<updated>2026-04-06T06:02:28Z</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-CodeLinks.js&amp;diff=474871&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-CodeLinks.js&amp;diff=474871&amp;oldid=prev"/>
		<updated>2025-11-04T17:47:06Z</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:47, 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-CodeLinks.js&amp;diff=474870&amp;oldid=prev</id>
		<title>wikt&gt;Benwing: User:Theknightwho fix tracking links in modules</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-CodeLinks.js&amp;diff=474870&amp;oldid=prev"/>
		<updated>2024-05-14T20:51:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;a href=&quot;/w/index.php?title=User:Theknightwho&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Theknightwho (page does not exist)&quot;&gt;User:Theknightwho&lt;/a&gt; fix tracking links in modules&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/*jshint undef:true, latedef:true */&lt;br /&gt;
/*global mw, jQuery */&lt;br /&gt;
&lt;br /&gt;
jQuery(function CodeLinksIIFE() {&lt;br /&gt;
&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// by John Gruber, from https://daringfireball.net/2010/07/improved_regex_for_matching_urls&lt;br /&gt;
var URLRegExp = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()&amp;lt;&amp;gt;]+|\(([^\s()&amp;lt;&amp;gt;]+|(\([^\s()&amp;lt;&amp;gt;]+\)))*\))+(?:\(([^\s()&amp;lt;&amp;gt;]+|(\([^\s()&amp;lt;&amp;gt;]+\)))*\)|[^\s`!()\[\]{};:&amp;#039;&amp;quot;.,&amp;lt;&amp;gt;?«»“”‘’]))/i;&lt;br /&gt;
&lt;br /&gt;
function processComment(node) {&lt;br /&gt;
	var wikilinkMatch, templateMatch, URLMatch,&lt;br /&gt;
		textNode = node.firstChild; // always a text node.&lt;br /&gt;
	&lt;br /&gt;
	while (&lt;br /&gt;
		(wikilinkMatch = /\[\[([^|{}\[\]\n]+)?(?:\|.*?)?]]/.exec(textNode.data))&lt;br /&gt;
		|| (templateMatch = /(\{\{(?:#invoke:)?)([^|{}\[\]\n#]+)(?=\||}})/i.exec(textNode.data))&lt;br /&gt;
		|| (URLMatch = URLRegExp.exec(textNode.data))&lt;br /&gt;
	) {&lt;br /&gt;
		var link = document.createElement(&amp;#039;a&amp;#039;),&lt;br /&gt;
			start = (wikilinkMatch || templateMatch || URLMatch).index,&lt;br /&gt;
			linkText;&lt;br /&gt;
		link.classList.add(&amp;quot;code-link&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		if (URLMatch) {&lt;br /&gt;
			var URL = URLMatch[0];&lt;br /&gt;
			link.href = URL;&lt;br /&gt;
			linkText = URL;&lt;br /&gt;
		} else {&lt;br /&gt;
			var fullPageName;&lt;br /&gt;
			if (wikilinkMatch) {&lt;br /&gt;
				linkText = wikilinkMatch[0];&lt;br /&gt;
				fullPageName = wikilinkMatch[1];&lt;br /&gt;
			} else if (templateMatch) {&lt;br /&gt;
				var prefix = templateMatch[1],&lt;br /&gt;
					pageName = templateMatch[2];&lt;br /&gt;
				linkText = pageName;&lt;br /&gt;
				fullPageName = (prefix === &amp;#039;{{#invoke:&amp;#039; ? &amp;#039;Module:&amp;#039; : &amp;#039;Template:&amp;#039;)&lt;br /&gt;
					+ pageName;&lt;br /&gt;
				link.title = fullPageName;&lt;br /&gt;
				start += prefix.length;&lt;br /&gt;
			}&lt;br /&gt;
			link.href = mw.util.getUrl(fullPageName);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		var beforeLink = textNode.data.substring(0, start),&lt;br /&gt;
			afterLink = textNode.data.substring(start + linkText.length);&lt;br /&gt;
		&lt;br /&gt;
		textNode.data = afterLink;&lt;br /&gt;
		link.appendChild(document.createTextNode(linkText));&lt;br /&gt;
		node.insertBefore(link, textNode);&lt;br /&gt;
		node.insertBefore(document.createTextNode(beforeLink), link);&lt;br /&gt;
		&lt;br /&gt;
		// ensure all matches are null at beginning of loop body; is this necessary?&lt;br /&gt;
		wikilinkMatch = templateMatch = URLMatch = null;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function each(coll, walk) {&lt;br /&gt;
	return Array.prototype.forEach.call(coll, walk);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var commentClasses = [ &amp;#039;c&amp;#039;, &amp;#039;c1&amp;#039;, &amp;#039;cm&amp;#039; ];&lt;br /&gt;
each(document.getElementsByClassName(&amp;#039;mw-highlight&amp;#039;), function (codeBlock) {&lt;br /&gt;
	each(commentClasses, function (commentClass) {&lt;br /&gt;
		each(codeBlock.getElementsByClassName(commentClass), processComment);&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Link module names after `require` and `mw.loadData`, and tracking page&lt;br /&gt;
// names after `require(&amp;quot;Module:debug&amp;quot;).track`.&lt;br /&gt;
var copyArray = Array.from ? Array.from.bind(Array) :&lt;br /&gt;
	function copyArray(array) {&lt;br /&gt;
		return Array.prototype.slice.call(array);&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
var classes = {&lt;br /&gt;
	identifier: &amp;quot;n&amp;quot;, functionName: &amp;quot;nb&amp;quot;,&lt;br /&gt;
	singleQuoteString: &amp;quot;s1&amp;quot;, doubleQuoteString: &amp;quot;s2&amp;quot;,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var trackingPageElements = [], moduleNames = [], dataModuleNames = [];&lt;br /&gt;
&lt;br /&gt;
var functionNames = document.getElementsByClassName(classes.functionName);&lt;br /&gt;
&lt;br /&gt;
Array.prototype.forEach.call(functionNames, function (functionName) {&lt;br /&gt;
	var text = functionName.firstChild.nodeValue;&lt;br /&gt;
	if (text !== &amp;quot;require&amp;quot;)&lt;br /&gt;
		return;&lt;br /&gt;
	&lt;br /&gt;
	var next = functionName.nextElementSibling;&lt;br /&gt;
	var nextText = next &amp;amp;&amp;amp; next.firstChild &amp;amp;&amp;amp; next.firstChild.nodeValue;&lt;br /&gt;
	&lt;br /&gt;
	var hasParenthesis = nextText === &amp;quot;(&amp;quot;;&lt;br /&gt;
	if (hasParenthesis) {&lt;br /&gt;
		next = next.nextElementSibling;&lt;br /&gt;
		nextText = next &amp;amp;&amp;amp; next.firstChild &amp;amp;&amp;amp; next.firstChild.nodeValue;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	var classList = next.classList;&lt;br /&gt;
	if (!(classList.contains(classes.singleQuoteString)&lt;br /&gt;
	|| classList.contains(classes.doubleQuoteString)))&lt;br /&gt;
		return;&lt;br /&gt;
	&lt;br /&gt;
	var string = next;&lt;br /&gt;
	var stringValue = nextText;&lt;br /&gt;
	if (!stringValue)&lt;br /&gt;
		return;&lt;br /&gt;
	&lt;br /&gt;
	next = next.nextElementSibling;&lt;br /&gt;
	nextText = next &amp;amp;&amp;amp; next.firstChild &amp;amp;&amp;amp; next.firstChild.nodeValue;&lt;br /&gt;
	if (hasParenthesis &amp;amp;&amp;amp; nextText &amp;amp;&amp;amp; nextText[0] !== &amp;quot;)&amp;quot;)&lt;br /&gt;
		return;&lt;br /&gt;
	&lt;br /&gt;
	moduleNames.push(string);&lt;br /&gt;
&lt;br /&gt;
	// FIXME!!! Tracking code has been moved to [[Module:debug/track]]. The following needs updating&lt;br /&gt;
	// to handle calls of the form require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;foo&amp;quot;).&lt;br /&gt;
	if (hasParenthesis ? nextText === &amp;quot;).&amp;quot; : nextText === &amp;quot;.&amp;quot;&lt;br /&gt;
	&amp;amp;&amp;amp; (/^[&amp;quot;&amp;#039;]mod(?:ule)?:(.+)[&amp;quot;&amp;#039;]$/i.exec(stringValue) || [])[1] === &amp;quot;debug&amp;quot;) {&lt;br /&gt;
		next = next.nextElementSibling;&lt;br /&gt;
		nextText = next &amp;amp;&amp;amp; next.firstChild &amp;amp;&amp;amp; next.firstChild.nodeValue;&lt;br /&gt;
		if (nextText !== &amp;quot;track&amp;quot;)&lt;br /&gt;
			return;&lt;br /&gt;
		&lt;br /&gt;
		next = next.nextElementSibling;&lt;br /&gt;
		if (!next) return;&lt;br /&gt;
		nextText = next &amp;amp;&amp;amp; next.firstChild &amp;amp;&amp;amp; next.firstChild.nodeValue;&lt;br /&gt;
		var trackWithParenthesis = false;&lt;br /&gt;
		if (nextText === &amp;quot;(&amp;quot;) {&lt;br /&gt;
			next = next.nextElementSibling;&lt;br /&gt;
			trackWithParenthesis = true;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		classList = next.classList;&lt;br /&gt;
		if (!(classList.contains(classes.singleQuoteString)&lt;br /&gt;
		|| classList.contains(classes.doubleQuoteString)))&lt;br /&gt;
			return;&lt;br /&gt;
		&lt;br /&gt;
		nextText = next &amp;amp;&amp;amp; next.firstChild &amp;amp;&amp;amp; next.firstChild.nodeValue;&lt;br /&gt;
		if (!nextText)&lt;br /&gt;
			return;&lt;br /&gt;
		&lt;br /&gt;
		// If there was a parenthesis on one side – `track(&amp;quot;...&amp;quot;)` rather than&lt;br /&gt;
		// `track &amp;quot;...&amp;quot;` – make sure there&amp;#039;s a matching parenthesis on the other side.&lt;br /&gt;
		if (trackWithParenthesis) {&lt;br /&gt;
			var after = next.nextElementSibling;&lt;br /&gt;
			var afterText = after &amp;amp;&amp;amp; after.firstChild &amp;amp;&amp;amp; after.firstChild.nodeValue;&lt;br /&gt;
			if (afterText !== &amp;quot;)&amp;quot;)&lt;br /&gt;
				return;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		trackingPageElements.push(next);&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var strings = copyArray(document.getElementsByClassName(classes.singleQuoteString))&lt;br /&gt;
	.concat(copyArray(document.getElementsByClassName(classes.doubleQuoteString)));&lt;br /&gt;
&lt;br /&gt;
Array.prototype.forEach.call(strings, function (string) {&lt;br /&gt;
	if (moduleNames.indexOf(string) !== -1 || trackingPageElements.indexOf(string) !== -1)&lt;br /&gt;
		return;&lt;br /&gt;
	&lt;br /&gt;
	var stringValue = string.firstChild.nodeValue;&lt;br /&gt;
	if (!/^[&amp;quot;&amp;#039;](?:module|mod):/i.test(stringValue))&lt;br /&gt;
		return;&lt;br /&gt;
	&lt;br /&gt;
	var prev = string.previousElementSibling;&lt;br /&gt;
	var prevText = prev &amp;amp;&amp;amp; prev.firstChild &amp;amp;&amp;amp; prev.firstChild.nodeValue;&lt;br /&gt;
	if (prevText === &amp;quot;(&amp;quot;) {&lt;br /&gt;
		var next = string.nextElementSibling;&lt;br /&gt;
		var nextText = next &amp;amp;&amp;amp; next.firstChild &amp;amp;&amp;amp; next.firstChild.nodeValue;&lt;br /&gt;
		if (!(nextText &amp;amp;&amp;amp; nextText[0] === &amp;quot;)&amp;quot;))&lt;br /&gt;
			return;&lt;br /&gt;
		&lt;br /&gt;
		prev = prev.previousElementSibling;&lt;br /&gt;
		prevText = prev &amp;amp;&amp;amp; prev.firstChild &amp;amp;&amp;amp; prev.firstChild.nodeValue;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (prevText !== &amp;quot;loadData&amp;quot;)&lt;br /&gt;
		return;&lt;br /&gt;
	&lt;br /&gt;
	prev = prev.previousElementSibling;&lt;br /&gt;
	prevText = prev &amp;amp;&amp;amp; prev.firstChild &amp;amp;&amp;amp; prev.firstChild.nodeValue;&lt;br /&gt;
	if (prevText !== &amp;quot;.&amp;quot;)&lt;br /&gt;
		return;&lt;br /&gt;
	&lt;br /&gt;
	prev = prev.previousElementSibling;&lt;br /&gt;
	prevText = prev &amp;amp;&amp;amp; prev.firstChild &amp;amp;&amp;amp; prev.firstChild.nodeValue;&lt;br /&gt;
	if (prevText !== &amp;quot;mw&amp;quot;)&lt;br /&gt;
		return;&lt;br /&gt;
	&lt;br /&gt;
	dataModuleNames.push(string);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (moduleNames.length &amp;gt; 0 || trackingPageElements.length &amp;gt; 0&lt;br /&gt;
|| dataModuleNames.length &amp;gt; 0) {&lt;br /&gt;
	mw.loader.using(&amp;quot;mediawiki.util&amp;quot;).done(function () {&lt;br /&gt;
		function addLink(element, page) {&lt;br /&gt;
			if (!(element instanceof Element))&lt;br /&gt;
				throw new TypeError(&amp;quot;Expected Element object&amp;quot;);&lt;br /&gt;
			var link = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
			link.href = mw.util.getUrl(page);&lt;br /&gt;
			// put text node from element inside link&lt;br /&gt;
			var firstChild = element.firstChild;&lt;br /&gt;
			if (!(firstChild instanceof Text))&lt;br /&gt;
				throw new TypeError(&amp;quot;Expected Text object&amp;quot;);&lt;br /&gt;
			link.appendChild(firstChild);&lt;br /&gt;
			element.appendChild(link); // put link inside syntax-highlighted string&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		// Link module names to module pages, or to the section in the Scribunto&lt;br /&gt;
		// manual.&lt;br /&gt;
		moduleNames.concat(dataModuleNames).forEach(function (module) {&lt;br /&gt;
			var link = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
			var stringValue = module.firstChild.nodeValue;&lt;br /&gt;
			var moduleName = stringValue.substring(1, stringValue.length - 1);&lt;br /&gt;
			var linkPage = /^mod(?:ule)?:/i.test(moduleName)&lt;br /&gt;
				? moduleName&lt;br /&gt;
				: &amp;quot;mw:Extension:Scribunto/Lua reference manual#&amp;quot; + moduleName;&lt;br /&gt;
			addLink(module, linkPage);&lt;br /&gt;
		});&lt;br /&gt;
		&lt;br /&gt;
		// Link tracking pages to [[Special:WhatLinksHere]].&lt;br /&gt;
		trackingPageElements.forEach(function (trackingPage) {&lt;br /&gt;
			var text = trackingPage.firstChild &amp;amp;&amp;amp; trackingPage.firstChild.nodeValue;&lt;br /&gt;
			if (!text)&lt;br /&gt;
				return;&lt;br /&gt;
			var trackingCode = text.substring(1, text.length - 1);&lt;br /&gt;
			&lt;br /&gt;
			addLink(trackingPage, &amp;quot;Special:WhatLinksHere/Wiktionary:Tracking/&amp;quot; + trackingCode);&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>wikt&gt;Benwing</name></author>
	</entry>
</feed>