«Модуль:Ballot» и «Модуль:Песочница/Jaguar K/ballot»: разница между страницами

(Различия между страницами)
Перейти к навигации Перейти к поиску
Первая страница
Вторая страница
Содержимое удалено Содержимое добавлено
не нужно вставлять таблицу внутрь другой таблицы
 
м о.с.
 
Строка 11: Строка 11:
2) Устанавливается список избирателей
2) Устанавливается список избирателей
2.1) нужна заранее подготовленная таблица к выборам, без неё нет автоматической проверки критериев
2.1) нужна заранее подготовленная таблица к выборам, без неё нет автоматической проверки критериев
2.1.1) если вообще нет такой таблицы, пропускать всех так // правка MBH авторства IKhitron
2.1.1) TODO - если вообще нет такой таблицы, пропускать всех так и писать ошибку
2.2) принимаются команды с комментариями от бюрократов о необходимости учесть кого-то, кого нет в списке избирателей
2.2) принимаются команды с комментариями от бюрократов о необходимости учесть кого-то
BUG - необходимо переписать, чтобы была возможность указать по одному пользователю много разных частичных ограничений
BUG - необходимо переписать, чтобы была возможность указать по одному пользователю много разных частичных ограничений
3) Установление списка голосов
3) Установление списка голосов
Строка 27: Строка 27:


Таблицы
Таблицы
candidatrue[candidate] - (ключ - ник кандидата, значение true/nil в зависимости от того, есть ли о нём запись)
candidatrue[candidate] - (ключ - ник кандидата, значение true/nil в зависимости от того есть ли о нём запись)


