Modul:Forfatter

Fra Wikisource, det frie bibliotek

Dokumentation for dette modul kan oprettes på Modul:Forfatter/dok

-- Forsøg at finde et passende wikipedialink på wikidata
local function findwikipedialink()
	local id = mw.wikibase.getEntity()
	if id == nil then
		return ""
	else
		local wikipedialiste = {"dawiki","enwiki","nowiki","svwiki","nnwiki","dewiki"}
		local linkprefix = {"","en:","no:","sv:","nn:","de:"}
		local link = nil
		for i,v in ipairs(wikipedialiste) do
			link = id:getSitelink(v)
			if link ~= nil then
				return linkprefix[i] .. link
			end
		end
		return ""
	end
end

-- Forsøg at finde et passende wikiquotelink på wikidata
local function findwikiquotelink()
	local id = mw.wikibase.getEntity()
	if id == nil then
		return ""
	else
		local wikiquoteliste = {"dawikiquote","enwikiquote","nowikiquote","svwikiquote","nnwikiquote","dewikiquote"}
		local linkprefix = {"","en:","no:","sv:","nn:","de:"}
		local link = nil
		for i,v in ipairs(wikiquoteliste) do
			link = id:getSitelink(v)
			if link ~= nil then
				return linkprefix[i] .. link
			end
		end
		return ""
	end
end

-- Forsøg at finde et passe commonslink på wikidata
local function findcommonslink()
	local id = mw.wikibase.getEntity()
	if id == nil then
		return ""
	else
		local p373 = id:getBestStatements("P373")
		if p373[1] ~= nil then
			if p373[1].mainsnak.datavalue ~= nil then
				return "Category:" .. p373[1].mainsnak.datavalue.value
			end
		end
		local p910 = id:getBestStatements("P910")
		if p910[1] ~= nil then
			if p910[1].mainsnak.datavalue ~= nil then
				local hovedkat = mw.wikibase.getEntity(p910[1].mainsnak.datavalue.value.id)
				if hovedkat ~= nil then
					local hovedkatlink = hovedkat:getSitelink("commonswiki")
					if hovedkatlink ~= nil then
						return hovedkatlink
					end
				end
			end
		end
		local link = id:getSitelink("commonswiki")
		if link ~= nil then
			return link
		end
		local p935 = id:getBestStatements("P935")
		if p935[1] ~= nil then
			if p935[1].mainsnak.datavalue ~= nil then
				return p935[1].mainsnak.datavalue.value
			end
		end
    	return ""
	end
end

