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