Модуль:Synctable
Материал из Playzone Minecraft Wiki
Для документации этого модуля может быть создана страница Модуль:Synctable/doc
p = {} p.synctable = function(f) local args = f.args or f if f == mw.getCurrentFrame() and args[1] == nil then args = f:getParent().args end local statuses = { ["не начато"] = {"FFCCCC", "CC2929", "Не проводилась", 0}, ["в процессе"] = {"FFFF99", "666614", "Закреплена за участником", 0}, ["подтверждение"] = {"CCCCFF", "2929CC", "Требуется подтверждение синхронизации", 0}, ["частично"] = {"CCFF99", "3D6614", "Завершена (по мере возможности)", 0}, ["завершено"] = {"99FF99", "146614", "Завершена", 0}, ["устарело"] = {"FFCC99", "995B1F", "Требуется ресинхронизация", 0}, ["сильно устарело"] = {"CC0000", "FFFFFF", "Требуется срочная ресинхронизация!", 0}, ["неизвестно"] = {"CCCCCC", "666666", "Неизвестно или ошибочный статус", 0} } local total = 0 local tStatusOrder = {"не начато", "в процессе", "подтверждение", "частично", "завершено", "устарело", "сильно устарело", "неизвестно"} local output = {} table.insert(output, '{|class="wikitable collapsible collapsed" style="width: 100%; text-align: center"\n!colspan="5"|') local iresult = {} for k, v in ipairs(args) do local articleName, originalName, status, assignedUser, syncDay, syncMonth, syncYear, baseRevEn, baseRevRu = v:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)") baseRevRu = mw.text.trim(baseRevRu) table.insert(iresult, ('|-\n|[[%s]] ([[:en:%s|%s]])\n'):format(articleName, originalName, originalName)) local actualStatus if not statuses[status] then actualStatus = "неизвестно" elseif status == "частично" or status == "завершено" then local daysSinceSync = math.floor(os.difftime(os.time(), os.time({year=tonumber(syncYear), month=tonumber(syncMonth), day=tonumber(syncDay)})) / 86400) if daysSinceSync >= 90 then actualStatus = "сильно устарело" elseif daysSinceSync >= 30 then actualStatus = "устарело" else actualStatus = status end else actualStatus = status end statusTable = statuses[actualStatus] statusTable[4] = statusTable[4] + 1 table.insert(iresult, ('|style="background: #%s; color: #%s"|%s\n'):format(statusTable[1], statusTable[2], statusTable[3])) if assignedUser == '—' then table.insert(iresult, '|—\n') else table.insert(iresult, ('|[[User:%s|%s]]\n'):format(assignedUser, assignedUser)) end if syncDay == '—' then table.insert(iresult, '|—\n') else table.insert(iresult, ('|%s.%s.%s\n'):format(syncDay, syncMonth, syncYear)) end if baseRevEn == '—' then table.insert(iresult, '|—\n') else table.insert(iresult, ('|[[:en:Special:Diff/%s/0|Оригинал]], [[Special:Diff/%s/0|Перевод]]\n'):format(baseRevEn, baseRevRu)) end end local tStatuses = {} for i, v in ipairs(tStatusOrder) do local statusCount = statuses[v][4] table.insert(tStatuses, v .. ': ' .. statusCount) total = total + statusCount end table.insert(output, '\n<table style="width: 80%; line-height: 50%; border: 1px solid gray; margin: 0.5em 10%; border-collapse: collapse" title="' .. table.concat(tStatuses, ', ') .. '"><tr>') local tStatusCells = {} for i, v in ipairs(tStatusOrder) do local statusCount = statuses[v][4] if statusCount ~= 0 then table.insert(tStatusCells, '<td style="background-color: #' .. statuses[v][1] .. '; width: ' .. math.floor((statusCount/total) * 10000) / 100 .. '%"> </td>') end end table.insert(output, table.concat(tStatusCells) .. '</tr></table>') table.insert(output, '\n|-\n!Название\n!Статус\n!Закреплено за\n!Дата синхронизации\n!Изменения\n') table.insert(output, table.concat(iresult)) table.insert(output, '|}') return table.concat(output) end return p