Модуль:Medical cases chart: различия между версиями
Перейти к навигации
Перейти к поиску
[отпатрулированная версия] | [отпатрулированная версия] |
Содержимое удалено Содержимое добавлено
Carn (обсуждение | вклад) Для устранения Ошибка Lua в Модуль:Medical_cases_chart на строке 13: attempt to index a boolean value. |
Putnik (обсуждение | вклад) исправление округления процентов |
||
Строка 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