Sari la conținut

Modul:InfoboxTeamSportBio

De la Wikipedia, enciclopedia liberă

local getArgs = require('Modul:Arguments').getArgs
local infobox3cols = require('Modul:Infobox3cols')
local wikidata = require('Modul:Wikidata')
local infoboxImage = require('Modul:InfoboxImage').InfoboxImage
local join = require('Modul:Separated entries').main
local StringUtils = require('Modul:StringUtils')
local DateUtils = require('Modul:DateUtils')
local lc = require('Modul:LocationAndCountry')
local bda = require('Modul:BirthDateAndAge')
local TableTools = require('Modul:TableTools')
local EditAtWikidata = require('Modul:EditAtWikidata')
local fc = require('Modul:FootballClub')
local zeroTemplate = mw.getCurrentFrame():expandTemplate{title='0', args={}}
local WDU_F = require('Modul:WikidataUtils/Football')
local allSportsData = mw.loadData('Modul:InfoboxTeamSportBio/data')

local p = {}

local text_seniorclubs = "Cluburi de seniori*"
local text_managerclubs = "Echipe antrenate"
local text_nationalteam = "Echipa națională"
local text_nationalteam_ext = ""

local function computeTeamDescriptor(teamId, endTimeFull)
	local teamIsNational = WDU_F.isNationalTeam(teamId)
	if teamIsNational then
		-- echipă națională
		local teamName = wikidata.findLinkToItemWithCallback(teamId, true, nil, WDU_F.getNationalTeamName)
		
		local countryIds = wikidata.getBestEntityIdsList(StringUtils.prependIfMissing({tostring(teamId), 'Q'}), 'P1532')
		if countryIds and #countryIds > 0 then
			local countryFlag = wikidata.findOneValueNoRef('P41', StringUtils.prependIfMissing({tostring(countryIds[1]), 'Q'}))
			if countryFlag and mw.text.trim(countryFlag) ~= '' then
				return '[[Fișier:' .. countryFlag .. '|20px|border]] ' .. teamName
			end
		end
	else 
		return fc.byItemFromArgs(teamId, endTimeFull)
	end
end

local function computeTimeDescriptor(team)
	if team.startTime then
		team.years = mw.ustring.sub(team.startTime, -4)
		if team.endTime then 
			if mw.ustring.sub(team.endTime, -4) ~= team.startTime then 
				team.years = team.years .. '-' .. mw.ustring.sub(team.endTime, -4)
			end
		else
			team.years = team.years .. '-'
		end
	end
end

