Módulo:Mapa de localización/sandbox

De Wikipedia, la enciclopedia libre
Icono de documentación de módulo Documentación del módulo[ver] [editar] [historial] [purgar]

A continuación se muestra la documentación transcluida desde la subpágina /doc. [salta a la caja de código]


Uso

Este módulo implementa las plantillas {{Mapa de localización}} y {{Mapa de localización~}}. Por favor consulte las páginas de plantilla correspondientes para las instrucciones de uso.

Ejemplos

Múltiples mapas

{{#invoke:Mapa de localización|main|Gran Belfast#Irlanda del Norte#Isla de Irlanda#Reino Unido
| pie      = Ubicación en el [[Gran Belfast]]##Ubicación en [[Irlanda del Norte]]##Ubicación en la [[Isla de Irlanda]]##Ubicación en el [[Reino Unido]]
| etiqueta = BHD
| lat_gra  = 54.615486
| lon_gra  = -5.871233
}}
BHD ubicada en Gran Belfast
BHD
BHD
Ubicación en el Gran Belfast
BHD ubicada en Irlanda del Norte
BHD
BHD
Ubicación en Irlanda del Norte
BHD ubicada en Isla de Irlanda
BHD
BHD
Ubicación en la Isla de Irlanda
BHD ubicada en Reino Unido
BHD
BHD
Ubicación en el Reino Unido
{{#invoke:Mapa de localización|main|Gran Belfast#Irlanda del Norte#Isla de Irlanda#Reino Unido
| pie      = Ubicación cerca del Gran Belfast
| etiqueta = BFS
| lat_gra  = 54.6575
| lon_gra  = -6.215833
}}
BFS ubicada en Gran Belfast
BFS
BFS
Ubicación cerca del Gran Belfast
BFS ubicada en Irlanda del Norte
BFS
BFS
BFS (Irlanda del Norte)
BFS ubicada en Isla de Irlanda
BFS
BFS
BFS (Isla de Irlanda)
BFS ubicada en Reino Unido
BFS
BFS
BFS (Reino Unido)

Ancho predeterminado y alineación, sin mapa ni etiqueta, pie predeterminado (coordenadas decimales)

Nota: Cuando no se especifica una etiqueta, el pie predeterminado es "Nombre de la página (Mapa nombre)" por lo que si este ejemplo se ve en una página llamada Pag, el título predeterminado sería "Pag (Tierra)". Del mismo modo, en una página llamada Pag (ciudad), el título predeterminado sería "Pag (ciudad) (Tierra)".

Pag está en una isla.
Pag está en una isla.
Mapa de localización/sandbox (Tierra)
{{#invoke:Mapa de localización|main|
| alt     = Pag está en una isla.
| lat_gra = 44.44
| lon_gra = 15.05
}}

Ancho predeterminado y alineación, sin etiqueta, pie predeterminado (coordenadas decimales)

Nota: Cuando no se especifica una etiqueta, el pie predeterminado es "Nombre de la página (Mapa nombre)" por lo que si este ejemplo se ve en una página llamada Pag, el título predeterminado sería "Pag (Croacia)". Del mismo modo, en una página llamada Pag (ciudad), el título predeterminado sería "Pag (ciudad) (Croacia)".

Pag está en una isla.
Pag está en una isla.
Mapa de localización/sandbox (Croacia)
{{#invoke:Mapa de localización|main|Croacia
| alt     = Pag está en una isla.
| lat_gra = 44.44
| lon_gra = 15.05
}}

Mapas con el pie por defecto (grados/minutos)

Nota: Cuando se especifica una etiqueta, el pie predeterminado es "texto de la etiqueta (Mapa nombre)", visto como "Pag (Croacia)" en este ejemplo.

Pag está en una isla.
Pag está en una isla.
Pag
Pag (Croacia)
{{#invoke:Mapa de localización|main|Croacia
| ancho = 200
| alineación = right
| alt = Pag está en una isla.
| etiqueta = Pag
| posición = right
| marca = Green pog.svg <!-- punto verde -->
| lat_gra = 44 | lat_min = 26 <!-- Por defecto: lat_dir = N -->
| lon_gra = 15 | lon_min = 3  <!-- Por defecto: lon_dir = E -->
}}

Marca fuera de los límites del mapa, sin pie

