Модуль:USCensusPop

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация

Функции

[править код]

Эта функция вызывается в шаблоне {{USCensusPop}} и показывает в виде таблицы годы переписи населения в США, число зарегистрированных на переписи жителей и процентное изменение населения по сравнению с предыдущей переписью.

Использование
{{#invoke:USCensusPop|show}}
Параметры

Принимает следующие параметры вызывающего шаблона:

  • |1870 =: численность населения в году
  • |1870n =: примечание к году (обычно это звёздочка)
  • |estyear =: год ожидаемой численности
  • |estimate =: ожидаемая численности
  • |estref =: ссылка на АИ ожидаемой численности
  • |footnote =: примечание под таблицей
  • |align = выравнивание:
    • right плавающий по правому краю страницы
    • left плавающий по левому краю страницы
    • center по центру
    • none слева, запрет обтекания шаблона
  • |collapsed =
    • yes отображение в свернутом виде
p = {}

local function round(value, precision)
	local rescale = math.pow( 10, precision );
	return math.floor( value * rescale + 0.5 ) / rescale;
end

function p.show(frame)
	local parent = frame:getParent(frame)
	local args = parent.args;
	local list = {}
	for arg in pairs( args) do
		local year = tonumber(arg) 
		local value = tonumber(args[arg])
		if year ~= nil and value ~= nil then
			table.insert(list, {['year'] = year, ['value'] = value })
		end
	end
	if table.getn(list) == o then
		-- нет данных
		return ''
	end
	local estyear =  args['estyear'];
	if estyear ~= nil then
		estyear = tonumber(estyear)
	end
	local estimate =  args['estimate'];
	if estimate ~= nil then
		estimate = tonumber(estimate)
	end
	if estyear ~= nil and estimate ~= nil then
		table.insert(list, {['year'] = estyear, ['value'] = estimate })
	end
	table.sort(list, function(a, b) return a.year < b.year end)
	
	local lang = mw.language.new('ru');
	local result = mw.html.create('table')
	local collapsed = args['collapsed'];
	local class = 'standard'
	if collapsed ~= nil then
		class = class .. ' collapsible collapsed'
	end
	local aligns = {
		['left'] = 'float: left; clear: left; margin: 0 1em 1em 0;',
		['center'] = 'float: none; margin-left: auto; margin-right: auto;',
		['none'] = 'float: none; margin: 0 1em 1em 0;',
		['right'] = 'float: right; clear: right; margin: 0 0 1em 1em;'
	}
	local align = args['align'] or 'right'
	if aligns[align] == nil then
		align = 'right'
	end
	result
		:addClass(class)
		:cssText(aligns[align] .. ' text-align:right')
		:attr('cellspacing', '0')
		:attr('cellpadding', '1')
	local title = args['title'] or 'Перепись населения'
	result
		:newline()
		:tag('caption')
		:css('background-color', 'var(--background-color-progressive-subtle, #eaf3ff)')
		:css('border', '1px solid var(--border-color-base,#a2a9b1)')
		:css('color', 'inherit')
		:css('font-size', '110%')
		:css('margin-bottom', '-1px')
		:css('padding', '0.2em 0.4em')
		:wikitext(title)
		:done()
		:done()
		:newline()
	result
		:tag('tr')
		:cssText('font-size:95%')
		:tag('th')
		:attr('scope', 'col')
		:wikitext('Год переписи')
		:done()
		:tag('th')
		:attr('scope', 'col')
		:wikitext(frame:expandTemplate{title = 'abbr', args = {'Нас.', 'Население', '0'}})
		:done()
		:tag('th')
		:attr('scope', 'col')
		:done()
		:tag('th')
		:attr('scope', 'col')
		:wikitext(frame:expandTemplate{title = 'abbr', args = {'%±', 'Изменение в процентах', '0'}})
		:done()
		:done()
		:newline()
	
	for i, row in ipairs(list) do
		local change = 0
		if i > 1 then
			change = 100 * list[i].value/list[i-1].value - 100
		end
		list[i].change = change
--		mw.logObject(list[i], 'row')
		local line = result
			:tag('tr')
			
		if row.year == estyear then
			line:tag('th')
				:attr('scope', 'row')
				:css('background', 'transparent')
				:css('color', 'inherit')
				:css('text-align', 'center')
				:wikitext(frame:expandTemplate{title = 'comment', args = {row.year, 'Текущее значение'}})
				:done()
		else
			line:tag('th')
				:attr('scope', 'row')
				:css('background', 'transparent')
				:css('color', 'inherit')
				:css('text-align', 'center')
				:wikitext('[[Перепись населения США (' .. row.year .. ')|' .. row.year .. ']]')
				:done()
		end
		line:tag('td')
			:cssText('padding-left:8px')
			:wikitext(row.value)
			:done()
		if row.year == estyear then
		line:tag('td')
			:cssText('padding-left:0; text-align:left;')
			:wikitext(args['estref'] or '')
			:done()
		else
		line:tag('td')
			:cssText('padding-left:0; text-align:left;')
			:wikitext(args[row.year .. 'n'] or '')
			:done()
		end
		if change == 0 then
			line
				:tag('td')
				:cssText('padding-left:0; text-align:center;')
				:wikitext('—')
				:done()
		else
			line
				:tag('td')
				:cssText('padding-left:8px;')
				:wikitext( lang:formatNum(round(change, 1)) .. '%')
				:done()
		end
		result
			:done()
			:newline()
	end
	local footnote = args['footnote'];
	if footnote ~= nil and  footnote ~= '' then
		local years = ''
		if list[1] ~= nil then
			years = list[1].year
		end
		if list[#list] ~= nil then
			years = years .. '–' .. list[#list].year 
		end
		if years ~= '' then
			years = years.. ' '
		end
		result
			:tag('tr')
			:tag('td')
			:attr('colspan', '4')
			:cssText('border-top:1px solid black; font-size:85%; text-align:left')
			:wikitext(years .. footnote)
			:done()
			:done()
	end
	result:allDone()
--	mw.logObject(list)
	return tostring(result)
end

return p