Lompat ke isi

Modul:UserLinks/shared

Ḍâri Wikipèḍia bhâsa Madhurâ, lombhung pangataowan mardhika

TemplateStyles' src attribute must not be empty.

TemplateStyles' src attribute must not be empty.

TemplateStyles' src attribute must not be empty.

This module stores functions that are shared between Module:UserLinks and Module:UserLinks/extra.


-- This module stores functions that are shared between [[Module:UserLinks]]
-- and [[Module:UserLinks/extra]].

-- Load data and define often-used variables
local cfg = mw.loadData('Module:UserLinks/config')
local namespaces = mw.site.namespaces

-- Lazily initialise modules that we may or may not need
local mCategoryHandler

-- Define namespaces for which links need to be escaped with the colon trick.
-- See [[w:en:Help:Colon trick]].
local colonNamespaces = {
	[6] = true, -- File
	[14] = true, -- Category
}

local p = {}

function p.maybeLoadModule(s)
	-- Attempts to load the module s. If it succeeds, returns the module;
	-- otherwise, returns false.
	local success, mdl = pcall(require, s)
	if success then
		return mdl
	else
		return false
	end
end

function p.raiseError(message, section, level)
	-- Raises an error using the Lua error function. The error message is
	-- designed to be caught with pcall and then passed to p.makeWikitextError.
	-- The section, if specified, is the section name on a help page that gives
	-- help to users about that particular error.
	if section then
		message = message .. '|' .. section
	end
	if not level or level == 0 then
		level = 0
	else
		level = level + 1
	end
	error(message, level)
end

local localBlacklist = {
	'/[sS]andbox$', -- Don't categorise sandboxes
	'/[tT]est ?cases$', -- Don't categorise test case pages
}

local function currentTitleMatchesLocalBlacklist()
	-- Return true if the current title matches any of the patterns in the
	-- local blacklist table. Otherwise return false.
	local title = mw.title.getCurrentTitle().prefixedText
	for i, pattern in ipairs(localBlacklist) do
		if title:find(pattern) then
			return true
		end
	end
	return false
end

function p.makeWikitextError(encodedMessage, demo)
	local errorMessage, section = mw.ustring.match(encodedMessage, '^(.-)|(.*)$')
	errorMessage = errorMessage or encodedMessage
	
	-- If not a demo, get the error category link and pass it through
	-- [[Module:Category handler]]'s blacklist.
	local category
	if not demo then
		category = string.format(
			'[[%s:%s]]',
			namespaces[14].name,
			p.message('error-config-category')
		)
		mCategoryHandler = p.maybeLoadModule('Module:Category handler')
		if mCategoryHandler then
			-- Categorise all namespaces, but not blacklisted pages.
			category = mCategoryHandler.main{all = category}
		end
		if category and currentTitleMatchesLocalBlacklist() then
			category = nil
		end
	end
	category = category or ''
	
	-- Format the error message and the section link.
	local formattedError
	if section then
		formattedError = p.message(
			'error-config-message-help',
			errorMessage,
			section
		)
	else
		formattedError = p.message(
			'error-config-message-nohelp',
			errorMessage
		)
	end

	-- Return the error message and the category inside html error tags.
	return string.format(
		'<strong class="error">%s</strong>%s',
		formattedError,
		category
	)
end

local function formatPage(interwiki, namespace, page)
	-- Formats an interwiki, a namespace and a page into a wikilink-ready
	-- string. The interwiki and namespace are optional. If a namespace is
	-- specified, it should be a valid key to mw.site.namespaces. The page
	-- parameter is required.
	local ret = {}
	interwiki = interwiki or ''
	if interwiki ~= '' or colonNamespaces[namespace] then
		ret[#ret + 1] = ':'
	end
	ret[#ret + 1] = interwiki
	if interwiki ~= '' then
		ret[#ret + 1] = ':'
	end
	if namespace then
		local nsTable = namespaces[namespace]
		if not nsTable then
			error('"' .. tostring(namespace) .. '" is not a valid namespace key', 2)
		end
		ret[#ret + 1] = nsTable.name
		if namespace ~= 0 then
			ret[#ret + 1] = ':'
		end
	end
	ret[#ret + 1] = page
	return table.concat(ret)
end

local function formatDisplay(s)
	-- Replaces spaces in a string with "&nbsp;" to make sure they don't wrap.
	-- Don't replace anything if we are substing, as we generally don't want
	-- to use "&nbsp;" in that case.
	if mw.isSubsting() then
		return s
	else
		return s:gsub(' ', '&nbsp;')
	end
end

function p.makeWikilink(interwiki, namespace, page, display)
	-- Creates a wikilink. The interwiki, namespace and display parameters are
	-- optional. If a namespace parameter is specified it must be a valid key
	-- to mw.site.namespaces.
	local formattedPage = formatPage(interwiki, namespace, page)
	if display then
		display = formatDisplay(display)
		return string.format('[[%s|%s]]', formattedPage, display)
	else
		return string.format('[[%s]]', formattedPage)
	end
end

local function formatUrlLink(url, display)
	-- Formats a URL link with an optional display parameter.
	if display then
		display = formatDisplay(display)
		return string.format('[%s %s]', url, display)
	else
		return string.format('[%s]', url)
	end
end

function p.makeUrlLink(s, display)
	-- Makes a URL link with an optional display parameter. The first input
	-- may be any valid input to mw.uri.new.
	local url = mw.uri.new(s)
	url = tostring(url)
	return formatUrlLink(url, display)
end

function p.makeFullUrlLink(interwiki, namespace, page, query, display)
	-- Makes a link to the full URL of a page. The interwiki, namespace, query
	-- and display parameters are optional. If a namespace parameter is
	-- specified it must be a valid key to mw.site.namespaces. The query
	-- parameter can be a string or a table as specified in the mw.uri library.
	local formattedPage = formatPage(interwiki, namespace, page)
	local url = mw.uri.fullUrl(formattedPage, query)
	url = tostring(url)
	return formatUrlLink(url, display)
end

function p.message(key, ...)
	-- Returns the message with the given key from [[Module:UserLinks/config]].
	-- Extra parameters are substituted in the message for keys $1, $2, $3, etc.
	local msg = cfg[key]
	if not msg then
		p.raiseError(
			'No message found with key "' .. tostring(key) .. '"',
			'No message found',
			2
		)
	end
	local noArgs = select('#', ...)
	if noArgs < 1 then
		return msg
	else
		local msg = mw.message.newRawMessage(msg, ...)
		return msg:plain()
	end
end

return p