Module:WikidataCoords

Wikipediýa, erkin ensiklopediýa
Jump to navigation Jump to search

Documentation for this module may be created at Module:WikidataCoords/doc

local p = {};

-- Значения аргументов по умолчанию
local defaultArgs = {
	['lat_deg'] = '',
	['lat_min'] = '0',
	['lat_sec'] = '0',
	['lat_dir'] = 'N',
	['lon_deg'] = '0',
	['lon_min'] = '0',
	['lon_sec'] = '0',
	['lon_dir'] = 'E'
};

-- Соотношение именованных и числовых параметров
local argsMap = {
	'lat_deg',
	'lat_min',
	'lat_sec',
	'lat_dir',
	'lon_deg',
	'lon_min',
	'lon_sec',
	'lon_dir'
};

-- Метод вызывает шаблон, добавляя к параметрам координаты из Викиданных
function p.execTplWithCoords( frame )
	local moduleWikidata = require( 'Module:Wikidata' );

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

	local template = mw.text.trim( args[1] );
	args[1] = 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.lat_deg = string.match( lat, '%d+°' );
			args.lat_min = string.match( lat, '%d+\'' );
			args.lat_sec = string.match( lat, '[0-9%.]+"' );
			args.lat_dir = string.match( lat, '[NS]' );
		end
		if lon and lon ~= '' then
			args.lon_deg = string.match( lon, '%d+°' );
			args.lon_min = string.match( lon, '%d+\'' );
			args.lon_sec = string.match( lon, '[0-9%.]+"' );
			args.lon_dir = 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[2] then
		local outType = mw.text.trim( args[2] );
		if outType == '12345678' then
			for i, name in ipairs( argsMap ) do
				args[i] = args[name];
				args[name] = nil;
			end
		end
	end

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

return p;