Module:Redirect template

From Nordic Larp Wiki
Revision as of 22:08, 2 January 2019 by en>Steel1943 (Undid revision 876443655 by MSGJ (talk) undoing this change as it seems to break the formatting of the rcat text if multiple rcat templates are used and contains wiki text with at least one example of m...)
Jump to navigation Jump to search

This module implements {{redirect template}} and {{redirect template/core}}. Please see the template pages for documentation.



require('Module:No globals')

local p = {}

-- key is beginning of arg name. value is table with namespace number and link
-- alternatively, a function taking the namespace number and returning a validity
-- can be used
local namespaceCategories = {
	all = { function() return true end },
	main = { 0, '[[wp:mainspace|main]]' },
	help = { 12, '[[wp:help namespace|help]]' },
	portal = { 100, '[[wp:portal|portal]]' },
	talk = { function(n) return n > 0 and n%2 == 1 end, '[[Help:Using talk pages|talk]]' },
	template = { 10, '[[wp:template namespace|template]]' },
	wikipedia = { 4, '[[wp:project namespace|Wikipedia project]]' },
	category = { 14, '[[wp:categorization|category]]' },
	user = { 2, '[[wp:user pages|user]]' },
}

-- Don't convert blank category to nil
local function valueFunc(key, val)
	if type(val) == 'string' then
		val = val:match('^%s*(.-)%s*$')
		if val == '' and key ~= 'category' and key ~= 'embed' then
			return nil
		end
	end
	return val
end

local function getPrettyName(args)
	for k in pairs(namespaceCategories) do
		if args[k .. ' category'] then
			return  "'''[[:Category:" .. args[k .. ' category'] .. "|" .. args.name .. "]]''': "
		end
	end
	return "'''" .. args.name .. "''': "
end

function p.core(frame, args)
	if not args then
		args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:Redirect template/core', valueFunc = valueFunc})
	end
	local namespace = mw.title.getCurrentTitle().namespace
	local otherCategory = args['other category'] and (args.category or string.format('[[Category:%s]]', args['other category']))
	local embedPossible = args.embed == nil or args.embed == 'yes'

	--- XXX: this is a HORRIBLE HACK. kill it with fire as soon as https://bugzilla.wikimedia.org/show_bug.cgi?id=12974 is fixed
	local beCompatibleWithBug12974 = args.info and (args.info:find('^[:;#*]', 1) == 1 or args.info:find('{|', 1, true) == 1) and '\n' or ' '
	
	local retval = string.format('*%sThis is a redirect%s%s.%s%s',
		embedPossible and args.name and getPrettyName(args) or '',
		args.from and (' from ' .. args.from) or '',
		args.to and (' to ' .. args.to) or '',
		args.info and beCompatibleWithBug12974 or '',
		args.info or ''
	)
	for k,v in pairs(namespaceCategories) do
		if args[k .. ' category'] then
			if type(v[1]) == 'function' and v[1](namespace) or v[1] == namespace then
				retval = retval .. (args.category or string.format('[[Category:%s]]', args[k .. ' category']))
			elseif args['other category'] then
				retval = retval .. otherCategory
			else
				retval = retval .. frame:expandTemplate{title = 'Incorrect redirect template', args = {v[2]}}
			end
		end
	end
	return retval
end

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:Redirect template', valueFunc = valueFunc})
	local retval = p.core(frame, args)
	if mw.title.getCurrentTitle().namespace == 0 then
		if args.printworthy == 'yes' then
			return retval .. (args.category or '[[Category:Printworthy redirects]]')
		elseif args.printworthy == 'no' then
			return retval .. (args.category or '[[Category:Unprintworthy redirects]]')
		end
	end
	return retval
end

return p