PhotosLocation

Permanently protected module
From Wikipedia, the free encyclopedia


require('strict')

local getArgs = require('Module:Arguments').getArgs



local patterns = {

	'(%d+)°(%d+)'([%d%.]+)"([NS]),%s*(%d+)°(%d+)'([%d%.]+)"([EW])',		-- if the returned data looks like 55°13'12"N, 23°17'17"E

	'(%d+)°(%d+)'([NS]),%s*(%d+)°(%d+)'([EW])',									-- if the returned data looks like 54°24'N, 25°25'E

	'(%d+)°(%d+)[′\']([%d%.]+)[″\"]([NS]),?%s*(%d+)°(%d+)[′\']([%d%.]+)[″\"]([EW])',	-- when args[1] is a dms string that uses quotes or primes

	'(%d+)°(%d+)[′\']([NS]),?%s*(%d+)°(%d+)[′\']([EW])',								-- when args[1] is a dms string that uses quotes or primes, bit shorter format

	'(%d+%.?%d*)°([NS]),?%s*(%d+%.?%d*)°([EW])',										-- when args[1] is a decimal degrees string

	}



local params = {'display', 'format', 'name', 'notes'};							-- {{coord}} template paramters





--[[--------------------------< I S _ S E T >------------------------------------------------------------------



Whether variable is set or not.  A variable is set when it is not nil and not empty.



]]



local function is_set( var )

	return not (var == nil or var == '');

end





--[[--------------------------< M A I N >----------------------------------------------------------------------



Template entry point.  This function takes up to two unnamed positional parameters:

	1 = coordinate string typically from a call to Wikidata like this: {{#property:P625|from=Q...}}

	2 = coordinate parameters; see Template:Coord

	

Also takes the named parameters |display=, |format=, |name=, |notes= which it passes on to {{coord}}



Reformats the Wikidata coordinate string into unnamed parameters for {{coord}}



{{#invoke:WikidataCoord|main|{{#property:P625|from={{{1}}}}}|{{{2}}}|display={{{display}}}|format={{{format}}}|name={{{name}}}|notes={{{notes}}}}}



]]



local function main (frame)

	local args = getArgs(frame);

	local lat_long = {};														-- table of lat/long coords extracted from wikidata return 

	

	if not is_set (args1]) then												-- in case wikidata returns nothing (happens when Q... is wrong)

		return '<span style="font-size:100%" class="error">{{WikidataCoord}} – missing coordinate data</span>';		-- error message and quit

	else

		for _, pattern in ipairs (patterns) do

			lat_long1], lat_long2], lat_long3], lat_long4], lat_long5], lat_long6], lat_long7], lat_long8 =

				mw.ustring.match (args1], pattern)

			if lat_long1 then

				break;

			end

		end

	end



	if not lat_long1 then

		return '<span style="font-size:100%" class="error">{{WikidataCoord}} – malformed coordinate data</span>';	-- wikidata returned something else

	end

	

	if is_set (args2]) then													-- coordinate parameters are in second unnammed positional parameter

		table.insert (lat_long, args2]);										-- add coordinate parameters as next positional parameter after coordnates

	end



	for _, param in ipairs (params) do

		if is_set (argsparam]) then

			lat_longparam = argsparam];										-- add the named parameters if they have a value

		end

	end



	if args._debug then

		return table.concat ({'<code style="color:inherit; background:inherit; border:none;">{{coord|', table.concat (lat_long, '|' ), '}}</code>'});

	end

	return frame:expandTemplate ({title = 'coord', args=lat_long});				-- invoke template {{coord}} with wikidata lat/long

end





--[[--------------------------< E X P O R T E D   F U N C T I O N >--------------------------------------------

]]



return {main = main}