local function extractDataAndNumberFromMultiParam(argName, paramNames)
	local actualParamName = nil
	local actualParamNumber
	for paramIndex = 1, #paramNames do
		local paramIndexWithEscapedBrackets = mw.ustring.gsub(mw.ustring.gsub(paramNames[paramIndex], '%(', '%%('), '%)', '%%)')
		local nlStart, nlEnd = mw.ustring.find(argName, paramIndexWithEscapedBrackets)
		if nlStart == 1 then
			actualParamName = mw.ustring.sub(argName, 1, nlEnd)
			local presumedIndex = mw.ustring.find(argName, "%d+$") or (1 + #argName)
			local indexStr = mw.text.trim(mw.ustring.sub(argName, presumedIndex, #argName) or "")
			if indexStr == "" then actualParamNumber = 1 else actualParamNumber = 1 + tonumber(indexStr) end
		end
	end
	if not actualParamName then return nil, nil end
	return actualParamName, actualParamNumber
end

local function extractTimeFromQualifier(qualifier)
	local wdStartTimes = qualifier
	if wdStartTimes and wdStartTimes[1] and wdStartTimes[1].datatype == 'time' then
		return wikidata.printSnak(wdStartTimes[1])
	end
	return nil
end

local function extractYearFromQualifier(qualifier)
	local wdStartTimes = qualifier
	if wdStartTimes and wdStartTimes[1] and wdStartTimes[1].datatype == 'time' then
		local dateFromSnak = DateUtils.extractDateFromWikidataSnak(wdStartTimes[1])
		return dateFromSnak and tostring(dateFromSnak.year), dateFromSnak
	end
	return nil
end

local function extractCapsAndGoals(argV)
	if not argV then return {} end
	local argWithout0 = mw.ustring.gsub(argV, zeroTemplate, '')
	local refs = {}
	mw.ustring.gsub(argWithout0, mw.ustring.char(0x007f) .. '.*' .. mw.ustring.char(0x007f), function(instance) table.insert(refs, instance) end)
	argWithout0 = mw.text.unstrip(argWithout0)
	if not mw.ustring.find(argWithout0, '%(') then return {argV}, refs end
	local capsAndGoals = {}
	mw.ustring.gsub(argWithout0, '%d+', function(instance) table.insert(capsAndGoals, tostring(tonumber(instance))) end )
	return capsAndGoals, refs
end

local function processArguments(args)
	local sportsData = allSportsData and allSportsData[args['sport']] or nil
	local processedArgs = {bgcolor='b0c4de',
		fgcolor='000',
		bodystyle='line-height: 1.2em',
		titlestyle='line-height: 1.5em',
		labelstyle='white-space: nowrap; vertical-align: baseline; text-align: left',
		datastyle='vertical-align: baseline',
		datastylea='white-space: nowrap; vertical-align: baseline',
		multidatastyle='white-space: nowrap; vertical-align: baseline',
		datastyleb='white-space: nowrap; vertical-align: baseline; text-align: right',
		datastylec='white-space: nowrap; vertical-align: baseline; text-align: right',
		headerstyle='line-height: 1.5em',
		wikidata='yes'}
	processedArgs.doc = sportsData and sportsData.mainTemplate or 'Modul:InfoboxTeamSportBio'
	processedArgs.above = args['name'] or args['nume'] or args['playername'] or args['numejucător'] or args['nume jucător'] or StringUtils._emptyToNil({wikidata.findLabel(nil, nil)}) or mw.title.getCurrentTitle().text
	processedArgs.aboveclass = args['aboveclass'] or (sportsData and sportsData.header) or 'fotbal2'
	local imgName, imgCaption = (args['image'] or args['imagine']), args['imagine_descriere']
	local imgExists = false
	if imgName and mw.text.trim(imgName) ~= '' then
		if StringUtils._startsWithAny({mw.text.trim(imgName), '[['}) then
			imgName = StringUtils._substringBefore({mw.text.trim(imgName), ']]', '|'})
			imgName = StringUtils._removeStart({imgName, '[['})
		end
		imgName = StringUtils._removeStart({mw.text.trim(imgName), 'File:'})
		imgName = StringUtils._removeStart({imgName, 'Fișier:'})
		imgName = StringUtils._removeStart({imgName, 'Fişier:'})
		imgName = StringUtils._removeStart({imgName, 'Image:'})
		imgName = StringUtils._removeStart({imgName, 'Imagine:'})
		imgName = StringUtils._removeStart({imgName, 'Media:'})
		local imgTitle = mw.title.new(imgName, 6)
		if imgTitle and imgTitle.file and imgTitle.file.exists then
			imgExists = true
		end
	end
	if not imgExists then
		imgName, imgCaption = wikidata.findImageAndCaption()
	end
	if imgName and imgName ~= '' then
		processedArgs.image = infoboxImage{image=imgName, size = args['image_size'] or args['mărime'], sizedefault = frameless, alt = args['alt'], suppressplaceholder='yes'}
		processedArgs.caption = imgCaption or ''
	end
	local lineIndex = 1
	processedArgs['header' .. tostring(lineIndex)] = 'Informații generale'
	lineIndex = lineIndex + 1
	
	processedArgs['label' .. tostring(lineIndex)] = 'Nume complet'
	processedArgs['data' .. tostring(lineIndex)] = args['fullname'] or args['nume complet'] or args['numecomplet'] or wikidata.findOneValue('P1477')
	processedArgs['class' .. tostring(lineIndex)] = 'nickname'
	lineIndex = lineIndex + 1

	processedArgs['label' .. tostring(lineIndex)] = 'Data nașterii'
	processedArgs['data' .. tostring(lineIndex)] = args['dateofbirth'] or args['birth_date'] or args['datanașterii'] or args['data nașterii'] or bda._getBdaByWikidata{link='y'}
	lineIndex = lineIndex + 1
	
	processedArgs['label' .. tostring(lineIndex)] = 'Locul nașterii'
	local birthPlace = args['birth_place'] or args['cityofbirth'] or args['loculnașterii'] or args['locul nașterii']
	local birthCountry
	if birthPlace == nil then
		birthPlace = lc.displayFromParams('P19', nil, 'P569', 1, ', ')
	end
	if birthCountry == nil then
		birthCountry = args['countryofbirth'] or args['țaranașterii'] or args['țara nașterii']
	end
	if birthPlace == birthCountry then
		birthCountry = nil
	end
	processedArgs['data' .. tostring(lineIndex)] = join({birthPlace, birthCountry, separator = ', '})
	processedArgs['class' .. tostring(lineIndex)] = 'birthplace'
	lineIndex = lineIndex + 1
	
	processedArgs['label' .. tostring(lineIndex)] = 'Data decesului'
	processedArgs['data' .. tostring(lineIndex)] = args['dateofdeath'] or args['death_date'] or args['datadecesului'] or args['data decesului'] or bda._getDdaByWikidata{link='y'}
	lineIndex = lineIndex + 1
	
	processedArgs['label' .. tostring(lineIndex)] = 'Locul decesului'

	processedArgs['data' .. tostring(lineIndex)] = args['death_place'] or args['cityofdeath'] or args['loculdecesului'] or args['locul decesului'] or lc.displayFromParams('P20', nil, 'P570', 1, ', ')
	if args['countryofdeath'] or args['țaradecesului'] or args['țara decesului'] then
		processedArgs['data' .. tostring(lineIndex)] = processedArgs['data' .. tostring(lineIndex)] .. ', ' .. (args['countryofdeath'] or args['țaradecesului'] or args['țara decesului'])
	end
	processedArgs['class' .. tostring(lineIndex)] = 'deathplace'
	lineIndex = lineIndex + 1
	
	processedArgs['label' .. tostring(lineIndex)] = 'Naționalitate'
	processedArgs['data' .. tostring(lineIndex)] = args['nationality'] or args['naționalitate']
	lineIndex = lineIndex + 1
	
	processedArgs['label' .. tostring(lineIndex)] = 'Înălțime'
	processedArgs['data' .. tostring(lineIndex)] = args['height'] or args['înălțime'] or wikidata.findOneValue('P2048')
	lineIndex = lineIndex + 1
	
	processedArgs['label' .. tostring(lineIndex)] = 'Greutate'
	processedArgs['data' .. tostring(lineIndex)] = args['weight'] or args['greutate'] or args['weigth'] or wikidata.findOneValue('P2067')
	lineIndex = lineIndex + 1
	
	processedArgs['label' .. tostring(lineIndex)] = 'Poreclă'
	processedArgs['data' .. tostring(lineIndex)] = args['nickname'] or args['poreclă'] or args['porecla'] or wikidata.findOneValue('P1449')
	lineIndex = lineIndex + 1
	
	processedArgs['label' .. tostring(lineIndex)] = 'Post'
	processedArgs['data' .. tostring(lineIndex)] = args['position'] or args['post']
	if not args['position'] and not args['post'] then
		local wdPositions = wikidata._getValueListWithSeparator({tostring(mw.html.create('br')), 'P413', nil})
 		processedArgs['data' .. tostring(lineIndex)] = wdPositions
	end
	processedArgs['class' .. tostring(lineIndex)] = 'role'
	lineIndex = lineIndex + 1
	
	local currentClub = args['currentclub'] or args['echipaactuală'] or args['echipăactuală'] or args ['clubul actual'] or args['echipa actuală']
	if not currentClub or mw.text.trim(currentClub) == '' then
		local clubsClaims = wikidata.findBestClaimsForProperty(nil, 'P54') -- member of sports team
		if clubsClaims and #clubsClaims > 0 and clubsClaims[1].rank == 'preferred' then
			if clubsClaims[1].mainsnak.snaktype == 'value' and clubsClaims[1].mainsnak.datavalue.type == 'wikibase-entityid' then
				local clubId = clubsClaims[1].mainsnak.datavalue.value['numeric-id']
				currentClub = fc.byItemFromArgs(StringUtils.prependIfMissing({tostring(clubId), 'Q'}))
			end
		end
	end
	if currentClub and currentClub ~= '' then
		processedArgs['header' .. tostring(lineIndex)] = 'Informații despre echipă'
		lineIndex = lineIndex + 1
	end
	
	processedArgs['label' .. tostring(lineIndex)] = 'Echipa actuală'
	processedArgs['data' .. tostring(lineIndex)] = currentClub
	processedArgs['class' .. tostring(lineIndex)] = 'org'
	lineIndex = lineIndex + 1
	
	processedArgs['label' .. tostring(lineIndex)] = 'Număr'
	processedArgs['data' .. tostring(lineIndex)] = args['clubnumber'] or args['număr'] or args['numărtricou'] or StringUtils._appendToString({wikidata.loadOneValueInChain({ 'P1618' }), EditAtWikidata.displayMessage('P1618')}) or StringUtils._appendToString({wikidata.loadOneValueInChain({ 'P54', '_P1618' }), EditAtWikidata.displayMessage('P54')})
	if not processedArgs['data' .. tostring(lineIndex)] or processedArgs['data' .. tostring(lineIndex)] == '' then processedArgs['data' .. tostring(lineIndex)] = wikidata.findOneValue('P1618') end
	lineIndex = lineIndex + 1
	
	local youthclubs = {}
	local seniorclubs = {}
	local managerclubs = {}
	local nationalteams = {}
	local titles = {}
	local embedded = {}
	local hasseniorgoals = false
	local hasnationalgoals = false
	for argN,argV in pairs(args) do
		local presumedYouthYearsParamName, presumedYouthYearsParamNumber = extractDataAndNumberFromMultiParam(argN, {"youthyears", "anijuniorat", "anidetineret"})
		if presumedYouthYearsParamName and presumedYouthYearsParamNumber and type(presumedYouthYearsParamNumber) == 'number' then
			if not youthclubs[presumedYouthYearsParamNumber] then youthclubs[presumedYouthYearsParamNumber] = {} end
			youthclubs[presumedYouthYearsParamNumber].years = argV
		end
		local presumedYouthClubParamName, presumedYouthClubParamNumber = extractDataAndNumberFromMultiParam(argN, {"youthclubs", "juniorat", "echipedetineret"})
		if presumedYouthClubParamName and presumedYouthClubParamNumber and type(presumedYouthClubParamNumber) == 'number' then
			if not youthclubs[presumedYouthClubParamNumber] then youthclubs[presumedYouthClubParamNumber] = {} end
			youthclubs[presumedYouthClubParamNumber].name = argV
		end
		
		if argN == 'title' or argN == 'titlu' or mw.ustring.find(argN, 'title%d+') then
			local presumedTitleParamName, presumedTitleParamNumber = extractDataAndNumberFromMultiParam(argN, {"title", "titlu"})
			if presumedTitleParamName and presumedTitleParamNumber and type(presumedTitleParamNumber) == 'number' then
				if not titles[presumedTitleParamNumber] then titles[presumedTitleParamNumber] = {} end
				titles[presumedTitleParamNumber].name = argV
			end
		end
		
		local presumedTitleYearsParamName, presumedTitleYearsParamNumber = extractDataAndNumberFromMultiParam(argN, {"titleyears", "anititlu"})
		if presumedTitleYearsParamName and presumedTitleYearsParamNumber and type(presumedTitleYearsParamNumber) == 'number' then
			if not titles[presumedTitleYearsParamNumber] then titles[presumedTitleYearsParamNumber] = {} end
			titles[presumedTitleYearsParamNumber].years = argV
		end

		if argN == 'club' or mw.ustring.find(argN, 'clubs?%d+') == 1 or argN == 'clubs' or argN == 'echipe' or mw.ustring.find(argN, 'echipe%d+') then
			local presumedClubParamName, presumedClubParamNumber = extractDataAndNumberFromMultiParam(argN, {"club", "clubs", "echipe"})
			if presumedClubParamName and presumedClubParamNumber and type(presumedClubParamNumber) == 'number' then
				if not seniorclubs[presumedClubParamNumber] then seniorclubs[presumedClubParamNumber] = {} end
				seniorclubs[presumedClubParamNumber].name = argV
			end
		end
		
		if argN == 'ani' or mw.ustring.find(argN, 'ani%d+') == 1 or mw.ustring.find(argN, 'ani', 1, true) ~= 1 then
			local presumedYearsParamName, presumedYearsParamNumber = extractDataAndNumberFromMultiParam(argN, {"years", "ani"})
			if presumedYearsParamName and presumedYearsParamNumber and type(presumedYearsParamNumber) == 'number' then
				if not seniorclubs[presumedYearsParamNumber] then seniorclubs[presumedYearsParamNumber] = {} end
				seniorclubs[presumedYearsParamNumber].years = argV
			end
		end
		
		if mw.ustring.find(argN, 'ap%d+') == 1 or mw.ustring.find(argN, 'apariții%(goluri%)%d*') == 1 or mw.ustring.find(argN, 'ap') ~= 1 then
			local presumedCapsParamName, presumedCapsParamNumber = extractDataAndNumberFromMultiParam(argN, {"caps", "caps(goals)", "apariții(goluri)", "ap"})
			if presumedCapsParamName and presumedCapsParamNumber and type(presumedCapsParamNumber) == 'number' then
				if not seniorclubs[presumedCapsParamNumber] then seniorclubs[presumedCapsParamNumber] = {} end
				if mw.ustring.find(argV, '<') then
					seniorclubs[presumedCapsParamNumber].caps = mw.ustring.gsub(argV, zeroTemplate, '')
				else
					local capsAndGoals, capsRefs = extractCapsAndGoals(argV)
					if #capsAndGoals > 0 then seniorclubs[presumedCapsParamNumber].caps = capsAndGoals[1] end
					if #capsAndGoals > 1 then seniorclubs[presumedCapsParamNumber].goals = capsAndGoals[#capsAndGoals] end
					if capsRefs and #capsRefs > 0 then seniorclubs[presumedCapsParamNumber].refs = table.concat(capsRefs) end
					hasseniorgoals = true
				end
			end
		end

		local presumedGoalsParamName, presumedGoalsParamNumber = extractDataAndNumberFromMultiParam(argN, {"goals", "goluri"})
		if presumedGoalsParamName and presumedGoalsParamNumber and type(presumedGoalsParamNumber) == 'number' then
			if not seniorclubs[presumedGoalsParamNumber] then seniorclubs[presumedGoalsParamNumber] = {} end
			seniorclubs[presumedGoalsParamNumber].goals = argV
			hasseniorgoals = true
		end

		local presumedNtGoalsParamName, presumedNtGoalsParamNumber = extractDataAndNumberFromMultiParam(argN, {"nationalgoals", "goluri nationala", "goluri națională"})
		if presumedNtGoalsParamName and presumedNtGoalsParamNumber and type(presumedNtGoalsParamNumber) == 'number' then
			if not nationalteams[presumedNtGoalsParamNumber] then nationalteams[presumedNtGoalsParamNumber] = {} end
			nationalteams[presumedNtGoalsParamNumber].goals = argV
			hasnationalgoals = true
		end
		local presumedNtYearsParamName, presumedNtYearsParamNumber = extractDataAndNumberFromMultiParam(argN, {"nationalyears", "ani nationala", "ani națională", "anilanațională", "ani la națională"})
		if presumedNtYearsParamName and presumedNtYearsParamNumber and type(presumedNtYearsParamNumber) == 'number' then
			if not nationalteams[presumedNtYearsParamNumber] then nationalteams[presumedNtYearsParamNumber] = {} end
			nationalteams[presumedNtYearsParamNumber].years = argV
		end
		local presumedNtCapsParamName, presumedNtCapsParamNumber = extractDataAndNumberFromMultiParam(argN, {"nationalcaps", "nationala ap", "naționala ap", "aparițiilanațională(goluri)", "selecții (goluri)", "nationalcaps(goals)"})
		if presumedNtCapsParamName and presumedNtCapsParamNumber and type(presumedNtCapsParamNumber) == 'number' then
			if not nationalteams[presumedNtCapsParamNumber] then nationalteams[presumedNtCapsParamNumber] = {} end
			if mw.ustring.find(argV, '<') then
				nationalteams[presumedNtCapsParamNumber].caps = mw.ustring.gsub(argV, zeroTemplate, '')
			else
				local capsAndGoals, capsRefs = extractCapsAndGoals(argV)
				if #capsAndGoals > 0 then nationalteams[presumedNtCapsParamNumber].caps = capsAndGoals[1] end
				if #capsAndGoals > 1 then nationalteams[presumedNtCapsParamNumber].goals = capsAndGoals[#capsAndGoals] end
				if capsRefs and #capsRefs > 0 then nationalteams[presumedNtCapsParamNumber].refs = table.concat(capsRefs) end
				hasnationalgoals = true
			end
		end
		if not mw.ustring.find(argN, "nationala ap") and not mw.ustring.find(argN, "nationalteam%-update") then
			local presumedNtTeamParamName, presumedNtTeamParamNumber = extractDataAndNumberFromMultiParam(argN, {"nationalteam", "nationala", "naționala", "echipănațională", "națională"})
			if presumedNtTeamParamName and presumedNtTeamParamNumber and type(presumedNtTeamParamNumber) == 'number' then
				if not nationalteams[presumedNtTeamParamNumber] then nationalteams[presumedNtTeamParamNumber] = {} end
				nationalteams[presumedNtTeamParamNumber].name = argV
			end
		end
		local presumedMgrYearsParamName, presumedMgrYearsParamNumber = extractDataAndNumberFromMultiParam(argN, {"manageryears", "anideantrenorat", "aniantrenorat", "ani antrenor"})
		if presumedMgrYearsParamName and presumedMgrYearsParamNumber and type(presumedMgrYearsParamNumber) == 'number' then
			if not managerclubs[presumedMgrYearsParamNumber] then managerclubs[presumedMgrYearsParamNumber] = {} end
			managerclubs[presumedMgrYearsParamNumber].years = argV
		end
		if argN ~= 'echipedetineret' then
			local presumedMgrClubParamName, presumedMgrClubParamNumber = extractDataAndNumberFromMultiParam(argN, {"managerclubs", "echipeantrenate", "club antrenat"})
			if presumedMgrClubParamName and presumedMgrClubParamNumber and type(presumedMgrClubParamNumber) == 'number' then
				if not managerclubs[presumedMgrClubParamNumber] then managerclubs[presumedMgrClubParamNumber] = {} end
				managerclubs[presumedMgrClubParamNumber].name = argV
			end
		end
		if mw.ustring.find(argN, 'embedded%d+') == 1 then
			local embeddedParamName, embeddedNo = extractDataAndNumberFromMultiParam(argN, {"embedded"})
			embedded[embeddedNo] = argV
		end
	end
	processedArgs['doc-colspan'] = '3'
	if table.maxn(youthclubs) == 1 and youthclubs[1].name then
		local youthclubnameslist = mw.text.split(youthclubs[1].name, "%s*<br%s*/?>%s*")
		local youthclubyearslist = mw.text.split(youthclubs[1].years or '', "%s*<br%s*/?>%s*")
		for youthclubindex = 1, table.maxn(youthclubnameslist) do
			youthclubs[youthclubindex] = {}
			youthclubs[youthclubindex].name = youthclubnameslist[youthclubindex]
			youthclubs[youthclubindex].years = youthclubyearslist[youthclubindex]
		end
	end
	if table.maxn(seniorclubs) == 1 and seniorclubs[1].name then
		local seniorclubnameslist = mw.text.split(seniorclubs[1].name or '', "%s*<%s*br%s*/?>%s*")
		local seniorclubyearslist = mw.text.split(seniorclubs[1].years or '', "%s*<%s*br%s*/?>%s*")
		local seniorclubcapslist = mw.text.split(seniorclubs[1].caps or '', "%s*<%s*br%s*/?>%s*")
		for seniorclubindex = 1, table.maxn(seniorclubyearslist) do
			local capsAndGoals = extractCapsAndGoals(seniorclubcapslist[seniorclubindex])
			if mw.ustring.lower(seniorclubyearslist[seniorclubindex]) == 'total' then
				if #capsAndGoals > 0 then args['totalcaps'] = tonumber(capsAndGoals[1]) end
				if #capsAndGoals > 1 then args['totalgoals'] = tonumber(capsAndGoals[#capsAndGoals]) end
				if args['totalcaps'] or args['totalgoals'] then hasseniorgoals = true end
			else
				if seniorclubs[seniorclubindex] == nil then seniorclubs[seniorclubindex] = {} end
				seniorclubs[seniorclubindex].name = seniorclubnameslist[seniorclubindex]
				seniorclubs[seniorclubindex].years = seniorclubyearslist[seniorclubindex]
				if #capsAndGoals > 0 then seniorclubs[seniorclubindex].caps = tonumber(capsAndGoals[1]) end
				if #capsAndGoals > 1 then seniorclubs[seniorclubindex].goals = tonumber(capsAndGoals[#capsAndGoals]) end
				if seniorclubs[seniorclubindex].caps or seniorclubs[seniorclubindex].goals then hasseniorgoals = true end
			end
		end
	end
	if table.maxn(nationalteams) == 1 and nationalteams[1].name then
		local nationalteamnameslist = mw.text.split(nationalteams[1].name or '', "%s*<br%s*/?>%s*")
		local nationalteamyearslist = mw.text.split(nationalteams[1].years or '', "%s*<br%s*/?>%s*")
		local nationalteamcapslist = mw.text.split(nationalteams[1].caps or '', "%s*<br%s*/?>%s*")
		for nationalteamindex = 1, table.maxn(nationalteamnameslist) do
			local eachyouthclub = {}
			if nationalteams[nationalteamindex] == nil then nationalteams[nationalteamindex] = {} end
			nationalteams[nationalteamindex].name = nationalteamnameslist[nationalteamindex]
			nationalteams[nationalteamindex].years = nationalteamyearslist[nationalteamindex]
			local capsAndGoals = extractCapsAndGoals(nationalteamcapslist[nationalteamindex])
			if #capsAndGoals > 0 then nationalteams[nationalteamindex].caps = tonumber(capsAndGoals[1]) end
			if #capsAndGoals > 1 then nationalteams[nationalteamindex].goals = tonumber(capsAndGoals[#capsAndGoals]) end
			if nationalteams[nationalteamindex].caps or nationalteams[nationalteamindex].goals then hasnationalgoals = true end
		end
	end
	if table.maxn(managerclubs) == 1 and managerclubs[1].name then
		local managerclubnameslist = mw.text.split(managerclubs[1].name or '', "%s*<br%s*/?>%s*")
		local managerclubyearslist = mw.text.split(managerclubs[1].years or '', "%s*<br%s*/?>%s*")
		for managerclubindex = 1, table.maxn(managerclubnameslist) do
			managerclubs[managerclubindex] = {}
			managerclubs[managerclubindex].name = managerclubnameslist[managerclubindex]
			managerclubs[managerclubindex].years = managerclubyearslist[managerclubindex]
		end
	end

	-- extract teams from wikidata
	if table.maxn(nationalteams) + table.maxn(seniorclubs) == 0 then
		local teamClaimsReversed = wikidata.findSortedClaimsForProperty(nil, 'P54') --member of sports team
		local teamClaims = {}
		if #teamClaimsReversed > 0 then
			text_seniorclubs = text_seniorclubs .. ' ' .. EditAtWikidata.displayMessage('P54')
			text_nationalteam_ext = ' ' .. EditAtWikidata.displayMessage('P54')
		end
		for teamClaimIdx = 1,#teamClaimsReversed do
			table.insert(teamClaims, 1, teamClaimsReversed[teamClaimIdx])
		end
		for teamClaimIdx = 1,#teamClaims do
			if teamClaims[teamClaimIdx].mainsnak.snaktype == 'value' and teamClaims[teamClaimIdx].mainsnak.datatype == 'wikibase-item' then
				local teamId = teamClaims[teamClaimIdx].mainsnak.datavalue.value.id
				local team = {}
				
				team.startTime = nil
				team.endTime = nil
				local startTimeFull, endTimeFull
				if teamClaims[teamClaimIdx].qualifiers then
					team.startTime, startTimeFull = extractYearFromQualifier(teamClaims[teamClaimIdx].qualifiers['P580'])
					team.endTime, endTimeFull = extractYearFromQualifier(teamClaims[teamClaimIdx].qualifiers['P582'])
					if teamClaims[teamClaimIdx].qualifiers['P1350'] and teamClaims[teamClaimIdx].qualifiers['P1350'][1] and teamClaims[teamClaimIdx].qualifiers['P1350'][1].datatype == 'quantity' then
						team.caps = tonumber(teamClaims[teamClaimIdx].qualifiers['P1350'][1].datavalue.value.amount)
						if WDU_F.isNationalTeam(teamId) then 
							hasnationalgoals = true 
						else 
							hasseniorgoals = true
						end
					end
					if teamClaims[teamClaimIdx].qualifiers['P1351'] and teamClaims[teamClaimIdx].qualifiers['P1351'][1] and teamClaims[teamClaimIdx].qualifiers['P1351'][1].datatype == 'quantity' then
						team.goals = tonumber(teamClaims[teamClaimIdx].qualifiers['P1351'][1].datavalue.value.amount)
					end
					if teamClaims[teamClaimIdx].qualifiers['P1642'] and teamClaims[teamClaimIdx].qualifiers['P1642'][1] and teamClaims[teamClaimIdx].qualifiers['P1642'][1].datatype == 'wikibase-item' then --acquisition transaction
						if teamClaims[teamClaimIdx].qualifiers['P1642'][1].datavalue.value['numeric-id'] == 2914547 then -- loan
							team.loan = true
						end
					end
				end

				team.name = computeTeamDescriptor(teamId, endTimeFull)
				computeTimeDescriptor(team)
				table.insert(WDU_F.isNationalTeam(teamId) and nationalteams or seniorclubs, team)
			end
		end
	end
	
	if table.maxn(managerclubs) == 0 then
		local teamClaimsReversed = wikidata.findSortedClaimsForProperty(nil, 'P6087')
		if #teamClaimsReversed > 0 then
			text_managerclubs = text_managerclubs .. ' ' .. EditAtWikidata.displayMessage('P6087')
		end
		if teamClaimsReversed then
			local teamClaims = {}
			for teamClaimIdx,eachTeamClaim in ipairs(teamClaimsReversed) do
				table.insert(teamClaims, 1, teamClaimsReversed[teamClaimIdx])
			end
			for teamClaimIdx,eachTeamClaim in ipairs(teamClaims) do
				if eachTeamClaim.mainsnak.datatype == 'wikibase-item' and eachTeamClaim.mainsnak and eachTeamClaim.mainsnak.snaktype == 'value' then
					local teamId = eachTeamClaim.mainsnak.datavalue.value.id
					local team = {}
					
					team.startTime = nil
					team.endTime = nil
					local startTimeFull, endTimeFull
					if teamClaims[teamClaimIdx].qualifiers then
						team.startTime, startTimeFull = extractYearFromQualifier(teamClaims[teamClaimIdx].qualifiers['P580'])
						team.endTime, endTimeFull = extractYearFromQualifier(teamClaims[teamClaimIdx].qualifiers['P582'])
					end
					team.name = computeTeamDescriptor(teamId, endTimeFull)
					computeTimeDescriptor(team)
					table.insert(managerclubs, team)
				end
			end
		end
	end

	--enter teams into precessed args
	if table.maxn(youthclubs) > 0 then
		processedArgs['header' .. tostring(lineIndex)] = 'Cluburi de juniori'
		lineIndex = lineIndex + 1
		processedArgs['label' .. tostring(lineIndex)] = 'Ani'
		processedArgs['data' .. tostring(lineIndex)] = "'''Club'''"
		lineIndex = lineIndex + 1
		for youthclubIdx = 1,table.maxn(youthclubs) do
			if youthclubs[youthclubIdx] then
				local youthclubspan = mw.html.create('span')
				youthclubspan:css('font-weight', 'normal')
				processedArgs['label' .. tostring(lineIndex)] = tostring(youthclubspan:wikitext(youthclubs[youthclubIdx].years or ''))
				processedArgs['data' .. tostring(lineIndex)] = youthclubs[youthclubIdx].name or ''
				lineIndex = lineIndex + 1
			end
		end
	end
	if table.maxn(seniorclubs) > 0 then
		processedArgs['header' .. tostring(lineIndex)] = text_seniorclubs
		lineIndex = lineIndex + 1
		processedArgs['label' .. tostring(lineIndex)] = 'Ani'
		clubSuffix = ''
		if hasseniorgoals == true then
			processedArgs['data' .. tostring(lineIndex) .. 'b'] = "'''Ap'''"
			processedArgs['data' .. tostring(lineIndex) .. 'c'] = "'''(G)'''"
			clubSuffix = 'a'
		end
		processedArgs['data' .. tostring(lineIndex) .. clubSuffix] = "'''Club'''"
		lineIndex = lineIndex + 1
		for clubIdx = 1,table.maxn(seniorclubs) do
			local clubspan = mw.html.create('span'):css('font-weight', 'normal')
			if seniorclubs[clubIdx] then
				processedArgs['label' .. tostring(lineIndex)] = tostring(clubspan:wikitext(seniorclubs[clubIdx].years or ''))
				processedArgs['data' .. tostring(lineIndex) .. clubSuffix] = seniorclubs[clubIdx].name
				if seniorclubs[clubIdx].loan then 
					processedArgs['data' .. tostring(lineIndex) .. clubSuffix] = '→ ' .. processedArgs['data' .. tostring(lineIndex) .. clubSuffix]
				end
				processedArgs['data' .. tostring(lineIndex) .. 'b'] = tostring(nil == seniorclubs[clubIdx].caps and '' or seniorclubs[clubIdx].caps)
				if seniorclubs[clubIdx].goals ~= nil then
					processedArgs['data' .. tostring(lineIndex) .. 'c'] = '(' .. tostring(seniorclubs[clubIdx].goals) .. ')' .. (seniorclubs[clubIdx].refs or '')
					processedArgs['doc-colspan'] = '4'
				end
				lineIndex = lineIndex + 1
			end
		end
		if args['totalcaps(goals)'] then
			local capsAndGoals = extractCapsAndGoals(args['totalcaps(goals)'])
			if #capsAndGoals > 0 then args['totalcaps'] = tonumber(capsAndGoals[1]) end
			if #capsAndGoals > 1 then args['totalgoals'] = tonumber(capsAndGoals[#capsAndGoals]) end
		end
		natSuffix = ''
		if args['totalyears'] or args['totalcaps'] then
			processedArgs['label' .. tostring(lineIndex)] = args['totalyears'] or args['totalcaps'] and 'Total'
			processedArgs['data' .. tostring(lineIndex) .. clubSuffix] = args['totalyears'] and args['totalcaps'] and "'''Total'''"
			processedArgs['data' .. tostring(lineIndex) .. 'b'] = tostring(args['totalcaps'])
			if args['totalgoals'] ~= nil then
				processedArgs['data' .. tostring(lineIndex) .. 'c'] = '(' .. tostring(args['totalgoals']) .. ')'
				processedArgs['doc-colspan'] = '4'
			end
			lineIndex = lineIndex + 1
		end
	end
	if table.maxn(nationalteams) > 0 then
		processedArgs['header' .. tostring(lineIndex)] = text_nationalteam .. ((args['ntupdate'] or args['nationalteam-update']) and '<sup>#</sup>' or '') .. text_nationalteam_ext
		lineIndex = lineIndex + 1
		processedArgs['label' .. tostring(lineIndex)] = 'Ani'
		nationSuffix = ''
		if hasnationalgoals == true then
			processedArgs['data' .. tostring(lineIndex) .. 'b'] = "'''Ap'''"
			processedArgs['data' .. tostring(lineIndex) .. 'c'] = "'''(G)'''"
			nationSuffix = 'a'
		end
		processedArgs['data' .. tostring(lineIndex) .. nationSuffix] = "'''Țară'''"
		lineIndex = lineIndex + 1
		for clubIdx = 1,table.maxn(nationalteams) do
			local clubspan = mw.html.create('span'):css('font-weight', 'normal')
			if nationalteams[clubIdx] then
				processedArgs['label' .. tostring(lineIndex)] = tostring(clubspan:wikitext(nationalteams[clubIdx].years or ''))
				processedArgs['data' .. tostring(lineIndex) .. nationSuffix] = nationalteams[clubIdx].name
				processedArgs['data' .. tostring(lineIndex) .. 'b'] = tostring(nil == nationalteams[clubIdx].caps and '' or nationalteams[clubIdx].caps)
				if nationalteams[clubIdx].goals ~= nil then
					processedArgs['data' .. tostring(lineIndex) .. 'c'] = StringUtils._encloseString({tostring(nationalteams[clubIdx].goals), '(', ')'}) .. (nationalteams[clubIdx].refs or '')
					processedArgs['doc-colspan'] = '4'
				end
				lineIndex = lineIndex + 1
			end
		end
	end
	if table.maxn(titles) > 0 then
		processedArgs['header' .. tostring(lineIndex)] = "Titluri"
		lineIndex = lineIndex + 1
		for titleIdx = 1,table.maxn(titles) do
			if titles[titleIdx] then
				processedArgs['label' .. tostring(lineIndex)] = titles[titleIdx].years
				processedArgs['data' .. tostring(lineIndex)] = titles[titleIdx].name
				lineIndex = lineIndex + 1
			end
		end
	end

	if table.maxn(managerclubs) > 0 then
		processedArgs['header' .. tostring(lineIndex)] = text_managerclubs
		lineIndex = lineIndex + 1
		for clubIdx = 1,table.maxn(managerclubs) do
			local clubspan = mw.html.create('span'):css('font-weight', 'normal')
			if managerclubs[clubIdx] then
				processedArgs['label' .. tostring(lineIndex)] = tostring(clubspan:wikitext(managerclubs[clubIdx].years or ''))
				processedArgs['data' .. tostring(lineIndex)] = managerclubs[clubIdx].name
				lineIndex = lineIndex + 1
			end
		end
	end
	
	embedded = TableTools.compressSparseArray(embedded)
	for embeddedIdx = 1, #embedded do
		processedArgs['data' .. tostring(lineIndex)] = embedded[embeddedIdx]
		lineIndex = lineIndex + 1
	end
	
	processedArgs['header' .. tostring(lineIndex)] = mw.getCurrentFrame():expandTemplate{title = 'Infobox medal templates', args = { title = args['medaltemplates-title'] or 'Palmares', medals = args['medaltemplates'] or '', expand = args['medaltemplates-expand'] or 'yes'} }
	lineIndex = lineIndex + 1
	
	processedArgs['header' .. tostring(lineIndex)] = args['module']
	lineIndex = lineIndex + 1
	
	processedArgs['belowstyle'] = 'color:darkslategray; font-size:95%'
	local belowparts = {}
	if table.maxn(seniorclubs) > 0 then
		local clubUpdate = args['pcupdate'] or args['club-update'] or args['reîmprospătareechipadeclub'] or args['actualizare club']
		local clubnote = '<span style="color:var(--color-subtle, darkslategray)">&#42; Apariții și goluri pentru echipa de club doar în cadrul campionatului intern</span>'
		if clubUpdate then
			clubnote = clubnote .. ' la data de ' .. clubUpdate
		end
		table.insert(belowparts, clubnote)
	end
	local ntUpdate = args['ntupdate'] or args['nationalteam-update'] or args['reîmprospătarenațională'] or args['actualizare națională']
	if table.maxn(nationalteams) > 0 and ntUpdate then
		table.insert(belowparts, '# Selecții și goluri la națională până la data de ' .. ntUpdate)
	end
	if #belowparts > 0 then
		processedArgs['below'] = table.concat(belowparts, tostring(mw.html.create('br')))
	end
	
	return processedArgs
end

p.infobox = function(frame)
	local args = getArgs(frame)
	return p._infobox(args)
end

p._infobox = function(args)
	local infoboxArgs = processArguments(args)
	return infobox3cols.infobox(infoboxArgs)
end

return p