Module:Carte de positionnement stellaire UAI

De louiki
Sauter à la navigation Sauter à la recherche

--[[

]]--

require('Module:No globals')

local getArgs = require('Module:Arguments').getArgs local mRaDec = require('Module:AdDéc') local cfg = mw.loadData('Module:Carte de positionnement stellaire UAI/Configuration') local errorCategory = local p = {}

local function errhandler(msg) local cat = mw.title.getCurrentTitle().namespace == 0 and errorCategory or return string.format('%s%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.ascension_droite, '^([%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.declinaison, '^+?(-?%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.legende 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 carte = frame.args[1] and mw.ustring.lower(frame.args[1]) return (cfg.alias[carte] or cfg.mappe[carte]) 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 carte if args.carte then args.carte = _latinise_letters(args.carte) else error('carte non spécifiée', 2) end -- eventuale alias args.carte = cfg.alias[args.carte] or args.carte if not cfg.mappe[args.carte] then error('carte non disponibile: ' .. args.carte, 2) end map = cfg.mappe[args.carte]

-- 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.ascension_droite_dec and args.declinaison_dec then ar = args.ascension_droite_dec dec = args.declinaison_dec elseif args.ascension_droite and args.declinaison 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.carte == '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 = 'Superpose2', 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.nom 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 Modèle: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(carte) local map, ar, dec, text

-- ottiene la carte if carte then carte = _latinise_letters(carte) else error('carte non spécifiée', 2) end -- eventuale alias carte = cfg.alias[carte] or carte if not cfg.mappe[carte] then error('carte non disponibile: ' .. carte, 2) end map = cfg.mappe[carte]


-- carte doppia if carte == 'ser' then map = map.caput end

-- utilizza il template Superpose text = ''.. string.gsub(map.page, ' %(constellation%)', ) ..'' return text end

-- Entry-point per il template Modèle:Carte di localizzazione IAU function p.page(frame) local carte = frame.args[1] return p._main2(carte) end

return p