Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Arbitration case implementation notes/Proposal/Automatic

From Wikipedia, the free encyclopedia

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 title
	local case = args["case"]
	if case then
		title = mw.title.new("Wikipedia:Arbitration/Requests/Case/"..case.."/Proposed decision")
	else 
		title = mw.title.getCurrentTitle()
		case = tostring(mw.title.getCurrentTitle())
		case = mw.ustring.gsub(case, "%/Proposed decision", "")
		case = mw.ustring.gsub(case, ".*%/", "")
	end
	local text = title:getContent()
	local escape = mw.ustring.gsub( section, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" )
	local sectionText, matches = mw.ustring.gsub(text, ".-%=%=%= *"..escape.." *%=%=%=", "")
	sectionText = mw.ustring.gsub(sectionText, ":Comments.*", "")
	
	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, "")
	
	local supportToOppose = tonumber(args["support-to-oppose"] or 0)
	support = support - supportToOppose
	oppose = oppose + supportToOppose
	
	----------------------------------------------------------------------------
	--						Individual votes in notes						  --
	----------------------------------------------------------------------------
	
	local autoNotes = ""
	local caseData = mw.title.new("Wikipedia:Arbitration/Requests/Case/" .. case .. "/Data"):getContent()
	local listed -- check if at the /Data subpage
	caseData, listed = mw.ustring.gsub(caseData, ".*|list", "")
	if listed == 0 or not args["autonotes"] then
		caseData = ""
	else
		caseData = mw.ustring.gsub(caseData, ".*'''Active:'''", "")
		caseData = mw.ustring.gsub(caseData, "'''.*", "")
		
		local activeArbs = {}
		for capture in mw.ustring.gmatch(caseData, "%|.-%}" ) do
	    	 activeArbs[#activeArbs+1] = mw.ustring.gsub(capture, "[%|%}]", "")
		end
		
		local abbreviations = require('Module:Arbitrator abbreviations')
		
		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[ _]talk%:", "")
				capt = mw.ustring.gsub(capt, "[%|%]#].*", "")
				if string.lower(activeArbs[arb]) == string.lower(capt) then
					autoNotes = autoNotes .. "<td style='width: fit-content; min-width: 35px; 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[ _]talk%:", "")
				capt = mw.ustring.gsub(capt, "[%|%]#].*", "")
				if string.lower(activeArbs[arb]) == string.lower(capt) then
					autoNotes = autoNotes .. "<td style='width: fit-content; min-width: 35px; 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[ _]talk%:", "")
				capt = mw.ustring.gsub(capt, "[%|%]#].*", "")
				if string.lower(activeArbs[arb]) == string.lower(capt) then
					autoNotes = autoNotes .. "<td style='width: fit-content; min-width: 35px; 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: 35px; 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>'
		..frame:expandTemplate{title="If preview", args={"<br>If previewing a section edit, outside sections are not detected."}}
		..'</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