Módulo:Mapa de localização UAI

Fonte: Enciclopédia de conhecimento da Igreja de Deus
Saltar para a navegação Saltar para a pesquisa

A documentação para este módulo pode ser criada na página Módulo:Mapa de localização UAI/doc

--[[
* Module de implementação do mapa de posicionamento UAI.
*
* Imported from https://it.wikipedia.org/w/index.php?title=Modulo:Mappa_di_localizzazione_IAU&oldid=84979493
]]--
require('Module:No globals')
local getArgs = require('Module:Arguments').getArgs
local mRaDec = require('Module:RaDec')
local cfg = mw.loadData('Module:Mapa de localização UAI/Configuration')
local errorCategory = '[[Categoria:!Elementos com erro do módulo Mapa de localização UAI]]'
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 _latinise_letters(tmparg)
												--2>--remove case
												tmparg=mw.ustring.lower(tmparg);
												--2>--remove acccent
												tmparg=mw.ustring.gsub(tmparg, "[áàâäãå]", "a");
												tmparg=mw.ustring.gsub(tmparg, "[æ]", "ae");
												tmparg=mw.ustring.gsub(tmparg, "[ç]", "c");
												tmparg=mw.ustring.gsub(tmparg, "[éèêë]", "e");
												tmparg=mw.ustring.gsub(tmparg, "[íìîï]", "i");
												tmparg=mw.ustring.gsub(tmparg, "[ñ]", "n");
												tmparg=mw.ustring.gsub(tmparg, "[óòôöõ]", "o");
												tmparg=mw.ustring.gsub(tmparg, "[œ]", "oe");
												tmparg=mw.ustring.gsub(tmparg, "[úùûü]", "u");
												tmparg=mw.ustring.gsub(tmparg, "[ýÿ]", "y");
												return tmparg;
end
-- http://lua-users.org/wiki/SimpleRound
local function round(num, idp)
				local mult = 10 ^ (idp or 0)
				return math.floor(num * mult + 0.5) / mult
end
-- Converte la declinazione da gradi/minuti/secondi in gradi decimali
local function dec2deg(dec)
				local sign = dec.d >= 0 and 1 or -1
				return dec.d + sign * dec.m / 60 + sign * dec.s / 3600
end
-- Converte l'ascensione retta da ore/minuti/secondi in gradi decimali
local function ar2deg(ar)
				return ar.h * 15 + ar.m / 4 + ar.s / 240
end
-- Parsifica il parametro ar con formato "ore/minuti/secondi"
local function parseArSlash(args)
				local h, m, s = string.match(args.ascensao_reta, '^([%d]+)/(%d+)/([%d,%.]+)$')
				h, m, s = tonumber(h), tonumber(m), tonumber(s)
				return (h and m and s) and ar2deg({ h = h, m = m, s = s }) or nil
end
-- Parsifica il parametro declinaz con formato "gradi/minuti/secondi"
local function parseDecSlash(args)
				local d, m, s = string.match(args.declinacao, '^+?(-?%d+)/(%d+)/([%d,%.]+)$')
				d, m, s = tonumber(d), tonumber(m), tonumber(s)
				return (d and m and s) and dec2deg({ d = d, m = m, s = s }) or nil
end
-- Le funzioni getX e getY sono state ottenute dalle formule di Ysogo in
-- Discussioni_progetto:Astronomia#Posizione_nella_carte_della_costellazione:
-- X = Ax+(Aw/2)+(Ah/(DECsup-DECinf))*(DECogg-DECaxe)*sen((ARmed-ARogg)/disang)
-- Y = Ay+Ah-(Ah/(DECsup-DECinf))*((DECogg-DECaxe)*cos((ARmed-ARogg)/disang)-(DECinf-DECaxe))
local function getX(map, ar, dec, width, marksize)
				local x = map.ax + map.aw / 2 +
														(map.ah / (map.dec_sup - map.dec_inf)) *
														(dec - map.dec_axe) *
														math.sin(((map.ar_med - ar) / map.dis_ang) * (math.pi / 180))
				-- scala il risultato in base a width e centra il marker
				return round(x * width / map.iw - marksize / 2)
end
local function getY(map, ar, dec, width, marksize)
				local y = map.ay + map.ah -
														(map.ah / (map.dec_sup - map.dec_inf)) *
														((dec - map.dec_axe) * math.cos(((map.ar_med - ar) / map.dis_ang) * (math.pi / 180)) - (map.dec_inf - map.dec_axe) )
				-- scala il risultato in base a width e centra il marker
				return round(y * width / map.iw - marksize / 2)
