Модуль:Medical cases chart: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Для устранения Ошибка Lua в Модуль:Medical_cases_chart на строке 13: attempt to index a boolean value.
исправление округления процентов
Строка 34: Строка 34:
if last_total ~= 0 then
if last_total ~= 0 then
if diff_total ~= 0 then
if diff_total ~= 0 then
table.insert( parameters, string.format( '+%d%%', 100 * diff_total / last_total ) )
table.insert( parameters, string.format( '+%d%%', math.floor( 100 * diff_total / last_total + 0.5 ) ) )
else
else
table.insert( parameters, '=' )
table.insert( parameters, '=' )
Строка 49: Строка 49:
if last_removed ~= 0 then
if last_removed ~= 0 then
if diff_removed ~= 0 then
if diff_removed ~= 0 then
table.insert( parameters, string.format( '+%d%%', 100 * diff_removed / last_removed ) )
table.insert( parameters, string.format( '+%d%%', math.floor( 100 * diff_removed / last_removed + 0.5 ) ) )
else
else
table.insert( parameters, '=' )
table.insert( parameters, '=' )

Версия от 09:38, 22 апреля 2020

Документация

Реализацию и подробное описание см. в шаблоне {{Medical cases chart}}

local p = {}

function p.buildBars( frame )
	local barwidth = frame.args.barwidth
	local data = frame.args.data
	local data_table = frame.args.table
	local divisor = frame.args.divisor
	local numwidth = frame.args.numwidth
	local collapsible = frame.args.collapsible

	local lines = {}
	if data_table and data_table ~= '' then
		local raw_lines
		local data_table_data = mw.ext.data.get( data_table )
		if type(data_table_data) == "table" then 
			raw_lines = data_table_data.data
		else return string.format("<span class='error'>Ошибка: путь «%s» не ведёт к таблице.</span>",data_table)
		end
		local last_total = 0
		local last_removed = 0
		for _, parameters in ipairs( raw_lines ) do
			-- Временный хак. Поддержка только первых четырёх полей из таблицы.
			-- Остальные поля удаляются и заменяются приростом.
			while #parameters > 4 do
				table.remove( parameters, #parameters )
			end
			table.insert( parameters, '' )
			table.insert( parameters, '' )

			-- Суммарное значение
			local total = parameters[4]
			table.insert( parameters, total )
			local diff_total = total - last_total
			if last_total ~= 0 then
				if diff_total ~= 0 then
					table.insert( parameters, string.format( '+%d%%', math.floor( 100 * diff_total / last_total + 0.5 ) ) )
				else
					table.insert( parameters, '=' )
				end
			else
				table.insert( parameters, '' )
			end
			last_total = total

			local removed = parameters[2]
			local diff_removed = parameters[2] - last_removed
			if removed ~= 0 then
				table.insert( parameters, removed )
				if last_removed ~= 0 then
					if diff_removed ~= 0 then
						table.insert( parameters, string.format( '+%d%%', math.floor( 100 * diff_removed / last_removed + 0.5 ) ) )
					else
						table.insert( parameters, '=' )
					end
				else
					table.insert( parameters, '' )
				end
			else
				table.insert( parameters, '' )
				table.insert( parameters, '' )
			end
			last_removed = removed

			table.insert( lines, parameters )
		end
	elseif data and data ~= '' then
		for i, line in ipairs( mw.text.split( data, '\n' ) ) do
			local parameters = {}
			for parameter in mw.text.gsplit( line, ';' ) do
				table.insert( parameters, mw.text.trim( parameter ) )
			end
			table.insert( lines, parameters )
		end
	end

	local i = 1
	if divisor == '' then
		local total1, total2 = 0, 0

		for k, parameter in ipairs( lines[#lines] ) do
			if not string.find( parameter, '^ *%a' ) then
				if i == 3 then
					total1 = tonumber( (string.gsub( parameter, '%D', '' )) )
					if not total1 then
						total1 = 0
					end
				elseif i == 4 then
					total2 = tonumber( (string.gsub( parameter, '%D', '' )) )
					if not total2 then
						total2 = 0
					end
					break
				end
				i = i + 1
			end
		end
		divisor = math.max( total1, total2 ) / ( 0.95 * barwidth )
	end
	local bars = ''
	local args

	for k, line in pairs( lines ) do
		args, i = {}, 1

		for pos, parameter in pairs( line ) do
			if string.find( parameter, '^ *%a' ) then
				parameter = mw.text.split( parameter, '=' )
				args[parameter[1]] = parameter[2]
			else
				args[i] = parameter
				i = i + 1
			end
		end
		args['divisor'] = divisor
		args['numwidth'] = numwidth
		args['collapsible'] = collapsible
		bars = bars .. frame:expandTemplate{ title = 'Medical cases chart/Row', args = args }
	end
	return bars
end
return p