Spring til indhold

Modul:Cykelhold

Page semibeskyttet
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), DCU Elite Team (Q114864716), atletikklub (Q7380012), amatørcykelhold (Q20652655) eller amatørcykelhold for damer (Q26849121), 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 == 'Q114864716' or holdtype == 'Q7380012' or holdtype == 'Q20652655' or holdtype == 'Q26849121' 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