<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mindpowe.red/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AUserLinks%2Fshared</id>
	<title>Module:UserLinks/shared - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mindpowe.red/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AUserLinks%2Fshared"/>
	<link rel="alternate" type="text/html" href="https://mindpowe.red/wiki/index.php?title=Module:UserLinks/shared&amp;action=history"/>
	<updated>2026-04-06T11:43:04Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>https://mindpowe.red/wiki/index.php?title=Module:UserLinks/shared&amp;diff=2875&amp;oldid=prev</id>
		<title>imported&gt;Mr. Stradivarius: set up a local blacklist system so that we don't categorise sandboxes or test case pages</title>
		<link rel="alternate" type="text/html" href="https://mindpowe.red/wiki/index.php?title=Module:UserLinks/shared&amp;diff=2875&amp;oldid=prev"/>
		<updated>2016-12-30T15:21:53Z</updated>

		<summary type="html">&lt;p&gt;set up a local blacklist system so that we don&amp;#039;t categorise sandboxes or test case pages&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module stores functions that are shared between [[Module:UserLinks]]&lt;br /&gt;
-- and [[Module:UserLinks/extra]].&lt;br /&gt;
&lt;br /&gt;
-- Load data and define often-used variables&lt;br /&gt;
local cfg = mw.loadData('Module:UserLinks/config')&lt;br /&gt;
local namespaces = mw.site.namespaces&lt;br /&gt;
&lt;br /&gt;
-- Lazily initialise modules that we may or may not need&lt;br /&gt;
local mCategoryHandler&lt;br /&gt;
&lt;br /&gt;
-- Define namespaces for which links need to be escaped with the colon trick.&lt;br /&gt;
-- See [[w:en:Help:Colon trick]].&lt;br /&gt;
local colonNamespaces = {&lt;br /&gt;
	[6] = true, -- File&lt;br /&gt;
	[14] = true, -- Category&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.maybeLoadModule(s)&lt;br /&gt;
	-- Attempts to load the module s. If it succeeds, returns the module;&lt;br /&gt;
	-- otherwise, returns false.&lt;br /&gt;
	local success, mdl = pcall(require, s)&lt;br /&gt;
	if success then&lt;br /&gt;
		return mdl&lt;br /&gt;
	else&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.raiseError(message, section, level)&lt;br /&gt;
	-- Raises an error using the Lua error function. The error message is&lt;br /&gt;
	-- designed to be caught with pcall and then passed to p.makeWikitextError.&lt;br /&gt;
	-- The section, if specified, is the section name on a help page that gives&lt;br /&gt;
	-- help to users about that particular error.&lt;br /&gt;
	if section then&lt;br /&gt;
		message = message .. '|' .. section&lt;br /&gt;
	end&lt;br /&gt;
	if not level or level == 0 then&lt;br /&gt;
		level = 0&lt;br /&gt;
	else&lt;br /&gt;
		level = level + 1&lt;br /&gt;
	end&lt;br /&gt;
	error(message, level)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local localBlacklist = {&lt;br /&gt;
	'/[sS]andbox$', -- Don't categorise sandboxes&lt;br /&gt;
	'/[tT]est ?cases$', -- Don't categorise test case pages&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function currentTitleMatchesLocalBlacklist()&lt;br /&gt;
	-- Return true if the current title matches any of the patterns in the&lt;br /&gt;
	-- local blacklist table. Otherwise return false.&lt;br /&gt;
	local title = mw.title.getCurrentTitle().prefixedText&lt;br /&gt;
	for i, pattern in ipairs(localBlacklist) do&lt;br /&gt;
		if title:find(pattern) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeWikitextError(encodedMessage, demo)&lt;br /&gt;
	local errorMessage, section = mw.ustring.match(encodedMessage, '^(.-)|(.*)$')&lt;br /&gt;
	errorMessage = errorMessage or encodedMessage&lt;br /&gt;
	&lt;br /&gt;
	-- If not a demo, get the error category link and pass it through&lt;br /&gt;
	-- [[Module:Category handler]]'s blacklist.&lt;br /&gt;
	local category&lt;br /&gt;
	if not demo then&lt;br /&gt;
		category = string.format(&lt;br /&gt;
			'[[%s:%s]]',&lt;br /&gt;
			namespaces[14].name,&lt;br /&gt;
			p.message('error-config-category')&lt;br /&gt;
		)&lt;br /&gt;
		mCategoryHandler = p.maybeLoadModule('Module:Category handler')&lt;br /&gt;
		if mCategoryHandler then&lt;br /&gt;
			-- Categorise all namespaces, but not blacklisted pages.&lt;br /&gt;
			category = mCategoryHandler.main{all = category}&lt;br /&gt;
		end&lt;br /&gt;
		if category and currentTitleMatchesLocalBlacklist() then&lt;br /&gt;
			category = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	category = category or ''&lt;br /&gt;
	&lt;br /&gt;
	-- Format the error message and the section link.&lt;br /&gt;
	local formattedError&lt;br /&gt;
	if section then&lt;br /&gt;
		formattedError = p.message(&lt;br /&gt;
			'error-config-message-help',&lt;br /&gt;
			errorMessage,&lt;br /&gt;
			section&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		formattedError = p.message(&lt;br /&gt;
			'error-config-message-nohelp',&lt;br /&gt;
			errorMessage&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Return the error message and the category inside html error tags.&lt;br /&gt;
	return string.format(&lt;br /&gt;
		'&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;%s&amp;lt;/strong&amp;gt;%s',&lt;br /&gt;
		formattedError,&lt;br /&gt;
		category&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatPage(interwiki, namespace, page)&lt;br /&gt;
	-- Formats an interwiki, a namespace and a page into a wikilink-ready&lt;br /&gt;
	-- string. The interwiki and namespace are optional. If a namespace is&lt;br /&gt;
	-- specified, it should be a valid key to mw.site.namespaces. The page&lt;br /&gt;
	-- parameter is required.&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	interwiki = interwiki or ''&lt;br /&gt;
	if interwiki ~= '' or colonNamespaces[namespace] then&lt;br /&gt;
		ret[#ret + 1] = ':'&lt;br /&gt;
	end&lt;br /&gt;
	ret[#ret + 1] = interwiki&lt;br /&gt;
	if interwiki ~= '' then&lt;br /&gt;
		ret[#ret + 1] = ':'&lt;br /&gt;
	end&lt;br /&gt;
	if namespace then&lt;br /&gt;
		local nsTable = namespaces[namespace]&lt;br /&gt;
		if not nsTable then&lt;br /&gt;
			error('&amp;quot;' .. tostring(namespace) .. '&amp;quot; is not a valid namespace key', 2)&lt;br /&gt;
		end&lt;br /&gt;
		ret[#ret + 1] = nsTable.name&lt;br /&gt;
		if namespace ~= 0 then&lt;br /&gt;
			ret[#ret + 1] = ':'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret[#ret + 1] = page&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatDisplay(s)&lt;br /&gt;
	-- Replaces spaces in a string with &amp;quot;&amp;amp;nbsp;&amp;quot; to make sure they don't wrap.&lt;br /&gt;
	-- Don't replace anything if we are substing, as we generally don't want&lt;br /&gt;
	-- to use &amp;quot;&amp;amp;nbsp;&amp;quot; in that case.&lt;br /&gt;
	if mw.isSubsting() then&lt;br /&gt;
		return s&lt;br /&gt;
	else&lt;br /&gt;
		return s:gsub(' ', '&amp;amp;nbsp;')&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeWikilink(interwiki, namespace, page, display)&lt;br /&gt;
	-- Creates a wikilink. The interwiki, namespace and display parameters are&lt;br /&gt;
	-- optional. If a namespace parameter is specified it must be a valid key&lt;br /&gt;
	-- to mw.site.namespaces.&lt;br /&gt;
	local formattedPage = formatPage(interwiki, namespace, page)&lt;br /&gt;
	if display then&lt;br /&gt;
		display = formatDisplay(display)&lt;br /&gt;
		return string.format('[[%s|%s]]', formattedPage, display)&lt;br /&gt;
	else&lt;br /&gt;
		return string.format('[[%s]]', formattedPage)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatUrlLink(url, display)&lt;br /&gt;
	-- Formats a URL link with an optional display parameter.&lt;br /&gt;
	if display then&lt;br /&gt;
		display = formatDisplay(display)&lt;br /&gt;
		return string.format('[%s %s]', url, display)&lt;br /&gt;
	else&lt;br /&gt;
		return string.format('[%s]', url)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeUrlLink(s, display)&lt;br /&gt;
	-- Makes a URL link with an optional display parameter. The first input&lt;br /&gt;
	-- may be any valid input to mw.uri.new.&lt;br /&gt;
	local url = mw.uri.new(s)&lt;br /&gt;
	url = tostring(url)&lt;br /&gt;
	return formatUrlLink(url, display)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeFullUrlLink(interwiki, namespace, page, query, display)&lt;br /&gt;
	-- Makes a link to the full URL of a page. The interwiki, namespace, query&lt;br /&gt;
	-- and display parameters are optional. If a namespace parameter is&lt;br /&gt;
	-- specified it must be a valid key to mw.site.namespaces. The query&lt;br /&gt;
	-- parameter can be a string or a table as specified in the mw.uri library.&lt;br /&gt;
	local formattedPage = formatPage(interwiki, namespace, page)&lt;br /&gt;
	local url = mw.uri.fullUrl(formattedPage, query)&lt;br /&gt;
	url = tostring(url)&lt;br /&gt;
	return formatUrlLink(url, display)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.message(key, ...)&lt;br /&gt;
	-- Returns the message with the given key from [[Module:UserLinks/config]].&lt;br /&gt;
	-- Extra parameters are substituted in the message for keys $1, $2, $3, etc.&lt;br /&gt;
	local msg = cfg[key]&lt;br /&gt;
	if not msg then&lt;br /&gt;
		p.raiseError(&lt;br /&gt;
			'No message found with key &amp;quot;' .. tostring(key) .. '&amp;quot;',&lt;br /&gt;
			'No message found',&lt;br /&gt;
			2&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	local noArgs = select('#', ...)&lt;br /&gt;
	if noArgs &amp;lt; 1 then&lt;br /&gt;
		return msg&lt;br /&gt;
	else&lt;br /&gt;
		local msg = mw.message.newRawMessage(msg, ...)&lt;br /&gt;
		return msg:plain()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Mr. Stradivarius</name></author>
		
	</entry>
</feed>