Spring til indhold

Modul:Cykelhold/sandkasse

Fra Wikipedia, den frie encyklopædi
--[[ Modul til at finde oplysninger på Wikidata om hvilke hold en profession cykelrytter har kørt for,
     så de let kan vises i en infoboks.]]

local tracking_category_for_errors = '[[Kategori:Oplysninger om cykelhold på Wikidata mangelfulde eller kunne ikke tolkes]]'
local tracking_category_for_no_team = '[[Kategori:Cykelrytter mangler angivelse af nuværende hold]]'

local p = {}

-- require('Modul:No globals') -- Kan ikke bruges pga. Modul:Cycling race 
local getTeamLink = require("Modul:Cycling race").getLocal("getTeamLinkCat") 
local lang = mw.language.getContentLanguage()

local function getQualifier(q, prop, type)
	if q[prop] then
		local first = q[prop][1]
		if first.snaktype == 'value' then
			local value = first.datavalue.value[type]
			if type == 'time' then
				return value, first.datavalue.value.precision
			else
				return value
			end
		end
	end
end

local function formatTime(time, prec)
	if prec == 9 then -- years
		return string.sub(time, 2, 5)
	elseif prec == 10 then -- months
		return lang:formatDate('M" "Y', time)
	elseif prec == 11 then -- days
		return lang:formatDate('j." "M" "Y', time)
	end
	return ''
end

--[[ Funktionen returnerer true hvis cykelholdet teamID var et amatørhold, defineret som værende (P31)
     et cykelhold (Q20639848) eller amatørcykelhold (Q20652655), på tidspunktet starttime ]] 
local function isAmateur(teamID, starttime)
	mw.logObject(teamID, "teamID")
	mw.logObject(starttime, "starttime")
	local P31_statements = mw.wikibase.getAllStatements(teamID, 'P31') -- P31 er 'tilfælde af'
	for _, P31_statement in pairs(P31_statements) do
		--mw.logObject(P31_statement, "P31_statement")
		if P31_statement.mainsnak.snaktype == 'value' and P31_statement.rank ~= 'deprecated' then
			local holdtype = P31_statement.mainsnak.datavalue.value.id
			mw.logObject(holdtype, "holdtype")
			if holdtype == 'Q20639848' or holdtype == 'Q20652655' then
				-- holdet har været et amatørhold, men tjek om tidspunktet passer
				local q = P31_statement.qualifiers
				if not q then
					mw.log("Ingen q - returnerer true")
					return true -- ingen tidskvalifikatorer, så holdet var altid et amatørhold
				end
				local ah_start, ah_start_prec = getQualifier(q, 'P580', 'time') -- starttidspunkt
				local ah_end, ah_end_prec = getQualifier(q, 'P582', 'time') -- sluttidspunkt
				if ah_start_prec == 9 then
					--[[ starttiden har præcision "år". Skær måned og dag ud så hele året
					     tælles med ved sammenligning med starttime ]]
					ah_start = string.sub(ah_start, 1, 5)
				elseif ah_start_prec == 10 then
					--[[ starttiden har præcision "måned". Skær dag ud så hele måneden
					     tælles med ved sammenligning med starttime ]]
					ah_start = string.sub(ah_start, 1, 8)
				end
				if not ah_start or ah_start <= starttime then
					--[[ holdet var amatør på tidspunktet "starttime" eller før ]]
					if not ah_end then
						mw.log("not ah_start or ah_start <= starttime, og not ah_end - returnerer true")
						return true -- Intet sluttidspunkt, så holdet var stadig et amatørhold
					end
					if ah_end_prec == 9 then
						--[[ sluttiden har præcision "år". Sæt månedsværdien til 13
							 så hele året tælles med ved sammenligning med starttime ]]
						ah_end = string.sub(ah_end, 1, 6) .. '13'
					elseif ah_end_prec == 10 then
						--[[ sluttiden har præcision "måned". Sæt dagværdien til 32
							 så hele måneden tælles med ved sammenligning med starttime ]]
						ah_end = string.sub(ah_end, 1, 9) .. '32'
					end
					if ah_end >= starttime then
						mw.log("ah_end >= starttime - returnerer true")
						return true -- Amatørstatus varede mindst til tidspunktet "starttime"
					end
				end
			end
		end
	end
	return false -- Ingen af de testede hold var amatør på det givne tidspunkt
end