candidates[N] - (без ключа, содержит ники кандидатов)
candidates[N] - (без ключа, содержит ники кандидатов)
Строка 45: Строка 45:
["июля"]=7,["августа"]=8,["сентября"]=9,["октября"]=10,["ноября"]=11,["декабря"]=12,["-"]=""}
["июля"]=7,["августа"]=8,["сентября"]=9,["октября"]=10,["ноября"]=11,["декабря"]=12,["-"]=""}
local table_start, table_end = '<table class="wikitable sortable" width=33%><tr style="text-align:center"><th class="headerSortDown">#</th><th>Кандидат</th><th>+</th><th>−</th><th>Δ</th><th>Σ</th><th>%</th></tr>', "</table>"
local table_start, table_end = '<table class="wikitable sortable" width=33%><tr style="text-align:center"><th class="headerSortDown">#</th><th>Кандидат</th><th>+</th><th>−</th><th>Δ</th><th>Σ</th><th>%</th></tr>', "</table>"
local err_start, err_end = '<tr class="sortbottom" style="text-align:center"><td colspan="7"><div class="mw-collapsible mw-collapsed"><strong style="display:block;text-align:left">Дополнительная информация</strong><div class="mw-collapsible-content">','</div></td></tr>'
local err_start, err_end = '<tr class="sortbottom" style="text-align:center"><td colspan=7><table class="mw-collapsible mw-collapsed"><tr><th>Дополнительная информация&nbsp;</th></tr><tr><td>','</td></tr></table></td></tr>'
local err_type = {["no data"] ="Нет данных:", ["clash"] ="Расхождения:", ["vot_ers"] ="Исключения:"}
local err_type = {["no data"] ="Нет данных:", ["clash"] ="Расхождения:", ["vot_ers"] ="Исключения:"}
Строка 96: Строка 96:
-- TODO подсчёт результатов на заданную дату
-- TODO подсчёт результатов на заданную дату
-- отмены голосов бюрократами будут вневременные и не повлияют на динамику
-- отмены голосов бюрократами будут вневременные и не повлияют на динамику
local function compute (err,vote_table,electoratrue,exceptions,has_page,date)
local function compute (err,vote_table,electoratrue,exceptions,date)
if not vote_table then return nil end
if not vote_table then return nil end
date = date or os.time()
date = date or os.time()
Строка 130: Строка 130:
end
end
--]]
--]]
if has_page and not electoratrue[voter] then
if not electoratrue[voter] then
table.insert(err,{"vot_ers",voter,"<small><i>[[Special:Contributions/"..voter.."|activity]]: </i></small>",dress(candidate,pro,contra)})
table.insert(err,{"vot_ers",voter,"<small><i>activity: </i></small>",dress(candidate,pro,contra)})
end
end
valid_votes[candidate][voter] = {electoratrue[voter] or not has_page or false, pro, contra, timestamp}
valid_votes[candidate][voter] = {electoratrue[voter] or false, pro, contra, timestamp}
if exceptions[voter] and type(exceptions[voter]) == "table" then
if exceptions[voter] and type(exceptions[voter]) == "table" then
for _, ex in ipairs(exceptions[voter]) do
for _, ex in ipairs(exceptions[voter]) do
Строка 198: Строка 198:
-- нужны даты голосования и автоматический вывод то одних, то других ссылок
-- нужны даты голосования и автоматический вывод то одних, то других ссылок
local main_arb_page = string.gsub( arb_page, "%/Голосование", "")
local main_arb_page = string.gsub( arb_page, "%/Голосование", "")
local isNew = mw.title.new(arb_page.."/Голоса"):getContent(), pathname
if isNew then pathname = "/Голоса" else pathname = "/*" end
local tr = mw.html.create( 'tr' )
local tr = mw.html.create( 'tr' )
tr :css( 'background', passing and '#cfc;' or (second and '#ffc;' or '#fcc;') )
tr :css( 'background', passing and '#cfc;' or (second and '#ffc;' or '#fcc;') )
:tag( 'td' ):css('text-align','right'):wikitext( (passing and '' or '<small>') .. i .. (passing and '' or '</small>')):done()
:tag( 'td' ):css('text-align','right'):wikitext( (passing and '' or '<small>') .. i .. (passing and '' or '</small>')):done()
:tag( 'td' ):css('text-align','center'):css('white-space','nowrap'):wikitext( table.concat{"[[".. arb_page .. pathname .."#", candidate, '|', candidate, "]] ([[", main_arb_page,"#", candidate,"|обс.]])"}):done()
:tag( 'td' ):css('text-align','center'):css('white-space','nowrap'):wikitext( table.concat{"[[".. arb_page .."/Голоса#", candidate, '|', candidate, "]] ([[", main_arb_page,"#", candidate,"|обс.]])"}):done()
:tag( 'td' ):css('text-align','right'):wikitext( count_sup ):done()
:tag( 'td' ):css('text-align','right'):wikitext( count_sup ):done()
:tag( 'td' ):css('text-align','right'):wikitext( count_opp ):done()
:tag( 'td' ):css('text-align','right'):wikitext( count_opp ):done()
Строка 257: Строка 255:
local nomination = function(page)
local nomination = function(page)
local nomination_page_text = page:getContent() or ""
local nomination_page_text = page:getContent() or ""
local block_pattern = "%{%{ВАРБ:строка|кандидат=([^\n]*)\n|номинатор=([^\n]*)\n|согласие=([^\n]*)\n|отказ=([^\n]*)\n|бюрократ=([^\n]*)\n|отказ бюрократа=([^\n]*)\n%}%}"
local block_pattern = "%{%{%ВАРБ:строка|1=([^\n]+)\n|2=([^\n]+)\n|3=([^\n]+)\n|4=([^\n]+)\n|5=([^\n]+)\n|6=([^\n]+)\n%}%}"
local old_block_pattern = "%{%{ВАРБ:старая строка|1=([^\n]*)|2=([^\n]*)|3=([^\n]*)|4=([^\n]*)|5=([^\n]*)%}%}"
local candidates, candidatrue = {}, {}
local candidates, candidatrue = {}, {}
setmetatable(candidatrue,vlist)
setmetatable(candidatrue,vlist)
for candidate, submitter, consent, refusal, admission, non_admission in nomination_page_text:gmatch(block_pattern) do
for candidate, submitter, consent, refusal, admission, non_admission in nomination_page_text:gmatch(block_pattern) do
candidate = trim(candidate)
candidate, consent, admission =
if consent:find("(UTC)") and admission:find("(UTC)") then
trim(candidate), trim(consent), trim(admission)
no_consent = table.concat{"<!-- Согласие (",candidate,") -->"}
no_admission = table.concat{"<!-- Бюрократ (",candidate,") -->"}
if not (no_consent == consent) and consent:find("(UTC)") then
candidatrue[candidate] = true
candidatrue[candidate] = true
table.insert(candidates, candidate)
table.insert(candidates,candidate)
end
end
for consent_type, nominee, nominator, consent, admission in nomination_page_text:gmatch(old_block_pattern) do
nominee = trim(nominee)
if consent_type=="+" and admission:find("(UTC)") then
candidatrue[nominee] = true
table.insert(candidates, nominee)
end
end
end
end
Строка 381: Строка 374:
local function elec_listing (err, arb_page)
local function elec_listing (err, arb_page)
local page_1, page_2, _ = mw.ustring.match(arb_page,"([^/]+)/([^/]+)/([^/]+)")
local page_1, page_2, _ = mw.ustring.match(arb_page,"([^/]+)/([^/]+)/([^/]+)")
local page_name, has_page
local page_name
if not page_1 then
if not page_1 then
page_name = table.concat({page_1 or arb_page,"Избиратели"},"/")
page_name = table.concat({page_1 or arb_page,"Избиратели"},"/")
Строка 391: Строка 384:
if not electorate[1] then
if not electorate[1] then
table.insert(err,{"no data","elec","","[[" .. page_name .. "|/Избиратели]]"})
table.insert(err,{"no data","elec","","[[" .. page_name .. "|/Избиратели]]"})
has_page = false
else
has_page = true
end
end


