Aller au contenu

Module:Infobox/Cycliste

Cette page fait l’objet d’une mesure de semi-protection étendue.
Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 27 août 2018 à 15:56 et modifiée en dernier par Zebulon84 (discuter | contributions) (maintenance). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[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.


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(),
		}
	}