Módulo:Mapa de localización/sandbox
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 }}
{{#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 }}
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)".
{{#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)".
{{#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.
{{#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
{{#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
{{#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
{{#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.
{{#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 }}
{{#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
{{#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 }}
{{#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°
{{#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 }}
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