«Модуль:Ballot» и «Модуль:Песочница/Jaguar K/ballot»: разница между страницами
(Различия между страницами)
Содержимое удалено Содержимое добавлено
Stjn (обсуждение | вклад) не нужно вставлять таблицу внутрь другой таблицы |
Jaguar K (обсуждение | вклад) м о.с. |
||
Строка 11: | Строка 11: | ||
2) Устанавливается список избирателей |
2) Устанавливается список избирателей |
||
2.1) нужна заранее подготовленная таблица к выборам, без неё нет автоматической проверки критериев |
2.1) нужна заранее подготовленная таблица к выборам, без неё нет автоматической проверки критериев |
||
2.1.1) если вообще нет такой таблицы, пропускать всех так |
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= |
local err_start, err_end = '<tr class="sortbottom" style="text-align:center"><td colspan=7><table class="mw-collapsible mw-collapsed"><tr><th>Дополнительная информация </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 |
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 |
if not electoratrue[voter] then |
||
table.insert(err,{"vot_ers",voter,"<small><i> |
table.insert(err,{"vot_ers",voter,"<small><i>activity: </i></small>",dress(candidate,pro,contra)}) |
||
end |
end |
||
valid_votes[candidate][voter] = {electoratrue[voter] |
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 |
: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 = "%{%{ВАРБ:строка| |
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 |
candidate, consent, admission = |
||
trim(candidate), trim(consent), trim(admission) |
|||
no_consent = table.concat{"<!-- Согласие (",candidate,") -->"} |
|||
no_admission = table.concat{"<!-- Бюрократ (",candidate,") -->"} |
|||
⚫ | |||
candidatrue[candidate] = true |
candidatrue[candidate] = true |
||
table.insert(candidates, |
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) |
|||
⚫ | |||
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 |
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 |
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 |
|||
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, "%d%d%d%d |
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 |
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 |
err, valid_votes = compute (err,vote_table,electoratrue,exceptions) --,date |
||
-- mw.logObject(err) |
-- mw.logObject(err) |
||