Modul:Cykelhold
Udseende
Modulet bruges af skabelonerne
- {{Cykelhold wd}} til at finde alle hold som en cykelrytter har kørt for. Se skabelonen for detaljer.
- {{Cykelhold nu}} til at finde det nuværende hold som en cykelrytter kører for. Se skabelonen for detaljer.
Modulet bruger funktioner fra Modul:Cycling race
Sporingskategorier oprettet af dette modul
- Kategori:Oplysninger om cykelhold på Wikidata mangelfulde eller kunne ikke tolkes (2 medlemmer)
- Noget gik galt ved analyse af data fra Wikidata (kategorien bør være tom)
- Kategori:Cykelrytter mangler angivelse af nuværende hold (8 medlemmer)
- {{Cykelhold nu}} er brugt for en cykelrytter uden et nuværende hold, sandynligvis har cykelrytteren indstillet karrieren
--[[ 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