Module:Infobox/Cycliste
Apparence
[voir] [modifier] [historique] [purger]
Cette page définit un module d'infobox. Pour les conseils sur l'usage de ce module, voyez Modèle:Infobox Cycliste.
La documentation de ce module est générée par le modèle {{Documentation module}}.
Elle est incluse depuis la page Modèle:Documentation module d'infobox. Veuillez placer les catégories sur cette page-là.
Les éditeurs peuvent travailler dans le bac à sable (créer).
Voir les statistiques d'appel depuis le wikicode sur l'outil wstat et les appels depuis d'autres modules.
local person = require "Module:Infobox/Fonctions/Personne"
local Wikidata = require "Module:Wikidata"
local CR = require "Module:Cycling race"
local Complexedate = require "Module:Date complexe"
local wikidataON=1
local function get( t, v, ... )
if v and type(t) == 'table' then
return get( t[v], ... )
elseif v then
return nil
else
return t
end
end
function timeStartEnd_entity(entity, property, mode, timeofrace)
-- mode = 'numeric-id', property = 'P54', Qid = 'Q123'
--local entity = mw.wikibase.getEntity(Qid)
local a, b = pcall(fooA, mode, entity, property, 1)
local starttime, endtime = '+0000-01-01', '+9999-12-31'
local available_lang_priority = available_lang_priority
if a == true then
local timeStartEnd = {}
local num = 1
local v
for _, v in pairs(entity.claims[property]) do
if pcall(function () local test = v.mainsnak.datavalue.value[mode] end) then -- test if not 'unnown value'
if pcall(function () starttime = v.qualifiers["P580"][1].datavalue.value.time end) then
starttime = v.qualifiers["P580"][1].datavalue.value.time
local _,_,year,m,d = string.find(starttime,"(%d+)-(%d+)-(%d+)")
if m == '00' and d == '00' then starttime = '+'..year..'-01-01T00:00:00Z' end
end
if pcall(function () endtime = v.qualifiers["P582"][1].datavalue.value.time end) then
endtime = v.qualifiers["P582"][1].datavalue.value.time
local _,_,year,m,d = string.find(endtime,"(%d+)-(%d+)-(%d+)")
if m == '00' and d == '00' then endtime = '+'..year..'-12-31T23:59:59Z' end
if m == '01' and d == '01' then endtime = '+'..year..'-12-31T23:59:59Z' end
end
if v.qualifiers then
if (not v.qualifiers["P580"] or starttime <= timeofrace)
and
(not v.qualifiers["P582"] or endtime >= timeofrace)
then
if available_lang_priority == true and property == "P1448" then
local test = false
pcall(function () if type( v.qualifiers["P1448"])=='table' then test=true end end)
if test == false then
timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
else
local lang_module, lang_WD
local language= ''
local zaehler
for i,j in ipairs(translations.lang_priority) do
lang_module = j
for number in pairs(v.qualifiers["P1448"]) do
lang_WD = v.qualifiers["P1448"][number].datavalue.value.language
if lang_WD == lang_module then zaehler = number break end
end -- for number in pairs
if lang_WD == lang_module then language = lang_WD break end
end -- for i,j
if language~='' then -- a WD translation matching translations.lang_priority exist
local t = v.qualifiers["P1448"][zaehler].datavalue.value.text
timeStartEnd[num] = t
else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]-- no matching between lang module and "official name" qualifier
end -- if language~=''
end -- test if official name qualifier exist
else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
end -- if property == "P1448"
num = num + 1
end
else
timeStartEnd[num] = v.mainsnak.datavalue.value[mode]
num = num + 1
end
end
end
return a, timeStartEnd[1]
else return false, '' end
end
local function teamValue( teamParam, dateParam )
return function( localdata )
local names, periods = localdata[ teamParam ], localdata[ dateParam ]
if not names then
return nil
end
if names then
names = mw.text.split(names, '<br />')
periods = mw.text.split(periods or '', '<br />')
end
local tab = mw.html.create('table')
for i, name in pairs(names) do
local row = mw.html.create('tr')
:tag('td'):wikitext(periods[i] or ''):done()
:tag('td'):wikitext(name):done()
tab:node(row):done()
end
tab:done()
return tostring(tab)
end
end
local function presentTeam(item)
local todaytable=os.date("*t")
if mw.ustring.len(todaytable["month"])==1 then todaytable["month"]='0'..todaytable["month"] end
if mw.ustring.len(todaytable["day"])==1 then todaytable["day"]='0'..todaytable["day"] end
today='+'..todaytable["year"].."-"..todaytable["month"].."-"..todaytable["day"].."T00:00:00Z"
a, b = timeStartEnd_entity(item,'P54', 'numeric-id', today)
if a == true and b~=nil then
return WPlink("Q"..b, 'team', today)
else
return nil
end
end
local function dateObject(orig)
local newobj = Complexedate.splitDate(orig)
local temp
--if newobj.day ==0 or newobj.day==nil then
if newobj.month == 0 or newobj.month==nil then
temp=newobj.year
else
temp=newobj.month..'.'..newobj.year
end
--else
--temp=newobj.day..'.'..newobj.month..'.'..newobj.year
--end
return temp
end
local function listofTeam(item)
--first we have to read P54 of the rider
local claims = Wikidata.getClaims{
entity = item,
property = 'P54',
conjtype = '<br />',
sorttype = 'chronological'
}
if not claims then
return nil
end
local riderteam={}
for i, v1 in pairs(item.claims["P54"]) do
d = get(v1, 'mainsnak', 'datavalue', 'value', 'numeric-id')
local starttime = get(v1, 'qualifiers', 'P580', 1, 'datavalue', 'value', 'time')
or get(v1, 'qualifiers', 'P585', 1, 'datavalue', 'value', 'time')
or 0
local endtime = get(v1, 'qualifiers', 'P582', 1, 'datavalue', 'value', 'time')
or get(v1, 'qualifiers', 'P585', 1, 'datavalue', 'value', 'time')
or 0
local stagiaire = get(v1, 'qualifiers', 'P39', 1, 'datavalue', 'value', 'numeric-id')
or 0
if d then
table.insert(riderteam,{"Q"..d, starttime, endtime, stagiaire})
end
end
return riderteam
end
local function comparedate(date1, beginorend1, date2, beginorend2)
local date1smaller=1
local year1, m1, d1
local year2, m2, d2
if date1==0 then
if date2==0 then
return 1--always smaller
end
else
_, _, year1,m1,d1 = string.find(date1, "(%d+)-(%d+)-(%d+)")
if m1 ==nil or m1=="00" then
if beginorend1==0 then --begin
m1="01"
d1="01"
else--end
m1="12"
d1="31"
end
end
end
if date2==0 then
return 1--always bigger
else
_, _, year2,m2,d2 = string.find(date2, "(%d+)-(%d+)-(%d+)")
if m2 ==nil or m2=="00" then
if beginorend2==0 then --begin
m2="01"
d2="01"
else--end
m2="12"
d2="31"
end
end
end
if year1==nil or year2 ==nil then
date1smaller=0
else
if tonumber(year1)<tonumber(year2) then
date1smaller=1
elseif tonumber(year1)>tonumber(year2) then
date1smaller=0
else
if tonumber(m1)<tonumber(m2) then
date1smaller=1
elseif tonumber(m1)>tonumber(m2) then
date1smaller=0
else
if d1==nil or d2==nil then
elseif tonumber(d1)<=tonumber(d2) then
date1smaller=1
elseif tonumber(d1)>tonumber(d2) then
date1smaller=0
end
end
end
end
return date1smaller
end
local function sortteamtable(teamrider)
iimax=#teamrider
newteamrider=teamrider
for i, v in pairs(teamrider) do
jjmax=iimax-i
table_sorted=1
jj=1
while jj<jjmax+1 do
comparisonTemp=comparedate(teamrider[jj][4],0,teamrider[jj+1][4],0)
if comparisonTemp==0 then
temp1=teamrider[jj][1]
temp2=teamrider[jj][2]
temp3=teamrider[jj][3]
temp4=teamrider[jj][4]
temp5=teamrider[jj][5]
newteamrider[jj][1]=teamrider[jj+1][1]
newteamrider[jj][2]=teamrider[jj+1][2]
newteamrider[jj][3]=teamrider[jj+1][3]
newteamrider[jj][4]=teamrider[jj+1][4]
newteamrider[jj][5]=teamrider[jj+1][5]
newteamrider[jj+1][1]=temp1
newteamrider[jj+1][2]=temp2
newteamrider[jj+1][3]=temp3
newteamrider[jj+1][4]=temp4
newteamrider[jj+1][5]=temp5
table_sorted=0
end
jj=jj+1
end
if table_sorted==1 then
break
end
end
return newteamrider
end
local function formatdate(date1)
if date1==0 then
return ''
else
return dateObject(date1)
end
end
local function listofteamname(teamrider)
local teamoutput={}
local sitelink
if teamrider==nil then
return nil
end
for ii, v in pairs(teamrider) do
teamname={} --it is a temp
thisteam = mw.wikibase.getEntityObject(teamrider[ii][1])
local teamlink=thisteam:getSitelink()
a,b =pcall(fooA, 'text', thisteam, 'P1448', 1)
if a == true then
for kk, v1 in pairs(thisteam.claims['P1448']) do
local starttime = get( v1, 'qualifiers', 'P580', 1, 'datavalue', 'value', 'time' )
or 0
local endtime = get( v1, 'qualifiers', 'P582', 1, 'datavalue', 'value', 'time' )
or 0
if teamlink==nil then
sitelink=v1.mainsnak.datavalue.value.text
else
sitelink='[['..teamlink..'|'..v1.mainsnak.datavalue.value.text..']]'
end
if starttime==0 and endtime==0 then --Only one name of team
table.insert(teamoutput,{sitelink, formatdate(teamrider[ii][2]),formatdate(teamrider[ii][3]),teamrider[ii][2],teamrider[ii][4]})
elseif starttime==0 and comparedate(endtime,1,teamrider[ii][3],1)==1 then --no beginning for name of team (not logical)
table.insert(teamoutput,{sitelink, formatdate(teamrider[ii][2]),formatdate(teamrider[ii][3]),teamrider[ii][2],teamrider[ii][4]})
elseif comparedate(starttime, 0,teamrider[ii][2],0)==1 and endtime==0 then --no ending for the name, the name was already so when the rider arrived in the team
table.insert(teamoutput,{sitelink, formatdate(teamrider[ii][2]),formatdate(teamrider[ii][3]),teamrider[ii][2],teamrider[ii][4]})
elseif comparedate(starttime,0, teamrider[ii][2],0)==1 and comparedate(teamrider[ii][3],1,endtime,1)==1 then --the name was so before and after the rider was in the team
table.insert(teamoutput,{sitelink, formatdate(teamrider[ii][2]), formatdate(teamrider[ii][3]),teamrider[ii][2],teamrider[ii][4]})
elseif comparedate(starttime, 0,teamrider[ii][2],0)==1 and comparedate(teamrider[ii][2],0,endtime,1)==1 then --the name started before arrival of the rider but changed then
table.insert(teamoutput,{sitelink, formatdate(teamrider[ii][2]),formatdate(endtime),teamrider[ii][2],teamrider[ii][4]})
elseif comparedate(starttime,0, teamrider[ii][3],1)==1 and comparedate(teamrider[ii][3],1, endtime, 1)==1 then --the name changed when the rider was already there and stayed the same afterwards
if teamrider[ii][3]==0 then
table.insert(teamoutput,{sitelink, formatdate(starttime), formatdate(endtime),starttime,teamrider[ii][4]})
else
table.insert(teamoutput,{sitelink, formatdate(starttime),formatdate(teamrider[ii][3]),starttime,teamrider[ii][4]})
end
elseif comparedate(teamrider[ii][2], 0,starttime,0)==1 and comparedate( endtime, 1,teamrider[ii][3],1)==1 then --the name is "included" in the period when the rider was there
table.insert(teamoutput,{sitelink, formatdate(starttime),formatdate(endtime),starttime,teamrider[ii][4]})
end
end
else
if teamlink==nil then
sitelink=thisteam:getLabel()
else
sitelink='[['..teamlink..'|'..thisteam:getLabel()..']]'
end
table.insert(teamoutput,{sitelink, formatdate(teamrider[ii][2]),formatdate(teamrider[ii][3]),teamrider[ii][2],teamrider[ii][4]})
end
end
return sortteamtable(teamoutput)
end
local function teamsplit(teamrider)
local thisteam
local teamamateur, teampro={},{}
local complexcase
for ii, v in pairs(teamrider) do
thisteam = mw.wikibase.getEntityObject(teamrider[ii][1])
a1,b1 =pcall(fooA, 'numeric-id', thisteam, 'P31', 1)
a2,b2 =pcall(fooA, 'numeric-id', thisteam, 'P31', 2)
if a1 ==true and a2==true then --at least two types
--table.insert(teampro, teamrider[ii])--too complex otherwise
teamid1=b1
teamid2=b2
if teamid1==20639848 or teamid1==20652655 or teamid1==26849121 then
if teamid2==20639848 or teamid2==20652655 or teamid2==26849121 then
table.insert(teamamateur, teamrider[ii])
else
table.insert(teampro, teamrider[ii])
end
else
table.insert(teampro, teamrider[ii])
end
elseif a1 == true then
teamid=b1
if teamid==2466826 or teamid==20639847 or teamid==1756006 or teamid==20653566 then --pro women, pro men, GSIII, continental
table.insert(teampro, teamrider[ii])
elseif teamid==20639848 or teamid==20652655 or teamid==26849121 then
table.insert(teamamateur, teamrider[ii])
else --by default pro
table.insert(teampro, teamrider[ii])
end
end
--
end
return teampro, teamamateur
end
local function listofTeamTable(localdata)
-- retourne une table de lignes contenant les anciens noms de l'équipe
local teamrider = listofTeam(localdata.item)
if not teamrider then
return nil
end
--table sorted
teampro, teamamateur =teamsplit(teamrider)
end
local function TeamTable(teamrider, titlesing, titleplural)
--local rows = {}
local rows = mw.html.create('table')
if teamrider ~=nil then
for i, period in pairs(teamrider) do --teamperiodbegin[i]..teamperiodend[i]
if teamrider[i][2]==teamrider[i][3] then
if teamrider[i][5]==0 then
periodtemp=teamrider[i][2]
nametemp=teamrider[i][1]
else
periodtemp=teamrider[i][2]
nametemp=teamrider[i][1]..' (stagiaire)'
end
else
if teamrider[i][5]==0 then
periodtemp=teamrider[i][2]..'-'..teamrider[i][3]
nametemp=teamrider[i][1]
else
periodtemp=teamrider[i][2]..'-'..teamrider[i][3]
nametemp=teamrider[i][1]..' (stagiaire)'
end
end
local row = mw.html.create('tr')
:tag('td'):wikitext(periodtemp or ''):done()
:tag('td'):wikitext(nametemp):done()
rows:node(row):done()
end
end
local title = titleplural
local temprows=tostring(rows)
if teamrider ==nil or #teamrider==0 then
temprows=nil
else
if #teamrider == 1 then
title = titlesing
end
end
return {type = 'table', title = title, rows = {{type = 'row', value = function () return temprows end}}}
end
local function AmateurTeamTable(localdata)
-- teamamateur called before
local NotUCInames = localdata['équipes non-UCI']
local Amateurnames = localdata['équipes amateur']
if NotUCInames or Amateurnames or localdata['équipes UCI'] or localdata['équipes pro'] then
wikidataON=0
end
if wikidataON==1 then
if teamamateur==nil then
listofTeamTable(localdata)
end
local teamrider=listofteamname(teamamateur)
return TeamTable(teamrider, 'Équipe non-UCI','Équipes non-UCI')
else
if NotUCInames then
return {type = 'table', title = 'Équipes non-UCI', rows = {{type = 'row', value = teamValue( 'équipes non-UCI', 'années non-UCI' )}}}
else
return {type = 'table', title = 'Équipes amateurs', rows = {{type = 'row', value = teamValue( 'équipes amateur', 'années amateur' )}}}
end
end
end
local function ProTeamTable(localdata)
local UCInames = localdata['équipes UCI']
local Pronames = localdata['équipes pro']
if wikidataON==1 then
if teampro==nil then
listofTeamTable(localdata)
end
local teamrider=listofteamname(teampro)
return TeamTable(teamrider, 'Équipe UCI','Équipes UCI')
else
if UCInames then
return {type = 'table', title = 'Équipes UCI', rows = {{type = 'row', value = teamValue( 'équipes UCI', 'années UCI' )}}}
else
return {type = 'table', title = 'Équipes professionnelles', rows = {{type = 'row', value = teamValue( 'équipes pro', 'années pro' )}}}
end
end
end
return
{
maincolor = '#FFDF80',
parts = {
person.title('cyclisme'),
person.mainimage('Article à illustrer Cycliste'),
{type = 'table', title = 'Informations', rows = {
person.othernames(),
person.birth(),
person.death(),
person.placeofburial(),
person.nationality(),
{type = 'row', label = 'Équipe actuelle', value = 'équipe',
wikidata = function ( item )
return presentTeam(item)
end,
},
{
type = 'row',
label = 'Spécialité',
singularlabel = 'Spécialité',
plurallabel = 'Spécialités',
value = 'type coureur',
property = 'P413'
},
{type = 'row', label = 'Latéralisation', property = 'P552'},
--person.appearance(),
{type = 'row', label = 'Groupe sanguin', property = 'P1853'},
--person.family(),
person.awards(),
},
},
AmateurTeamTable,
ProTeamTable,
{type = 'table', title = 'Équipes dirigées', rows = {
{type = 'row', value = teamValue( 'équipes dirigées', 'années direction' )}
}},
{type = 'table', title = 'Principales victoires', rows = {
{type = 'row', value = 'victoires principales'},
}},
person.plaque(),
person.tombe(),
}
}