Jump to content

Module:Location map

From Simple English Wikipedia, the free encyclopedia
Revision as of 18:10, 11 March 2014 by Jackmcbarn (talk | changes) (just working code)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Usage

This module implements the {{Location map}} and {{Location map~}} templates. Please see the template pages for usage instructions.

Known issues

Since the introduction of support for different captions when multiple maps are utilized, an issue has been highlighted.
Some infobox templates use their caption parameter directly instead of passing it to this module. This results in the display of a "##" between the two captions.
If you are unable to edit the infobox template, contact Bellezzasolo.

Tracking/maintenance categories

See also


local p = {}

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

local function round(n, digits)
	local mult = math.pow(10, digits)
	return math.floor(n * mult + 0.5) / mult
end

local function decdeg(degrees, minutes, seconds, hemisphere, digits, decimal)
	if decimal ~= nil then
		return tonumber(decimal)
	end
	decimal = (degrees or 0) + (minutes or 0)/60 + (seconds or 0)/3600
	if hemisphere == 'W' or hemisphere == 'w' or hemisphere == 'S' or  hemisphere == 's' then
		decimal = -decimal
	end
	if digits == nil then
		digits = 7
	end
	return round(decimal, digits)
end

function p.tilde(frame) -- {{location map~}}
	local args = getArgs(frame)
	local retval = '<div style="position: absolute; top: '
	local map_template = 'Location map ' .. args[1]
	local map_y = frame:expandTemplate{title = map_template, args = { 'y' }}
	if map_y and map_y ~= '' then
		retval = retval .. frame:callParserFunction('#expr', frame:expandTemplate{title = map_template, args = { 'y', decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, nil, args.lat), decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, nil, args.long) }})
	else
		local map_top = frame:expandTemplate{title = map_template, args = { 'top' }}
		local map_bottom = frame:expandTemplate{title = map_template, args = { 'bottom' }}
		retval = retval .. round(100 * (map_top - decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, nil, args.lat) ) / (map_top - map_bottom), 1)
	end
	retval = retval .. '%; left: '
	local map_x = frame:expandTemplate{title = map_template, args = { 'x' }}
	local x
	if map_x and map_x ~= '' then
		x = frame:callParserFunction('#expr', frame:expandTemplate{title = map_template, args = { 'x', decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, nil, args.lat), decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, nil, args.long) }})
	else
		local map_crosses180 = frame:expandTemplate{title = map_template, args = { 'crosses180' }}
		local map_left = frame:expandTemplate{title = map_template, args = { 'left' }}
		local map_right = frame:expandTemplate{title = map_template, args = { 'right' }}
		local crosses180_correction = map_crosses180 and map_crosses180 ~= '' and args.lon_dir == 'W' and (-36000/(map_left - map_right)) or 0
		x = round(crosses180_correction + 100 * (decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, nil, args.long) - map_left) / (map_right - map_left), 1)
	end
	retval = retval .. x .. '%; height: 0; width: 0; margin: 0; padding: 0;"><div style="position: relative; text-align: center; '
	local marksize = tonumber(args.marksize) or tonumber(frame:expandTemplate{title = map_template, args = { 'marksize' }}) or 8
	retval = retval .. 'left: -' .. round(marksize / 2, 0) .. 'px; top: -' .. round(marksize / 2, 0) .. 'px; width: ' .. marksize .. 'px; font-size: ' .. marksize .. 'px; line-height:0;'
	retval = retval .. '" title="' .. (args[2] or '') .. '">'
	local mark = args.mark or frame:expandTemplate{title = map_template, args = { 'mark' }}
	if mark == '' then mark = 'Red pog.svg' end
	retval = retval .. '[[File:' .. mark .. '|' .. marksize .. 'x' .. marksize .. 'px|' .. (args.label or mw.title.getCurrentTitle().text) .. '|link=' .. (args.link or '') .. '|alt=' .. (args.alt or '') .. ']]'
	retval = retval .. '</div>'
	if args.position ~= 'none' then
		retval = retval .. '<div style="font-size: ' .. (args.label_size or 90) .. '%; line-height: 110%; position: relative; top: -1.5em; width: ' .. (args.label_width or 6) .. 'em; '
		if args.position == 'left' then
			retval = retval .. 'left: -6.5em; text-align: right;'
		elseif args.position == 'right' then
			retval = retval .. 'left: 0.5em; text-align: left;'
		elseif args.position == 'top' then
			retval = retval .. 'top:-2.65em; left:-3em; text-align: center;'
		elseif args.position == 'bottom' then
			retval = retval .. 'top:-0.15em; left: -3em; text-align: center;'
		elseif tonumber(x) > 70 then
			retval = retval .. 'left: -6.5em; text-align: right;'
		else
			retval = retval .. 'left: 0.5em; text-align: left;'
		end
		retval = retval .. '"><span style="padding: 1px; '
		if args.background then
			retval = retval .. 'background-color: ' .. args.background .. ';'
		end
		retval = retval .. '">' .. (args.label or '') .. '</span></div>'
	end
	retval = retval .. '</div>'
	
	return retval
end

return p