Module:Arbitration case implementation notes/Proposal/Automatic/sandbox

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search
local getArgs = require('Module:Arguments').getArgs

local p = {}

function p.main( frame )
	local args = getArgs(frame)
	local section = args["section"] or args["anchor"] or args["name"] or "{{{name}}}"
	local pattern = args["pattern"] or "%c:?#[^:#%*].-UTC"
	local ret = args["ret"] or ""
	local text = mw.title.getCurrentTitle():getContent()
	local escape = mw.ustring.gsub( section, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" )
	local sectionText, matches = mw.ustring.gsub(text, ".-%=%=%= *"..escape.." *%=%=%=", "")
	sectionText = mw.ustring.gsub(sectionText, ":Comments.*", "")
	
	local caseTitle = tostring(mw.title.getCurrentTitle())
	caseTitle = mw.ustring.gsub(caseTitle, "%/Proposed decision", "")
	caseTitle = mw.ustring.gsub(caseTitle, ".*%/", "")
	
	local supportText = mw.ustring.gsub(sectionText, ".*:Support", "Support")
	supportText = mw.ustring.gsub(supportText, ":Oppose.*", "")
	local _, support = mw.ustring.gsub(supportText, pattern, "")
	
	local opposeText = mw.ustring.gsub(sectionText, ".*:Oppose", "Oppose")
	opposeText = mw.ustring.gsub(opposeText, ":Abstain.*", "")
	local _, oppose = mw.ustring.gsub(opposeText, pattern, "")
	
	local abstainText = mw.ustring.gsub(sectionText, ".*:Abstain", "Abstain")
	local _, abstain = mw.ustring.gsub(abstainText, pattern, "")
	
	----------------------------------------------------------------------------
	--						Individual votes in notes						  --
	----------------------------------------------------------------------------
	
	local autoNotes = ""
	local casenavData = mw.title.new("Template:Arbitration case navigation/data"):getContent()
	local listed -- check if at Template:casenav/data
	casenavData, listed = mw.ustring.gsub(casenavData, ".*" .. caseTitle .. "%-list", "")
	if listed == 0 or args["skipautonotes"] then 
		casenavData = "" 
	else
		casenavData = mw.ustring.gsub(casenavData, ".*'''Active:'''", "")
		casenavData = mw.ustring.gsub(casenavData, "'''.*", "")
		
		local activeArbs = {}
		for capture in mw.ustring.gmatch(casenavData, "%|.-%}" ) do
	    	 activeArbs[#activeArbs+1] = mw.ustring.gsub(capture, "[%|%}]", "")
		end
		
		local abbreviations = {}
		abbreviations["Aoidh"] = "Aoi"
		abbreviations["Cabayi"] = "Cab"
		abbreviations["CaptainEek"] = "Cap"
		abbreviations["Daniel"] = "Dan"
		abbreviations["Elli"] = "Elli"
		abbreviations["HJ Mitchell"] = "HJM"
		abbreviations["KrakatoaKatie"] = "KK"
		abbreviations["Liz"] = "Liz"
		abbreviations["Primefac"] = "Pf"
		abbreviations["ScottishFinnishRadish"] = "SFR"
		abbreviations["Sdrqaz"] = "Sdr"
		abbreviations["Theleekycauldron"] = "leek"
		abbreviations["ToBeFree"] = "TBF"
		abbreviations["Worm That Turned"] = "WTT"
		abbreviations["Z1720"] = "Z"
		
		autoNotes = "<table class='wikitable' style='margin: 0'><tr>"
		for arb = 1, #activeArbs do
			local abbr = abbreviations[activeArbs[arb]] or activeArbs[arb]
			local found = false
			for capt in mw.ustring.gmatch(supportText, pattern) do
				capt = mw.ustring.gsub(capt, ".*ser%:", "")
				capt = mw.ustring.gsub(capt, "%|.*", "")
				if string.lower(activeArbs[arb]) == string.lower(capt) then
					autoNotes = autoNotes .. "<td style='width: fit-content; min-width: 30px; color:var(--color-base, #202122); background:var(--background-color-success-subtle, #dff2eb)' title='"..activeArbs[arb].." supported'>S<sup>"..abbr.."</sup></td>"
					found = true
				end
			end
			for capt in mw.ustring.gmatch(opposeText, pattern) do
				capt = mw.ustring.gsub(capt, ".*ser%:", "")
				capt = mw.ustring.gsub(capt, "%|.*", "")
				if string.lower(activeArbs[arb]) == string.lower(capt) then
					autoNotes = autoNotes .. "<td style='width: fit-content; min-width: 30px; color:var(--color-base, #202122); background:var(--background-color-error-subtle, #ffe9e5)' title='"..activeArbs[arb].." opposed'>O<sup>"..abbr.."</sup></td>"
					found = true
				end
			end
			for capt in mw.ustring.gmatch(abstainText, pattern) do
				capt = mw.ustring.gsub(capt, ".*ser%:", "")
				capt = mw.ustring.gsub(capt, "%|.*", "")
				if string.lower(activeArbs[arb]) == string.lower(capt) then
					autoNotes = autoNotes .. "<td style='width: fit-content; min-width: 30px; color:var(--color-base, #202122); background:var(--background-color-neutral, #eaecf0)' title='"..activeArbs[arb].." abstained'>A<sup>"..abbr.."</sup></td>"
					found = true
				end
			end
			if not found then
				autoNotes = autoNotes .. "<td style='width: fit-content; min-width: 30px; color:var(--color-base, #202122); background:var(--background-color-neutral-subtle, #f8f9fa)' title='"..activeArbs[arb].." has not voted'>_<sup>"..abbr.."</sup></td>"
			end
		end
		autoNotes = autoNotes .. "</tr></table>"
	end
	
	----------------------------------------------------------------------------
	--			Error when found 0 or multiple sections						  --
	----------------------------------------------------------------------------
	
	if matches ~= 1 then
		support = '?</td>'
		..'<td style="background-color: #fdeded">?</td>'
		..'<td style="background-color: #fdeded">?</td>'
		..'<td style="background-color: #ededfd">[[File:Symbol question.svg|20px|link=|alt=]]</td>'
		..'<td style="background-color: #fdeded">?</td>'
		..'<td style="background-color: #ededfd"><span class="error">Error: Found '
		..tostring(matches)
		..' sections with heading<br><code>==='
		..tostring(section)
		..'===</code></span></td></tr><tr style="display:none">'
	end
	
	----------------------------------------------------------------------------
	--					Output options for debugging						  --
	----------------------------------------------------------------------------
	
	if ret == "support" then
		return support
	elseif ret == "oppose" then
		return oppose
	elseif ret == "abstain" then
		return abstain
	elseif ret == "text" then
		return text
	elseif ret == "sectionText" then
		return sectionText
	elseif ret == "supportText" then
		return supportText
	elseif ret == "opposeText" then
		return opposeText
	elseif ret == "abstainText" then
		return abstainText
	else
		local template = "Arbitration Committee implementation notes/Proposal"
		local params = {}
		params["anchor"] = args["anchor"] or args["name"] or "{{{name}}}"
		params["name"] = args["name"] or "{{{name}}}"
		params["number"] = args["number"] or "{{{number}}}"
		params["support"] = support
		params["oppose"] = oppose
		params["abstain"] = abstain
		params["notes"] = autoNotes .. (args["notes"] or "")
		if args["pass"] then
			params["pass"] = args["pass"]
		end
		if args["active"] then
			params["active"] = args["active"]
		end
		return frame:expandTemplate{title=template, args=params}
	end
end

return p