Rimini está en Italia (aparece fuera del mapa)
Rimini está en Italia (aparece fuera del mapa)
Rimini
{{#invoke:Mapa de localización|main|Croacia
| ancho    = 200
| alineación    = right
| pie  =
| alt      = Rimini está en Italia (aparece fuera del mapa)
| lat_gra  = 44.05
| lon_gra  = 12.57 <! - Fuera borde izquierdo del mapa a 13,1 -> lon_gra = 12,57 -->
| fuera  = 1 <! - Somos conscientes el punto está fuera del mapa, por lo suprimimos la categoría de alerta -> fuera = 1 -->
| etiqueta    = Rimini
| posición = right
}}

pie, tamaño_etiqueta, fondo_etiqueta, marca, tamaño_marca

Mapa de Italia con la marca de la ubicación de Rimini
Mapa de Italia con la marca de la ubicación de Rimini
Rimini
Ubicación de Rimini en Italia
{{#invoke:Mapa de localización|main|Italia
| ancho      = 200
| alineación      = right
| pie    = Ubicación de Rimini en Italia
| alt        = Mapa de Italia con la marca de la ubicación de Rimini
| etiqueta      = Rimini
| tamaño_etiqueta = 150 <!--150% del tamaño normal-->
| posición   = bottom
| color_etiqueta = orange <!-- naranja -->
| marca       = Orange_pog.svg
| tamaño_marca = 12 <!--tamaño en pixels-->
| lat_gra    = 44.05
| lon_gra    = 12.57
}}

Parámetro mapa_alternativo

Mapa de italia con una marca que muestra la ubicación de Roma.
Mapa de italia con una marca que muestra la ubicación de Roma.
Roma
Ubicación de Roma en Italia
{{#invoke:Mapa de localización|main|Italia
| mapa_alternativo = Italy location map.svg
| ancho   = 200
| alineación   = right
| pie = Ubicación de Roma en Italia
| alt     = Mapa de italia con una marca que muestra la ubicación de Roma.
| etiqueta   = Roma
| lat_gra = 41.9
| lon_gra = 12.5
}}

Parámetro tipo

También demuestra el posicionamiento automático de etiqueta a la izquierda, debido a la posición de extremo derecho de marca.

El Aeropuerto Biratnagar Airport se ubica al sureste de Nepal
El Aeropuerto Biratnagar Airport se ubica al sureste de Nepal
Biratnagar
Ubicación del Aeropuerto Biratnagar en Nepal
{{#invoke:Mapa de localización|main|Nepal
| tipo = relieve
| pie = Ubicación del Aeropuerto Biratnagar en Nepal
| alt = El Aeropuerto Biratnagar Airport se ubica al sureste de Nepal
| etiqueta = Biratnagar
| marca = Airplane silhouette.svg
| tamaño_marca = 10
| lat_gra = 26 | lat_min = 28 | lat_seg = 53 | lat_dir = N
| lon_gra = 87 | lon_min = 15 | lon_seg = 50 | lon_dir = E
}}
El Aeropuerto Biratnagar Airport se ubica al sureste de Nepal
El Aeropuerto Biratnagar Airport se ubica al sureste de Nepal
Biratnagar
Ubicación del Aeropuerto Biratnagar en Nepal
{{#invoke:Mapa de localización|main|Nepal
| tipo = 
| pie = Ubicación del Aeropuerto Biratnagar en Nepal
| alt = El Aeropuerto Biratnagar Airport se ubica al sureste de Nepal
| etiqueta = Biratnagar
| marca = Airplane silhouette.svg
| tamaño_marca = 10
| lat_gra = 26 | lat_min = 28 | lat_seg = 53 | lat_dir = N
| lon_gra = 87 | lon_min = 15 | lon_seg = 50 | lon_dir = E
}}

Las mismas coordenadas en diferentes mapas

