Modul:Messierobjekter

Moduldokumentasjon

local p = {}

-- henter inn nødvendige moduler
local getValueFromID = require('Modul:Sandkasse/Cocu/Wikidata').getValueFromID -- muliggjør arbitrary access
local ISOdate = require('Modul:ISOtilNorskdato').isodato -- formatterer dato

local function legend(frame, args)
	local opencluster = mw.getCurrentFrame():expandTemplate{ title = 'Legend2'
		, args = { '#eeeeff', '[[Stjernehop]]/[[Åpen stjernehop]]  ', ['border'] = '1px solid #aaaaaa'  } }
	local globularcluster = mw.getCurrentFrame():expandTemplate{ title = 'Legend2'
		, args = { '#ffe4b5', '[[Kulehop]]  ', ['border'] = '1px solid #aaaaaa'  } }
	local nebula = mw.getCurrentFrame():expandTemplate{ title = 'Legend2'
		, args = { '#ffcccc', '[[Stjernetåke]]  ', ['border'] = '1px solid #aaaaaa'  } }
	local planetarynebula = mw.getCurrentFrame():expandTemplate{ title = 'Legend2'
		, args = { '#ccffee', '[[Planetarisk tåke]]  ', ['border'] = '1px solid #aaaaaa'  } }
	local supernovaremnant = mw.getCurrentFrame():expandTemplate{ title = 'Legend2'
		, args = { '#ffccee', '[[Supernovarest]]  ', ['border'] = '1px solid #aaaaaa'  } }
	local galaxy = mw.getCurrentFrame():expandTemplate{ title = 'Legend2'
		, args = { '#ffffcc', '[[Galakse]]  ', ['border'] = '1px solid #aaaaaa'  } }
	local other = mw.getCurrentFrame():expandTemplate{ title = 'Legend2'
		, args = { '#ffffff', 'Andre', ['border'] = '1px solid #aaaaaa'  } }

	local result = opencluster .. globularcluster .. nebula ..
			planetarynebula .. supernovaremnant .. galaxy .. other .. '\n'
					
	return result
end

local function findQnr(frame)
	return {
	M1 = 10934, M2 = 11099, M3 = 11202, M4 = 11212, M5 = 11217, M6 = 11225, M7 = 11234, M8 = 11243, M9 = 11258, M10 = 11267,
	M11 = 11294, M12 = 11307, M13 = 11312, M14 = 11320, M15 = 11332, M16 = 11349, M17 = 11357, M18 = 11370, M19 = 11374, M20 = 11377,
	M21 = 11383, M22 = 11392, M23 = 11396, M24 = 13618, M25 = 13623, M26 = 13626, M27 = 13628, M28 = 13644, M29 = 13647, M30 = 13653,
	M31 = 2469, M32 = 13720, M33 = 13724, M34 = 13729, M35 = 13736, M36 = 13738, M37 = 13878, M38 = 13880, M39 = 13883, M40 = 13886,
	M41 = 13897, M42 = 13903, M43 = 13906, M44 = 13760, M45 = 13423, M46 = 13910, M47 = 13942, M48 = 13951, M49 = 13952, M50 = 13956,
	M51 = 13957, M52 = 13958, M53 = 13960, M54 = 13962, M55 = 13965, M56 = 13967, M57 = 13969, M58 = 13970, M59 = 13971, M60 = 13976,
	M61 = 13978, M62 = 13980, M63 = 13981, M64 = 13983, M65 = 13986, M66 = 13992, M67 = 13997, M68 = 14000, M69 = 14002, M70 = 14004,
	M71 = 14006, M72 = 14008, M73 = 14009, M74 = 14013, M75 = 14014, M76 = 14015, M77 = 14017, M78 = 14018, M79 = 14019, M80 = 14021,
	M81 = 14024, M82 = 14026, M83 = 14030, M84 = 14033, M85 = 14035, M86 = 2577, M87 = 14041, M88 = 14048, M89 = 14337, M90 = 14343,
	M91 = 14344, M92 = 14346, M93 = 14347, M94 = 14349, M95 = 14351, M96 = 14354, M97 = 14359, M98 = 14361, M99 = 14364, M100 = 14365, 
	M101 = 14371, M102 = 14374, M103 = 14376, M104 = 4647, M105 = 14377, M106 = 4658, M107 = 4755, M108 = 4751, M109 = 4746, M110 = 4662,
	}
end


