Module:Flag

☆ Save On Wikipedia ↗
Module documentation

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.

UsageUsage

Generic flag templatesGeneric flag templates

Sports flag templatesSports flag templates

ExamplesExamples

Template Module
Code Output PEIS Code Output PEIS
{{flag|CHN}} CHN 443b {{#invoke:flag||CHN}}  CHN 128b
{{flag country|CHN}}  China 577b {{#invoke:flag|country|CHN}}  China 128b
{{flag decoration|CHN}}/{{flag deco|CHN}} 452b {{#invoke:flag|decoration|CHN}}/{{#invoke:flag|deco|CHN}} 107b
{{flag icon|CHN}} China 548b {{#invoke:flag|icon|CHN}} China 117b
{{flag link|CHN|at the 2004 Summer Olympics}}  China 497b {{#invoke:flag|link|CHN|at the 2004 Summer Olympics}}  China 198b
{{flag+link|History of|CHN}}  China 663b {{#invoke:flag|+link|History of|CHN}}  China 139b
{{flag list|SWI}}  SWI 685b {{#invoke:flag|list|SWI}}  SWI 254b
{{flagu|CHN}}  CHN 365b {{#invoke:flag|u|CHN}}  CHN 162b
{{flag team|GBR}}  Great Britain (GBR) 804b {{#invoke:flag|team|GBR}}  Great Britain (GBR) 193b
{{flag athlete|Andy Murray|GBR}}  Andy Murray (GBR) 617b {{#invoke:flag|athlete|Andy Murray|GBR}}  Andy Murray (GBR) 210b
{{flag medalist|Andy Murray|GBR}} Andy Murray
 Great Britain
469b {{#invoke:flag|medalist|Andy Murray|GBR}} Andy Murray
 Great Britain
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|CHN}}  China 560b {{#invoke:flag|fb|CHN}}  China 151b
{{fb-rt|CHN}} China  482b {{#invoke:flag|fb-rt|CHN}} China  151b
{{fbicon|CHN}} China 444b {{#invoke:flag|fbicon|CHN}} China national football team 163b
{{fba|CHN}}  China 625b {{#invoke:flag|fba|CHN}}  China 149b
{{fbaicon|CHN}} China 500b {{#invoke:flag|fbaicon|CHN}} Chinese Football Association 159b
{{fbw|CHN}}  China 318b {{#invoke:flag|fbw|CHN}}  China 183b
{{fbw-rt|CHN}} China  506b {{#invoke:flag|fbw-rt|CHN}} China  190b
{{futsal|CHN}}  China 476b {{#invoke:flag|futsal|CHN}}  China 149b
{{futsal-rt|CHN}} China  476b {{#invoke:flag|futsal-rt|CHN}} China  156b
{{ru|CHN}}  China 646b {{#invoke:flag|ru|CHN}}  China 210b

CaveatsCaveats

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
})