Lockerbie se encuentra en el sur de Escocia.
Lockerbie se encuentra en el sur de Escocia.
Lockerbie
Lockerbie en Escocia, Reino Unido
{{#invoke:Mapa de localización|main|Escocia
| tipo = relieve
| ancho = 180
| alineación = right
| pie = Lockerbie en Escocia, Reino Unido
| alt = Lockerbie se encuentra en el sur de Escocia.
| etiqueta = Lockerbie
| marca = Blue_pog.svg
| lon_segsize = 9
| lat_gra = 55 | lat_min = 07 | lat_seg = 16 | lat_dir = N
| lon_gra = 03 | lon_min = 21 | lon_seg = 19 | lon_dir = W
}}
Lockerbie se encuentra en el sur de Escocia.
Lockerbie se encuentra en el sur de Escocia.
Lockerbie
Lockerbie en Escocia, Reino Unido
{{#invoke:Mapa de localización|main|Reino Unido
| tipo = relieve
| ancho = 180
| alineación = right
| pie = Lockerbie en Escocia, Reino Unido
| alt = Lockerbie se encuentra en el sur de Escocia.
| etiqueta = Lockerbie
| lon_seg = Blue_pog.svg
| lon_segsize = 9
| lat_gra = 55 | lat_min = 07 | lat_seg = 16 | lat_dir = N
| lon_gra = 03 | lon_min = 21 | lon_seg = 19 | lon_dir = W
}}

Mapas que atraviesan el meridiano 180°

Ver Categoría:Wikipedia:Plantillas de mapa de localización que atraviesan el meridiano 180
Suva ubicada en Fiyi
Suva
Suva
Suva (Fiyi)
{{#invoke:Mapa de localización|main|Fiyi
| ancho          = 180
| alineación     = right
| etiqueta       = Suva
| posición       = right
| color_etiqueta = yellow
| marca          = Locator_Dot.png
| tamaño_marca   = 7
| lat_gra =  18 | lat_min =  8 | lat_seg = 0 | lat_dir = S
| lon_gra = 178 | lon_min = 26 | lon_seg = 0 | lon_dir = E
}}

Esta documentación está transcluida desde Módulo:Mapa de localización/sandbox/doc.
Por favor, añade las categorías en la subpágina de documentación y los interwikis en Wikidata. Subpáginas de este módulo.

require('Módulo:No globals')
 
local p = {}
 
local getArgs = require('Módulo:Argumentos').obtenerArgumentos
 
local function round(n, decimals)
	local pow = 10^(decimals or 0)
	return math.floor(n * pow + 0.5) / pow
end
 
function p.getMapParams(map, frame)
	if not map then
		error('Se debe especificar el nombre de la definición del mapa de localización que va a usar', 2)
	end
	map = mw.text.trim(map)
	--local moduletitle = mw.title.new('Módulo:Mapa de localización/datos/' .. map)
	--mw.log('Nombre ' .. 'Módulo:Mapa de localización/datos/' .. map)
	--if not moduletitle then
	--	mw.log('Nombre no válido ' .. 'Módulo:Mapa de localización/datos/' .. map)
	--	error('"' .. map .. '" no es un nombre válido para una definición de mapa de localización', 2)
	--elseif moduletitle.exists then
	--	local mapData = mw.loadData('Módulo:Mapa de localización/datos/' .. map)
	--	return function(name, params)
	--		if name == nil then
	--			return 'Módulo:Mapa de localización/datos/' .. map
	--		elseif mapData[name] == nil then
	--			return ''
	--		elseif params then
	--			return mw.message.newRawMessage(tostring(mapData[name]), unpack(params)):plain()
	--		else
	--			return mapData[name]
	--		end
	--	end
	--elseif mw.title.new('Plantilla:Mapa de localización de ' .. map).exists then
	if mw.title.new('Plantilla:Mapa de localización de ' .. map).exists then
		local cache = {}
		if type(frame) ~= 'table' or type(frame.expandTemplate) ~= 'function' then
			error('Debe proporcionar el objeto frame de la página si utiliza un mapa implementado mediante una plantilla')
		end
		return function(name, params)
			if params then
				return frame:expandTemplate{title = 'Plantilla:Mapa de localización de ' .. map, args = { name, unpack(params) }}
			else
				if name == nil then
					return 'Plantilla:Mapa de localización de ' .. map
				elseif cache[name] == nil then
					cache[name] = frame:expandTemplate{title = 'Plantilla:Mapa de localización de ' .. map, args = { name }}
				end
				return cache[name]
			end
		end
	else
		error('No se puede mostrar la ubicación especificada porque no existe el Módulo:Mapa de localización/datos/' .. map .. ' ni la Plantilla:Mapa de localización de ' .. map, 2)
	end
end
 
