Modul:Resolve category redirect

TemplateStyles' src attribute must not be empty.

Lua error in Modul:Lua_banner at line 113: attempt to index field 'edit' (a nil value).

Resolves a soft category redirect.

It takes one parameter, which is the name of a category. It returns that category name, unless the category exists and is a {{category redirect}} ... when it returns the name of the redirect target.

{{Resolve category redirect|categoryname}}

Examples

beccè'

Category exists and is not redirected: Category:1970s

beccè'
  • {{Resolve category redirect|1970s}} → 1970s
  • {{Resolve category redirect|Category:1970s}} → 1970s

Category exists and is a soft redirect: Category:Mosques completed in the 19th century

beccè'
  • {{Resolve category redirect|Mosques completed in the 19th century}} → Mosques completed in the 19th century
  • {{Resolve category redirect|Category:Mosques completed in the 19th century}} → Mosques completed in the 19th century

Category exists and is a soft redirect: Category:Organisations

beccè'
  • {{Resolve category redirect|Organisations}} → Organisations
  • {{Resolve category redirect|Category:Organisations}} → Organisations
  • {{Resolve category redirect|Colourless green things}} → Colourless green things
  • {{Resolve category redirect|Category:Colourless green things}} → Colourless green things
  • {{Resolve category redirect|1781 in Mexico}} → 1781 in Mexico
  • {{Resolve category redirect|Category:1781 in Mexico}} → 1781 in Mexico

Templates

beccè'

{{Title year}} and other templates without parameters are now allowed in the {{Category redirect}} target name, and are evaluated accordingly. Multiple templates are not evaluated, but such functionality can be requested with an appropriate working example.

The character ! is also now allowed (see testcases).

Avoiding deletion of the redirected page

beccè'

It is helpful to also add {{R from category navigation}} or {{R from template-generated category}} (as appropriate) to indicate that the redirect is required for navigation between category pages. See those template page for full syntax. This also hides a speedy deletion button that is otherwise displayed to administrators.

Tracking categories

beccè'

See also

beccè'

local p = {}

local function cleanup( rtarget )
	rtarget = mw.text.trim( rtarget )
	rtarget = mw.ustring.gsub( rtarget, '^1%s*=%s*', '' )
	rtarget = string.gsub( rtarget, '^[Cc]ategory:', '' )
	return rtarget
end

--Returns the target of {{Category redirect}}, if it exists, else returns the original cat.
function p.rtarget( cat, frame )
	cat = string.gsub( cat, '^[Cc]ategory:', '' ) --"!" in cat not recognized by mw.title.makeTitle() otherwise
	if string.match( cat, '[|]' ) then
		return cat	
	end
	local catcontent = mw.title.makeTitle( 'Category', cat or '' ):getContent() --makeTitle() allows ':' in cat names
	if string.match( catcontent or '', '{{ *[Cc]at' ) then --regex common to all possible calls
		catcontent = mw.ustring.gsub( catcontent, '|%s*keep%s*=%s*[yY]?[eE]?[sS]?%s*', '' ) --remove other params
		local getRegex = require('Module:Template redirect regex').main
		local tregex = getRegex('Category redirect')
		for _, v in pairs (tregex) do
			local found = mw.ustring.match( catcontent, v..'%s*|' )
			if found then --refine
				local rtarget = mw.ustring.match( catcontent, v..'%s*|%s*([^{|}]+)}}' ) or --{{Category redirect|...}} (most common)
								mw.ustring.match( catcontent, v..'%s*|%s*([^{|}]+)|' )     --{{Category redirect|...|...}} (2nd most common)
				if rtarget then --normal, plain text target
					return cleanup(rtarget)
				else
					local ty_regex = '%s*|%s*([^{|}]*{{([^#][^{|}]+)}}[^{|}]*)' --$1 nests $2
					local rtarget_orig, ty = mw.ustring.match( catcontent, v..ty_regex )
					if rtarget_ty then --{{Category redirect|...{{Title year}}... (less common)
						local ty_eval = frame:expandTemplate{ title = ty, args = { page = cat } } --frame:newChild doesn't work, use 'page' param instead
						local rtarget_ty_eval = mw.ustring.gsub( rtarget_ty, '{{%s*'..ty..'%s*}}', ty_eval )
						return cleanup(rtarget_ty_eval)
					else --resolve basic parser functions: e.g. {{#time:j F Y}} on Proposed deletion as of today (very uncommon)
						local pf_regex = '%s*|%s*([^{|}]*{{%s*(#[^{|}#:]+):([^{|}#:]+)}}[^{|}]*)' --$1 nests $2 & $3
						local rtarget_pf, pf, arg = mw.ustring.match( catcontent, v..pf_regex )
						if rtarget_pf then
							local pf_eval = frame:callParserFunction{ name = pf, args = { arg } }
							local rtarget_pf_eval = mw.ustring.gsub( rtarget_pf, '{{%s*'..pf..'%s*:%s*'..arg..'%s*}}', pf_eval )
							return cleanup(rtarget_pf_eval)
						else --potential TODO: 1) +loop for multiple templates, 2) allow sub-parameters
							return cat
						end
	end	end	end	end	end
	return cat
end

function p.main( frame )
	local args = frame:getParent().args
	local cat  = mw.text.trim( args[1] or '' )
	if (cat == '') or (cat == nil) then
		return ''
	end
	return p.rtarget( cat, frame )
end

return p