-- Lav en i dato wikidataformat om til en passende tekststreng
-- Håndterer foreløbig ikke datoer angivet med +/- etellerandet korrekt
-- Håndterer foreløbig ikke datoer før år 1 med anden præcision end et år
-- Håndterer foreløbig ikke datoer med anden præcision end dag, måned, år eller årti
local function udtraekdato(dato, datotype)
	if mw.ustring.sub(dato.time,1,1) ~= "+" then
		if dato.precision >= 9 then
			-- Datoen er angivet til et specifikt år
			local aar = mw.ustring.sub(dato.time,2,5)
			if mw.ustring.sub(aar,1,1) == "0" then
				aar = mw.ustring.sub(aar,2,4)
			end
			if mw.ustring.sub(aar,1,1) == "0" then
				aar = mw.ustring.sub(aar,2,3)
			end
			if mw.ustring.sub(aar,1,1) == "0" then
				aar = mw.ustring.sub(aar,2,2)
			end
			if datotype == "bday" then
				return "<time datetime=\"-" .. aar .. "\" itemprop=\"birthDate\" class=\"" .. datotype .. "\">" .. aar .. "&nbsp;fvt.</time>"
			end
			if datotype == "dday" then
				return "<time datetime=\"-" .. aar .. "\" itemprop=\"deathDate\" class=\"" .. datotype .. "\">" .. aar .. "&nbsp;fvt.</time>"
			end
		end
		return nil
	end
	local lang = mw.language.getContentLanguage()
	if dato.precision >= 11 then
		-- Datoen er angivet til en specifik dag
		local isodato = lang:formatDate( "Y-m-d", dato.time)
		local formateretdato = lang:formatDate( "j. F Y", dato.time)
		if isodato ~= nil and formateretdato ~= nil then
			if datotype == "bday" then
				return "<time datetime=\"" .. isodato .. "\" itemprop=\"birthDate\" class=\"" .. datotype .. "\">" .. formateretdato .. "</time>"
			end
			if datotype == "dday" then
				return "<time datetime=\"" .. isodato .. "\" itemprop=\"deathDate\" class=\"" .. datotype .. "\">" .. formateretdato .. "</time>"
			end
		end
	else
		if dato.precision >= 10 then
			-- Datoen er angivet til en specifik måned og år, men ikke en dato
			-- Datoformateringsfunktionerne giver forkerte resultater med månedsdag på "00"
			local temp = mw.ustring.sub(dato.time,1,8) .. '-01'
			local isodato = lang:formatDate( "Y-m", temp)
			local formateretdato = lang:formatDate( "F Y", temp)
			if isodato ~= nil and formateretdato ~= nil then
				if datotype == "bday" then
					return "<time datetime=\"" .. isodato .. "\" itemprop=\"birthDate\" class=\"" .. datotype .. "\">" .. formateretdato .. "</time>"
				end
				if datotype == "dday" then
					return "<time datetime=\"" .. isodato .. "\" itemprop=\"deathDate\" class=\"" .. datotype .. "\">" .. formateretdato .. "</time>"
				end
			end
		else
			if dato.precision >= 9 then
				-- Datoen er angivet til et specifikt år, men ikke en specifik dato
				local aar = mw.ustring.sub(dato.time,2,5)
				if mw.ustring.sub(aar,1,1) == "0" then
					aar = mw.ustring.sub(aar,2,4)
				end
				if mw.ustring.sub(aar,1,1) == "0" then
					aar = mw.ustring.sub(aar,2,3)
				end
				if mw.ustring.sub(aar,1,1) == "0" then
					aar = mw.ustring.sub(aar,2,2)
				end
				if datotype == "bday" then
					return "<time datetime=\"" .. aar .. "\" itemprop=\"birthDate\" class=\"" .. datotype .. "\">" .. aar .. "</time>"
				end
				if datotype == "dday" then
					return "<time datetime=\"" .. aar .. "\" itemprop=\"deathDate\" class=\"" .. datotype .. "\">" .. aar .. "</time>"
				end
			else
				if dato.precision >= 8 then
					-- Datoen er angivet med præcision svarende til et årti
					local aarti = mw.ustring.sub(dato.time,2,5)
					if mw.ustring.sub(aarti,1,1) == "0" then
						aarti = mw.ustring.sub(aarti,2,4)
					end
					if mw.ustring.sub(aarti,1,1) == "0" then
						aarti = mw.ustring.sub(aarti,2,3)
					end
					if mw.ustring.sub(aarti,1,1) == "0" then
						aarti = mw.ustring.sub(aarti,2,2)
					end
					if datotype == "bday" then
						return "<time datetime=\"" .. aarti .. "\" itemprop=\"birthDate\" class=\"" .. datotype .. "\">" .. aarti .. "erne</time>"
					end
					if datotype == "dday" then
						return "<time datetime=\"" .. aarti .. "\" itemprop=\"deathDate\" class=\"" .. datotype .. "\">" .. aarti .. "erne</time>"
					end
				end
			end
		end
	end
	return nil
end

local p = {}

-- Tjek om siden er på wikidata
function p.tjekwikidata()
	local id = mw.wikibase.getEntity()
	if id == nil then
		return "[[Kategori:Forfattersider uden forbindelse til wikidata]]"
	else
		return ""
	end
end

-- Returnerer wikitekst for at vise et billede om muligt
function p.billedewikitekst(frame)
	local input = frame.args[1]
	local billede = ""
	local billedtekst = ""
	if input == "" or input == nil then
		-- Hvis der ikke er angivet et billede, så forsøg at finde et på wikidata
		local id = mw.wikibase.getEntity()
		if id ~= nil then
			local billedestatement = id:getBestStatements("P18")
			if billedestatement[1] ~= nil then
				if billedestatement[1].mainsnak.datavalue ~= nil then
					-- Der er et brugbart billede på wikidata
					billede = billedestatement[1].mainsnak.datavalue.value
					-- Kontroller om der også er angivet en billedtekst på dansk
					if billedestatement[1].qualifiers ~= nil then
						if billedestatement[1].qualifiers['P2096'] ~= nil then
							for i,j in pairs(billedestatement[1].qualifiers['P2096']) do
								if j.datavalue.value.language == "da" then
									billedtekst = j.datavalue.value.text
								end
							end
						end
					end
				end
			end
		end
	else
		billede = input
	end
	if billede ~= "" and billede ~= nil then
		if billedtekst == "" or billedtekst == nil then
			-- Hvis der ikke blev fundet en billedtekst på wikidata, så brug navnet istedet
			local navn = frame.args[2]
			billedtekst = navn
		end
		if billedtekst ~= "" and billedtekst ~= nil then
			return "[[Fil:" .. billede .. "|thumb|class=photo|" .. billedtekst .. "]]"
		else
			return "[[Fil:" .. billede .. "|thumb|class=photo]]"
		end
	else
		return ""
	end
