Module:COVID-19 data
From HandWiki
Revision as of 14:14, 30 December 2021 by imported>MainEditor (Created page with "local p = {} local data_title = mw.title.new( 'Template:COVID-19 data/data' ) local data_content = data_title:getContent() local data = mw.text.jsonDecode(data_content) fun...")
Documentation for this module may be created at Module:COVID-19 data/doc
local p = {} local data_title = mw.title.new( 'Template:COVID-19 data/data' ) local data_content = data_title:getContent() local data = mw.text.jsonDecode(data_content) 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 int end function p.main() local out = '' local data_s = {} -- 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 = { cases = false, deaths = false, recoveries = false, total_vaccinated = false, vaccine_doses = false, fully_vaccinated = false, percent_vaccinated = false, deaths_per_million = false } 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 = { cases = true, deaths = true, recoveries = false, total_vaccinated = true, vaccine_doses = true, fully_vaccinated = true, percent_vaccinated = false, deaths_per_million = false } columns_index = { 'cases', 'deaths', 'recoveries', 'total_vaccinated', 'vaccine_doses', 'fully_vaccinated', 'percent_vaccinated', 'deaths_per_million' } 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 out = out .. '\n|-' if row._code == 'XW' then out = out .. 'class="sorttop static-row-header"' end out = out .. '\n' -- Add the flag if not mw.getCurrentFrame().args['noflag'] then out = out .. '| data-sort-value="' .. row.name .. '" | ' if row._code == 'XW' then out = out .. '[[File:OOjs UI icon globe.svg|16px|alt=|link=]]' else flag_params = {row.name} -- So that it's not too large if row.name == 'New Caledonia' then flag_params[2] = 'merged' end out = out .. mw.getCurrentFrame():expandTemplate{ title = 'Flagicon', args = flag_params } end end -- Add country name if mw.getCurrentFrame().args['noflag'] then out = out .. '| data-sort-value="' .. row.name .. '" | ' else out = out .. '||' end if row._code == 'XW' then out = out .. '[[COVID-19 pandemic|' .. row.name .. ']]' elseif row._code == 'GE' then out = out .. '[[COVID-19 pandemic in Georgia (country)' .. '|' .. row.name .. ']]' else out = out .. '[[COVID-19 pandemic in ' .. row.name .. '|' .. row.name .. ']]' end -- Add notes if row.note then out = out .. mw.getCurrentFrame():expandTemplate{ title = 'Efn', args = {row.note} } end -- Fill out columns for _, column in ipairs(columns_index) do if columns[column] then if row[column] then out = out .. '|| 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 .. '|| style="background: #cccccc;"' .. ' data-sort-value=0 | —' end end end end end out = out .. '\n|- class="sortbottom static-row-header" ' .. 'style="text-align: left;"\n' .. '| colspan=8 style="width: 0;" |' .. mw.getCurrentFrame():expandTemplate{ title = 'Notelist' } return out end function p.vac() local out = '' local data_s = {} local has_country_num_doses = false local has_country_num_fully = false -- 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 -- Add the flag if row.name == 'World' then out = out .. '|-\n| [[File:OOjs UI icon globe.svg|16px|alt=|link=]]' .. '|| style="text-align:left;" | [[Deployment of COVID-19 vaccines|World]]' else flag_params = {row.name} -- So that it's not too large if row.name == 'New Caledonia' then flag_params[2] = 'merged' end out = out .. '|-\n|' .. mw.getCurrentFrame():expandTemplate{ title = 'Flagicon', args = flag_params } .. '|| style="text-align:left;" | [[COVID-19 vaccination in ' .. row.name .. '|' .. row.name .. ']]' end -- Add note if row.note_vaccination then out = out .. mw.getCurrentFrame():expandTemplate{ title = 'Efn', args = {row.note_vaccination} } end -- Add the number if row.total_vaccinated then out = out .. '||' .. format_num(row.total_vaccinated) elseif row.vaccine_doses then has_country_num_doses = true out = out .. '||' .. mw.getCurrentFrame():expandTemplate{ title = 'Font color', args = {'darkred', format_num(row.vaccine_doses)} } .. mw.getCurrentFrame():expandTemplate{ title = 'Efn', args = {name = 'country_num_doses'} } elseif row.fully_vaccinated then has_country_num_fully = true out = out .. '||' .. mw.getCurrentFrame():expandTemplate{ title = 'Font color', args = {'darkorange', format_num(row.fully_vaccinated)} } .. mw.getCurrentFrame():expandTemplate{ title = 'Efn', args = {name = 'country_num_fully'} } end -- Add the percentage if row.percent_vaccinated then out = out .. '||' .. string.format("%.1f", row.percent_vaccinated) .. '%' else out = out .. '|| style="background: #cccccc;" |' end out = out .. '\n' 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{ title = 'Efn', args = { name = 'country_num_doses', 'This country\'s data are the ' .. mw.getCurrentFrame():expandTemplate{ title = 'Font color', args = { 'darkred', 'number of vaccine doses administered' } } .. ', not the first dose only.' } } end if has_country_num_fully then notelist_refs = notelist_refs .. mw.getCurrentFrame():expandTemplate{ title = 'Efn', args = { name = 'country_num_fully', 'This country\'s data are the ' .. mw.getCurrentFrame():expandTemplate{ title = 'Font color', args = { 'darkorange', 'number of people fully vaccinated' } } .. ', not the number of people ' .. 'who have received at least one dose.' } } end out = out .. '|- class="sortbottom"\n| colspan=4 |' .. mw.getCurrentFrame():expandTemplate{ title = 'Notelist', args = {refs = notelist_refs} } end return out end function p.text() local location = mw.getCurrentFrame().args['location'] local column = mw.getCurrentFrame().args['column'] return data[location][column] end return p