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 motion implementation notes/Motion/Automatic

From Wikipedia, the free encyclopedia

local getArgs = require('Module:Arguments').getArgs

local p = {}

function p.main( frame )
	local args = getArgs(frame)
	local page = args["page"] or ""
	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 escape = mw.ustring.gsub( section, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" )
	
	for _, p in ipairs({
		"Wikipedia:Arbitration/Requests/Clarification and Amendment", 
		"Wikipedia:Arbitration/Requests/Case", 
		"Wikipedia:Arbitration/Requests/Motions"
	}) do
		if page == "" then
			local text = mw.title.new(p):getContent()
			local _, sections = mw.ustring.gsub(text, ".*%=%= *"..escape, "")
			if sections ~= 0 then
				page = p
			end
		end
	end
	
	if page == "ARM" then
		page = "Wikipedia:Arbitration/Requests/Motions"
	elseif page == "ARC" then
		page = "Wikipedia:Arbitration/Requests/Case"
	elseif page == "ARCA" or page == "" then
		page = "Wikipedia:Arbitration/Requests/Clarification and Amendment"
	end

	local text = mw.title.new(page):getContent()
	local sectionText, matches = mw.ustring.gsub(text, ".*%=%= *"..escape.." *%=%=", "")
	sectionText = mw.ustring.gsub(sectionText, "[;']'?'?Arbitrator discussion.*", "")
	
	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
	
	if matches ~= 1 then
		support = '?</td>'
		..'<td>?</td>'
		..'<td>?</td>'
		..'<td style="background-color: #ededfd">[[File:Symbol question.svg|20px|link=]]</td>'
		..'<td>?</td>'
		..'<td style="background-color: #ededfd"><span class="error">Error: Found '
		..tostring(matches)
		..' sections on [['
		..tostring(page)
		..']] 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
	
	local autoNotes = ""
	local activeArbsString

	if args["autonotes"] then
		activeArbsString = mw.title.new("Wikipedia:Arbitration/Requests/Motions/Implementation notes"):getContent()
		activeArbsString = string.gsub(activeArbsString, ".*" .. args["autonotes"] .. ".*Active arbitrators(.*)\n==.*", "%1")
		local activeArbs = {}
		for capture in mw.ustring.gmatch(activeArbsString, "%|.-%}" ) 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%:", "")
				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%:", "")
				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%:", "")
				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
	
	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
	elseif ret == "call" then
		local template = "Arbitration motion implementation notes/Motion"
		local params = {}
		params["anchor"] = args["anchor"] or args["name"] or "{{{name}}}"
		params["name"] = args["name"] or "{{{name}}}"
		params["support"] = support
		params["oppose"] = oppose
		params["abstain"] = abstain
		params["notes"] = (args["notes"] or "") .. autoNotes
		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}
	else
		return ""
	end
end

return p