Modulo:Quorum

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Modulo che implementa le funzionalità del template:Quorum.


local p = {}
local page = 'Wikipedia:Amministratori/Sistema di voto/Quorum'

local function set_error(msg, ...)
	local messages = {
		bad_list = 'Non è stato trovato un elenco di 8 elezioni in $1',
		bad_votes = 'I voti in $1 non combaciano con quelli calcolati per ciascuna elezione: $2',
		duplicate_election = 'È stata elencata più volte la seguente elezione: $1',
		missing_election = 'Non è stata trovata la pagina della seguente elezione: $1',
	}
	msg = mw.message.newRawMessage(messages[msg], ...):plain()
	return string.format('<span class="error">%s</span>', msg)
end

function p.listpage()
	return string.format('[[%s]]', page)
end

function p.main()
	local source = mw.title.new(page):getContent()
	local quorum = 0
	local elections, candidates, votes = {}, {}, {}
	local pattern = '%[%[(W%a+:Amministratori/Elezioni/[^|%[%]]-)[|%]][^%[}]+s[iì]'
	for election in string.gmatch(source or '', pattern) do
		if not source or #candidates == 8 then
			return set_error('bad_list', page)
		elseif elections[election] then
			return set_error('duplicate_election', election)
		end
		elections[election] = true
		local content = mw.title.new(election):getContent()
		if not content then
			return set_error('missing_election', election)
		end
		content = content:gsub('\n==+ *[^\n]- *==+', '\r%0')
		local candidate = election:match('Elezioni/([^/]+)')
		table.insert(candidates, string.format('[[User:%s|%s]]', candidate, candidate))
		votes[#candidates] = 0
		for heading, section in string.gmatch(content, '\n==+ *([^\n]-) *==+(.-)\r') do
			if heading == 'Pro' or heading == 'Contro' then
				local _, count = section:gsub('\n#[^#:*\n][^\n]-%a', '')
				quorum = quorum + count
				votes[#candidates] = votes[#candidates] + count
			end
		end
	end
	if #candidates < 8 then
		return set_error('bad_list', page)
	elseif not source:match('%s' .. table.concat(votes, '%s.-%s') .. '%s') then
		return set_error('bad_votes', page, table.concat(votes, ', '))
	end
	quorum = math.floor(quorum / 12)
	if not mw.title.equals(mw.title.getCurrentTitle(), mw.title.new(page)) then return quorum end
	candidates = mw.text.listToText(candidates, ', ', ' e ')
	return string.format('Pertanto il quorum per la prossima votazione, calcolato in base al numero di favorevoli e contrari nelle votazioni relative a %s, è pari a <b>%s</b>.', candidates, quorum)
end

return p