end
local function getThumbnail(text, image, args, width)
				local divNode = mw.html.create('div')
				divNode
								:addClass('thumb')
								:addClass(args.float == 'right' and 'tright' or 'tleft')
								:tag('div')
												:addClass('thumbinner')
												:css('width', width .. 'px')
												:wikitext(text)
												:tag('div')
																:addClass('thumbcaption')
																:wikitext(args.legenda or '')
																:tag('div')
																				:addClass('magnify')
																				:wikitext(string.format('[[:File:%s]]', image))
				return tostring(divNode)
end
-- Restituisce l'elenco dei codici delle mappe configurate
function p.maps()
				local sortedMaps = {}
				for key, _ in pairs(cfg.mappe) do
								table.insert(sortedMaps, key)
				end
				table.sort(sortedMaps)
				return mw.text.listToText(sortedMaps)
end
-- Restituisce 1 se la carte specificata è disponibile altrimenti nil
function p.hasmap(frame)
				local mapa = frame.args[1] and mw.ustring.lower(frame.args[1])
				return (cfg.alias[mapa] or cfg.mappe[mapa]) and 1
end
-- Per l'utilizzo da altro modulo
function p._main(args)
				local map, ar, dec, text
				local width = tonumber(args.width) or 260
				local marksize = tonumber(args.marksize) or 15
			
				-- ottiene la mapa
				if args.mapa then
								args.mapa = _latinise_letters(args.mapa)
				else
								error('mapa não foi informado', 2)
				end
				-- eventuale alias
				args.mapa = cfg.alias[args.mapa] or args.mapa
				if not cfg.mappe[args.mapa] then
								error('mapa não disponível: ' .. args.mapa, 2)
				end
				map = cfg.mappe[args.mapa]
			
				-- ottiene ascensione retta e declinazione
				if args.RA and args.DEC then
								ar = mRaDec.parseRA(args.RA)
								dec = mRaDec.parseDEC(args.DEC)
								if ar and dec then
												ar = ar2deg(ar)
												dec = dec2deg(dec)
								end
				elseif args.ascensao_reta_dec and args.declinacao_dec then
								ar = args.ascensao_reta_dec
								dec = args.declinacao_dec
				elseif args.ascensao_reta and args.declinacao then
								ar = parseArSlash(args)
								dec = parseDecSlash(args)
				end
				if not ar or not dec then
								error('coordonées célestes invalides', 2)
				end
				-- carte doppia
				if args.mapa == 'ser' then
								map = ar > 255 and map.cauda or map.caput
				end
				-- per le costellazioni che attraversano il meridiano fondamentale
				if map.ar_med > ar + 180 then
								ar = ar + 360
				end
				-- utilizza il template Superpose
				text = mw.getCurrentFrame():expandTemplate {
								title = 'Superimpose',
								args = {
												base = map.image,
												base_width = width .. 'px',
												base_caption = '',
												float = args.mark or 'Cercle rouge 100%.svg',
												float_width = marksize .. 'px',
												float_caption = args.nome or '',
												x = getX(map, ar, dec, width, marksize),
												y = getY(map, ar, dec, width, marksize)
								}
				}
				return args.inclusion and text or getThumbnail(text, map.image, args, width + 2)
end
-- Entry-point per il template {{carte di localizzazione IAU}}
function p.main(frame)
				return select(2, xpcall(function()
								return p._main(getArgs(frame, { parentOnly = true }))
				end, errhandler))
end
-- Per l'utilizzo da altro modulo
function p._main2(mapa)
				local map, ar, dec, text
			
				-- ottiene la carte
				if mapa then
								mapa = _latinise_letters(mapa)
				else
								error('mapa não especificado', 2)
				end
				-- eventuale alias
				mapa = cfg.alias[mapa] or mapa
				if not cfg.mappe[mapa] then
								error('mapa não disponível: ' .. mapa, 2)
				end
				map = cfg.mappe[mapa]
			

				-- carte doppia
				if mapa == 'ser' then
								map = map.caput
				end
			
				-- utilizza il template Superpose
				text = '[['.. map.page .. '|'.. string.gsub(map.page, ' %(constelação%)', '') ..']]'
				return text
end
-- Entry-point per il template {{carte di localizzazione IAU}}
function p.page(frame)
				local mapa = frame.args[1]
				return p._main2(mapa)
end
return p