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.

  1. 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:
  2. 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.
  3. 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.
  4. 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.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.