local function header(frame, args)
	return [=[{| class="wikitable"
![[Messierkatalogen|Messier-<br />nummer]]
![[NGC-katalogen|NGC]]-/IC-nummer
!Vanlig navn
!Bilde
!Objekt
!Oppdager
!Oppdaget
![[Stjernebilde]]
!Ref]=]
end

function p.row(frame, args)
	
	retval = ''
	i = 1
	repeat
		-- finner Q-nummeret til Messierobjektet
		local qnr = findQnr(frame)
		qnr = tostring(qnr['M' .. i])
			
		-- definerer Q-iden for kobling mot Wikidata
		Qid = 'Q' .. qnr
		
		-- definerer Messiernummer
		Mnr = 'M' .. i
		
		-- definerer hva som skal stå i kolonnen for 'vanlig navn'. i denne tabellen brukes artikkelens etikett på Wikidata
		if mw.wikibase.label("Q" .. qnr) == nil then
			label = ''
		else
			label = mw.wikibase.label("Q" .. qnr)
		end
		
		local entity = mw.wikibase.getEntity("Q" .. qnr)
		
		-- definerer hvilken side på nowp det skal lenkes til og hva som skal vises som lenketekst
		local sitelink = mw.wikibase.sitelink("Q" .. qnr)
		if sitelink == nil then
			if label == '' then
				sitelink = '[[Messier ' .. i .. '|' .. Mnr .. ']]'
			else
				sitelink = '[[' .. label .. '|' .. Mnr .. ']]'
			end
		else 
			sitelink = '[[' .. sitelink .. '|' .. Mnr .. ']]'
		end
		
		-- definerer om det skal vises noe i kolonnen for 'vanlig navn'. hvis objektet ikke har noe annet navn enn 'Messier xxx', så vises det ingenting
		if label:match("Messier%s%d") or label:match("M%d") or label:match("M%s%d") then
			label = ''
		else
			label = label
		end
		
--		-- henter ut bilde fra Wikidata
		local p18 = mw.wikibase.getEntityObject("Q" .. qnr).claims.P18
		if not p18 then image = "" else image = "[[Fil:" .. p18[1].mainsnak.datavalue.value .. "|75px]]" end
				
		-- henter ut objekttype(r) fra Wikidata
		local claims = entity.claims["P31"]
		if claims then
			-- if wiki-linked value output as link if possible
			if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
				local out = {}
				for k, v in pairs(claims) do
					local sitelink = mw.wikibase.sitelink("Q" .. v.mainsnak.datavalue.value["numeric-id"])
					local label = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
					if label == nil then label = "" end
							
					if sitelink then
						out[#out + 1] = "[[" .. sitelink .. "|" .. label .. "]]"
					else
						out[#out + 1] = label
					end
				end
				objecttype = table.concat(out, "<br /> ")
			else
				objecttype = entity:formatPropertyValues("P31", mw.wikibase.entity.claimRanks).value
			end
		else
			objecttype = ""
		end
		
		-- definerer radfargen på bakgrunn av objekktype
		if objecttype == nil then
			color = ""
		elseif objecttype:match("..kulehop..") then
			color = 'style="background:#ffe4b5"'
		elseif objecttype:match("..stjernetåke..") or objecttype:match("..H.II..") or objecttype:match("..refleksjonståke..") then
			color = 'style="background:#ffcccc"'
		elseif objecttype:match("..galakse..") then
			color = 'style="background:#ffffcc"'
		elseif objecttype:match("..stjernehop..") or objecttype:match("..stjernesky..") then
			color = 'style="background:#eeeeff"'
		elseif objecttype:match("..supernova..") then
			color = 'style="background:#ffccee"'
		elseif objecttype:match("..planet..") then
			color = 'style="background:#ccffee"'
		else
			color = 'style="background:#ffffff"'
		end
		
		-- henter ut oppdager(e) fra Wikidata
		local claims = entity.claims["P61"]
		if claims then
			-- if wiki-linked value output as link if possible
			if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
				local out = {}
				for k, v in pairs(claims) do
					local sitelink = mw.wikibase.sitelink("Q" .. v.mainsnak.datavalue.value["numeric-id"])
					local label = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
					if label == nil then label = "Q" .. v.mainsnak.datavalue.value["numeric-id"] end
							
					if sitelink then
						out[#out + 1] = "[[" .. sitelink .. "|" .. label .. "]]"
					else
						out[#out + 1] = label
					end
				end
				discoverer = table.concat(out, "<br /> ")
			else
				discoverer = entity:formatPropertyValues("P61", mw.wikibase.entity.claimRanks).value
			end
		else
			discoverer = ""
		end
		
		-- henter ut oppdagelsesdato fra Wikidata
		discovered = ISOdate({args = {[1] = getValueFromID{args = {[1] = Qid, [2] = 'P575', [3] = 'hent_wikidata'}}}})
		
		-- henter ut stjernebilde fra Wikidata
		constellation = getValueFromID({args = {[1] = Qid, [2] = 'P59', [3] = 'hent_wikidata'}})

		-- henter ut avstand fra Wikidata
		distance = getValueFromID({args = {[1] = Qid, [2] = 'P2583', [3] = 'hent_wikidata'}})
		
		-- henter ut tilsynelatende størrelsesklasse fra Wikidata
		appmag = getValueFromID({args = {[1] = Qid, [2] = 'P1215', [3] = 'hent_wikidata'}})
		
		-- henter ut luminositet fra Wikidata
		luminosity = getValueFromID({args = {[1] = Qid, [2] = 'P2060', [3] = 'hent_wikidata'}})
		
		-- henter ut andre katalognavn fra Wikidata
		local claims = mw.wikibase.getEntity("Q" .. qnr).claims["P528"]
		if claims then
			catname = entity:formatPropertyValues("P528", mw.wikibase.entity.claimRanks).value
		else
			catname = ''
		end
		
		if string.match(catname, "NGC %d%d%d%d%d") == nil then
			if string.match(catname, "NGC %d%d%d%d") == nil then
				if string.match(catname, "NGC %d%d%d") == nil then
					if string.match(catname, "NGC %d%d") == nil then
						if string.match(catname, "NGC %d") == nil then
							if string.match(catname, "IC %d%d%d%d%d") == nil then
								if string.match(catname, "IC %d%d%d%d") == nil then
									if string.match(catname, "IC %d%d%d") == nil then
										if string.match(catname, "IC %d%d") == nil then
											if string.match(catname, "IC %d") == nil then
												ngcnr = "–"
											else
												ngcnr = string.match(catname, "IC %d")
											end
										else
											ngcnr = string.match(catname, "IC %d&d")
										end
									else
										ngcnr = string.match(catname, "IC %d%d%d")
									end
								else
									ngcnr = string.match(catname, "IC %d%d%d%d")
								end
							else
								ngcnr = string.match(catname, "IC %d%d%d%d%d")
							end
						else
							ngcnr = string.match(catname, "NGC %d")
						end
					else
						ngcnr = string.match(catname, "NGC %d%d")
					end
				else
					ngcnr = string.match(catname, "NGC %d%d%d")
				end
			else
				ngcnr = string.match(catname, "NGC %d%d%d%d")
			end
		else
			ngcnr = string.match(catname, "NGC %d%d%d%d%d")
		end
		
		
		-- lager en referanse
			-- definerer variabel i referansens url
			if i < 10 then url0 = '00' elseif i > 99 then url0 = "" else url0 = '0' end
			-- definerer variabel i referansens dato
			if i < 105 then year = '1771' else year = '1783' end
			ref =  mw.getCurrentFrame():expandTemplate{ title = 'Kilde www', args = { ['tittel'] = 'Messier ' .. i, ['språk'] = 'engelsk', ['besøksdato'] = '2015-09-18', 
			 ['url'] = 'http://messier.seds.org/m/m' .. url0 .. i .. '.html', ['forfatter'] = 'Messier, Charles', ['dato'] = year } } -- skriver referanse
			refstart = '<ref name="Messier' .. i .. '">'
			refend = '</ref>'
			
		-- setter sammen raden(e)
		retval = retval .. '\n' .. [=[
		|- ]=] .. color .. '\n' .. [=[
		| ]=] .. sitelink .. '\n' .. [=[
		|align="center"| ]=] .. ngcnr .. '\n' .. [=[
		| <i>]=] .. label .. '</i>\n' .. [=[
		|align="center"| ]=] .. image .. '\n' .. [=[
		| ]=] .. objecttype .. '\n' .. [=[
		| ]=] .. discoverer .. '\n' .. [=[
		| ]=] .. discovered .. '\n' .. [=[
		| ]=] .. constellation .. '\n' .. [=[
		| ]=] .. frame:preprocess(refstart .. ref .. refend) .. '\n'
		
		-- kjører loop
		i=i+1
		
		-- stopper her
	until i > 110
		
		-- returner radene
	return retval
end

local function bottom(frame, args)
	return [=[
	|-
	![[Messierkatalogen|Messier-<br />nummer]]
	![[NGC-katalogen|NGC]]-/IC-nummer
	!Vanlig navn
	!Bilde
	!Objekt
	!Oppdager
	!Oppdaget
	![[Stjernebilde]]
	!Ref
	|}]=]
end

function p.build(frame, args)
	legend = legend(frame, args)
	header = header(frame, args)
	row = p.row(frame, args)
	bottom = bottom(frame, args)
	
	return legend .. header .. row .. bottom
end

function p.navbox(frame, args)
	navbox = ''
	i = 1
	repeat
		-- finner Q-nummeret til Messierobjektet
		local qnr = findQnr(frame)
		qnr = tostring(qnr['M' .. i])
		
		-- definerer Messiernummer
		Mnr = 'M' .. i
		
		-- finner labelen fra Wikidata
		if mw.wikibase.label("Q" .. qnr) == nil then
			label = ''
		else
			label = mw.wikibase.label("Q" .. qnr)
		end
		
		-- definerer hvilken side på nowp det skal lenkes til og hva som skal vises som lenketekst
		local sitelink = mw.wikibase.sitelink("Q" .. qnr)
		if i == 110 then
			separator = ''
		else
			separator = '&nbsp;&middot; '
		end
		if sitelink == nil then
			if label == '' then
				sitelink = '[[Messier ' .. i .. '|' .. Mnr .. ']]' .. separator
			else
				sitelink = '[[' .. label .. '|' .. Mnr .. ']]' .. separator
			end
		else 
			sitelink = '[[' .. sitelink .. '|' .. Mnr .. ']]' .. separator
		end
		
		navbox = navbox .. sitelink
		i=i+1
		
	until i>110
	return navbox
end
return p