Module:COVID-19 data explained

local p =

local data_title = mw.title.new('Template:COVID-19 data/data')local data_content = data_title:getContentlocal data = mw.text.jsonDecode(data_content)

local function format_num(number) if not number then return end local _, _, minus, int, _ = tostring(number):find('([-]?)(%d+)([.]?%d*)') int = int:reverse:gsub("(%d%d%d)", "%1,") int = int:reverse:gsub("^,", "") int = minus .. int return intend

function p.main local out = local data_s = local has_notelist = false local count_row = 0 local count_col = 0 -- Build new table local locations = if mw.getCurrentFrame.args['locations'] then for location in string.gmatch(mw.getCurrentFrame.args['locations'], '([^,]+)' ) do locations[location] = true end else locations = nil end for key, value in pairs(data) do local index if mw.getCurrentFrame.args['sort'] then if value[mw.getCurrentFrame.args['sort']] then index = value[mw.getCurrentFrame.args['sort']] else index = 0 end else if value.cases then index = value.cases elseif value.deaths then index = value.deaths elseif value.vaccine_doses then index = value.vaccine_doses elseif value.total_vaccinated then index = value.total_vaccinated elseif value.fully_vaccinated then index = value.fully_vaccinated else index = 0 end end if (not locations) or locations[key] then data_s[#data_s+1] = value data_s[#data_s]['_index'] = index data_s[#data_s]['_code'] = key end end -- Sort the new table table.sort(data_s, function(x, y) if x._code

'XW' then return true elseif y._code

'XW' then return false else return (x._index > y._index) end end ) -- Get columns local columns = local columns_index = if mw.getCurrentFrame.args['columns'] then for column in string.gmatch(mw.getCurrentFrame.args['columns'], '([^,]+)' ) do columns[column] = true columns_index[#columns_index+1] = column end else columns = columns_index = end -- Check if should show note_vaccination local show_note_vaccination = false if columns['total_vaccinated'] or columns['vaccine_doses'] or columns['fully_vaccinated'] or columns['percent_vaccinated'] or columns['percent_fully_vaccinated'] then show_note_vaccination = true end -- Generate wikitext content for _, row in ipairs(data_s) do -- Test for empty rows local has_data = false for _, column in pairs(columns_index) do if columns[column] and row[column] then has_data = true end end if has_data then -- Only add row if it has data count_row = count_row + 1 out = out .. '\n|-' if row._code

'XW' then out = out .. 'class="sorttop static-row-header"' end -- Add the flag if not mw.getCurrentFrame.args['noflag'] then if count_row

1 then count_col = count_col + 1 end out = out .. '\n| style="text-align: center;" data-sort-value="' .. row.name .. '" | ' if row._code

'XW' then out = out .. '' else flag_params = -- So that it's not too large if row.name

'New Caledonia' then flag_params[2] = 'merged' end out = out .. mw.getCurrentFrame:expandTemplate end end -- Add country name if count_row

1 then count_col = count_col + 1 end if mw.getCurrentFrame.args['noflag'] then out = out .. '\n! scope="row" style="background-color: inherit;" data-sort-value="' .. row.name .. '" | ' else out = out .. '\n! scope="row" style="background-color: inherit;" |' end if row._code

'XW' then out = out .. '' .. row.name .. '' elseif row._code

'GE' then out = out .. '' .. row.name .. '' elseif row._code

'IM' then out = out .. '' .. row.name .. '' else out = out .. '' .. row.name .. '' end -- Add notes if row.note then has_notelist = true out = out .. mw.getCurrentFrame:expandTemplate end if row.note_vaccination and show_note_vaccination then has_notelist = true out = out .. mw.getCurrentFrame:expandTemplate end -- Fill out columns for _, column in ipairs(columns_index) do if columns[column] then if count_row

1 then count_col = count_col + 1 end if row[column] then out = out .. '\n| data-sort-value=' .. tostring(row[column]) .. '|' if column:find('^percent') then out = out .. string.format('%.2f', row[column]) .. '%' else out = out .. format_num(row[column]) end else out = out .. '\n| data-sort-value=0 | —' end end end end end if has_notelist then out = out .. '\n|- class="sortbottom static-row-header" style="text-align: left;"' .. '\n| colspan="' .. count_col .. '" style="width: 0;" |' .. mw.getCurrentFrame:expandTemplate end return outend

function p.vac local out = local data_s = local has_country_num_doses = false local has_country_num_fully = false local count_row = 0 local count_col = 0 -- Build new table for key, value in pairs(data) do if value.total_vaccinated then data_s[#data_s+1] = value data_s[#data_s]['index'] = value.total_vaccinated elseif value.vaccine_doses then data_s[#data_s+1] = value data_s[#data_s]['index'] = value.vaccine_doses elseif value.fully_vaccinated then data_s[#data_s+1] = value data_s[#data_s]['index'] = value.fully_vaccinated end end -- Sort the new table table.sort(data_s, function(x, y) return (x.index > y.index) end ) -- Generate wikitext content for _, row in pairs(data_s) do count_row = count_row + 1 out = out .. '\n|-' -- Add the flag if count_row

1 then count_col = count_col + 2 end if row.name

'World' then out = out .. 'class="sorttop static-row-header"' .. '\n| style="text-align: center;" data-sort-value="' .. row.name .. '" | ' .. '' .. '\n! scope="row" style="background-color: inherit;" data-sort-value="' .. row.name .. '" | ' .. 'World' else flag_params = -- So that it's not too large if row.name

'New Caledonia' then flag_params[2] = 'merged' end out = out .. '\n| style="text-align: center;" data-sort-value="' .. row.name .. '" | ' .. mw.getCurrentFrame:expandTemplate .. '\n! scope="row" style="background-color: inherit;" data-sort-value="' .. row.name .. '" | ' .. '' .. row.name .. '' end -- Add note if row.note_vaccination then out = out .. mw.getCurrentFrame:expandTemplate end -- Add the number if count_row

1 then count_col = count_col + 1 end if row.total_vaccinated then out = out .. '\n| data-sort-value=' .. tostring(row.total_vaccinated) .. '|' .. format_num(row.total_vaccinated) elseif row.vaccine_doses then has_country_num_doses = true out = out .. '\n| data-sort-value=' .. tostring(row.vaccine_doses) .. '|' .. mw.getCurrentFrame:expandTemplate .. mw.getCurrentFrame:expandTemplate elseif row.fully_vaccinated then has_country_num_fully = true out = out .. '\n| data-sort-value=' .. tostring(row.fully_vaccinated) .. '|' .. mw.getCurrentFrame:expandTemplate .. mw.getCurrentFrame:expandTemplate end -- Add the percentage if count_row

1 then count_col = count_col + 1 end if row.percent_vaccinated then out = out .. '\n| data-sort-value=' .. tostring(row.percent_vaccinated) .. '|' .. string.format("%.1f", row.percent_vaccinated) .. '%' else out = out .. '\n| data-sort-value=0 | —' end end if has_country_num_doses or has_country_num_fully then notelist_refs = if has_country_num_doses then notelist_refs = notelist_refs .. mw.getCurrentFrame:expandTemplate end if has_country_num_fully then notelist_refs = notelist_refs .. mw.getCurrentFrame:expandTemplate end out = out .. '\n|- class="sortbottom static-row-header" style="text-align: left;"' .. '\n| colspan="' .. count_col .. '" style="width: 0;" |' .. mw.getCurrentFrame:expandTemplate end return outend

function p.text local location = mw.getCurrentFrame.args['location'] local column = mw.getCurrentFrame.args['column'] return data[location][column]end

return p