function p.data(frame, args, map)
	if not args then
		args = getArgs(frame, {frameOnly = true})
	end
	if not map then
		map = p.getMapParams(args[1], frame)
	end
	local params = {}
	for k,v in ipairs(args) do
		if k > 2 then
			params[k-2] = v
		end
	end
	return map(args[2], #params ~= 0 and params)
end
 
local hemisphereMultipliers = {
	longitude = { W = -1, w = -1, O = -1, o = -1, E = 1, e = 1 },
	latitude = { S = -1, s = -1, N = 1, n = 1 }
}
 
local function decdeg(degrees, minutes, seconds, hemisphere, decimal, direction)
	if not degrees or degrees == '' then
		if not decimal or decimal == '' then
			return nil
		end
		local retval = tonumber(decimal)
		if not retval then
			error('El valor "' .. decimal .. '" provisto en ' .. direction .. ' no es válido', 2)
		end
		return retval
	end
	decimal = tonumber(degrees)
	if not decimal then
		error('El valor de grados "' .. degrees .. '" provisto en ' .. direction .. ' no es válido', 2)
	end
	if minutes  and minutes == '' then
		minutes = 0
	end
	if seconds  and seconds == '' then
		seconds = 0
	end
	
	if minutes  and not tonumber(minutes) then
		error('El valor de minutos "' .. minutes .. '" provisto en ' .. direction .. ' no es válido', 2)
	end
	if seconds  and not tonumber(seconds) then
		error('El valor de segundos "' .. seconds .. '" provisto en ' .. direction .. ' no es válido', 2)
	end
	decimal = decimal + (minutes or 0)/60 + (seconds or 0)/3600
	if hemisphere and hemisphere ~= '' then
		local multiplier = hemisphereMultipliers[direction][hemisphere]
		if not multiplier then
			error('El hemisferio "' .. hemisphere .. '" provisto en ' .. direction .. ' no es válido', 2)
		end
		decimal = decimal * multiplier
	end
	return decimal
end
 
-- Efectivamente hacer removeBlanks false para el pie y mapLink, y true para todo lo demás
-- Si useWikidata está presente, pero en blanco, convertirlo en false en lugar de cero
-- p.top, p.bottom y sus interlocutores necesitan utilizar esto

function p.valueFunc(key, value)
	if value then
		value = mw.text.trim(value)
	end
	if value ~= '' or key == 'pie' or key == 'caption' or key == 'maplink' or key == "enlace_mapa" then
		return value
	elseif key == 'useWikidata' or key == "usar_wikidata"then
		return false
	end
end
 
local function getContainerImage(args, map)
	if (args.AlternativeMap and args.AlternativeMap ~= '') or (args.mapa_alternativo and args.mapa_alternativo ~= '') then
		return args.AlternativeMap or args.mapa_alternativo
	elseif args.tipo and args.tipo ~= '' and map(args.tipo) and  map(args.tipo) ~= '' then
		return map(args.tipo)
	elseif args.relief or args.relieve and map('image1') ~= '' then
		return map('image1')
	else
		return map('image')
	end
end
 
function p.top(frame, args, map)
	local alineacion, borde, pie, ancho, enlaceMapa, etiqueta, ImagenSuperpuesta
	if not args then
		args = getArgs(frame, {frameOnly = true, valueFunc = p.valueFunc})
	end
	if not map then
		map = p.getMapParams(args[1], frame)
	end

        -- Variable con los parámetros en inglés o en español

	local width
	ancho = args.ancho or args.width
	alineacion = args['alineación'] or args.float
        pie = args.caption or args['pie']
        enlaceMapa = args.enlace_mapa or args.maplink 
        etiqueta = args.label or args.etiqueta
        borde = args.borde or args.border 
        ImagenSuperpuesta = args.imagen_superpuesta or args.overlay_image
	if not ancho or ancho == '' then
		width = round((args.default_width or 240) * (tonumber(map('defaultscale')) or 1))
	elseif mw.ustring.sub(ancho, -2) == 'px' then
		width = mw.ustring.sub(ancho, 1, -3)
	else
		width = ancho
	end
	
        
	local retval = alineacion == 'center' and '<div class="center">' or ''
	
	if pie and pie ~= '' and pie ~= 'no' then
		retval = retval .. '<div class="noviewer thumb '
		if alineacion == '"left"' or alineacion == 'left' then
			retval = retval .. 'tleft'
		elseif alineacion == '"center"' or alineacion == 'center' or alineacion == 'centrado' or alineacion == '"none"' or alineacion == 'none' then
			retval = retval .. 'tnone'
		else
			retval = retval .. 'tright'
		end
		retval = retval .. '"><div class="thumbinner" style="width:' .. (width + 2) .. 'px'
		
		if borde == 'none' then
			
			retval = retval .. ';border:none'
		elseif borde then
			retval = retval .. ';border-color:' .. borde
		end
		retval = retval .. '"><div style="position:relative;width:' .. width .. 'px' .. (borde ~= 'none' and ';border:1px solid lightgray">' or '">')
	else
		retval = retval .. '<div style="width:' .. width .. 'px;'
		if alineacion == '"left"' or alineacion == 'left' then
			retval = retval .. 'float:left;clear:left'
		elseif alineacion == '"center"' or alineacion == 'center' or alineacion == 'centrado' then
			retval = retval .. 'float:none;clear:both;margin-left:auto;margin-right:auto'
		elseif alineacion == '"none"' or args.float == 'none' then
			retval = retval .. 'float:none;clear:none'
		else
			retval = retval .. 'float:right;clear:right'
		end
		retval = retval .. '"><div style="width:' .. width .. 'px;padding:0"><div style="position:relative;width:' .. width .. 'px">'
	end
	local image = getContainerImage(args, map)
	local currentTitle = mw.title.getCurrentTitle()
	retval = string.format(
		'%s[[Archivo:%s|%spx|%s%s]]',
		retval,
		image,
		width,
		args.alt or ('alt=' .. (etiqueta or mw.title.getCurrentTitle().text) .. ' ubicada en ' .. map('name')),
		enlaceMapa and ('|link=' .. enlaceMapa) or ''
	)
	if args.pie and args.pie ~= '' then
		if (currentTitle.namespace == 0) and mw.ustring.find(args.pie, '##') then
			retval = retval .. '[[Categoría:Wikipedia:Páginas utilizando un mapa de localización con doble numeral en el pie]]'
		end
	end
	if args.overlay_image then
		return retval .. '<div style="position:absolute;top:0;left:0">[[Archivo:' .. ImagenSuperpuesta .. '|' .. width .. 'px]]</div>'
	else
		return retval
	end
end
 
function p.bottom(frame, args, map)
	local alineacion, borde, pie, ancho, enlaceMapa, etiqueta, pieNoDefinido
	if not args then
		args = getArgs(frame, {frameOnly = true, valueFunc = p.valueFunc})
	end
	if not map then
		map = p.getMapParams(args[1], frame)
	end
         -- Variable con los parámetros en inglés o en español

	local width
	ancho = args.ancho or args.width
	alineacion = args['alineación'] or args.float
        pie = args.caption or args['pie']
        enlaceMapa = args.enlace_mapa or args.maplink 
        etiqueta =  args.etiqueta or args.label
        borde = args.borde or args.border
        pieNoDefinido = args.pie_no_definido or args.caption_undefined 
	local retval = '</div>'
 
	if not pie then
		retval = retval .. '<div style="font-size:90%;padding-top:3px">'
		.. (( etiqueta or mw.title.getCurrentTitle().text) .. ' (' .. map('name') .. ')')
		.. '</div>'
	elseif pie == '' or pie == 'no' then
		retval = retval .. '<div style="font-size:90%;padding-top:3px"></div>'
	else 
		-- Creando un vínculo sin ningún texto a propósito para que el CSS nos pueda dar una buena imagen
		retval = retval .. '<div class="thumbcaption"><div class="magnify">[[:Archivo:' .. getContainerImage(args, map) .. '| ]]</div>' .. pie .. '</div>'
	end
	
    if args.switcherLabel then
		retval = retval .. '<span class="switcher-label" style="display:none">' .. args.switcherLabel .. '</span>'
	elseif args.autoSwitcherLabel then
		retval = retval .. '<span class="switcher-label" style="display:none">Mostrar mapa de ' .. map('name') .. '</span>'
	end

	retval = retval .. '</div></div>'
	retval = retval .. (alineacion == 'center' and '</div>' or '')
	if pieNoDefinido then
		mw.log('parámetro pie_no_definido eliminado')
		local parent = frame:getParent()
		if parent then
			mw.log('El padre es ' .. parent:getTitle())
		end
		mw.logObject(args, 'args')
		retval = retval .. '[[Categoría:Wikipedia:Mapas de localización con parámetro eliminado en la llamada]]'
	end
	return retval
end
 
local function markOuterDiv(x, y, imageDiv, labelDiv)
	return mw.html.create('div')
		:cssText('position:absolute;top:' .. round(y, 3) .. '%;left:' .. round(x, 3) .. '%;height:0;width:0;margin:0;padding:0')
		:node(imageDiv)
		:node(labelDiv)
end
 
local function markImageDiv(mark, marksize, label, link, alt, title)
	local builder = mw.html.create('div')
		:cssText('position:absolute;text-align:center;left:-' .. round(marksize / 2) .. 'px;top:-' .. round(marksize / 2) .. 'px;width:' .. marksize .. 'px;font-size:' .. marksize .. 'px;line-height:0')
		:attr('title', title)
	if marksize ~= 0 then
		builder:wikitext(string.format(
			'[[Archivo:%s|%dx%dpx|%s|link=%s%s]]',
			mark,
			marksize,
			marksize,
			label,
			link,
			alt and ('|alt=' .. alt) or ''
		))
	end
	return builder
end
 
local function markLabelDiv(label, label_size, label_width, position, background, x, marksize)
	local builder = mw.html.create('div')
		:cssText('font-size:' .. label_size .. '%;line-height:110%;position:absolute;width:' .. label_width .. 'em')
	local distance = round(marksize / 2 + 1)
	local spanCss
	if position == 'top' then -- specified top
		builder:cssText('bottom:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em;text-align:center')
	elseif position == 'bottom' then -- specified bottom
		builder:cssText('top:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em;text-align:center')
	elseif position == 'left' or (tonumber(x) > 70 and position ~= 'right') then -- specified left or autodetected to left
		builder:cssText('top:-0.75em;right:' .. distance .. 'px;text-align:right')
		spanCss = 'float:right'
	else -- specified right or autodetected to right
		builder:cssText('top:-0.75em;left:' .. distance .. 'px;text-align:left')
		spanCss = 'float:left'
	end
	builder = builder:tag('span')
		:cssText('padding:1px')
		:cssText(spanCss)
		:wikitext(label)
	if background then
		builder:cssText('background-color:' .. background)
	end
	return builder:done()
end
 
local function getX(longitude, left, right)
	local width = (tonumber(right) - tonumber(left)) % 360
	if width == 0 then
		width = 360
	end
	local distanceFromLeft = (longitude - left) % 360
	-- La distancia más allá de la derecha del mapa es igual a distanceFromLeft - ancho. 
	-- La distancia más allá de la izquierda del mapa es igual a 360 - distanceFromLeft. 
	-- para minimizar el estiramiento de la página  será de cualquier manera  más corta
	if distanceFromLeft - width / 2 >= 180 then
		distanceFromLeft = distanceFromLeft - 360
	end
	return 100 * distanceFromLeft / width
end
 
local function getY(latitude, top, bottom)
	return 100 * (top - latitude) / (top - bottom)
end

function p.mark(frame, args, map)
	if not args then
		args = getArgs(frame, {wrappers = 'Mapa de localización~'})
	end
	local mapnames = {}
	if not map then
		if args[1] and args[1] ~= "" and not string.match(args[1],"^%s*$") then
			map = {}
			for mapname in mw.text.gsplit(args[1], '#', true) do
				map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame)
				mapnames[#mapnames + 1] = mapname
			end
			if #map == 1 then map = map[1] end
		else
			map = p.getMapParams('Tierra', frame)
			args[1] = 'Tierra'
		end
	end
	if type(map) == 'table' then
		local outputs = {}
		local oldargs = args[1]
		for k,v in ipairs(map) do
			args[1] = mapnames[k]
			outputs[k] = tostring(p.mark(frame, args, v))
		end
		args[1] = oldargs
		return table.concat(outputs, '#PlaceList#') .. '#PlaceList#'
	end
	local x, y, longitude, latitude, fuera, wikidata, declaraciones
    fuera = args.fuera or args.outside
	longitude = decdeg(args.lon_deg or args.lon_gra, args.lon_min, args.lon_sec or args.lon_seg, args.lon_dir, args.long, 'longitude')
	latitude = decdeg(args.lat_deg or args.lat_gra, args.lat_min, args.lat_sec or args.lat_seg, args.lat_dir, args.lat, 'latitude')
	wikidata = args.usar_wikidata or args.useWikidata
	if args.excludefrom then
		-- If this mark is to be excluded from certain maps entirely (useful in the context of multiple maps)
		for exclusionmap in mw.text.gsplit(args.excludefrom, '#', true) do
			-- Check if this map is excluded. If so, return an empty string.
			if args[1] == exclusionmap then
				return ''
			end
		end
			
	end
	local builder = mw.html.create()
	local currentTitle = mw.title.getCurrentTitle()
	if args.coordenadas then
--		Temporarily removed to facilitate infobox conversion. See [[Wikipedia:Coordinates in infoboxes]]

--		if longitude or latitude then
--			error('Coordinates from [[Module:Coordinates]] and individual coordinates cannot both be provided')
--		end
		longitude = coord2text('longitud', args.coordenadas)
		latitude = coord2text('latitud', args.coordenadas)
	elseif not longitude and not latitude and wikidata then
		-- If they didn't provide either coordinate, try Wikidata. If they provided one but not the other, don't.
		local entity = mw.wikibase.getEntity()
		if entity and entity.claims and entity.claims.P625 and entity.claims.P625[1].mainsnak.snaktype == 'value' then
			local value = entity.claims.P625[1].mainsnak.datavalue.value
			longitude, latitude = value.longitude, value.latitude
		end
		if args.link and (currentTitle.namespace == 0) then
			builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con marcadores enlazados con coordenadas de Wikidata]]')	
		end
	end
	if not longitude then
		error('No se pasó ningun valor para la longitud')
	elseif not latitude then
		error('No se pasó ningun valor para la latitud')
	end
	if currentTitle.namespace > 0 then
		if (not args.lon_deg) ~= (not args.lat_deg) then
			builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con diferente precisión de longitud y latitud|Grados]]')
		elseif (not args.lon_min) ~= (not args.lat_min) then
			builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con diferente precisión de longitud y latitud|Minutos]]')
		elseif (not args.lon_sec) ~= (not args.lat_sec) then
			builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con diferente precisión de longitud y latitud|Segundos]]')
		elseif (not args.lon_dir) ~= (not args.lat_dir) then
			builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con diferente precisión de longitud y latitud|Hemisferio]]')
		elseif (not args.long) ~= (not args.lat) then
			builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con diferente precisión de longitud y latitud|Decimal]]')
		end
	end
	if ((tonumber(args.lat_deg) or 0) < 0) and ((tonumber(args.lat_min) or 0) ~= 0 or (tonumber(args.lat_sec) or 0) ~= 0 or (args.lat_dir and args.lat_dir ~='')) then
		builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con grados, minutos, o segundos negativos]]')
	end
	if ((tonumber(args.lon_deg) or 0) < 0) and ((tonumber(args.lon_min) or 0) ~= 0 or (tonumber(args.lon_sec) or 0) ~= 0 or (args.lon_dir and args.lon_dir ~= '')) then
		builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con grados, minutos, o segundos negativos]]')
	end
	if (((tonumber(args.lat_min) or 0) < 0) or ((tonumber(args.lat_sec) or 0) < 0)) then
		builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con grados, minutos, o segundos negativos]]')
	end
	if (((tonumber(args.lon_min) or 0) < 0) or ((tonumber(args.lon_sec) or 0) < 0)) then
		builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con grados, minutos, o segundos negativos]]')
	end
	if args.skew or args.lon_shift or args.markhigh then
		mw.log('Parámetro utilizado en la invocación eliminado.')
		local parent = frame:getParent()
		if parent then
			mw.log('El padre es ' .. parent:getTitle())
		end
		mw.logObject(args, 'args')
		if currentTitle.namespace == 0 then
			local key = (args.skew and 'skew' or '') ..
						(args.lon_shift and 'lon_shift' or '') ..
						(args.markhigh and 'markhigh' or '')
			builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con parámetro eliminado en la llamada|' .. key ..' ]]')
		end
	end
	--if map('skew') ~= '' or map('lat_skew') ~= '' or map('crosses180') ~= '' then --or map('type') ~= '' then
	--	mw.log('Eliminados parámetros usados en la definición del mapa ' .. map())
	--	builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con parámetro eliminado en la llamada]]')
	--end 
	if  map('x') and map('x') ~= '' and tonumber(mw.ext.ParserFunctions.expr(map('x', { latitude, longitude }))) then
		mw.log('Existe x -' .. map('x'))
		x = tonumber(mw.ext.ParserFunctions.expr(map('x', { latitude, longitude })))
	else
		mw.log('No existe x')
		x = tonumber(getX(longitude, map('left'), map('right')))
	end
	if  map('y') and map('y') ~= '' and tonumber(mw.ext.ParserFunctions.expr(map('y', { latitude, longitude })))  then
		mw.log('Existe y -' .. map('y'))
		y = tonumber(mw.ext.ParserFunctions.expr(map('y', { latitude, longitude })))
	else
		mw.log('No existe y')
		y = tonumber(getY(latitude, map('top'), map('bottom')))
	end

	if (x < 0 or x > 100 or y < 0 or y > 100) and not fuera then
		mw.log('La localización está fuera de los límites del mapa. x = ' .. x .. ', y = ' .. y)
		local parent = frame:getParent()
		if parent then
			mw.log('El padre es ' .. parent:getTitle())
		end
		mw.logObject(args, 'args')
		if currentTitle.namespace == 0 then
			local key = currentTitle.prefixedText
			builder:wikitext('[[Categoría:Wikipedia:Mapas de localización con la marca fuera de sus límites y marca fuera no asignada|' .. key .. ' ]]')
		end
	end
	local mark =  args.marca or args.mark or map('marca') or map('mark') 
	if mark == '' then
		mark = 'Red pog.svg'
	end
	local etiqueta = args.etiqueta or args.label
	local posicion = args['posición'] or args.position
	local marksize =  tonumber(args.marksize) or tonumber(args['tamaño_marca']) or tonumber(map('marksize')) or tonumber(map('tamaño_marca')) or 8
	local imageDiv = markImageDiv(mark, marksize, etiqueta or mw.title.getCurrentTitle().text, args.enlace or args.link or '', args.alt, args[2])
	local labelDiv
	if etiqueta and posicion ~= 'none' then
		labelDiv = markLabelDiv(etiqueta, args['tamaño_etiqueta'] or args.label_size or 90, args['ancho_etiqueta'] or args.label_width or 6, args['posición'] or args.position, args['color_etiqueta'] or args.background, x, marksize)
	end
	return builder:node(markOuterDiv(x, y, imageDiv, labelDiv))
