Join The Fan Lab, a private Fandom research community for users in the US and UK where you will be asked to share your opinions on all things gaming and entertainment! Click here to see if you qualify

Модуль:Таблица обновления

Материал из Minecraft Wiki
Перейти к: навигация, поиск
[создать | история | обновить]Документация
У этого модуля нет документации. Если вы знаете, как использовать этот модуль, пожалуйста, добавьте соответствующую информацию.
p = {}

p.synctableMigration = function(f) -- переход от старой модели «Синхронизационная таблица»
	local args = f.args or f
	if f == mw.getCurrentFrame() and args[1] == nil then
		args = f:getParent().args
	end
	
	local output = {}
	table.insert(output, '<pre>\nreturn {\n')
	
	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(output, '\t{\n')
		table.insert(output, ('\t\t["оригинал"] = "%s",\n'):format(originalName))
		table.insert(output, ('\t\t["перевод"] = "%s",\n'):format(articleName))
		table.insert(output, ('\t\t["статус"] = "%s",\n'):format(status))
		table.insert(output, '\t\t["приоритет"] = 0.5,\n')
		
		if (assignedUser == "—") then
			table.insert(output, '\t\t["закреплено за"] = nil,\n')
		else
			table.insert(output, ('\t\t["закреплено за"] = "%s",\n'):format(assignedUser))
		end
		
		if (syncDay == "—") then
			table.insert(output, '\t\t["дата обновления"] = nil,\n')
		else
			table.insert(output, ('\t\t["дата обновления"] = { ["день"] = %s, ["месяц"] = %s, ["год"] = %s },\n'):format(syncDay, syncMonth, syncYear))
		end
		
		if (baseRevEn == "—") then
			table.insert(output, '\t\t["версия оригинала"] = nil,\n')
			table.insert(output, '\t\t["версия перевода"] = nil,\n')
		else
			table.insert(output, ('\t\t["версия оригинала"] = %s,\n'):format(baseRevEn))
			table.insert(output, ('\t\t["версия перевода"] = %s,\n'):format(baseRevRu))
		end
		
		table.insert(output, '\t\t["комментарий"] = nil\n')
		
		table.insert(output, '\t},\n')
		
	end
	table.insert(output, '}\n</pre>\n')
	
	return table.concat(output)
end

p.updateTable = 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 priorityNames = {
		{function(p) return p >= 0.95 end, "Срочный"},
		{function(p) return p >= 0.8 and p < 0.95 end, "Очень высокий"},
		{function(p) return p >= 0.65 and p < 0.8 end, "Высокий"},
		{function(p) return p > 0.55 and p < 0.65 end, "Выше среднего"},
		{function(p) return p >= 0.45 and p <= 0.55 end, "Средний"},
		{function(p) return p > 0.35 and p < 0.45 end, "Ниже среднего"},
		{function(p) return p > 0.2 and p <= 0.35 end, "Низкий"},
		{function(p) return p > 0.05 and p <= 0.2 end, "Очень низкий"},
		{function(p) return p <= 0.05 end, "Минимальный"}
	}
	
	local output = {}
	table.insert(output, '{|class="wikitable sortable collapsible collapsed" style="width: 100%; text-align: center"\n!colspan="8"|')
	local content = {}
	
	if not mw.title.new(args[1]).exists then
		return '<strong class=error>Модуль [[' .. args[1] .. ']] отсутствует. Требуется его создать.</strong>'
	end
	
	local updatetable = mw.loadData(args[1])
	
	for index, value in ipairs(updatetable) do
		local originalName = value["оригинал"]
		local translationName = value["перевод"]
		local status = value["статус"]
		local priority = value["приоритет"]
		local assignee = value["закреплено за"]
		local updateDate = value["дата обновления"]
		local isNotTranslation = value["не перевод"]
		local originalRevision = value["версия оригинала"]
		local translationRevision = value["версия перевода"]
		local comment = value["комментарий"]
		
		if isNotTranslation then
			table.insert(content, ("|-\n|[[%s]]\n|''(не перевод)''\n"):format(translationName))
		else
			table.insert(content, ("|-\n|[[%s]]\n|[[:en:%s]]\n"):format(translationName, originalName))
		end
		
		local actualStatus
		if not statuses[status] then
			actualStatus = "неизвестно"
		elseif status == "частично" or status == "завершено" then
			local daysSinceUpdate = math.floor(os.difftime(os.time(), os.time({
				year=tonumber(updateDate["год"]),
				month=tonumber(updateDate["месяц"]),
				day=tonumber(updateDate["день"])
			})) / 86400)
			
			if daysSinceUpdate >= 90 then
				actualStatus = "сильно устарело"
			elseif daysSinceUpdate >= 30 then
				actualStatus = "устарело"
			else
				actualStatus = status
			end
		else
			actualStatus = status
		end
		
		statusTable = statuses[actualStatus]
		statusTable[4] = statusTable[4] + 1
		table.insert(content, ('|style="background: #%s; color: #%s"|%s\n'):format(statusTable[1], statusTable[2], statusTable[3]))
		
		local priorityColorRed = priority > 0.5 and 255 or math.floor(2 * priority * 255)
		local priorityColorGreen = priority < 0.5 and 255 or 255 - math.floor(2 * (priority - 0.5) * 255)
		local priorityColor = ("rgb(%d, %d, 0)"):format(priorityColorRed, priorityColorGreen)
		local priorityName
		for index2, value2 in ipairs(priorityNames) do
			if value2[1](priority) then
				priorityName = value2[2]
				break
			end
		end
		table.insert(content, ('|style="background: %s" data-sort-value="%s"|%s\n'):format(priorityColor, priority, priorityName))
		
		if not assignee then
			table.insert(content, '|—\n')
		else
			table.insert(content, ('|[[User:%s|%s]]\n'):format(assignee, assignee))
		end
		
		if not updateDate then
			table.insert(content, '|—\n')
		else
			table.insert(content, ('|%s.%s.%s\n'):format(updateDate["день"], updateDate["месяц"], updateDate["год"]))
		end
		
		if isNotTranslation then
			table.insert(content, ("|[[Special:Diff/%s/0|Страница здесь]] ''(не перевод)''\n"):format(translationRevision))
		elseif not originalRevision then
			table.insert(content, '|—\n')
		else
			table.insert(content, ('|[[:en:Special:Diff/%s/0|Оригинал]], [[Special:Diff/%s/0|перевод]]\n'):format(tostring(originalRevision), tostring(translationRevision)))
		end
		
		if not comment then
			table.insert(content, '|—\n')
		else
			table.insert(content, ('|%s\n'):format(comment))
		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 .. '%">&nbsp;</td>')
		end
	end
	table.insert(output, table.concat(tStatusCells) .. '</tr></table>')
	table.insert(output, '\n|-\n!Страница здесь\n!Страница-оригинал\n!Статус\n!Приоритет\n!Закреплено за\n!Дата обновления\n!Базовые версии\n!Комментарий\n')
	table.insert(output, table.concat(content))
	table.insert(output, '|}')
	table.insert(output, ('<small>\'\'Таблица сгенерирована функцией <code>updateTable</code> модуля «[[Модуль:Таблица обновления|Таблица обновления]]» на основе данных из страницы [[%s]].\'\'</small>'):format(args[1]))
	
	
	return table.concat(output)
end

return p