end

-- Returnerer wikitekst for et link til wikipedia om muligt
function p.wikipedia(frame)
	local input = frame.args[1]
	local link = ""
	if input == "" or input == nil then
		-- Hvis der ikke er angivet et link, så forsøg at finde et på wikidata
		link = findwikipedialink()
	else
		link = input
	end
	if link ~= "" and link ~= nil then
		return "<div style=\"margin:0.5em;\">\'\'<div style=\"display: table-cell; vertical-align: middle;\">[[Fil:Wikipedia-logo-v2.svg|20px]] Biografi på \'\'\'[[w:" .. link .. "|Wikipedia]]\'\'\'</div>\'\'</div>"
	else
		return ""
	end
end

-- Returnerer wikitekst for et link til wikiquote om muligt
function p.wikiquote(frame)
	local input = frame.args[1]
	local link = ""
	if input == "" or input == nil then
		-- Hvis der ikke er angivet et link, så forsøg at finde et på wikidata
		link = findwikiquotelink()
	else
		link = input
	end
	if link ~= "" and link ~= nil then
		return "<div style=\"margin:0.5em;\">\'\'<div style=\"display: table-cell; vertical-align: middle;\">[[Fil:Wikiquote-logo.svg|20px]] Citater på \'\'\'[[q:" .. link .. "|Wikiquote]]\'\'\'</div>\'\'</div>"
	else
		return ""
	end
end

-- Returnerer wikitekst for et link til commons om muligt
function p.commons(frame)
	local input = frame.args[1]
	local link = ""
	if input == "" or input == nil then
		-- Hvis der ikke er angivet et link, så forsøg at finde et på wikidata
		link = findcommonslink()
	else
		link = input
	end
	if link ~= "" and link ~= nil then
		return "<div style=\"margin:0.5em;\">\'\'<div style=\"display: table-cell; vertical-align: middle;\">[[Fil:Commons-logo.svg|20px]] Billeder, videoer og lydfiler på \'\'\'[[commons:" .. link .. "|Wikimedia Commons]]\'\'\'</div>\'\'</div>"
	else
		return ""
	end
end

-- Returnerer wikitekst for fødsels- og dødsdatoer om muligt
function p.datoer(frame)
	local input = frame.args[1]
	if input ~= "" and input ~= nil then
		return " " .. input
	end
	local id = mw.wikibase.getEntity()
	if id == nil then
		return ""
	end
	-- Find fødselsdato
	local p569 = id:getBestStatements("P569")
	local fdato = nil
	if p569[1] ~= nil then
		if p569[1].mainsnak.datavalue ~= nil then
			fdato = udtraekdato(p569[1].mainsnak.datavalue.value, "bday")
		end
		-- Er der angivet to datoer med samme prioritet, så angiv begge med en skråstreg
		local fdato2 =nil
		if p569[2] ~= nil then
			if p569[2].mainsnak.datavalue ~= nil then
				fdato2 = udtraekdato(p569[2].mainsnak.datavalue.value, "bday")
			end
			if fdato ~= nil and fdato2 ~= nil then
				fdato = fdato .. "/" .. fdato2
			end
		end
	end
	-- Find dødsdato
	local p570 = id:getBestStatements("P570")
	local ddato = nil
	if p570[1] ~= nil then
		if p570[1].mainsnak.datavalue ~= nil then
			ddato = udtraekdato(p570[1].mainsnak.datavalue.value, "dday")
		end
		-- Er der angivet to datoer med samme prioritet, så angiv begge med en skråstreg
		local ddato2 =nil
		if p570[2] ~= nil then
			if p570[2].mainsnak.datavalue ~= nil then
				ddato2 = udtraekdato(p570[2].mainsnak.datavalue.value, "dday")
			end
			if ddato ~= nil and ddato2 ~= nil then
				ddato = ddato .. "/" .. ddato2
			end
		end
	end
	if fdato ~= nil and ddato ~= nil then
		return " (" .. fdato .. " – " .. ddato ..")"
	end
	if fdato ~= nil and ddato == nil then
		return " (f. " .. fdato .. ")"
	end
	if fdato == nil and ddato ~= nil then
		return " (d. " .. ddato .. ")"
	end
	return ""
end

return p