Jump to content

Module:Region topic

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Jackmcbarn (talk | contribs) at 17:42, 27 November 2015 (simplify blankToNil and xor). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local p = {}

local function blankToNil(s)
	--Replaces string consisting of only whitespace with nil
	return s and string.find('%S') and s or nil
end

local function yn(s,def)
	--Normalizes "boolean" inputs to 1 (yes), 0 (no),
	--nil (unrecognized), or the value of the 'def' parameter (nil)
	if s then
		local yn_map = {yes=1, y=1, ["true"]=1, ["1"]=1, no=0, n=0, ["false"]=0, ["0"]=0, [""]=0}
		return yn_map[string.lower(s)]
	else
		return def
	end
end

local function xor(a,b)
	--A logical XOR function
	return not a ~= not b
end

function p.main(frame)
	--Produces the navbox

	local args = require("Module:Arguments").getArgs(frame, {removeBlanks = false, trim = false})

	--Navbox parameters
	local nbargs = {
		name = args.name or error("No name parameter"),
		state = args.state or "autocollapse",
		titlestyle = args.titlestyle,
		bodystyle = args.bodystyle,
		abovestyle = args.abovestyle,
		belowstyle = args.belowstyle,
		groupstyle = args.groupstyle,
		liststyle = args.liststyle,
		listclass = "hlist",
		image = args.image,
		above = args.above,
		border = args.border,
		navbar = args.navbar
	}

	--Load data page
	local data = blankToNil(args.data) and mw.loadData(args.data) or error("No data page specified")

	--Link parameters
	local pref = blankToNil(args.prefix or args[1])
	local suff = blankToNil(args.suffix or args[2])
	pref = (pref or "")..((yn(args.noprefixspace,0) or 1)<1 and pref and " " or "")
	suff = ((yn(args.nosuffixspace,0) or 1)<1 and suff and " " or "")..(suff or "")
	local art
	if args.article then
		art = (yn(args.article,0)~=0)
	else
		art = (pref~="" and suff=="")
	end
	local nrl = yn(args.noredlinks,0.5) or 0.5

	--Navbox title
	if args.title then
		nbargs.title = args.title
	else
		local linkart = (art and data.region_the) and (pref=="" and "The " or "the ") or ""
		local link = pref..linkart..(data.region or error("No region parameter"))..suff
		if nrl~=0 and mw.title.new(link).exists then
			nbargs.title = "[["..link.."]]"
		else
			nbargs.title = link
		end
	end

	--Loop over groups
	for i = 1, (data.ngroups or 1), 1 do
		--If group is not hidden or excluded
		if not data["group"..i].switch
		or yn(args[data["group"..i].switch],2)==2 and not data["group"..i].hidden
		or yn(args[data["group"..i].switch],2)~=2 and xor((yn(args[data["group"..i].switch]))==1,data["group"..i].negate_switch) then
			local gdata = data["group"..i].data
			--Create list & loop over entries
			local list = mw.html.create("ul")
			for j,country in ipairs(gdata) do
				local code = country[1]
				local name = args[code.."_name"] or country[2]
				local citem, cunl
				--Determine if country should be included or not
				if yn(args[code],1)~=0
				and (yn(args[code],2)~=2
				or (not country.switch or yn(args[country.switch],2)==2) and not country.hidden
				or country.switch and yn(args[country.switch],2)~=2 and xor((yn(args[country.switch]))==1,country.negate_switch)) then
					--Determine link target
					local lname = country.link or country[2]
					local lart = (art and country.the) and "the " or ""
					local link
					if yn(args[code],1)==1 then
						link = pref..lart..lname..suff
					else
						link = args[code] or (pref..lart..lname..suff)
					end
					--Create list item if not nonexisting
					if yn(args[code],2)~=2 or not (nrl==1 or nrl~=0 and (yn(args[code.."_noredlink"],0)==1 or country.noredlink)) or mw.title.new(link).exists then
						citem = list:tag("li"):wikitext("[["..link.."|"..name.."]]")
					else
						cunl = true
					end
				else--Mark that unlinked list item will need to be created in case of sub-list
					cunl = true
				end
				--Create sub-list if present
				if country.subgroup then
					local subgroup = country.subgroup
					local sublist = mw.html.create("ul")
					for k,scountry in ipairs(subgroup) do
						--Similar to main item code
						local scode = scountry[1]
						local sname = args[scode.."_name"] or scountry[2]
						local slname = scountry.link or scountry[2]
						local slart = (art and scountry.the) and "the " or ""
						local slink
						if yn(args[scode],1)==1 then
							slink = pref..slart..slname..suff
						else
							slink = args[scode] or (pref..slart..slname..suff)
						end
						if (yn(args[code],2)~=2 or not (nrl==1 or nrl~=0 and (yn(args[code.."_noredlink"],0)==1 or scountry.noredlink)) or mw.title.new(slink).exists)
						and yn(args[scode],1)~=0
						and (yn(args[scode],2)~=2
						or ((not subgroup.switch or yn(args[subgroup.switch],2)==2) and not subgroup.hidden
						or yn(args[subgroup.switch],2)~=2 and xor((yn(args[subgroup.switch]))==1,subgroup.negate_switch))
						and (not scountry.switch or yn(args[scountry.switch],2)==2) and not scountry.hidden
						or scountry.switch and yn(args[scountry.switch],2)~=2 and xor((yn(args[scountry.switch]))==1,scountry.negate_switch)) then
							sublist:tag("li"):wikitext("[["..slink.."|"..sname.."]]")
						end
					end
					--If non-empty sub-list, add it to country item
					if tostring(sublist) ~= "<ul></ul>" then
						if cunl then
							citem = list:tag("li"):wikitext(name):node(sublist)
						else
							citem:node(sublist)
						end
					end
				end
			end
			--Add group name and data to navbox args
			if string.match(data["group"..i].name,"%{%{") then
				nbargs["group"..i] = frame:preprocess(data["group"..i].name)
			else
				nbargs["group"..i] = data["group"..i].name
			end
			--Move list to navbox parameters if not empty
			if tostring(list)~="<ul></ul>" or yn(args.showemptygroups,0)==1 then
				nbargs["list"..i] = tostring(list)
			end
		end
	end

	--Invoke navbox module
	return require("Module:Navbox")._navbox(nbargs)