return err, electoratrue, has_page
return err, electoratrue
end
end


Строка 428: Строка 418:
-- if not candidates_ampe[1] then
-- if not candidates_ampe[1] then
-- table.insert(err,{"no data","allpages changes","",'[['.. tostring(pagep_candid_ampe) ..'|/&]]'}) end
-- table.insert(err,{"no data","allpages changes","",'[['.. tostring(pagep_candid_ampe) ..'|/&]]'}) end
-- if not candidates_allvotes[1] then
if not candidates_allvotes[1] then
-- table.insert(err,{"no data","all votes","",'[['.. tostring(pagep_candid_allvotes) ..'|/Голоса]]'}) end
table.insert(err,{"no data","all votes","",'[['.. tostring(pagep_candid_allvotes) ..'|/Голоса]]'}) end
if not candidates_nom[1] then
if not candidates_nom[1] then
table.insert(err,{"no data","nomination","",'[['.. tostring(pagep_candid_nom) ..'|/Выдвижение]]'}) end
table.insert(err,{"no data","nomination","",'[['.. tostring(pagep_candid_nom) ..'|/Выдвижение]]'}) end
Строка 462: Строка 452:
local return_json = (ch_args[2] == "json")
local return_json = (ch_args[2] == "json")
-- модуль работает на старых страницах, путь приводится к одному формату таким образом
-- модуль работает на старых страницах, путь приводится к одному формату таким образом
arb_page = string.gsub( arb_page, "%/Голосование%/Предитоги", "/Голосование")
arb_page = string.gsub( arb_page, "%/Голосование%/Предытоги", "/Голосование")
arb_page = string.gsub( arb_page, "%/Голосование%/Предытоги", "/Голосование")
arb_page = string.gsub( arb_page, "%/Голосование%/Предитоги", "/Голосование")
arb_page = string.gsub( arb_page, "%/Форум", "/Голосование")
arb_page = string.gsub( arb_page, "%/Форум", "/Голосование")
arb_page = string.gsub( arb_page, "%d%d%d%d ?%d?$", "%0/Голосование")
arb_page = string.gsub( arb_page, "%d%d%d%d$", "%0/Голосование")
local err, vote_table = {}, {}
local err, vote_table = {}, {}
local candidates, electoratrue, exceptions, valid_votes, pre_result, pre_sort
local candidates, electoratrue, exceptions, valid_votes, pre_result, pre_sort


err, candidates = cand_listing (err, arb_page)
err, candidates = cand_listing (err, arb_page)
err, electoratrue, has_page = elec_listing (err, arb_page)
err, electoratrue = elec_listing (err, arb_page)
err, exceptions = caret(err, arb_page .. "/Исключения")
err, exceptions = caret(err, arb_page .. "/Исключения")
local result = {}
local result = {}
Строка 481: Строка 471:
-- TODO function under construction
-- TODO function under construction
err, valid_votes = compute (err,vote_table,electoratrue,exceptions,has_page) --,date
err, valid_votes = compute (err,vote_table,electoratrue,exceptions) --,date
-- mw.logObject(err)
-- mw.logObject(err)