Modul:Vorlage:Sternkarte
Erscheinungsbild
Dieses von der Vorlage:Sternkarte genutzte Modul dient der Erstellung einer Sternkarte aus den Angaben Sternbild (=Kartenauswahl), Rektaszension und Deklination.
--[[
* Grafische Darstellung auf Sternkarte IAU (Module d'implementation du patron Carte de positionnement stellaire UAI.)
*
* Imported from https://fr.wikipedia.org/w/index.php?title=Module:Carte_de_positionnement_stellaire_UAI&oldid=143871472
* (which was Imported from https://it.wikipedia.org/w/index.php?title=Modulo:Mappa_di_localizzazione_IAU&oldid=84979493)
*
* Parameterliste
* aktuell schon analysiert: Name, Sternbild, Rek, Dek, Bildtext
* noch nicht analyisert: Rek_dec, Dek_dec, RA, DEC, width, mark, marksize, inclusion
]]--
require('Modul:No Globals')
local getArgs = require('Modul:Arguments').getArgs
local mRaDec = require('Modul:Vorlage:Sternkarte/RekDek')
local cfg = mw.loadData('Modul:Vorlage:Sternkarte/Konfiguration')
local errorCategory = 'Kategorie:Wikipedia:Vorlagenfehler/Vorlage:Sternkarte'
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 (convert all parameters to lower 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");
--2>--remove ß
tmparg=mw.ustring.gsub(tmparg, "[ß]", "ss");
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
-- Konvertierung der Hexadezimalen Deklination in Dezimalgrad
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
-- Konvertierung der Rektaszension in Dezimalgrad
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.Rek, '^([%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)
-- zunächst die Deklination parsen ob mit oder ohne / beim Vorzeichen
local s_length = mw.ustring.len(args.Dek)
local s_part1 = mw.ustring.sub(args.Dek,1,3)
s_part1 = mw.ustring.gsub(s_part1, "-/", "-")
s_part1 = mw.ustring.gsub(s_part1, "+/", "+")
local s_part2 = mw.ustring.sub(args.Dek,4,s_length)
args.Dek = s_part1 .. s_part2
-- nun wird das Pattern gesucht
local d, m, s = string.match(args.Dek, '^+?(-?%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.Ausrichtung == 'right' and 'tright' or 'tleft')
:tag('div')
:addClass('thumbinner')
:css('width', width .. 'px')
:wikitext(text)
:tag('div')
:addClass('thumbcaption')
:wikitext(args.Bildtext 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 Sternbild = frame.args[1] and mw.ustring.lower(frame.args[1])
return (cfg.alias[Sternbild] or cfg.mappe[Sternbild]) and 1
end
-- Per l'utilizzo da altro modulo
function p._main(args)
local map, ar, dec, text
local width = tonumber(args.width) or 300
local marksize = tonumber(args.marksize) or 15
-- ottiene la carte
if args.Sternbild then
args.Sternbild = _latinise_letters(args.Sternbild)
else
error('Parameter Sternbild nicht definiert', 2)
end
-- eventuale alias
args.Sternbild = cfg.alias[args.Sternbild] or args.Sternbild
if not cfg.mappe[args.Sternbild] then
error('Sternbild nicht gefunden: ' .. args.Sternbild, 2)
end
map = cfg.mappe[args.Sternbild]
-- 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.Rek_dec and args.Dek_dec then
ar = args.Rek_dec
dec = args.Dek_dec
elseif args.Rek and args.Dek then
ar = parseArSlash(args)
dec = parseDecSlash(args)
end
if not ar or not dec then
error('Ungültige Sternkoordinaten oder Format', 2)
end
-- carte doppia
if args.Sternbild == '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 = 'Vorlage:Bild mit Markierung erweitert',
args = {
Hintergrund = map.image,
Hintergrund_Breite = width .. 'px',
Hintergrund_Text = '',
Markierung = args.mark or 'Cercle rouge 100%.svg',
Markierung_Breite = marksize .. 'px',
Markierung_Text = args.Name 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(Sternbild)
local map, ar, dec, text
-- ottiene la carte
if Sternbild then
Sternbild = _latinise_letters(Sternbild)
else
error('Parameter Sternbild nicht definiert', 2)
end
-- eventuale alias
Sternbild = cfg.alias[carte] or Sternbild
if not cfg.mappe[Sternbild] then
error('Sternbild nicht gefunden: ' .. Sternbild, 2)
end
map = cfg.mappe[Sternbild]
-- carte doppia
if Sternbild == 'ser' then
map = map.caput
end
-- utilizza il template Superpose
text = '[['.. map.page .. '|'.. string.gsub(map.page, ' %(constellation%)', '') ..']]'
return text
end
-- Entry-point per il template {{carte di localizzazione IAU}}
function p.page(frame)
local Sternbild = frame.args[1]
return p._main2(Sternbild)
end
return p