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

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

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

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;

	if not args.lat_deg or args.lat_deg == '' then
		-- Атрыманьне каардынатаў зь ВікіЗьвестак
		frame.args = {
			['property'] = 'p625',
			['plain'] = true
		};
		local coords = moduleWikidata.formatProperty( frame );
		coords = string.gsub( coords, ''', '\'' );
		coords = string.gsub( coords, '"', '"' );

		-- Пераўтварэньне каардынатаў у значэньні асобных парамэтраў
		coords = mw.text.split( coords, ', ', true );
		local lat = coords[1];
		local lon = coords[2];
		if lat and lat ~= '' then
			args['Шырата градусаў'] = string.match( lat, '%d+°' );
			args['Шырата хвілінаў'] = string.match( lat, '%d+\'' );
			args['Шырата сэкундаў'] = string.match( lat, '[0-9%.]+"' );
			args['Шырата паўшар’е'] = string.match( lat, '[NS]' );
		end
		if lon and lon ~= '' then
			args['Даўгата градусаў'] = string.match( lon, '%d+°' );
			args['Даўгата хвілінаў'] = string.match( lon, '%d+\'' );
			args['Даўгата сэкундаў'] = string.match( lon, '[0-9%.]+"' );
			args['Даўгата паўшар’е'] = string.match( lon, '[EW]' );
		end
	end

	-- Заданьне дапомных значэньняў
	for name, value in pairs( defaultArgs ) do
	    if not args[name] or args[name] == '' then
	    	args[name] = value;
	    end
    	args[name] = mw.text.trim( args[name], \'" ' );
	end
	
	if (args['Шырата паўшар’е'] == 'N') then
		args['Шырата паўшар’е'] = 'паўночнае';
	else args['Шырата паўшар’е'] = 'паўднёвае';
	end
		
	if (args['Даўгата паўшар’е'] == 'E') then
		args['Даўгата паўшар’е'] = 'усходняе';
	else args['Даўгата паўшар’е'] = 'заходняе';
	end
	
	-- Асьлі парамэтры пустыя, шаблён не выклікаецца
	if (args.lat_deg == '' and args.lon_deg == '') and not coord then
		return '';
	end
	
	-- Асьлі ў другім парамэтры пазначаны фармат вываду
	if outType and not 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.lat_deg .. '/' .. args.lat_min .. '/' .. args.lat_sec .. '/' .. args.lat_dir .. '/' ..	args.lon_deg .. '/' ..	args.lon_min .. '/' .. args.lon_sec .. '/' .. args.lon_dir
		end
	end

	return frame:expandTemplate{ title = template, args = args };
end

return p;