end

function p.list(frame)
	--Produces a list of entities and associated parameters (use in template documentation)

	--Get input paramers and load data page
	local args = require("Module:Arguments").getArgs(frame)
	local data = args.data and mw.loadData(args.data) or error("No data page specified")

	--Create table and header row
	local tab = mw.html.create("table"):addClass("wikitable collapsible"):css("color","#000")
	local head = tab:tag("tr"):css("font-weight","bold")
	head:tag("th"):css("background-color","#e8e8e8"):wikitext("Code")
	head:tag("th"):css("background-color","#e8e8e8"):wikitext("Display name [link name]")
	head:tag("th"):css("background-color","#e8e8e8"):wikitext("Switch")
	head:tag("th"):css("background-color","#e8e8e8"):wikitext("Hidden?")

	--Loop over groups
	for i = 1, data.ngroups or 1 do
		--Add group data
		local grow = tab:tag("tr"):css("background-color","#eaf1fe")
		grow:tag("td")
		if string.match(data["group"..i].name,"%{%{") then
			grow:tag("td"):css("font-weight","bold"):wikitext(frame:preprocess(data["group"..i].name))
		else
			grow:tag("td"):css("font-weight","bold"):wikitext(data["group"..i].name)
		end
		grow:tag("td"):cssText(data["group"..i].negate_switch and "text-decoration:overline;" or "")
		:wikitext(data["group"..i].switch or "")
		grow:tag("td"):wikitext(data["group"..i].hidden and "Yes" or "")
		--Loop over group entries
		for j,ddata in ipairs(data["group"..i].data) do
			--Add single entry data
			local drow = tab:tag("tr"):css("background-color","#f8f8f8")
			drow:tag("td"):wikitext(ddata[1])
			local dname = drow:tag("td"):css("padding-left","1em"):wikitext(ddata[2])
			if ddata.the or ddata.link then
				dname:wikitext(" ["..(ddata.the and "the" or "")..(ddata.the and ddata.link and " " or "")..(ddata.link or "").."]")
			end
			drow:tag("td"):cssText(ddata.negate_switch and "text-decoration:overline;" or ""):wikitext(ddata.switch or "")
			drow:tag("td"):wikitext(ddata.hidden and "Yes" or (ddata.noredlink and "Depends on existence" or ""))
			--Add subgroup data if exists
			if ddata.subgroup then
				local shead = tab:tag("tr"):css("background-color","#fefce2")
				shead:tag("td")
				shead:tag("td"):css("padding-left","2em"):css("font-weight","bold"):wikitext("Subgroup")
				shead:tag("td"):cssText(ddata.subgroup.negate_switch and "text-decoration:overline;" or ""):wikitext(ddata.subgroup.switch or "")
				shead:tag("td"):wikitext(ddata.subgroup.hidden and "Yes" or "")
				for k,sdata in ipairs(ddata.subgroup) do
					local srow = tab:tag("tr"):css("background-color","#fdfcf4")
					srow:tag("td"):wikitext(sdata[1])
					local sname = srow:tag("td"):css("padding-left","2em"):css("font-style","italic"):wikitext(sdata[2])
					if sdata.the or sdata.link then
						sname:wikitext(" ["..(sdata.the and "the" or "")..(sdata.the and sdata.link and " " or "")..(sdata.link or "").."]")
					end
					srow:tag("td"):cssText(sdata.negate_switch and "text-decoration:overline;" or ""):wikitext(sdata.switch or "")
					srow:tag("td"):wikitext(sdata.hidden and "Yes" or (sdata.noredlink and "Depends on existence" or ""))
				end
			end
		end
	end

	return tab
end

return p