Módulu:Mapa cuerpu celeste
La documentación pa esti módulu pue crease en Módulu:Mapa cuerpu celeste/usu
local getArgs = require('Module:Arguments').getArgs
local mWikidata = require('Module:Wikidata')
local cfg = mw.loadData('Module:Mapa cuerpu celeste/datos')
local errorCategory = '[[Categoria:Artículos con errores del módulu Mapa cuerpu celeste]]'
local p = {}
local function errhandler(msg)
local cat = mw.title.getCurrentTitle().namespace == 0 and errorCategory or ''
return string.format('<span class="error">%s</span>%s', msg, cat)
end
local function getX(map, long, marksize)
local dim = 250
return math.floor(dim * (math.fmod(long + 360 + map.spost_mer0, 360) / 360) - marksize / 2)
end
local function getY(map, lat, marksize)
local dim = 250
local ret = 0
if map.projection == 'equirectangular' then
-- projecció cilíndrica equidistant o equirectangular
ret = (dim * map.height / map.width) / 2 *
(-lat / map.max_lat) +
(dim * map.height / map.width) / 2 - marksize / 2
elseif map.projection == 'Mercator' then
-- pProjecció cilíndrica de Mercator
ret = (dim * map.height / map.width) / 2 *
(-math.log(math.tan(math.pi / 4 + lat * math.pi / 360))) /
math.log(math.tan(math.pi / 4 + map.max_lat * math.pi / 360)) +
(dim * map.height / map.width) / 2 - marksize / 2
elseif map.projection == 'Lambert' then
-- projecció cilíndrica equivalent de Lambert
ret = (dim * map.height / map.width) / 2 *
(-math.sin(lat * math.pi / 180) / math.sin(map.max_lat * math.pi / 180)) +
(dim * map.height / map.width) / 2 - marksize / 2
end
return math.floor(ret)
end
-- Añadir la preposición antes del nome del cuerpu celeste
local function prep(cuerpu)
if cuerpu == 'lluna' then
return 'de la Lluna'
elseif mw.ustring.find(cuerpu, "^[aàeèéiíoòóuú]") then
return 'd’' .. mw.language.getContentLanguage():ucfirst(cuerpu)
end
return 'de ' .. mw.language.getContentLanguage():ucfirst(cuerpu)
end
-- Pa utilizar dende otros módulos
function p._main(args)
-- paràmetres requerits: mapa, lat, long
if args.mapa or args[1] then
args.mapa = mw.ustring.lower(args.mapa or args[1])
else
error('mapa non especificáu', 2)
end
args.mapa = cfg.aliases[args.mapa] or args.mapa -- àlies eventual
if not cfg.maps[args.mapa] then
error('mapa non disponible: ' .. args.mapa, 2)
end
-- recuperación de coordenaes dende Wikidata
args.lat = args.lat or mWikidata.claim({property = 'P625', formatting = 'latitude'})
args.long = args.long or mWikidata.claim({property = 'P625', formatting = 'longitude'})
if not args.lat then
error('llatitú non especificada', 2)
elseif not tonumber(args.lat) then
error('la llatitú nun ye un númberu', 2)
elseif not args.long then
error('llonxitú non especificada', 2)
elseif not tonumber(args.long) then
error('la llonxitú nun ye un númberu', 2)
end
local map = cfg.maps[args.mapa]
local caption = string.format('Mapa topográficu %s. Proyeición %s. Àrea representada: %s.',
prep(args.mapa),
(map.projection == 'equirectangular' and '' or 'de ') .. map.projection,
map.range)
return mw.getCurrentFrame():expandTemplate {
title = 'Sobrepuestu',
args = {
base = map.image,
base_width = '250px',
base_caption = caption,
float = args.mark or 'DeepPink pog.svg',
float_width = (args.marksize or 15) .. 'px',
float_caption = args.nom or '',
x = getX(map, args.long, args.marksize or 15),
y = getY(map, args.lat, args.marksize or 15)
}
}
end
-- Puntu d'entrada dende plantía
function p.main(frame)
return select(2, xpcall(function()
return p._main(getArgs(frame, {parentOnly = true}))
end, errhandler))
end
return p