پرش به محتوا

پودمان:COVID-19 data

از ویکی‌پدیا، دانشنامهٔ آزاد
توضیحات پودمان[نمایش] [ویرایش] [تاریخچه] [پاکسازی]


این ماژول و الگوها، داده‌های دنیاگیری کووید-۱۹ را نمایش می‌دهند.

اجزاء اصلی

[ویرایش]

جدول‌ها

[ویرایش]

بدنهٔ هر جدول را می‌توان با استفاده از تابع main() ایجاد کرد:

{{#invoke:COVID-19 data|main|columns=ستون‌ها|sort=مرتب‌سازی بر اساس ستون}}

این تابع تنها محتوای جدول (بدنهٔ آن) را تولید می‌کند. سرآیندها و عنوان‌ها را می‌توان به‌طور مستقل از پودمان شخصی‌سازی کرد تا امکان سبک‌بندی وجود داشته‌باشد.

برای جلوگیری از ایجاد ارجاع‌های تکراری و همچنین به‌روزرسانی خودکار نویسندگان و تاریخ بازبینی منبع، از ارجاع زیر (ترجیحاً در عنوان جدول) استفاده کنید:

<ref name="Template:COVID-19 data">{{داده‌های کووید-۱۹/یادکرد}}</ref>
فهرست
صفحه م.ا.؟ م؟ ک.و.؟ د.و.؟ و.ک.؟ سایر؟ ت؟ توضیحات
الگو:داده‌های کووید-۱۹ جدول اصلی
Template:COVID-19 vaccination data * * * *vac() Fallback: VT/VD/VF
الگو:داده‌های دنیاگیری ۲۰۱۹–۲۰۲۰ کروناویروس Other "hub" template
Template:COVID-19 vaccination data in North America
Template:COVID-19 pandemic death rates مرگ‌ها/میلیون
Template:COVID-19 pandemic death rates by country بزرگ‌تر، همراه با شماره‌گذاری ردیف‌ها

منابع

[ویرایش]

local p = {}

local num_conv = require('Module:Numeral converter').convert

local data_title = mw.title.new(
	'الگو:داده‌های کووید-۱۹/داده‌ها'
)
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 = mw.ustring.gsub(int, ",", "٬")
	int = minus .. int
	return num_conv('fa', int)
end

function p.main()
	local out = ''
	local data_s = {}
	-- Build new table
	local locations = {}
	if mw.getCurrentFrame().args['locations'] then
		for location in mw.ustring.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 mw.ustring.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
				if row._code == 'XW' then
					out = out ..
						'| [[پرونده:OOjs UI icon globe.svg|16px|alt=|link=]]'
				else
					flag_params = {row.name}
					-- So that it's not too large
					if row.name == 'کالدونیای جدید' then
						flag_params[2] = 'merged'
					end
					out = out .. '|' ..
						mw.getCurrentFrame():expandTemplate{
							title = 'پرچمک',
							args = flag_params
						}
				end
			end
			-- Add country name
			if row._code == 'XW' then
				out = out .. '|| [[دنیاگیری کووید-۱۹|' .. row.name .. ']]'
			elseif row._code == 'BT' then
				out = out ..
					'|| [[دنیاگیری کووید-۱۹ در بوتان (کشور)' ..
					'|' .. row.name .. ']]'
			elseif row._code == 'GG' then
				out = out ..
					'|| [[دنیاگیری کووید-۱۹ در گرنزی (جزیره)' ..
					'|' .. row.name .. ']]'
			else
				out = out ..
					'|| [[دنیاگیری کووید-۱۹ در ' .. 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]) ..
							'|' .. format_num(row[column])
					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: right;"\n' ..
			'| colspan=8 style="width: 0;" |' ..
			mw.getCurrentFrame():expandTemplate{
				title = 'یادداشت‌ها'
			}
	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 == 'جهان' then
			out = out ..
				'|-\n| [[پرونده:OOjs UI icon globe.svg|16px|alt=|link=]]' ..
				'|| style="text-align:right;" | [[گسترش واکسن کووید-۱۹|جهان]]'
		else
			flag_params = {row.name}
			-- So that it's not too large
			if row.name == 'کالدونیای جدید' then
				flag_params[2] = 'merged'
			end
			out = out ..
				'|-\n|' ..
				mw.getCurrentFrame():expandTemplate{
					title = 'پرچمک',
					args = flag_params
				} ..
				'||  style="text-align:right;" | [[واکسیناسیون کووید-۱۹ در ' .. 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 .. '||' .. mw.ustring.format("%.1f", num_conv('fa', 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',
						'داده‌های این کشور برابر با ' ..
							mw.getCurrentFrame():expandTemplate{
								title = 'Font color',
								args = {
									'darkred',
									'تعداد دوزهای واکسن تزریق‌شده'
								}
							} ..
							'است، نه فقط دوز نخست.'
					}
				}
		end
		if has_country_num_fully then
			notelist_refs = notelist_refs ..
				mw.getCurrentFrame():expandTemplate{
					title = 'Efn',
					args = {
						name = 'country_num_fully',
						'داده‌های این کشور برابر با ' ..
							mw.getCurrentFrame():expandTemplate{
								title = 'Font color',
								args = {
									'darkorange',
									'تعداد افراد کاملاً واکسینه‌شده'
								}
							} ..
							'است، نه فقط تعداد افرادی که ' ..
							'دست کم یک دوز واکسن را دریافت کرده‌اند.'
					}
				}
		end
		out = out .. '|- class="sortbottom"\n| colspan=4 |' ..
			mw.getCurrentFrame():expandTemplate{
				title = 'یادداشت‌ها',
				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