<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ALocation_map%2Fsandbox2</id>
	<title>Module:Location map/sandbox2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ALocation_map%2Fsandbox2"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Location_map/sandbox2&amp;action=history"/>
	<updated>2026-07-29T07:47:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Location_map/sandbox2&amp;diff=143887&amp;oldid=prev</id>
		<title>imported&gt;Mr. Stradivarius: remove a couple of new lines that weren&#039;t in the original</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Location_map/sandbox2&amp;diff=143887&amp;oldid=prev"/>
		<updated>2014-04-08T13:13:55Z</updated>

		<summary type="html">&lt;p&gt;remove a couple of new lines that weren&amp;#039;t in the original&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--=============================================================&lt;br /&gt;
-- Module:Location_map/sandbox2 - Map marker with autofixing&lt;br /&gt;
--=============================================================&lt;br /&gt;
--&lt;br /&gt;
--  This version of Module:Location_map will autofix the&lt;br /&gt;
--  parameters, to attempt to display a map marker even&lt;br /&gt;
--  though the parameters might be invalid.&lt;br /&gt;
--&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local function round(n, digits)&lt;br /&gt;
	local mult = math.pow(10, digits)&lt;br /&gt;
	return math.floor(n * mult + 0.5) / mult&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getMapParams(map, frame)&lt;br /&gt;
	if mw.title.new(&amp;#039;Module:Location map/data/&amp;#039; .. map).exists then&lt;br /&gt;
		local mapData = mw.loadData(&amp;#039;Module:Location map/data/&amp;#039; .. map)&lt;br /&gt;
		return function(name, params)&lt;br /&gt;
			if mapData[name] == nil then&lt;br /&gt;
				return &amp;#039;&amp;#039;&lt;br /&gt;
			elseif params then&lt;br /&gt;
				return mw.message.newRawMessage(mapData[name], unpack(params)):plain()&lt;br /&gt;
			else&lt;br /&gt;
				return mapData[name]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local cache = {}&lt;br /&gt;
		return function(name, params)&lt;br /&gt;
			if params then&lt;br /&gt;
				return frame:expandTemplate{title = &amp;#039;Location map &amp;#039; .. map, args = { name, unpack(params) }}&lt;br /&gt;
			else&lt;br /&gt;
				if cache[name] == nil then&lt;br /&gt;
					cache[name] = frame:expandTemplate{title = &amp;#039;Location map &amp;#039; .. map, args = { name }}&lt;br /&gt;
				end&lt;br /&gt;
				return cache[name]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function decdeg(degrees, minutes, seconds, hemisphere, digits, decimal)&lt;br /&gt;
	if degrees == nil then&lt;br /&gt;
                local n = tonumber(decimal);&lt;br /&gt;
                if n == nil then&lt;br /&gt;
                  n = tonumber( string.sub(decimal,1,-2) );&lt;br /&gt;
                end&lt;br /&gt;
                if n == nil then&lt;br /&gt;
                  n = tonumber( string.sub(decimal,1,-3) );&lt;br /&gt;
                end&lt;br /&gt;
		return n&lt;br /&gt;
	end&lt;br /&gt;
	decimal = (degrees or 0) + (minutes or 0)/60 + (seconds or 0)/3600&lt;br /&gt;
	if hemisphere == &amp;#039;W&amp;#039; or hemisphere == &amp;#039;w&amp;#039; or hemisphere == &amp;#039;S&amp;#039; or  hemisphere == &amp;#039;s&amp;#039; then&lt;br /&gt;
		decimal = -decimal&lt;br /&gt;
	end&lt;br /&gt;
	if digits == nil then&lt;br /&gt;
		digits = 7&lt;br /&gt;
	end&lt;br /&gt;
	return round(decimal, digits)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.top(frame, args, map)&lt;br /&gt;
	if not args then&lt;br /&gt;
		args = getArgs(frame)&lt;br /&gt;
	end&lt;br /&gt;
	if not map then&lt;br /&gt;
		map = getMapParams(args[1], frame)&lt;br /&gt;
	end&lt;br /&gt;
	local width&lt;br /&gt;
	if args.width then&lt;br /&gt;
		width = mw.ustring.gsub(args.width, &amp;#039;px&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		width = round((args.default_width or 240) * (tonumber(map(&amp;#039;defaultscale&amp;#039;)) or 1), 0)&lt;br /&gt;
	end&lt;br /&gt;
	local retval = &amp;#039;&amp;#039;&lt;br /&gt;
	if args.float == &amp;#039;center&amp;#039; then&lt;br /&gt;
		retval = retval .. &amp;#039;&amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if args.caption then&lt;br /&gt;
		retval = retval .. &amp;#039;&amp;lt;div class=&amp;quot;thumb &amp;#039;&lt;br /&gt;
		if args.float == &amp;#039;&amp;quot;left&amp;quot;&amp;#039; or args.float == &amp;#039;left&amp;#039; then&lt;br /&gt;
			retval = retval .. &amp;#039;tleft&amp;#039;&lt;br /&gt;
		elseif args.float == &amp;#039;&amp;quot;center&amp;quot;&amp;#039; or args.float == &amp;#039;center&amp;#039; or args.float == &amp;#039;&amp;quot;none&amp;quot;&amp;#039; or args.float == &amp;#039;none&amp;#039; then&lt;br /&gt;
			retval = retval .. &amp;#039;tnone&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			retval = retval .. &amp;#039;tright&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		retval = retval .. &amp;#039;&amp;quot;&amp;gt;&amp;lt;div &amp;lt;!--class=&amp;quot;thumbinner&amp;quot;--&amp;gt; style=&amp;quot;width:&amp;#039; .. (width + 2) .. &amp;#039;px; &amp;#039;&lt;br /&gt;
		if args.border == &amp;#039;none&amp;#039; then&lt;br /&gt;
			retval = retval .. &amp;#039;border: none;&amp;#039;&lt;br /&gt;
		elseif args.border then&lt;br /&gt;
			retval = retval .. &amp;#039;border-color:&amp;#039; .. args.border .. &amp;#039;;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		retval = retval .. &amp;#039;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;position: relative; &amp;#039;&lt;br /&gt;
		if args.border ~= &amp;#039;none&amp;#039; then&lt;br /&gt;
			retval = retval .. &amp;#039;border: 1px solid lightgray&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		retval = retval .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		retval = retval .. &amp;#039;&amp;lt;div style=&amp;quot;width:&amp;#039; .. width .. &amp;#039;px; &amp;#039;&lt;br /&gt;
		if args.float == &amp;#039;&amp;quot;left&amp;quot;&amp;#039; or args.float == &amp;#039;left&amp;#039; then&lt;br /&gt;
			retval = retval .. &amp;#039;float: left; clear: left&amp;#039;&lt;br /&gt;
		elseif args.float == &amp;#039;&amp;quot;center&amp;quot;&amp;#039; or args.float == &amp;#039;center&amp;#039; then&lt;br /&gt;
			retval = retval .. &amp;#039;float: none; clear: both; margin-left: auto; margin-right: auto&amp;#039;&lt;br /&gt;
		elseif args.float == &amp;#039;&amp;quot;none&amp;quot;&amp;#039; or args.float == &amp;#039;none&amp;#039; then&lt;br /&gt;
			retval = retval .. &amp;#039;float: none; clear: none&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			retval = retval .. &amp;#039;float: right; clear: right&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		retval = retval .. &amp;#039;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;width:&amp;#039; .. width .. &amp;#039;px; padding:0&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;position: relative; &amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local image&lt;br /&gt;
	if args.AlternativeMap then&lt;br /&gt;
		image = args.AlternativeMap&lt;br /&gt;
	elseif args.relief and map(&amp;#039;image1&amp;#039;) ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		image = map(&amp;#039;image1&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		image = map(&amp;#039;image&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	retval = retval .. &amp;#039;[[File:&amp;#039; .. image .. &amp;#039;|&amp;#039; .. width .. &amp;#039;px|&amp;#039; .. (args.alt or ((args.label or mw.title.getCurrentTitle().text) .. &amp;#039; is located in &amp;#039; .. map(&amp;#039;name&amp;#039;))) .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	if args.overlay_image then&lt;br /&gt;
		retval = retval .. &amp;#039;&amp;lt;div style=&amp;quot;position:absolute; top: 0; left: 0&amp;quot;&amp;gt;[[File:&amp;#039; .. args.overlay_image .. &amp;#039;|&amp;#039; .. width .. &amp;#039;px|link=File:&amp;#039; .. image .. &amp;#039;]]&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return retval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.bottom(frame, args, map)&lt;br /&gt;
	if not args then&lt;br /&gt;
		args = getArgs(frame)&lt;br /&gt;
	end&lt;br /&gt;
	if not map then&lt;br /&gt;
		map = getMapParams(args[1], frame)&lt;br /&gt;
	end&lt;br /&gt;
	local retval = &amp;#039;&amp;#039;&lt;br /&gt;
	retval = retval .. &amp;#039;&amp;lt;/div&amp;gt;&amp;lt;div &amp;#039; .. (args.caption and &amp;#039;class=&amp;quot;thumbcaption&amp;quot;&amp;#039; or &amp;#039;style=&amp;quot;font-size: 90%; padding-top:3px&amp;quot;&amp;#039;) .. &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
	local caption = frame.args.caption or frame:getParent().args.caption&lt;br /&gt;
&lt;br /&gt;
	if args.lon_deg == nil then&lt;br /&gt;
                local n = tonumber(args.long);&lt;br /&gt;
                if n == nil then&lt;br /&gt;
		  if caption==nil then caption=&amp;#039;&amp;#039; end&lt;br /&gt;
                  caption = caption .. &amp;quot; &amp;lt;sup&amp;gt;[fix long=&amp;quot; ..args.long.. &amp;quot;]&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
	end&lt;br /&gt;
	if args.lat_deg == nil then&lt;br /&gt;
                local n = tonumber(args.lat);&lt;br /&gt;
                if n == nil then&lt;br /&gt;
		  if caption==nil then caption=&amp;#039;&amp;#039; end&lt;br /&gt;
                  caption = caption .. &amp;quot; &amp;lt;sup&amp;gt;[fix lat=&amp;quot; ..args.lat.. &amp;quot;]&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
	end&lt;br /&gt;
	if caption and not args.caption_undefined then&lt;br /&gt;
		retval = retval .. mw.text.trim(caption)&lt;br /&gt;
	else&lt;br /&gt;
		retval = retval .. (args.label or mw.title.getCurrentTitle().text) .. &amp;#039; (&amp;#039; .. map(&amp;#039;name&amp;#039;) .. &amp;#039;)&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	retval = retval .. &amp;#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	if args.float == &amp;#039;center&amp;#039; then&lt;br /&gt;
		retval = retval .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return retval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.container(frame, args, map)&lt;br /&gt;
	if not args then&lt;br /&gt;
		args = getArgs(frame)&lt;br /&gt;
	end&lt;br /&gt;
	if not map then&lt;br /&gt;
		map = getMapParams(args[1], frame)&lt;br /&gt;
	end&lt;br /&gt;
	return p.top(frame, args, map) .. (args.places or &amp;#039;&amp;#039;) .. p.bottom(frame, args, map)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function markOuterDiv(x, y, content)&lt;br /&gt;
	return &amp;#039;&amp;lt;div style=&amp;quot;position:absolute; z-index:2; top:&amp;#039; .. y .. &amp;#039;%;left:&amp;#039; .. x .. &amp;#039;%;height:0;width:0;margin:0;padding:0&amp;quot;&amp;gt;&amp;#039; .. content .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function markImageDiv(mark, marksize, label, link, alt, title)&lt;br /&gt;
	local retval = &amp;#039;&amp;lt;div style=&amp;quot;position:relative;text-align:center;left:-&amp;#039; .. round(marksize / 2, 0) .. &amp;#039;px;top:-&amp;#039; .. round(marksize / 2, 0) .. &amp;#039;px;width:&amp;#039; .. marksize .. &amp;#039;px;font-size:&amp;#039; .. 9 .. &amp;#039;px;line-height:0&amp;quot;&amp;#039;&lt;br /&gt;
	if title then&lt;br /&gt;
		retval = retval .. &amp;#039; title=&amp;quot;&amp;#039; .. title .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	retval = retval .. &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
	if marksize ~= 0 then&lt;br /&gt;
		retval = retval .. &amp;#039;[[File:&amp;#039; .. mark .. &amp;#039;|&amp;#039; .. marksize .. &amp;#039;x&amp;#039; .. marksize .. &amp;#039;px|&amp;#039; .. label .. &amp;#039;|link=&amp;#039; .. link&lt;br /&gt;
		if alt then&lt;br /&gt;
			retval = retval .. &amp;#039;|alt=&amp;#039; .. alt&lt;br /&gt;
		end&lt;br /&gt;
		retval = retval .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return retval .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function markLabelDiv(label, label_size, label_width, position, background, x)&lt;br /&gt;
	local retval = &amp;#039;&amp;lt;div style=&amp;quot;font-size:&amp;#039; .. label_size .. &amp;#039;%;line-height:110%;position:relative;top:-1.5em;width:&amp;#039; .. label_width .. &amp;#039;em;&amp;#039;&lt;br /&gt;
	if position == &amp;#039;top&amp;#039; then -- specified top&lt;br /&gt;
		retval = retval .. &amp;#039;top:-2.65em;left:-3em;text-align:center&amp;#039;&lt;br /&gt;
	elseif position == &amp;#039;bottom&amp;#039; then -- specified bottom&lt;br /&gt;
		retval = retval .. &amp;#039;top:-0.15em;left:-3em;text-align:center&amp;#039;&lt;br /&gt;
	elseif position == &amp;#039;left&amp;#039; or (tonumber(x) &amp;gt; 70 and position ~= &amp;#039;right&amp;#039;) then -- specified left or autodetected to left&lt;br /&gt;
		retval = retval .. &amp;#039;left:-6.5em;text-align:right&amp;#039;&lt;br /&gt;
	else -- specified right or autodetected to right&lt;br /&gt;
		retval = retval .. &amp;#039;left:0.5em;text-align:left&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	retval = retval .. &amp;#039;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;padding:1px&amp;#039;&lt;br /&gt;
	if background then&lt;br /&gt;
		retval = retval .. &amp;#039;;background-color:&amp;#039; .. background&lt;br /&gt;
	end&lt;br /&gt;
	return retval .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. label .. &amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getX(longitude, latitude, lon_dir, left, right, top, bottom, crosses180, skew, lon_shift)&lt;br /&gt;
	local crosses180_correction = crosses180 and lon_dir == &amp;#039;W&amp;#039; and (-36000/(left - right)) or 0&lt;br /&gt;
	if skew then&lt;br /&gt;
		local lat_ratio = (top - latitude)/(top - bottom)&lt;br /&gt;
		local skew_factor = (1 - skew) * lat_ratio + skew&lt;br /&gt;
		longitude = (longitude - 0.5 * (right + left) + lon_shift) * skew_factor + 0.5 * (right + left) - lon_shift&lt;br /&gt;
	end&lt;br /&gt;
	return round(crosses180_correction + 100 * (longitude - left) / (right - left), 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getY(latitude, top, bottom)&lt;br /&gt;
	return round(100 * (top - latitude) / (top - bottom), 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mark(frame, args, map)&lt;br /&gt;
	if not args then&lt;br /&gt;
		args = getArgs(frame)&lt;br /&gt;
	end&lt;br /&gt;
	if not map then&lt;br /&gt;
		map = getMapParams(args[1], frame)&lt;br /&gt;
	end&lt;br /&gt;
	local x, y, longitude, latitide&lt;br /&gt;
	longitude = decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, nil, args.long)&lt;br /&gt;
	latitude = decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, nil, args.lat)&lt;br /&gt;
	if map(&amp;#039;x&amp;#039;) ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		x = frame:callParserFunction(&amp;#039;#expr&amp;#039;, map(&amp;#039;x&amp;#039;, { latitude, longitude }))&lt;br /&gt;
	else&lt;br /&gt;
		x = getX(longitude, latitude, args.lon_dir, map(&amp;#039;left&amp;#039;), map(&amp;#039;right&amp;#039;), map(&amp;#039;top&amp;#039;), map(&amp;#039;bottom&amp;#039;), map(&amp;#039;crosses180&amp;#039;) ~= &amp;#039;&amp;#039;, tonumber(args.skew or map(&amp;#039;skew&amp;#039;)), args.lon_shift or 0)&lt;br /&gt;
	end&lt;br /&gt;
	if map(&amp;#039;y&amp;#039;) ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		y = frame:callParserFunction(&amp;#039;#expr&amp;#039;, map(&amp;#039;y&amp;#039;, { latitude, longitude }))&lt;br /&gt;
	else&lt;br /&gt;
		y = getY(latitude, map(&amp;#039;top&amp;#039;), map(&amp;#039;bottom&amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
	local mark = args.mark or map(&amp;#039;mark&amp;#039;)&lt;br /&gt;
	if mark == &amp;#039;&amp;#039; then&lt;br /&gt;
		mark = &amp;#039;Red pog.svg&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local divContent = markImageDiv(mark, tonumber(args.marksize) or tonumber(map(&amp;#039;marksize&amp;#039;)) or 8, args.label or mw.title.getCurrentTitle().text, args.link or &amp;#039;&amp;#039;, args.alt, args[2])&lt;br /&gt;
	if args.label and args.position ~= &amp;#039;none&amp;#039; then&lt;br /&gt;
		divContent = divContent .. markLabelDiv(args.label, args.label_size or 90, args.label_width or 6, args.position, args.background, x)&lt;br /&gt;
	end&lt;br /&gt;
	return markOuterDiv(x, y, divContent)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, args, map)&lt;br /&gt;
	if not args then&lt;br /&gt;
		args = getArgs(frame)&lt;br /&gt;
	end&lt;br /&gt;
	if not args[1] then&lt;br /&gt;
		args[1] = &amp;#039;World&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if not map then&lt;br /&gt;
		map = getMapParams(args[1], frame)&lt;br /&gt;
	end&lt;br /&gt;
	return p.top(frame, args, map) .. p.mark(frame, args, map) .. p.bottom(frame, args, map)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Mr. Stradivarius</name></author>
	</entry>
</feed>