Module:Flag: Difference between revisions

From Project Basis
Jump to navigation Jump to search
Fix preview warning for flagicon
 
m 1 revision imported
 
(No difference)

Latest revision as of 13:27, 19 July 2026

Lua-native alternative to popular flag templates. Can be used to reduce post-expand include size of pages with lots of templates, since it avoids calling multilevel templates.

Usage

Generic flag templates

Sports flag templates

Examples

Template Module
Code Output PEIS Code Output PEIS
{{flag|THY}} THY || 443b || {{#invoke:flag||THY}} ||  THY || 128b
{{flag country|THY}}  Thyon || 577b || {{#invoke:flag|country|THY}} ||  Thyon || 128b
{{flag decoration|THY}}/{{flag deco|THY}} || 452b || {{#invoke:flag|decoration|THY}}/{{#invoke:flag|deco|THY}} || || 107b
{{flag icon|THY}} Thyon || 548b || {{#invoke:flag|icon|THY}} || Thyon || 117b
{{flag link|THY|at the 2400 Sports Games}}  Thyon || 497b || {{#invoke:flag|link|THY|at the 2400 Sports Games}} ||  Thyon || 198b
{{flag+link|History of|THY}}  [[Thyon|Thyon]] || 663b || {{#invoke:flag|+link|History of|THY}} ||  Thyon || 139b
{{flag list|SWI}}  SWI 685b {{#invoke:flag|list|SWI}}  SWI 254b
{{flagu|THY}}  THY || 365b || {{#invoke:flag|u|THY}} ||  THY || 162b
{{flag team|MER}}  Methelor (MER) || 804b || {{#invoke:flag|team|MER}} ||  Methelor (MER) || 193b
{{flag athlete|Worut Jamun|MER}}  Worut Jamun (MER) || 617b || {{#invoke:flag|athlete|Worut Jamun|MER}} ||  Worut Jamun (MER) || 210b
{{flag medalist|Andy Murray|MER}} Andy Murray
 Methelor || 469b || {{#invoke:flag|medalist|Andy Murray|MER}} || Andy Murray
 Methelor || 129b
{{flag IOC|CAN|1924 Winter|1}}  Canada (1) 326b {{#invoke:flag|IOC|CAN|1924 Winter|1}}  Canada (1) 163b
{{flag IOC 2|HKG|1954 Asian Games|1}}  Hong Kong (1) 368b {{#invoke:flag|IOC 2|HKG|1954 Asian Games|1}}  Hong Kong (1) 184b
{{flag IOC athlete|Mark Spitz|USA|1972 Summer}}  Mark Spitz (USA) 346b {{#invoke:flag|IOC athlete|Mark Spitz|USA|1972 Summer}}  Mark Spitz (USA) 178b
{{fb|THY}}  Thyon || 560b || {{#invoke:flag|fb|THY}} ||  Thyon || 151b
{{fb-rt|THY}} Thyon  || 482b || {{#invoke:flag|fb-rt|THY}} || Thyon  || 151b
{{fbicon|THY}} Thyon || 444b || {{#invoke:flag|fbicon|THY}} || Thyon national football team || 163b
{{fba|THY}}  [[|Thyon]] || 625b || {{#invoke:flag|fba|THY}} ||  Thyon || 149b
{{fbaicon|THY}} Thyon || 500b || {{#invoke:flag|fbaicon|THY}} || Thyon Football Association || 159b
{{fbw|THY}}  Thyon 318b {{#invoke:flag|fbw|THY}}  Thyon 183b
{{fbw-rt|THY}} Thyon  || 506b || {{#invoke:flag|fbw-rt|THY}} || Thyon  || 190b
{{futsal|THY}}  Thyon || 476b || {{#invoke:flag|futsal|THY}} ||  Thyon || 149b
{{futsal-rt|THY}} Thyon  || 476b || {{#invoke:flag|futsal-rt|THY}} || Thyon  || 156b
{{ru|THY}}  Thyon || 646b || {{#invoke:flag|ru|THY}} ||  Thyon || 210b

Caveats

When used inside a template, parameters from that template are passed to the module. This can be useful in some situations, but can lead to conflicts (for example, if the parent template has a parameter |country= that is unrelated to the flag it is supposed to display). To prevent this behavior, add the |frameonly= parameter to the module call, e.g. {{#invoke:flag|deco|CHN|frameonly=true}}.


local margs = require('Module:Arguments')

local notblank = function (v) return (v or '') ~= '' end

local function _main(frame, name, mode, key)
	local categories = {
		['Flag icon'] = '[[Category:Flag icons missing country data templates]]' ..
			frame:expandTemplate{title = 'Preview warning', args = {'Unrecognized country in Template:flag icon'}},
		['Flag decoration'] = '[[Category:Flag decoration missing country data templates]]',
	}

    local yesno = require('Module:Yesno')

	--Get input arguments
	local args = margs.getArgs(frame, {
		frameOnly = notblank(frame.args.frameonly), valueFunc =
			function(argkey,value)
				if value then
					value = mw.text.trim(value)
					--Change empty string to nil for all args except 'image' and 'border'
					if argkey=="image" or argkey=="border" or value~="" then
						return value
					end
				end
				return nil
			end
	} )
	
	local preftext, sufftext = "", ""
	
	if name == 'Flag+link' then
		args.pref = args[1]
	elseif name == 'Flag athlete' then
		args.preftext = args[1]
		args[2] = args.code or args[2] or ""
		args.variant = args.variant or args[3]
	elseif name == 'Flag medalist' then
		preftext = (args[1] or "") .. "<br/>"
		args[2] = args.code or args[2] or ""
		args.variant = args.variant or args[3]
	elseif name == 'Flag link' then
		args.suff = args[2]
		args[2] = args[1] or ""
		args.variant = args.variant or args[3]
	elseif key ~= nil then
		args.variant = args.variant or args[1]
		args[2] = key
	else
		local sports = {
			['3x3'] = '3x3',
			bb = 'bb',
			fb = 'fb',
			fbicon = 'fb',
			ru = 'ru',
			fba = 'fba',
			fbw = 'fbw',
			fbaicon = 'fba',
			futsal = 'futsal'
		}
		if sports[name]then
			args.avar = args[1] and sports[name] or nil
			if name == 'fb' and yesno(args.align) == true then
				args.align='c'
			elseif sports[name] == 'fba' then
				if args[1] then
					local list = require("Module:Fba/list")
					local old = notblank(args.old) and "_old" or ""
					local country = args[1]
					local fba = list.fbas[country .. old]
					if not fba then -- look for aliases
						local countryTable = require('Module:CountryData').getcachedtable(frame, country)
						if countryTable and countryTable.alias then
							country = countryTable.alias
							fba = list.fbas[country .. old]
						end
					end
					if args.name == "code" then
						args.name = list.codes[country] or country
					elseif args.name == "full" then
						args.name = fba
					end
					if fba then
						mode = string.gsub(mode, "p", "c")
						args.link = fba
					end
					args.altlink = args.old
				elseif args.name == "code" or args.name == "full" then
					args.name = ""
				end
			end
		elseif name == "Flag team" and (args.code or args[1]) then
			sufftext = '&nbsp;<span style="font-size:90%;">('..(args.code or args[1])..')</span>'
		end
		args.variant = args.variant or args[2]
		args[2] = args[1] or ""
	end

	args[1] = mode .. (args.opts or '')
	args.missingcategory = notblank(args[2]) and categories[name] or nil
	args.noredlink = args.noredlink or 'notext'

	if args.placeholder and yesno(args.placeholder) ~= true then
		args[1] = args[1] .. 'o'
	end

	local check = ''
	
	if name == 'Flag icon' and mw.title.getCurrentTitle().namespace == 0 then
		local unknown = '[[Category:Pages using ' .. mw.ustring.lower(name) .. 
			' template with unknown parameters|_VALUE_' .. frame:getParent():getTitle() .. ']]'
		local opts = {
            unknown=unknown,
            preview='Page using [[Template:' .. name .. ']] with unknown parameter "_VALUE_"',
            ignoreblank='y',
            '1','2','variant','image','size','sz','border','align','al','width',
            'w','alt','ilink','noredlink','missingcategory','name','clink','link',
            'pref','suff','plink','the','section','altvar','avar','age','nalign',
            'nal','text','nodata','opts','placeholder','getParent','frameonly'
		}
		check = require('Module:Check for unknown parameters')._check(opts,args)
	end

	return preftext .. require('Module:Flagg').luaMain(frame,args) .. sufftext .. check
end

local p = {
	['']		= function (frame) return _main(frame, 'Flag',				'unc'   ) end,
	decoration	= function (frame) return _main(frame, 'Flag decoration',	'uxx'   ) end,
	icon		= function (frame) return _main(frame, 'Flag icon',			'cxxl'  ) end,
	link		= function (frame) return _main(frame, 'Flag link',			'unpe'  ) end,
	['+link']	= function (frame) return _main(frame, 'Flag+link',			'unpefo') end,
	u			= function (frame) return _main(frame, 'Flag',				'unu'   ) end,
	country		= function (frame) return _main(frame, 'Flag country',		'unce'  ) end,
	list        = function (frame) return _main(frame, 'Flag list',			'usc'   ) end,
	team		= function (frame) return _main(frame, 'Flag team',			'unce'  ) end,
	athlete		= function (frame) return _main(frame, 'Flag athlete',		'unape' ) end,
	medalist	= function (frame) return _main(frame, 'Flag medalist',		'unce'  ) end,
	['3x3']		= function (frame) return _main(frame, '3x3',				'unpe'  ) end,
	bb			= function (frame) return _main(frame, 'bb',				'unpe'  ) end,
	fb			= function (frame) return _main(frame, 'fb',				'unpe'  ) end,
	fba			= function (frame) return _main(frame, 'fba',				'unpe'  ) end,
	['fb-rt']	= function (frame) return _main(frame, 'fb',				'unpre' ) end,
	fbw			= function (frame) return _main(frame, 'fbw',				'unpe'  ) end,
	['fbw-rt']	= function (frame) return _main(frame, 'fbw',				'unpre' ) end,
	fbicon		= function (frame) return _main(frame, 'fbicon',			'pxxl'  ) end,
	fbaicon		= function (frame) return _main(frame, 'fbaicon',			'pxxl'  ) end,
	futsal		= function (frame) return _main(frame, 'futsal',			'unpe'  ) end,
	['futsal-rt'] = function (frame) return _main(frame, 'futsal',			'unpre' ) end,
	ru			= function (frame) return _main(frame, 'ru',				'unpe'  ) end,
	IOC			= function (frame) return require('Module:Country_alias').flagIOC(frame:newChild{ title = 'Template:Flag IOC' }) end,
	IOC2		= function (frame) return require('Module:Country_alias').flagXYZ(frame:newChild{ title = 'Template:Flag IOC 2', args = {name = margs.getArgs(frame).name or '', type = 'name'} }) end,
	IOCathlete	= function (frame) return require('Module:Country_alias').flagXYZ(frame:newChild{ title = 'Template:Flag IOC athlete', args = {type = 'athlete-O'} }) end,
}

p['deco'] = p.decoration
p['IOC 2'] = p.IOC2
p['IOC athlete'] = p.IOCathlete

return setmetatable (p, {['__index'] =											-- returns table p with the metatable __index set so that, if the table KEY isn't recognized, it returns
	function (_, key)															-- this anonymous function called as function(p, KEY)
		return function (frame) return _main(frame, 'Flag', 'unc', key) end		-- which interprets the module call as {{flag|KEY}} and passes it to _main()
	end
})