PhotosLocation

From Wikipedia, the free encyclopedia

require('strict')

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



local p = {}



--[[--------------------------< 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:WikdataCoord|main|{{#property:P625|from={{{1}}}}}|{{{2}}}|display={{{display}}}|format={{{format}}}|name={{{name}}}|notes={{{notes}}}}}



]]



function p.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';			-- error message and quit

	elseif mw.ustring.match (args1], '%d+°%d+&#39;[%d%.]+&#34;[NS],%s*%d+°%d+&#39;[%d%.]+&#34;[EW]') then			-- if the returned data looks like 55°13&#39;12&#34;N, 23°17&#39;17&#34;E

		lat_long1], lat_long2], lat_long3], lat_long4], lat_long5], lat_long6], lat_long7], lat_long8 =	-- parse it into the table

			mw.ustring.match (args1], '(%d+)°(%d+)&#39;([%d%.]+)&#34;([NS]),%s*(%d+)°(%d+)&#39;([%d%.]+)&#34;([EW])')

	elseif mw.ustring.match (args1], '%d+°%d+&#39;[NS],%s*%d+°%d+&#39;[EW]') then									-- if the returned data looks like 54°24&#39;N, 25°25&#39;E

		lat_long1], lat_long2], lat_long3], lat_long4], lat_long5], lat_long6 =								-- parse it into the table

			mw.ustring.match (args1], '(%d+)°(%d+)&#39;([NS]),%s*(%d+)°(%d+)&#39;([EW])')

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

		lat_long1], lat_long2], lat_long3], lat_long4], lat_long5], lat_long6], lat_long7], lat_long8 =	-- parse it into the table

			mw.ustring.match (args1], '(%d+)°(%d+)[′\']([%d%.]+)[″\"]([NS]),?%s*(%d+)°(%d+)[′\']([%d%.]+)[″\"]([EW])')

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

		lat_long1], lat_long2], lat_long3], lat_long4], lat_long5], lat_long6 =								-- parse it into the table

			mw.ustring.match (args1], '(%d+)°(%d+)[′\']([NS]),?%s*(%d+)°(%d+)[′\']([EW])')

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

		lat_long1], lat_long2], lat_long3], lat_long4 =														-- parse it into the table

			mw.ustring.match (args1], '(%d+%.?%d*)°([NS]),?%s*(%d+%.?%d*)°([EW])')

	else

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

	end



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

		if is_set (lat_long5]) then											-- set when args[1] format is dms

			lat_long9	= args2];

		else

			lat_long5	= args2];												-- this one when args[1] is decimal degrees format

		end

	end

	if is_set (args.display) then

		lat_long.display = args.display;

	end

	if is_set (args.format) then

		lat_long.format = args.format;

	end

	if is_set (args.name) then

		lat_long.name = args.name;

	end

	if is_set (args.notes) then

		lat_long.notes = args.notes;

	end





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

end



return p;