execTplWithCoords

вироиш

Дар {{Wikidata-coords}} истифода бурда мешавад.

Вызывает шаблон, указанный первым параметром, передавая в него все остальные параметры и добавляя lat_* и lon_* в случае их отсутствия.

Если вторым параметром передан формат 12345678, 23456789 или 345678910, то в дополнение к параметрам lat_* и lon_* координаты будут переданы в соответствующих числовых параметрах.

Если в шаблон нужно передать первый или второй числовой параметр, можно воспользоваться параметрами 01 и 02.


local p = {};

-- Значения аргументов по умолчанию
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'
};

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

	local isWikidata = false
	if (not args.lat_deg or args.lat_deg == '') 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.text.split(coords, ',', true);
		local lat = tonumber(coords[1]);
		local lon = tonumber(coords[2]);
		if lat and lat ~= '' then
			args.lat_deg = math.abs(lat);
			if lat >= 0 then
				args.lat_dir = 'N'
			else
				args.lat_dir = 'S'
			end
		end
		if lon and lon ~= '' then
			args.lon_deg = math.abs(lon);
			if lon >= 0 then
				args.lon_dir = 'E'
			else
				args.lon_dir = '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.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

	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;