Перайсьці да зьместу

Модуль:КаардынатыЗьВікізьвестак

Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі

Дакумэнтацыю да гэтага модуля можна стварыць у Модуль:КаардынатыЗьВікізьвестак/Дакумэнтацыя

local p = {};

-- Дапомныя аргумэнты
local defaultArgs = {
	['Шырата градусаў'] = '',
	['Шырата хвілінаў'] = '0',
	['Шырата сэкундаў'] = '0',
	['Шырата паўшар’е'] = 'N',
	['Даўгата градусаў'] = '',
	['Даўгата хвілінаў'] = '0',
	['Даўгата сэкундаў'] = '0',
	['Даўгата паўшар’е'] = 'E'
};

-- Суадносіны пайменных і лічбавых парамэтраў
local argsMap = {
	'Шырата градусаў',
	'Шырата хвілінаў',
	'Шырата сэкундаў',
	'Шырата паўшар’е',
	'Даўгата градусаў',
	'Даўгата хвілінаў',
	'Даўгата сэкундаў',
	'Даўгата паўшар’е'
};

-- Мэтад выклікае шаблён, дадаючы да парамэтраў каардынаты зь Вікізьвестак
function p.execTplWithCoords(frame)
	local moduleWikidata = require('Модуль:Вікізьвесткі');

	local pFrame = frame:getParent();
	local args = mw.clone(pFrame.args);
	setmetatable(args, nil);

	local template = mw.text.trim(args[1]);
	args[1] = nil;

	-- Фармат вываду
	local outType = args[2]
	if outType then
		outType = mw.text.trim(outType);
	end

	-- Перавызначэньне 1 і 2 парамэтраў
	args[1] = args['01'];
	args['01'] = nil;
	args[2] = args['02'];
	args['02'] = nil;

	local isWikidata = false
	if (not args['Шырата градусаў'] or args['Шырата градусаў'] == '') and (not args.coord or args.coord == '') then
		isWikidata = true
		-- Атрыманьне каардынатаў зь Вікізьвестак
		frame.args = {
			['property'] = 'p625',
			['plain'] = true
		};
		local coords = moduleWikidata.formatProperty(frame);

	    -- Калі парамэтры пустыя, шаблён не выклікаецца
		if not coords or coords == '' then
			return '';
		end

		-- Выдаляем магчымыя ўдакладненьні, кшталту «каля»
		coords = mw.ustring.gsub(coords, '[^%d.,-]', "");

		-- Пераўтварэньне каардынатаў у значэньні асобных парамэтраў
		coords = mw.text.split(coords, ',', true);
		local lat = tonumber(coords[1]);
		local lon = tonumber(coords[2]);
		if lat and lat ~= '' then
			args['Шырата градусаў'] = math.abs(lat);
			if lat >= 0 then
				args['Шырата паўшар’е'] = 'N'
			else
				args['Шырата паўшар’е'] = 'S'
			end
		end
		if lon and lon ~= '' then
			args['Даўгата градусаў'] = math.abs(lon);
			if lon >= 0 then
				args['Даўгата паўшар’е'] = 'E'
			else
				args['Даўгата паўшар’е'] = 'W'
			end
		end
	end

	-- Заданьне дапомных значэньняў
	for name, value in pairs(defaultArgs) do
		if not args[name] or args[name] == '' then
			args[name] = value;
		end
	end

	-- Калі парамэтры пустыя, шаблён не выклікаецца
	if (args['Шырата градусаў'] == '' and args['Даўгата градусаў'] == '') and (not args.coord or args.coord == '') then
		return '';
	end

	-- Калі ў другім парамэтры пазначаны фармат вываду
	if outType and (not args.coord or args.coord == '') then
		-- Нумараваныя парамэтры, пачынаючы з n-га
		if outType == '12345678' or outType == '23456789' or outType == '345678910' then
			local n = 0;
			if outType == '23456789' then
				n = 1;
			elseif outType == '345678910' then
				n = 2;
			end

			for i, name in ipairs(argsMap) do
				args[i + n] = args[name];
				args[name] = nil;
			end
		end
		if outType == 'coord' then
			args['coord'] = args['Шырата градусаў'] ..
				'/' ..
				args['Шырата хвілінаў'] ..
				'/' ..
				args['Шырата сэкундаў'] ..
				'/' ..
				args['Шырата паўшар’е'] .. '/' .. args['Даўгата градусаў'] .. '/' .. args['Даўгата хвілінаў'] .. '/' .. args['Даўгата сэкундаў'] .. '/' .. args['Даўгата паўшар’е']
		end
	end

	local out = frame:expandTemplate { title = template, args = args }
	if not isWikidata then
		out = '<span class="no-wikidata" data-wikidata-property-id="P625">' .. out .. '</span>'
	end

	return out
end

return p;