Модуль:Песочница/Vort

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

local function amountToNumber(amount)
	return tonumber(string.gsub(amount, '^% ', ''), 10);
end

local function formatNum(number)
	return mw.language.getContentLanguage():formatNum(
		math.floor(number * 100) / 100);
end

local function densityq(q)
	local p1082 = mw.wikibase.getBestStatements(q, 'P1082');
	if #p1082 == 0 then return nil; end;
	local p2046 = mw.wikibase.getBestStatements(q, 'P2046');
	if #p2046 == 0 then return nil; end;
	local population = amountToNumber(p1082[1].mainsnak.datavalue.value.amount);
	local areaValue = p2046[1].mainsnak.datavalue.value;
	local areaAmount = tonumber(areaValue.amount, 10);
	local areaUnit = string.gsub(areaValue.unit,
		'http://www.wikidata.org/entity/', '');
	local p2370 = mw.wikibase.getBestStatements(areaUnit, 'P2370');
	if not p2370 then return nil; end;
	local unitToSI = amountToNumber(p2370[1].mainsnak.datavalue.value.amount);
	local areaKM2 = areaAmount * unitToSI / 1000000;
	return population / areaKM2;
end

local function densityi()
	local q = mw.wikibase.getEntityIdForCurrentPage();
	if not q then return nil;
	else return densityq(q); end;
end

function p.density(frame)
	local q = frame.args[1];
	local unit = frame.args['unit'];
	local result = nil;
	if not q then result = densityi();
	else result = densityq(q); end;
	if not result then return nil;
	else if unit
		then return formatNum(result) .. ' ' .. unit;
		else return formatNum(result); end;
	end;
end

return p