モジュール:Flagg

local titleSelf = mw.title.new(... or mw.getCurrentFrame():getTitle())
local titleCountryData = mw.title.newModule:CountryData
if titleSelf.isSubpage then
	local sandbox = titleSelf.subpageText:match^sandbox
	if sandbox then
		titleCountryData = titleCountryData:subPageTitle(sandbox)
	end
end
local CountryData = require(tostring(titleCountryData))
local p = {}
function p.main(frame)
	--Get input arguments
	local args = require('Module:Arguments').getArgs(frame,{valueFunc =
		function(key,value)
			if value then
				value = mw.text.trim(value)
				--Change empty string to nil for all args except 'image' and 'border'
				if key=="image" or key=="border" or value~="" then
					return value
				end
			end
			return nil
		end
	})
	--Call main function
	return p.luaMain(frame,args)
end
function p.luaMain(frame,args)
	local function emp2nil(x)
		if x=="" then return nil else return x end
	end
	local function space2emp(x)
		if string.find(x,"^%s*$") then return "" else return x end
	end
	local function nopx(x)
		if x~=nil and (string.find(x,"^%d+$") or string.find(x,"^%d+px$")) then return string.gsub(x,"^(.*)px","%1") else return nil end
	end
	--Country & mode parameters
	local mode = string.lower(args1 or "usc")
	local mi = string.sub(mode,1,1)
	local ms = string.sub(mode,2,2)
	local mn = string.sub(mode,3,3)
	local me = string.sub(mode,4,-1)
	local country = args2 or ""
	local avar = args"avar" or args"altvar"
	local clink = args"clink" or args"link"
	--Get country data & altvar data
	local data, alink, amap, asuf
	if avar then
		local age = args"age" or ""
		local aalias
		amap, aalias = require("Module:Flagg/Altvar data").alttable(age)
		avar = string.gsub(string.lower(avar or "")," \-","")
		avar = aaliasavar or avar
		if not amapavar then error("Unknown avar") end
		local apar = {altvar=amapavar.altvar;mw=amapavar.mw;age=amapavar.age;variant=args"variant" or args3}
		data = CountryData.getcachedtable(frame, country, apar)
		asuf = amapavar.altlink
		alink = data"link alias-"..amapavar.altvar or (clink or data"shortname alias" or data.alias or country).." "..asuf
	else
		data = (args"nodata" and {}) or CountryData.getcachedtable(frame, country, {variant=args"variant" or args3})
		avar = ""
		amap = {""={altvar=""}}
	end
	--Name and link parameters
	clink = clink or data.alias or country
	local pref = args"pref"
	local suff = args"suff" or asuf
	local pref2 = args"pref2"
	local suff2 = args"suff2"
	if not pref and not suff then --Default prefix
		pref = "Flag of"
	end
	local yn_map = {""=0; "0"=0; "no"=0; "n"=0; "1"=1; "yes"=1; "y"=1}
	local fthe = (args"pthe" and yn_mapargs"pthe"~=0) or (args"the" and yn_mapargs"the"~=0)
	local nthe = (args"nthe" and yn_mapargs"nthe"~=0) or (args"the" and yn_mapargs"the"~=0)
	fthe = fthe and (pref and "t" or "T").."he " or ""
	nthe = nthe and (pref and "t" or "T").."he " or ""
	local flink = args"plink" or args"flink" or alink
	              or clink=="" and "" or space2emp((pref or "").." ")..fthe..clink..space2emp(" "..(suff or ""))
	local flink2
	if args"plink2" or args"flink2" or pref2 or suff2 then
		flink2 = args"plink2" or args"flink2" or clink=="" and "" or space2emp((pref2 or "").." ")..fthe..clink..space2emp(" "..(suff2 or ""))
	else
		flink2 = flink
	end
	local fsec = args"psection" or args"section"
	local fsec2 = args"psection2" or args"section"
	local csec = args"csection" or args"section"
	fsec = fsec and "#"..fsec or ""
	fsec2 = fsec2 and "#"..fsec2 or ""
	csec = csec and "#"..csec or ""
	if string.find(me,"f") then
		if mw.title.new( flink ).exists == false then
			if flink2 ~= flink and mw.title.new ( flink2 ).exists == true then
				flink = flink2
				fsec = fsec2
			else
				flink = clink
			end
		end
	end
	local name = args"name"
	if not name then
		local cname = string.find(me,"e") and (data"name alias-"..amapavar.altvar or data"shortname alias" or data.alias) or country
		if mn == "f" then
			name = cname=="" and "" or space2emp((pref or "").." ")..nthe..cname..space2emp(" "..(suff or ""))
		else
			name = cname
		end
	end
	--Image parameters
	local pimage = args"image"
	local placeholder = "Flag placeholder.svg"
	local variant = args"variant" or args3 or ""
	local image_map = {""=placeholder; "none"=placeholder; "blank"=placeholder}
	if pimage then --Remove namespace
		pimage = string.gsub(pimage,"^FfIiLlEe:","")
		pimage = string.gsub(pimage,"^IiMmAaGgEe:","")
	end
	local iname = image_mappimage or pimage
	local size = args"size" or args"sz"
	local size_map = {xs="12x8px"; s="17x11px"; m="23x15px"; l="32x21px"; xl="46x30px"}
	if size==nil or string.find(size,"^%d*x?%d+px$") then
		--valid EIS size (..px, x..px or ..x..px) or unset
	elseif string.find(size,"^%d*x?%d+$") then --EIS size without "px" suffix
		size=size.."px"
	else --size from map, or invalid value
		size = size_mapsize or nil
	end
	local border = args"border"
	if iname then
		size = size or "23x15px"
		if yn_mapborder==0 then border = "" else border = "|border" end
	else
		iname = data"flag alias-"..amapavar.altvar.."-"..variant or data"flag alias-"..variant or data"flag alias-"..amapavar.altvar or data"flag alias" or placeholder
		size = size or emp2nil(data.size) or "23x15px"
		if border then
			if yn_mapborder==0 then border = "" else border = "|border" end
		else
			local autoborder = data"border-"..variant or data"border-"..amapavar.altvar or data.border
			if autoborder and autoborder~="border" then border = "" else border = "|border" end
		end
	end
	local am = ""
	if args"alt" or string.find(me,"a") then
		am = args"alt" or args"name" or country
		am = am.."|"..am
	end
	--Build display name
	local text = args"text"
	if not text then
		if mn=="x" then --no text
			text = ""
		elseif mn=="p" or mn=="f" or mn == "*" then --prefix/suffix link
			text = flink=="" and name or ""..name..""
			-- By the principle of least surprise, there should be some
			-- indication that the link Country does not
			-- go to Country.
			if mn == "*" and clink ~= flink then
				text = text:sub(1, -3) .. "\226\128\175*" end
		elseif mn=="b" then --both prefix/suffix and normal country link
			local preflink = pref and (flink=="" and pref.." " or ""..pref.." ") or ""
			local sufflink = suff and (flink=="" and " "..suff or " "..suff.."") or ""
			local namelink = (name=="" and "" or nthe)..(clink=="" and name or ""..name.."")
			text = preflink..namelink..sufflink
		elseif mn=="d" then --data template
			local title = mw.title.new("Template:Country data "..country)
			--check if redirect
			if title.isRedirect then
				text = ""..title:fullUrl("redirect=no").." "..name..""
			else
				text = ""..name..""
			end
		elseif mn=="u" then --unlinked
			text = name
		else --country link (default)
			text = clink=="" and name or ""..name..""
		end
	end
	--Build image
	local ilink = args"ilink"
	if not ilink then
		if mi=="x" or (iname==placeholder and pimage~=placeholder) then --no image/invisible image
			iname = placeholder
			border = ""
			ilink = "|link="
			am = ""
		elseif mi=="i" then --image page link
			ilink = ""
		elseif mi=="c" then --country link
			ilink = "|link="..clink..(clink=="" and "" or csec)
		elseif mi=="p" or mi=="f" then --prefix/suffix link
			ilink = "|link="..flink..(flink=="" and "" or fsec)
		elseif mi=="d" then --data template
			local title = mw.title.new("Template:Country data "..country)
			--check if redirect
			if title.isRedirect then
				ilink = "|link="..title:fullUrl("redirect=no")
			else
				ilink = "|link="..title.fullText
			end
		else --unlinked (default)
			ilink = "|link="
		end
	end
	if am == "" and string.find(me,"l") then
		am = mw.ustring.sub(ilink,7,-1)
	end
	local image = "alt="..am..""
	if iname==placeholder then
		if require('Module:yesno')(args"noredlink") == false then
			iname = 
			image = ":Template:Country data "..country..""
		end
		if (args"missingcategory" or ) ~=  then
			image = image..args"missingcategory"
		end
		if string.find(me,"b") then
			text = 
		end
	end
	--Combine image and name with separator
	local align_map = {left="left", l="left", center="center", centre="center", c="center", middle="center", m="center", right="right", r="right"}
	local align = align_mapargs"align" or args"al"
	local nalign =  align_mapargs"nalign" or args"nal"
	local out
	if string.find(me,"r") then
		--image right of name
		if (ms=="x" and mi=="x") or (string.find(me,"o") and iname==placeholder and pimage~=placeholder) then --name only
			out = text
		elseif ms=="x" then --no separator
			out = text..""..image..""
		elseif ms=="n" then --non-breaking space
			out = text.." "..image..""
		elseif ms=="l" then --line break
			out = text..""..image..""
		elseif ms=="t" then --table cell
			out = "style=\"text-align:"..(nalign or "left").."\"|"..text.."
"..image..""
		else --fixed-width span box (default)
			local width = args"width" or args"w" or require("Module:Flaglist").luawidth(size)
			out = text.." "..image..""
		end
	else --image left of name
		if (ms=="x" and mi=="x") or (string.find(me,"o") and iname==placeholder and pimage~=placeholder) then --name only
			out = text
		elseif ms=="x" then --no separator
			out = ""..image..""..text
		elseif ms=="n" then --non-breaking space
			out = ""..image.." "..text
		elseif ms=="l" then --line break
			out = ""..image..""..text
		elseif ms=="t" then --table cell
			out = "style=\"text-align:"..(align or "center")..";\"|"..image.."
"..text
		else --fixed-width span box (default)
			local width = nopx(args"width" or args"w") or require("Module:Flaglist").luawidth(size)
			out = ""..image.." "..text
		end
	end
	if string.find(me,"w") then --avoid wrapping
		out = ""..out..""
	end
	
	-- align in table
	if me:find("t") then
		out = 'style="text-align:'..(align or 'left')..'"|'..out
	end
	--Tracking categories
	local cat = ""
	if pimage and not image_mappimage and country~="" and data"flag alias" and not args.demo then
		cat = ""
	end
	return out..cat
end
return p