--[[ Funktionen bruges af "Skabelon:Cykelhold wd". Se skabelonen for beskrivelse. ]]
function p.alle_hold(frame)
	local args = (frame == mw.getCurrentFrame()) and frame:getParent().args or frame.args
	local riderID = args.q or mw.wikibase.getEntityIdForCurrentPage()
	if not riderID then
		return 'Fejl i Modul:Cykelhold: Wikidata-entitet ikke angivet.'
	end
	local holdtype = args.holdtype or "prof"
	if holdtype ~= "prof" and holdtype ~= "alle" and holdtype ~= "amatør" then
		return 'Fejl i Modul:Cykelhold: Ukendt værdi for holdtype'
	end
	local teams = mw.wikibase.getAllStatements(riderID, 'P54') -- P54 er 'medlem af sportshold'
	local teamTable = {}
	for _, team in pairs(teams) do
		if team.mainsnak.snaktype == 'value' and team.rank ~= 'deprecated' then
			local teamID = team.mainsnak.datavalue.value.id
			local q = team.qualifiers
			if q then
				starttime, startprec = getQualifier(q, 'P580', 'time')
				endtime, endprec = getQualifier(q, 'P582', 'time')
				position = getQualifier(q, 'P39', 'id')
			end
			if not starttime then
				return tracking_category_for_errors
			end
			-- Tjek om holdet har den ønskede holdtype på starttidspunktet
			if	(holdtype == "prof" and not isAmateur(teamID, starttime)) or
				(holdtype == "amatør" and isAmateur(teamID, starttime)) or
				holdtype == "alle" then

				if position and position ~= 'Q2328847' then -- 'Position held' is not 'stagiare'
					return tracking_category_for_errors
				end
				if startprec == 9 then -- start precision is years
					starttime = string.sub(starttime, 1, 5) .. '-01-01T00:00:00Z'
				elseif startprec == 10 then -- start precision is months
					starttime = string.sub(starttime, 1, 8) .. '-01T00:00:00Z'
				end
				local teamLink = getTeamLink(teamID, starttime)
				if position == 'Q2328847' then
					teamLink = teamLink .. " ''([[Stagiaire (cykelsport)|stagiaire]])''"
				end
				local startFormatted = formatTime(starttime, startprec)
				local endFormatted = formatTime(endtime, endprec)
				local years = (startFormatted == endFormatted) and startFormatted or (startFormatted .. '–' .. endFormatted)
				teamTable[#teamTable + 1] = { starttime, years, teamLink}
			end
		end
	end
	table.sort(teamTable, function(a,b)
		return a[1] < b[1] end)
	local text =
		'<table style="width:100%; line-height: 1.4em; vertical-align: top;"><tr>' ..
		'<th style="width: 30%; padding: 0.2em 0.1em 0.2em 0; text-align: left;">År</th>' ..
		'<th style="width: 70%; padding: 0.2em 0 0.2em 0.1em; text-align: left;">Hold' ..
		' [[File:Blue pencil.svg|frameless|text-top|6px|alt=Rediger på Wikidata|link=d:' .. riderID ..
		'#P54|Rediger på Wikidata]]</th></tr>'
	for _, i in ipairs(teamTable) do
		text = text .. '<tr><td>' .. i[2] .. '</td><td>' .. i[3] .. '</td></tr>'
	end
	return text .. '</table>'
end

--[[ Funktionen bruges af "Skabelon:Cykelhold nu". Se skabelonen for beskrivelse. ]]
function p.hold_nu(frame)
	local args = (frame == mw.getCurrentFrame()) and frame:getParent().args or frame.args
	local riderID = args.q or mw.wikibase.getEntityIdForCurrentPage()
	if not riderID then
		return 'Fejl i Modul:Cykelhold: Wikidata-entitet ikke angivet.'
	end

	local year = args['år']
	if year then
		year = '+' .. mw.text.trim(year)
		year = year .. string.sub('+0000-01-01T00:00:00Z', #year + 1, -1)
	else
		year = os.date('+%FT00:00:00Z')
	end

	local no_team = args['ingen']
	if no_team then
		no_team = mw.text.trim(noteam)
	else
		no_team = "''Stoppet''"
	end
	local getStatementForTime = require("Modul:Cycling race").getLocal("getStatementForTime")
	local statement = getStatementForTime(riderID, 'P54', year)
	if not statement then
		return no_team .. tracking_category_for_no_team
	end

	return (getTeamLink(statement.mainsnak.datavalue.value.id, year))
end
return p