Module:IAU star location map
--[[
* IAU Star Positioning Map Pattern Implementation Module.
*
* Imported from https://it.wikipedia.org/w/index.php?title=Modulo:Mappa_di_localizzazione_IAU&oldid=84979493
]]--
require('strict')
local getArgs = require('Module:Arguments').getArgs
local mRaDec = require('Module:RADec')
local cfg = mw.loadData('Module:IAU star location map/Configuration')
local errorCategory = '[[Category:Pages with errors in module IAU star location map]]'
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
-- Converts declination from degrees/minutes/seconds to decimal degrees
local function dec2deg(dec)
local sign = dec.d >= 0 and not(dec.signe == '-') and 1 or -1
return dec.d + sign * dec.m / 60 + sign * dec.s / 3600
end
-- Converts right ascension from hours/minutes/seconds to decimal degrees
local function ar2deg(ar)
return ar.h * 15 + ar.m / 4 + ar.s / 240
end
-- Parse the right ascension parameter with the format "hours/minutes/seconds"
local function parseArSlash(args)
local h, m, s = string.match(args.ra, '^([%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
-- Parse the declination parameter with the format "degrees/minutes/seconds"
local function parseDecSlash(args)
local d, signe, m, s = string.match(args.dec, '^+?((-?)%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, signe = signe }) or nil
end
-- The functions getX and getY were obtained from Ysogo's formulas in
-- Project Discussions: Astronomy#Constellation Map Position:
-- X = Ax+(Aw/2)+(Ah/(DECsup-DECinf))*(DECogg-DECaxe)*sin((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))
-- scale the result based on width and center the 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) )
-- scale the result based on width and center the 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 'floatright' or 'floatleft')
:tag('div')
:addClass('thumbinner')
:css('width', width .. 'px')
:wikitext(text)
:tag('div')
:addClass('thumbcaption')
:wikitext(args.caption or '')
:tag('div')
:addClass('magnify')
:wikitext(string.format('[[:File:%s]]', image))
return tostring(divNode)
end
-- Returns the list of configured map codes
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
-- Returns 1 if the specified map is available, otherwise nil.
function p.hasmap(frame)
local map = frame.args[1] and mw.ustring.lower(frame.args[1])
return (cfg.alias[map] or cfg.mappe[map]) and 1
end
-- For use from another module
function p._main(args)
local map, ar, dec, text
local width = tonumber(args.width) or 260
local marksize = tonumber(args.marksize) or 15
-- gets the maps
if args.map then
args.map = _latinise_letters(args.map)
else
error('Map not specified', 2)
end
-- possibly others
args.map = cfg.alias[args.map] or args.map
if not cfg.mappe[args.map] then
error('Invalid map' .. args.map, 2)
end
map = cfg.mappe[args.map]
-- gets right ascension and declination
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
end
if not ar or not dec then
error('Invalid celestial coordinates', 2)
end
-- double maps
if args.map == 'ser' then
map = ar > 255 and map.cauda or map.caput
end
-- for constellations that cross the prime meridian
if map.ar_med > ar + 180 then
ar = ar + 360
end
-- use the Superimpose2 template
text = mw.getCurrentFrame():expandTemplate {
title = 'Superimpose2',
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.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 for the template {{IAU star location map}}
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(map)
local map, ar, dec, text
-- ottiene la map
if map then
map = _latinise_letters(map)
else
error('map non spécifiée', 2)
end
-- eventuale alias
map = cfg.alias[map] or map
if not cfg.mappe[map] then
error('map non disponibile: ' .. map, 2)
end
map = cfg.mappe[map]
-- map doppia
if map == 'ser' then
map = map.caput
end
-- utilizza il template Superpose
text = '[['.. map.page .. '|'.. string.gsub(map.page, ' %(constellation%)', '') ..']]'
return text
end
-- Entry-point for the template {{IAU star location map}}
function p.page(frame)
local map = frame.args[1]
return p._main2(map)
end
return p
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.