Модуль:WikidataCoords/пісочниця

{{i}} Документація модуля[створити]
local p = {};

--Розділення координат вказаних у форматі через /
local function splitCoord(args, s)
	if s and s~= nil then
		local iterator = mw.ustring.gmatch(s, "[^/]+");
		local i = 1;
		for w in iterator do
			args[i] = w;
			i = i + 1;
		end	
	end
	
	for i=1,10 do
		if args[i] == nil then
			args[i] = ""
		else
			args[i] = args[i]:match( '^%s*(.-)%s*$' );  --remove whitespace
		end
	end
	
	return args
end

-- Типові значення аргументів
local defaultArgs = {
	['lat_deg'] = '',
	['lat_min'] = '0',
	['lat_sec'] = '0',
	['lat_dir'] = 'N',
	['lon_deg'] = '',
	['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'
};

local function getSep(lparam, rparam) 
	local ret
	if lparam ~= '' and rparam ~= '' then
		ret = lparam .. '_' .. rparam
	else
		ret = lparam .. rparam
	end
	
	return ret
end	

-- Метод викликає шаблон, додаючи до параметрів координати з Вікіданих
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;

	-- Формат виводу
	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 == '') and (not args.coord or args.coord == '') then
		-- Отримання координат із Вікіданих
		frame.args = {
			['property'] = 'p625',
			['plain'] = true
		};
		local coords = moduleWikidata.formatProperty( frame );
		
		-- Якщо параметри пусті, шаблон не викликається
		if not coords or coords == '' then
			return '';
		end
		
		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.lat_deg == '' and args.lon_deg == '') 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.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
	
	if outType ~= 'coord' then
		args = splitCoord(args, args.coord)
	end	
	
	if 'coord' == template then
		 local params = {}
		 params.type = args.type and ('type:' .. args.type) or ''
		 params.region = args.region and ('region:' .. args.region) or ''
		 params.scale = args.scale and ('scale:' .. args.scale) or ''
		 params.display = args.display and ('display:' .. args.display) or ''
		 
		 args.type = ''
		 args.region = ''
		 args.scale = ''
		 args.display = ''
		 
		 args[9] = ''
		 for key, value in pairs(params) do
		 	args[9] = getSep(args[9], value)
		 end
	end	

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

return p;
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya