<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AMedical_cases_data</id>
	<title>Module:Medical cases data - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AMedical_cases_data"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Medical_cases_data&amp;action=history"/>
	<updated>2026-06-06T23:32:31Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Medical_cases_data&amp;diff=478694&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Medical_cases_data&amp;diff=478694&amp;oldid=prev"/>
		<updated>2021-07-16T04:59:02Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Usage: =p._caseTable({config=&amp;quot;San Francisco Bay Area&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local lang = mw.getContentLanguage()&lt;br /&gt;
local tabularData = require(&amp;quot;Module:Tabular data&amp;quot;)&lt;br /&gt;
local wd = require(&amp;quot;Module:wd&amp;quot;)&lt;br /&gt;
local mapFrame = require(&amp;quot;Module:Mapframe&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local propertyIDsByDisposition = {&lt;br /&gt;
	-- tests = &amp;quot;P8011&amp;quot;,&lt;br /&gt;
	cases = &amp;quot;P1603&amp;quot;,&lt;br /&gt;
	-- hospitalizations = &amp;quot;P8049&amp;quot;,&lt;br /&gt;
	recoveries = &amp;quot;P8010&amp;quot;,&lt;br /&gt;
	deaths = &amp;quot;P1120&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function round(x)&lt;br /&gt;
	return (math.modf(x + (x &amp;lt; 0 and -0.5 or 0.5)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.pointInTime(statement)&lt;br /&gt;
	local qualifiers = statement.qualifiers and statement.qualifiers.P585&lt;br /&gt;
	local time = qualifiers and qualifiers[1].datavalue.value.time&lt;br /&gt;
	return time and tonumber(lang:formatDate(&amp;quot;U&amp;quot;, time))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =tonumber(p.mostRecentStatement(&amp;quot;Q83873577&amp;quot;, &amp;quot;P1120&amp;quot;).mainsnak.datavalue.value.amount)&lt;br /&gt;
function p.mostRecentStatement(entityID, propertyID, startDate, endDate)&lt;br /&gt;
	local startTime = startDate and tonumber(lang:formatDate(&amp;quot;U&amp;quot;, startDate)) or -math.huge&lt;br /&gt;
	local endTime = endDate and tonumber(lang:formatDate(&amp;quot;U&amp;quot;, endDate)) or math.huge&lt;br /&gt;
	&lt;br /&gt;
	local statements = mw.wikibase.getBestStatements(entityID, propertyID)&lt;br /&gt;
	local latestTime = -math.huge&lt;br /&gt;
	local latestStatement&lt;br /&gt;
	for i, statement in ipairs(statements) do&lt;br /&gt;
		local time = p.pointInTime(statement)&lt;br /&gt;
		if time and time &amp;gt; startTime and time &amp;lt; endTime and time &amp;gt; latestTime then&lt;br /&gt;
			latestTime = time&lt;br /&gt;
			latestStatement = statement&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return latestStatement&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.statementReference(statement)&lt;br /&gt;
	local reference = statement.references and statement.references[1]&lt;br /&gt;
	local referenceSnak = reference and reference.snaks.P248 and reference.snaks.P248[1]&lt;br /&gt;
	local declarationQID = referenceSnak and referenceSnak.datavalue.value.id&lt;br /&gt;
	if not declarationQID then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local name = mw.wikibase.formatValue(referenceSnak)&lt;br /&gt;
	local url = mw.wikibase.getBestStatements(declarationQID, &amp;quot;P856&amp;quot;)[1].mainsnak.datavalue.value&lt;br /&gt;
	return {&lt;br /&gt;
		name = declarationQID,&lt;br /&gt;
		wikitext = url and mw.ustring.format(&amp;quot;[%s %s]&amp;quot;, url, name) or name,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._regionData(regionConfigs, populationDate)&lt;br /&gt;
	local regions = {}&lt;br /&gt;
	for i, regionConfig in ipairs(regionConfigs) do&lt;br /&gt;
		local outbreakEntity = regionConfig.entity&lt;br /&gt;
		local locationEntity = mw.wikibase.getBestStatements(outbreakEntity, &amp;quot;P276&amp;quot;)[1].mainsnak.datavalue.value.id&lt;br /&gt;
		local dataTableName = mw.wikibase.getBestStatements(outbreakEntity, &amp;quot;P8204&amp;quot;)[1]&lt;br /&gt;
		local dataTable&lt;br /&gt;
		if dataTableName then&lt;br /&gt;
			dataTableName = dataTableName.mainsnak.datavalue.value&lt;br /&gt;
			dataTable = mw.ext.data.get((dataTableName:gsub(&amp;quot;^Data:&amp;quot;, &amp;quot;&amp;quot;)))&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local region = {&lt;br /&gt;
			outbreakEntity = outbreakEntity,&lt;br /&gt;
			locationEntity = locationEntity,&lt;br /&gt;
			name = mw.wikibase.getLabel(locationEntity),&lt;br /&gt;
			link = mw.wikibase.getSitelink(locationEntity),&lt;br /&gt;
			population = tonumber(wd._property({&lt;br /&gt;
				&amp;quot;raw&amp;quot;,&lt;br /&gt;
				locationEntity,&lt;br /&gt;
				&amp;quot;P1082&amp;quot;,&lt;br /&gt;
				P585 = populationDate,&lt;br /&gt;
			})),&lt;br /&gt;
			dataTableName = dataTableName,&lt;br /&gt;
			note = regionConfig.note,&lt;br /&gt;
			sources = {},&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		local columns = regionConfig.columns&lt;br /&gt;
		local latestTableDate = dataTable and tabularData._cell({&lt;br /&gt;
			data = dataTable,&lt;br /&gt;
			output_row = -1,&lt;br /&gt;
			output_column = columns and columns.date or &amp;quot;date&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
		local latestTableTime = latestTableDate and tonumber(lang:formatDate(&amp;quot;U&amp;quot;, latestTableDate))&lt;br /&gt;
		local usesDataTable = false&lt;br /&gt;
		&lt;br /&gt;
		local casesStatement = p.mostRecentStatement(outbreakEntity, propertyIDsByDisposition.cases)&lt;br /&gt;
		local casesTime = casesStatement and p.pointInTime(casesStatement)&lt;br /&gt;
		if casesTime and (not latestTableTime or casesTime &amp;gt; latestTableTime) then&lt;br /&gt;
			region.cases = tonumber(casesStatement.mainsnak.datavalue.value.amount)&lt;br /&gt;
			local reference = p.statementReference(casesStatement)&lt;br /&gt;
			if reference then&lt;br /&gt;
				region.sources[reference.name] = reference.wikitext&lt;br /&gt;
			end&lt;br /&gt;
		elseif latestTableTime then&lt;br /&gt;
			region.cases = dataTable and (tabularData._cell({&lt;br /&gt;
				data = dataTable,&lt;br /&gt;
				output_row = -1,&lt;br /&gt;
				output_column = columns and columns.cases or &amp;quot;totalConfirmedCases&amp;quot;,&lt;br /&gt;
			}) or tabularData._lookup({&lt;br /&gt;
				data = dataTable,&lt;br /&gt;
				search_pattern = &amp;quot;%d&amp;quot;,&lt;br /&gt;
				search_column = columns and columns.cases or &amp;quot;totalConfirmedCases&amp;quot;,&lt;br /&gt;
				occurrence = -1,&lt;br /&gt;
				output_column = columns and columns.cases or &amp;quot;totalConfirmedCases&amp;quot;,&lt;br /&gt;
			})) + (columns and columns.cases2 and tabularData._cell({&lt;br /&gt;
				data = dataTable,&lt;br /&gt;
				output_row = -1,&lt;br /&gt;
				output_column = columns.cases2,&lt;br /&gt;
			}) or 0)&lt;br /&gt;
			usesDataTable = true&lt;br /&gt;
		end&lt;br /&gt;
		region.arrivalDate = dataTable and tabularData._lookup({&lt;br /&gt;
			data = dataTable,&lt;br /&gt;
			search_pattern = &amp;quot;[1-9]&amp;quot;,&lt;br /&gt;
			search_column = columns and columns.cases or &amp;quot;totalConfirmedCases&amp;quot;,&lt;br /&gt;
			occurrence = 1,&lt;br /&gt;
			output_column = columns and columns.date or &amp;quot;date&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
		&lt;br /&gt;
		local deathsStatement = p.mostRecentStatement(outbreakEntity, propertyIDsByDisposition.deaths)&lt;br /&gt;
		local deathsTime = deathsStatement and p.pointInTime(deathsStatement)&lt;br /&gt;
		if deathsTime and (not latestTableTime or deathsTime &amp;gt; latestTableTime) then&lt;br /&gt;
			region.deaths = tonumber(deathsStatement.mainsnak.datavalue.value.amount)&lt;br /&gt;
			local reference = p.statementReference(deathsStatement)&lt;br /&gt;
			if reference then&lt;br /&gt;
				region.sources[reference.name] = reference.wikitext&lt;br /&gt;
			end&lt;br /&gt;
		elseif latestTableTime then&lt;br /&gt;
			region.deaths = dataTable and (tabularData._cell({&lt;br /&gt;
				data = dataTable,&lt;br /&gt;
				output_row = -1,&lt;br /&gt;
				output_column = columns and columns.deaths or &amp;quot;deaths&amp;quot;,&lt;br /&gt;
			}) or tabularData._lookup({&lt;br /&gt;
				data = dataTable,&lt;br /&gt;
				search_pattern = &amp;quot;%d&amp;quot;,&lt;br /&gt;
				search_column = columns and columns.deaths or &amp;quot;deaths&amp;quot;,&lt;br /&gt;
				occurrence = -1,&lt;br /&gt;
				output_column = columns and columns.deaths or &amp;quot;deaths&amp;quot;,&lt;br /&gt;
			}))&lt;br /&gt;
			usesDataTable = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local recoveriesStatement = p.mostRecentStatement(outbreakEntity, propertyIDsByDisposition.recoveries)&lt;br /&gt;
		local recoveriesTime = recoveriesStatement and p.pointInTime(recoveriesStatement)&lt;br /&gt;
		if recoveriesTime and (not latestTableTime or recoveriesTime &amp;gt; latestTableTime) then&lt;br /&gt;
			region.recoveries = tonumber(recoveriesStatement.mainsnak.datavalue.value.amount)&lt;br /&gt;
			local reference = p.statementReference(recoveriesStatement)&lt;br /&gt;
			if reference then&lt;br /&gt;
				region.sources[reference.name] = reference.wikitext&lt;br /&gt;
			end&lt;br /&gt;
		elseif latestTableTime then&lt;br /&gt;
			region.recoveries = columns and columns.recoveries and dataTable and (tabularData._cell({&lt;br /&gt;
				data = dataTable,&lt;br /&gt;
				output_row = -1,&lt;br /&gt;
				output_column = columns.recoveries,&lt;br /&gt;
			}) or tabularData._lookup({&lt;br /&gt;
				data = dataTable,&lt;br /&gt;
				search_pattern = &amp;quot;%d&amp;quot;,&lt;br /&gt;
				search_column = columns.recoveries,&lt;br /&gt;
				occurrence = -1,&lt;br /&gt;
				output_column = columns.recoveries,&lt;br /&gt;
			}))&lt;br /&gt;
			usesDataTable = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local viewLinks = {&lt;br /&gt;
			mw.ustring.format(&amp;quot;[[d:%s|d]]&amp;quot;, region.outbreakEntity),&lt;br /&gt;
		}&lt;br /&gt;
		if dataTableName then&lt;br /&gt;
			table.insert(viewLinks, mw.ustring.format(&amp;quot;[[c:%s|c]]&amp;quot;, dataTableName))&lt;br /&gt;
		end&lt;br /&gt;
		region.viewLink = table.concat(viewLinks, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		if usesDataTable then&lt;br /&gt;
			local formattedDate = latestTableTime&lt;br /&gt;
			local reference = mw.ustring.format(&amp;quot;%s. %s.&amp;quot;, dataTable.sources:gsub(&amp;quot;&amp;lt;br */?&amp;gt;.*&amp;quot;, &amp;quot;&amp;quot;), lang:formatDate(&amp;quot;F j, Y&amp;quot;, latestTableDate))&lt;br /&gt;
			region.sources[dataTableName] = reference&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(regions, region)&lt;br /&gt;
	end&lt;br /&gt;
	return regions&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function addNumericCell(row, contents)&lt;br /&gt;
	if contents then&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&amp;quot;td&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;data-sort-value&amp;quot;, contents)&lt;br /&gt;
			:wikitext(lang:formatNum(contents))&lt;br /&gt;
	else&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&amp;quot;td&amp;quot;)&lt;br /&gt;
			:addClass(&amp;quot;unknown&amp;quot;)&lt;br /&gt;
			:addClass(&amp;quot;table-unknown&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;align&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
			:css({&lt;br /&gt;
				background = &amp;quot;#ececec&amp;quot;,&lt;br /&gt;
				color = &amp;quot;#2c2c2c&amp;quot;,&lt;br /&gt;
				[&amp;quot;font-size&amp;quot;] = &amp;quot;smaller&amp;quot;,&lt;br /&gt;
				[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;,&lt;br /&gt;
			})&lt;br /&gt;
			:attr(&amp;quot;data-sort-value&amp;quot;, &amp;quot;0&amp;quot;)&lt;br /&gt;
			:wikitext(&amp;quot;?&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return row&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Usage: =p._caseTable({config=&amp;quot;San Francisco Bay Area&amp;quot;})&lt;br /&gt;
function p._caseTable(args)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local config = args.config and mw.loadData(&amp;quot;Module:Medical cases data/&amp;quot; .. args.config)&lt;br /&gt;
	local populationDate = config and config.populationDate or args.populationDate&lt;br /&gt;
	local regions = p._regionData(&lt;br /&gt;
		config and config.regions,&lt;br /&gt;
		populationDate)&lt;br /&gt;
	table.sort(regions, function (left, right)&lt;br /&gt;
		local leftCases = left.cases or 0&lt;br /&gt;
		local rightCases = right.cases or 0&lt;br /&gt;
		return leftCases == rightCases and left.name &amp;lt; right.name or leftCases &amp;gt; rightCases&lt;br /&gt;
	end)&lt;br /&gt;
	&lt;br /&gt;
	local totals = {&lt;br /&gt;
		regions = #regions,&lt;br /&gt;
		cases = 0,&lt;br /&gt;
		deaths = 0,&lt;br /&gt;
		recoveries = 0,&lt;br /&gt;
		population = 0,&lt;br /&gt;
	}&lt;br /&gt;
	for i, region in ipairs(regions) do&lt;br /&gt;
		totals.cases = totals.cases + (region.cases or 0)&lt;br /&gt;
		totals.deaths = totals.deaths + (region.deaths or 0)&lt;br /&gt;
		totals.recoveries = totals.recoveries and region.recoveries and (totals.recoveries + region.recoveries)&lt;br /&gt;
		totals.population = totals.population + (region.population or 0)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local htmlTable = mw.html.create(&amp;quot;table&amp;quot;)&lt;br /&gt;
		:addClass(&amp;quot;wikitable&amp;quot;)&lt;br /&gt;
		:addClass(&amp;quot;sortable&amp;quot;)&lt;br /&gt;
		:addClass(&amp;quot;plainrowheaders&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
		:css({&lt;br /&gt;
			[&amp;quot;font-size&amp;quot;] = &amp;quot;85%&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
	htmlTable&lt;br /&gt;
		:tag(&amp;quot;caption&amp;quot;)&lt;br /&gt;
		:wikitext(config and config.caption or args.caption)&lt;br /&gt;
	&lt;br /&gt;
	local headerRow = htmlTable&lt;br /&gt;
		:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
	local totalRow = htmlTable&lt;br /&gt;
		:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local columnNotes = config and config.columnNotes&lt;br /&gt;
	headerRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;scope&amp;quot;, &amp;quot;col&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;data-sort-type&amp;quot;, &amp;quot;text&amp;quot;)&lt;br /&gt;
		:wikitext(config and config.regionTerm or args.regionTerm or &amp;quot;Regions&amp;quot;)&lt;br /&gt;
		:wikitext(columnNotes and columnNotes.regions and frame:expandTemplate {&lt;br /&gt;
			title = &amp;quot;efn&amp;quot;,&lt;br /&gt;
			args = {&lt;br /&gt;
				columnNotes.regions&lt;br /&gt;
			}&lt;br /&gt;
		})&lt;br /&gt;
	totalRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
		:wikitext(lang:formatNum(totals.regions))&lt;br /&gt;
	headerRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;scope&amp;quot;, &amp;quot;col&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;data-sort-type&amp;quot;, &amp;quot;number&amp;quot;)&lt;br /&gt;
		:wikitext(&amp;quot;Cases&amp;quot;)&lt;br /&gt;
		:wikitext(columnNotes and columnNotes.cases and frame:expandTemplate {&lt;br /&gt;
			title = &amp;quot;efn&amp;quot;,&lt;br /&gt;
			args = {&lt;br /&gt;
				columnNotes.cases&lt;br /&gt;
			}&lt;br /&gt;
		})&lt;br /&gt;
	totalRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;data-sort-type&amp;quot;, &amp;quot;number&amp;quot;)&lt;br /&gt;
		:wikitext(lang:formatNum(totals.cases))&lt;br /&gt;
	local recoveriesHeader = headerRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;scope&amp;quot;, &amp;quot;col&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;data-sort-type&amp;quot;, &amp;quot;number&amp;quot;)&lt;br /&gt;
	recoveriesHeader&lt;br /&gt;
		:tag(&amp;quot;abbr&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;title&amp;quot;, &amp;quot;Recoveries&amp;quot;)&lt;br /&gt;
		:wikitext(&amp;quot;Recov.&amp;quot;)&lt;br /&gt;
	recoveriesHeader&lt;br /&gt;
		:wikitext(columnNotes and columnNotes.recoveries and frame:expandTemplate {&lt;br /&gt;
			title = &amp;quot;efn&amp;quot;,&lt;br /&gt;
			args = {&lt;br /&gt;
				columnNotes.recoveries&lt;br /&gt;
			}&lt;br /&gt;
		})&lt;br /&gt;
	totalRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
		:wikitext(totals.recoveries and lang:formatNum(totals.recoveries))&lt;br /&gt;
	headerRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;scope&amp;quot;, &amp;quot;col&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;data-sort-type&amp;quot;, &amp;quot;number&amp;quot;)&lt;br /&gt;
		:wikitext(&amp;quot;Deaths&amp;quot;)&lt;br /&gt;
		:wikitext(columnNotes and columnNotes.deaths and frame:expandTemplate {&lt;br /&gt;
			title = &amp;quot;efn&amp;quot;,&lt;br /&gt;
			args = {&lt;br /&gt;
				columnNotes.deaths&lt;br /&gt;
			}&lt;br /&gt;
		})&lt;br /&gt;
	totalRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;data-sort-type&amp;quot;, &amp;quot;number&amp;quot;)&lt;br /&gt;
		:wikitext(lang:formatNum(totals.deaths))&lt;br /&gt;
	local populationHeader = headerRow&lt;br /&gt;
			:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;scope&amp;quot;, &amp;quot;col&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;data-sort-type&amp;quot;, &amp;quot;number&amp;quot;)&lt;br /&gt;
	populationHeader&lt;br /&gt;
		:tag(&amp;quot;abbr&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;title&amp;quot;, &amp;quot;Population&amp;quot;)&lt;br /&gt;
		:wikitext(&amp;quot;Pop.&amp;quot;)&lt;br /&gt;
	if populationDate then&lt;br /&gt;
		populationHeader&lt;br /&gt;
			:wikitext(mw.ustring.format(&amp;quot; (%d)&amp;quot;, lang:formatDate(&amp;quot;Y&amp;quot;, populationDate)))&lt;br /&gt;
	end&lt;br /&gt;
	populationHeader&lt;br /&gt;
		:wikitext(columnNotes and columnNotes.population and frame:expandTemplate {&lt;br /&gt;
			title = &amp;quot;efn&amp;quot;,&lt;br /&gt;
			args = {&lt;br /&gt;
				columnNotes.population&lt;br /&gt;
			}&lt;br /&gt;
		})&lt;br /&gt;
	totalRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;data-sort-type&amp;quot;, &amp;quot;number&amp;quot;)&lt;br /&gt;
		:wikitext(lang:formatNum(totals.population))&lt;br /&gt;
	headerRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;scope&amp;quot;, &amp;quot;col&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;data-sort-type&amp;quot;, &amp;quot;number&amp;quot;)&lt;br /&gt;
			:tag(&amp;quot;abbr&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;title&amp;quot;, &amp;quot;Cases per 1 million inhabitants&amp;quot;)&lt;br /&gt;
			:wikitext(&amp;quot;C/1M&amp;quot;)&lt;br /&gt;
		:wikitext(columnNotes and columnNotes.casesPerMillion and frame:expandTemplate {&lt;br /&gt;
			title = &amp;quot;efn&amp;quot;,&lt;br /&gt;
			args = {&lt;br /&gt;
				columnNotes.casesPerMillion&lt;br /&gt;
			}&lt;br /&gt;
		})&lt;br /&gt;
	totalRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;data-sort-type&amp;quot;, &amp;quot;number&amp;quot;)&lt;br /&gt;
		:wikitext(lang:formatNum(round(totals.cases / totals.population * 1e6)))&lt;br /&gt;
	headerRow&lt;br /&gt;
		:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;scope&amp;quot;, &amp;quot;col&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;rowspan&amp;quot;, 2)&lt;br /&gt;
		:addClass(&amp;quot;unsortable&amp;quot;)&lt;br /&gt;
			:tag(&amp;quot;abbr&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;title&amp;quot;, &amp;quot;Reference&amp;quot;)&lt;br /&gt;
			:wikitext(&amp;quot;Ref.&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local regionNamePattern = config and config.regionNamePattern or args.regionNamePattern&lt;br /&gt;
	for i, region in ipairs(regions) do&lt;br /&gt;
		local row = htmlTable:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
		local name = region.name&lt;br /&gt;
		if regionNamePattern then&lt;br /&gt;
			name = mw.ustring.match(region.name, regionNamePattern) or name&lt;br /&gt;
		end&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;scope&amp;quot;, &amp;quot;row&amp;quot;)&lt;br /&gt;
			:wikitext(mw.ustring.format(&amp;quot;[[%s|%s]]&amp;quot;, region.link, name))&lt;br /&gt;
			:wikitext(regionNote and frame:expandTemplate {&lt;br /&gt;
				title = &amp;quot;efn&amp;quot;,&lt;br /&gt;
				args = {&lt;br /&gt;
					region.note,&lt;br /&gt;
				}&lt;br /&gt;
			})&lt;br /&gt;
		addNumericCell(row, region.cases)&lt;br /&gt;
		addNumericCell(row, region.recoveries)&lt;br /&gt;
		addNumericCell(row, region.deaths)&lt;br /&gt;
		addNumericCell(row, region.population)&lt;br /&gt;
		addNumericCell(row, region.cases and region.population and round(region.cases / region.population * 1e6))&lt;br /&gt;
		local refCell = row&lt;br /&gt;
			:tag(&amp;quot;td&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;align&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
			:wikitext(region.viewLink)&lt;br /&gt;
		for name, wikitext in pairs(region.sources) do&lt;br /&gt;
			refCell:wikitext(frame:callParserFunction {&lt;br /&gt;
				name = &amp;quot;#tag:ref&amp;quot;,&lt;br /&gt;
				args = {&lt;br /&gt;
					name = name,&lt;br /&gt;
					wikitext,&lt;br /&gt;
				},&lt;br /&gt;
			})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local footerRow = htmlTable&lt;br /&gt;
		:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
		:addClass(&amp;quot;sortbottom&amp;quot;)&lt;br /&gt;
	footerRow&lt;br /&gt;
		:tag(&amp;quot;td&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;colspan&amp;quot;, 7)&lt;br /&gt;
		:attr(&amp;quot;align&amp;quot;, &amp;quot;left&amp;quot;)&lt;br /&gt;
		:css({&lt;br /&gt;
			width = 0,&lt;br /&gt;
		})&lt;br /&gt;
		:wikitext(frame:expandTemplate {&lt;br /&gt;
			title = &amp;quot;notelist&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
	return htmlTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.caseTable(frame)&lt;br /&gt;
	return p._caseTable(frame.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._statistics(args)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local config = args.config and mw.loadData(&amp;quot;Module:Medical cases data/&amp;quot; .. args.config)&lt;br /&gt;
	local populationDate = config and config.populationDate or args.populationDate&lt;br /&gt;
	local regions = p._regionData(&lt;br /&gt;
		config and config.regions,&lt;br /&gt;
		populationDate)&lt;br /&gt;
	&lt;br /&gt;
	local stats = {&lt;br /&gt;
		regions = #regions,&lt;br /&gt;
		cases = 0,&lt;br /&gt;
		deaths = 0,&lt;br /&gt;
		recoveries = 0,&lt;br /&gt;
		recoveriesRegions = 0,&lt;br /&gt;
		population = 0,&lt;br /&gt;
	}&lt;br /&gt;
	for i, region in ipairs(regions) do&lt;br /&gt;
		stats.cases = stats.cases + (region.cases or 0)&lt;br /&gt;
		stats.deaths = stats.deaths + (region.deaths or 0)&lt;br /&gt;
		if region.recoveries then&lt;br /&gt;
			stats.recoveries = stats.recoveries + region.recoveries&lt;br /&gt;
			stats.recoveriesRegions = stats.recoveriesRegions + 1&lt;br /&gt;
		end&lt;br /&gt;
		stats.population = stats.population + (region.population or 0)&lt;br /&gt;
		if not stats.arrivalDate or region.arrivalDate &amp;lt; stats.arrivalDate then&lt;br /&gt;
			stats.arrivalDate = region.arrivalDate&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return stats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.statistics(frame)&lt;br /&gt;
	return p._statistics(frame.args)[mw.text.trim(frame.args[1])]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fillColor(casesPerCapita)&lt;br /&gt;
	-- [[c:Template:COVID-19 Prevalence in US by county]]&lt;br /&gt;
	local percent = casesPerCapita * 100&lt;br /&gt;
	if percent &amp;gt;= 10.00 then return &amp;quot;#510000&amp;quot; end&lt;br /&gt;
	if percent &amp;gt;=  3.00 then return &amp;quot;#99000d&amp;quot; end&lt;br /&gt;
	if percent &amp;gt;=  1.00 then return &amp;quot;#cb181d&amp;quot; end&lt;br /&gt;
	if percent &amp;gt;=  0.30 then return &amp;quot;#fb6a4a&amp;quot; end&lt;br /&gt;
	if percent &amp;gt;=  0.10 then return &amp;quot;#fc9272&amp;quot; end&lt;br /&gt;
	if percent &amp;gt;=  0.03 then return &amp;quot;#fcbba1&amp;quot; end&lt;br /&gt;
	if percent &amp;gt;=  0.00 then return &amp;quot;#fee5d9&amp;quot; end&lt;br /&gt;
	return &amp;quot;#cccccc&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Usage: =p._map({config=&amp;quot;San Francisco Bay Area&amp;quot;})&lt;br /&gt;
function p._map(args)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local config = args.config and mw.loadData(&amp;quot;Module:Medical cases data/&amp;quot; .. args.config)&lt;br /&gt;
	local populationDate = config and config.populationDate or args.populationDate&lt;br /&gt;
	local regions = p._regionData(&lt;br /&gt;
		config and config.regions,&lt;br /&gt;
		populationDate)&lt;br /&gt;
	&lt;br /&gt;
	local params = {&lt;br /&gt;
		frame = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		[&amp;quot;frame-width&amp;quot;] = args.frameWidth or (config and config.frameWidth),&lt;br /&gt;
		[&amp;quot;frame-height&amp;quot;] = args.frameHeight or (config and config.frameHeight),&lt;br /&gt;
		text = args.caption or (config and config.caption),&lt;br /&gt;
	}&lt;br /&gt;
	for i, region in ipairs(regions) do&lt;br /&gt;
		i = i == 1 and &amp;quot;&amp;quot; or i&lt;br /&gt;
		params[&amp;quot;type&amp;quot; .. i] = &amp;quot;shape&amp;quot;&lt;br /&gt;
		params[&amp;quot;id&amp;quot; .. i] = region.locationEntity&lt;br /&gt;
		params[&amp;quot;title&amp;quot; .. i] = region.name&lt;br /&gt;
		params[&amp;quot;stroke-color&amp;quot; .. i] = &amp;quot;#ffffff&amp;quot;&lt;br /&gt;
		params[&amp;quot;stroke-width&amp;quot; .. i] = 1&lt;br /&gt;
		params[&amp;quot;fill&amp;quot; .. i] = fillColor(region.cases / region.population)&lt;br /&gt;
		&lt;br /&gt;
		local details = {&lt;br /&gt;
			mw.ustring.format(&amp;quot;%s cases (%s/1M)&amp;quot;, lang:formatNum(region.cases),&lt;br /&gt;
				lang:formatNum(round(region.cases / region.population * 1e6))),&lt;br /&gt;
			mw.ustring.format(&amp;quot;%s deaths&amp;quot;, lang:formatNum(region.deaths)),&lt;br /&gt;
		}&lt;br /&gt;
		if region.recoveries then&lt;br /&gt;
			table.insert(details, mw.ustring.format(&amp;quot;%s recoveries&amp;quot;, lang:formatNum(region.recoveries)))&lt;br /&gt;
		end&lt;br /&gt;
		params[&amp;quot;description&amp;quot; .. i] = table.concat(details, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return frame:preprocess(mapFrame._main(params))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.map(frame)&lt;br /&gt;
	return p._map(frame.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>