Modul:Cykelhold/sandkasse
Udseende
Dette er modulsandkassesiden for Modul:Cykelhold (forskel). |
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
[rediger kildetekst]- 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) 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