Модуль:WikidataCoords

З Вікіпедыі, свабоднай энцыклапедыі

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

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'
};

local defaultArgsWikidata= {
	['lat_deg_wikidata'] = '',
	['lat_min_wikidata'] = '0',
	['lat_sec_wikidata'] = '0',
	['lat_dir_wikidata'] = 'N',
	['lon_deg_wikidata'] = '0',
	['lon_min_wikidata'] = '0',
	['lon_sec_wikidata'] = '0',
	['lon_dir_wikidata'] = 'E'
};

-- Метад выклікае шаблон, дадаючы да параметраў каардынаты з Вікіданых як _wikidata
function p.execTplAddCoords( 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] );

	-- Калі параметры непустыя, шаблон не выклікаецца 
	if not args.lat_deg or args.lat_deg == '' then
		return '';
	else
		-- Атрыманне каардынат з Вікіданых
		local propertyFilter = 'p625';
		if args.propertyFilter then
	      propertyFilter = args.propertyFilter
		end
		frame.args = {
			['property'] = propertyFilter,
			['subvalue'] = 'plain',
			['plain'] = true
		};
		local coords = moduleWikidata.formatProperty( frame );
		mw.log( coords )
		if (coords) then
			coords = string.gsub( coords, ''', '′' );
			coords = string.gsub( coords, '"', '″' );
	
			-- Пераўтварэнне каардынат у значэнні асобных параметраў
			coords = mw.text.split(coords, ',', true);
			local lat = tonumber(coords[1]);
			local lon = tonumber(coords[2]);
			if lat and lat ~= '' then
				args.lat_deg_wikidata = math.abs(lat);
				if lat >= 0 then
					args.lat_dir_wikidata = 'N'
				else
					args.lat_dir_wikidata = 'S'
				end
			end
			if lon and lon ~= '' then
				args.lon_deg_wikidata = math.abs(lon);
				if lon >= 0 then
					args.lon_dir_wikidata = 'E'
				else
					args.lon_dir_wikidata = 'W'
				end
			end
		end
	end

	-- Устаноўка значэнняў па змоўчанні
	for name, value in pairs( defaultArgsWikidata ) do
	    if not args[name] or args[name] == '' then
	    	args[name] = value;
	    end
    	args[name] = mw.text.trim( args[name], '°′″ ' );
	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
	
	return frame:expandTemplate{ title = template, args = args };
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;

	local isWikidata = false
	if (not args.lat_deg or args.lat_deg == '') and (not args.coord or args.coord == '') then
		isWikidata = true
		-- Атрыманне каардынат з Вікіданых
		local propertyFilter = 'p625';
		if args.propertyFilter then
	      propertyFilter = args.propertyFilter
		end
		frame.args = {
			['property'] = propertyFilter,
			['subvalue'] = 'plain',
			['plain'] = true
		};
		local coords = moduleWikidata.formatProperty(frame);
		mw.log( 'cart' .. coords )

		if (coords) then
		coords = string.gsub( coords, ''', '′' );
		coords = string.gsub( coords, '"', '″' );

		-- Пераўтварэнне каардынат у значэнні асобных параметраў
		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
	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;