end

local function switcherSeparate(s)
	if s == nil then return {} end
	local retval = {}
	for i in string.gmatch(s .. '#', '([^#]*)#') do
		i = mw.text.trim(i)
		retval[#retval + 1] = (i ~= '' and i)
	end
	return retval
end

function p.main(frame, args, map)
	local caption_list = {}
	if not args then
		args = getArgs(frame, {wrappers = 'Plantilla:Mapa de localización', valueFunc = p.valueFunc})
	end
	if args.useWikidata == nil and args.usar_wikidata == nil then
		args.useWikidata = true
	end
	if not map then
		if args[1] and args[1] ~= "" and not string.match(args[1],"^%s*$") then
			map = {}
			for mapname in string.gmatch(args[1], '[^#]+') do
				map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame)
			end
			if args['pie'] then
				if args['pie'] == "" then
					while #caption_list < #map do
						caption_list[#caption_list + 1] = args['pie']
					end
				else
					for caption in mw.text.gsplit(args['pie'], '##', true) do
						caption_list[#caption_list + 1] = caption
					end
				end
			end
			if #map == 1 then map = map[1] end
		else
			map = p.getMapParams('Tierra', frame)
		end
	end
	if type(map) == 'table' then
		local altmaps = switcherSeparate(args.mapa_alternativo)
		if #altmaps > #map then
			error(string.format('%d mapa_alternativo provistos, pero solo %d mapas se pasaron', #altmaps, #map))
		end
		local overlays = switcherSeparate(args.imagen_superpuesta)
		if #overlays > #map then
			error(string.format('%d imagen_superpuesta provistas, pero solo %d mapas se pasaron', #overlays, #map))
		end
		if #caption_list > #map then
			error(string.format('%d pie provistos, pero solo %d mapas se pasaron', #caption_list, #map))
		end
		local outputs = {}
		args.autoSwitcherLabel = true
		for k,v in ipairs(map) do
			args.mapa_alternativo= altmaps[k]
			args.imagen_superpuesta = overlays[k]
			if k <= #caption_list then
				args.pie = caption_list[k]
			else
				args.pie = false
			end
			outputs[k] = p.main(frame, args, v)
		end
		return '<div class="switcher-container">' .. table.concat(outputs) .. '</div>'
	else
		return p.top(frame, args, map) .. tostring( p.mark(frame, args, map) ) .. p.bottom(frame, args, map)
	end
end

return p