Modul:Sportperson WD

Från Wikipedia
Hoppa till navigering Hoppa till sök

Template-info.png Dokumentation [visa] [redigera] [historik] [rensa sidcachen]


Detta är en modul för att information om sportperson (för närvarande volleybollspelare), som spelposition och under vilken tid de spelat för olika klubbar och landslag. Modulen hämtdata uppgifter från Wikidata och lägger in det i Mall:Faktamall. Modulen anropas genom att lägga in {{#Invoke:Sportperson WD | person}} i artikeln.

Argument[redigera wikitext]

Modulen tar för närvarande inga argument.

Beskrivning[redigera wikitext]

Modulen är för närvarande under utveckling och finns bara inlagd på ett begränsat antal artikelsidor. Undvik att lägga in den i artiklar i någon större omfattning tills vidare, tills utformningen blivit mer stabil. Den består av följande delar:

  • Personlig data (bild (P18), födelsedatum (P569), födelseplats (P19) och spelarposition (P413)). Uppgifterna hämtas från motsvarande uppgifter i Wikidata.
  • Uppgifter om klubbar som personen spelat för. Detta omfattar dels:
    • Klubbarna personen har spelat för med start och slutår. Uppgifterna hämtas från motsvarande uppgifter i Wikidata (medlem i idrottslag (P54)), med årtalen som bestämning.
    • Resultat för klubbarna som personen har spelat för (placering, typ av tävling och tid för tävlingsupplagan). Uppgifter från dess hämtas från uppgiften deltog i (P1344) från Wikidata. Koden läser av klubbens placering i tävlingen antingen direkt från posten eller genom att hitta spelaren lag från tävlingens deltagande lag (P1923). Den läser av tiden för tävlingen genom att läsa av uppgifter från tävlingens wikidata-objekt, antingen direkt genom (startdatum (P580) eller slutdatum (P582)) eller indirekt genom att först läsa tidsperiod (P2348) och sedan läsa motsvarande uppgifter därifrån. Om relevanta uppgifter inte finns anpassas visningen så att infoboxen blir så lättläst som möjligt.
  • Uppgifter om landslag som personen spelat för fylls i på samma sätt. Dessa fungerar på samma sätt som för klubbarna, med enda skillnaden är att de är landslag. Ett lag räknas som landslag om deras instans av (P31) är landslag (Q1194951). Klubblag har istället instans av (P31) som är antingen idrottsförening (Q847017), idrottslag (Q12973014) eller volleybollklubb (Q108395614) eller är instans av något som i sin tur är instans av någon av de tre listade typerna.
  • Uppgifter om lag (klubblag eller landslag) som personen tränat. Detta fungerar på samma sätt som klubblag eller landslag som personen spelat för, men tas istället från tränare för idrottslag (P6087).
  • Individuella utmärkelser (utmärkelse (P166)). Uppgifterna hämtas från motsvarande uppgifter i Wikidata.

För alla delar gäller att de bara visas i infoboxen om det finns några inlagda uppgifter (t.ex. visas inte individuella utmärkelser om det inte finns några inlagda).

Felsökning[redigera wikitext]

Modulen försöker visa ett meddelande direkt i sidan om information saknas på wikidata som gör att den inte kan visa informationen på det sätt som det är tänkt. Vanligen kan fel åtgärdas genom att lägga in rätt uppgifter i wikidata. Om du får ett meddelande som börjar Luafel i Modul:Sportklubb_WD skriv gärna ett meddelande på modulens diskussionssida.

Exempel på fel och åtgärder:

  • Tävling hamnar på fel plats (i början istället för längre ner i tabellen) - Tävlingar sorteras i första hand på när de avslutats och i andra hand efter när de börjat. Om det inte finns någon datum hamnar de först. Gå till den aktuella tävlingen i wikidata och lägg in startdatum (P580) eller slutdatum (P582) (eller tidsperiod (P2348), men då mest den i sin tur ha startdatum (P580) och/eller slutdatum (P582)).
p = {}

local wd = require( 'Modul:Referenshantering' )
local sd = require( 'Modul:Sportdata')

p.iRefcounter=0

txtLanguageCode='sv'

--Labels & Headers
txtImage='bild'
txtBirthDate='Födelsedatum'
txtBirthPlace='Födelseplats'
txtDeathDate='Dödsdatum'
txtDeathPlace='Dödsplats'
txtPlayerPosition='Spelarposition'
txtHeight='Längd'
txtClubTeamHeader='Klubblag'
txtClubTeamResultHeader='Meriter'
txtNationalTeamHeader='Landslag'
txtNationalTeamResultHeader='Meriter'
txtCoachHeader='Uppdrag som tränare'
txtCoachingResultHeader='Tränarmeriter'
txtTeamHeader='Lag'
txtIndividualAwards='Individuella utmärkelser'
txtCompetitionHeader="Tävling"
txtSeasonHeader="År"
txtMatches="Matcher"
txtPoints="Poäng"
txtPositionHeader='Plats'
txtAppearances='landskamper'

--Templates
txtInfoboxTemplate='Faktamall'
txtDateTemplate='Date'
txtAgeTemplate='Ålder'
txtAgeDeadTemplate='Död datum och ålder'
txtFlagIconTemplate='Flaggbild'

--Parameternames for the infobox tempate
local txtLabel='etikett'
txtContent='innehåll'
txtHeaderStyle='rubrikstil'
txtHeader='rubrik'
txtStyle='stil'

--Help text
txtEditComment='Redigera uppgifter i faktarutan'

--Layout
txtStyleMain='background:orange;'
txtStyleLevel2='background:gold'
txtTeamHeaderStyle='bgcolor="#eaecf0" align="center"'
txtWidth_px='300px'

p.person = function(frame)
    -- Get correct entityid, directly from page or if set by parameter 'id' (usually for testing purposes)
	local entityid
	if (frame.args['id']) then
		entityid=frame.args['id']
		else
		entityid=mw.wikibase.getEntityIdForCurrentPage()
		end
	-- Only show infobox if an entity is set
	if not (entityid==nil) then
		frame['id']=entityid
		local entity=mw.wikibase.getEntity(entityid) 	
		local txtTitle=getLabelByEntity( entityid )
		
	    myArgs={titel=txtTitle,grundstil=txtWidth_px}

		--Image
		img=entity:getBestStatements( 'P18' )
		if next(img) then
			wdImage = img[1]['mainsnak']['datavalue']['value']
		    if img[1].qualifiers and img[1].qualifiers.P2096 then
			    -- Only add if has the same language code as the wikipedia
			    language=readQualifier(img[1].qualifiers.P2096[1],'language')
			    if (language==txtLanguageCode) then
				    myArgs['bildtext']=readQualifier(img[1].qualifiers.P2096[1],'text') --..read(img[1],'P2096')
				    end
			    end
		    myArgs[txtImage]='[[File:' .. wdImage .. '|' .. txtWidth_px .. ']]' ..  txtEditPen(entityid,'P18')
			end
	    myArgs[txtHeaderStyle] = txtStyleMain
	    
		--Initiate counter, used for keeping track of the element numbers used to fill the infobox (header1, header2 etc.)
	    iCounter=0

		--Birth date
		entityBirthDate=entity:getBestStatements( 'P569' )
		--Birth date
		entityDeathDate=entity:getBestStatements( 'P570' )
		--Only show if set 
		bHasBirthDate=next(entityBirthDate)
		bDead=next(entityDeathDate)
		
		if bHasBirthDate then
	    	iCounter=iCounter+1
			txtBirthData = read(entityBirthDate[1],'time')
			txtBirthYear = tonumber(string.sub(txtBirthData,2,5))
			txtBirthMonth = tonumber(string.sub(txtBirthData,7,8))
			txtBirthDay = tonumber(string.sub(txtBirthData,10,11))
		    myArgs[txtLabel .. iCounter]=txtBirthDate
		    if (bDead) then 
			    myArgs[txtContent  .. iCounter]=txtDate(txtBirthYear,txtBirthMonth,txtBirthDay) .. txtUnpackReference(frame,tblProcessAllRefsForItemWD(frame,entityBirthDate[1].references,entityid,'P569')) .. txtEditPen(entityid,'P569')
		    	else
		    		if txtBirthDay>0 then -- använd bara mallen "Ålder" om födelsedatum är angivet med precision på dagnivå
			    		myArgs[txtContent  .. iCounter]=frame:expandTemplate{ title = txtAgeTemplate, args = { txtBirthYear, txtBirthMonth, txtBirthDay }} .. txtUnpackReference(frame,tblProcessAllRefsForItemWD(frame,entityBirthDate[1].references,entityid,'P569')) .. txtEditPen(entityid,'P569')
			    	end
			    end
			end
	
		--Birth place
		entityBirthPlace=entity:getBestStatements( 'P19' )
		--Only show if set 
	    if next(entityBirthPlace) then
	    	iCounter=iCounter+1
		    idPlace=read(entityBirthPlace[1],'id')
		  	entityPlace=mw.wikibase.getEntity(idPlace) 	
			wdBirthCountry = getOneValue(entityPlace,'P17')
			wdBirthPlace = txtWikilink(idPlace) .. ', ' .. frame:expandTemplate{ title = txtFlagIconTemplate , args={wdBirthCountry}} .. '[[' .. wdBirthCountry .. ']]' .. txtUnpackReference(frame,tblProcessAllRefsForItemWD(frame,entityBirthPlace[1].references,entityid,'P19')) ..  txtEditPen(entityid,'P19')
		    myArgs[txtLabel .. iCounter]=txtBirthPlace
	    	myArgs[txtContent  .. iCounter]=wdBirthPlace
	    	end

	    if (bDead) then 
	    	iCounter=iCounter+1
			txtDeathData = read(entityDeathDate[1],'time')
			txtDeathYear = tonumber(string.sub(txtDeathData,2,5))
			txtDeathMonth = tonumber(string.sub(txtDeathData,7,8))
			txtDeathDay = tonumber(string.sub(txtDeathData,10,11))
		    myArgs[txtLabel .. iCounter]=txtDeathDate
		    if (bHasBirthDate) then
		    	if (txtDeathDay>0 and txtBirthDay>0) then  --använd bara mallen "Död datum och ålder" om såväl födelsedatum som dödsdatum har precision på dagnivå
			    	myArgs[txtContent  .. iCounter]=frame:expandTemplate{ title = txtAgeDeadTemplate, args = { txtDeathYear, txtDeathMonth, txtDeathDay,txtBirthYear, txtBirthMonth, txtBirthDay }} .. txtUnpackReference(frame,tblProcessAllRefsForItemWD(frame,entityBirthDate[1].references,entityid,'P570')) .. txtEditPen(entityid,'P570')
		        else
	    			myArgs[txtContent  .. iCounter]=txtDate(txtDeathYear, txtDeathMonth, txtDeathDay) .. txtUnpackReference(frame,tblProcessAllRefsForItemWD(frame,entityBirthDate[1].references,entityid,'P570')) .. txtEditPen(entityid,'P570')
		    	end
			end
	    end

		--Death place
		entityDeathPlace=entity:getBestStatements( 'P20' )
		--Only show if set 
	    if next(entityDeathPlace) then
	    	iCounter=iCounter+1
		    idPlace=read(entityDeathPlace[1],'id')
		  	entityPlace=mw.wikibase.getEntity(idPlace) 	
			wdDeathCountry = getOneValue(entityPlace,'P17')
			wdDeathPlace = txtWikilink(idPlace) .. ', ' .. frame:expandTemplate{ title = txtFlagIconTemplate , args={wdDeathCountry}} .. '[[' .. wdDeathCountry .. ']]' .. txtUnpackReference(frame,tblProcessAllRefsForItemWD(frame,entityDeathPlace[1].references,entityid,'P20')) ..  txtEditPen(entityid,'P20')
		    myArgs[txtLabel .. iCounter]=txtDeathPlace
	    	myArgs[txtContent  .. iCounter]=wdDeathPlace
	    	end

		--Player position
		wdPosition = getOneValue(entity,'P413')
		--Only show if set 
		if not (wdPosition==nil) then
			iCounter=iCounter+1
		    myArgs[txtLabel .. iCounter]=txtPlayerPosition;
		    myArgs[txtContent .. iCounter]=firstToUpper(wdPosition)  ..  txtEditPen(entityid,'P413');
		end

		--Height
		wdHeight=entity:getBestStatements( 'P2048' )
		--Only show if set 
		if next(wdHeight) then
			iCounter=iCounter+1
			fHeight = string.sub(read(wdHeight[1],'amount'),2,-1)
			txtUnitWithInsaneURL= read(wdHeight[1],'unit') 
			indexSlash = txtUnitWithInsaneURL:match'^.*()/' -- Find last slash
			idUnitentity=string.sub(txtUnitWithInsaneURL,indexSlash+1) -- Just read after the last slash
			bUnitok=false
			if (idUnitentity=="Q174728") then
				bUnitok=true
				end
			if (idUnitentity=="Q11573") then				-- Handle if unit is meter rather than centimeter
				fHeight = fHeight * 100
				bUnitok=true
			end
			-- If unit neither centimeter nor meter
			if (not bUnitok) then
				fHeight = "(modulen kan inte omvandla denna enheten till cm)"
				end
		    myArgs[txtLabel .. iCounter]=txtHeight
		    myArgs[txtContent .. iCounter]=fHeight  .. ' cm' .. txtUnpackReference(frame,tblProcessAllRefsForItemWD(frame,wdHeight[1].references,entityid,'P2048')) ..  txtEditPen(entityid,'P2048');
		end

		iCounter=iCounter+1
		bHasResults,txtIndividualresults=individualresults(frame,entity)
		if (bHasResults) then
		    myArgs[txtHeader .. iCounter]='Tävlingsresultat'
		    myArgs[txtHeader .. iCounter .. txtStyle]=txtStyleLevel2
			iCounter=iCounter+1
		    myArgs[txtContent .. iCounter]=txtIndividualresults
			iCounter=iCounter+1
			end

		iCounter=iCounter+1
	    tblClubTeam,tblNationalTeam=tblTeam(frame,entity,'P54')
	    
	    --show teams information if the person has been a member of a team
	    if next(tblClubTeam) then
		    myArgs[txtHeader .. iCounter]=txtClubTeamHeader
		    for key, value in pairs( tblClubTeam ) do
	    		iCounter=iCounter+1
	    		txtNameClub=value.txtName
	    		if (txtNameClub:sub(1,8)=='(saknas)') then
	    			qId=txtNameClub:sub( 13,-4)
	    			txtNameClub='(saknas)' .. frame:extensionTag("ref", "Etikett och wikilänk saknas, [https://www.wikidata.org/wiki/" .. qId .. " Klicka här] för att lägga till") 
	    			end
		    	myArgs[txtLabel .. iCounter]=txtNameClub
			    myArgs[txtContent .. iCounter]=txtYears(value.yearfrom,value.yearto) .. ' ' .. txtUnpackReference(frame,value.hasref,value.ref).. value.edit
		    	end
			iCounter=iCounter+1
			bHasResults,txtTeamresults=teamresults(frame,entity)
			if (bHasResults) then
			    myArgs[txtHeader .. iCounter]=txtClubTeamResultHeader
			    myArgs[txtHeader .. iCounter .. txtStyle]=txtStyleLevel2
				iCounter=iCounter+1
			    myArgs[txtContent .. iCounter]=txtTeamresults
				iCounter=iCounter+1
				end
		    end
	    --show national teams information if the person has been a member of a national team
	    if next(tblNationalTeam) then
		    myArgs[txtHeader .. iCounter]=txtNationalTeamHeader;
		    local key,value
	    	for key, value in pairs( tblNationalTeam ) do
	    		iCounter=iCounter+1
			    myArgs[txtLabel .. iCounter]=value.nationalteam
			    txtTmp=txtYears(value.yearfrom,value.yearto)
			    if (value.appearances~=nil) then
			    	txtTmp = txtTmp .. ' (' .. value.appearances .. ' ' .. txtAppearances .. ')'  .. ' ' 
			    	end
			    myArgs[txtContent .. iCounter]=txtTmp .. txtUnpackReference(frame,value.hasref,value.ref) .. value.edit
			    end
			iCounter=iCounter+1
			
			bHasResults,txtNationalTeamresults=nationalteamresults(frame,entity)
			if (bHasResults) then
			    myArgs[txtHeader .. iCounter]=txtNationalTeamResultHeader;
			    myArgs[txtHeader .. iCounter .. txtStyle]=txtStyleLevel2;
				iCounter=iCounter+1
			    myArgs[txtContent .. iCounter]=txtNationalTeamresults
				iCounter=iCounter+1
				end
	    end
	
	    --show coaching information if the person has been a coach of a team (club or national)
	    tblClubTeamCoach,tblNationalTeamCoach=tblTeam(frame,entity,'P6087')
	    if next(tblClubTeamCoach) or next(tblNationalTeamCoach) then
		    myArgs[txtHeader .. iCounter]=txtCoachHeader;
		    if next(tblClubTeamCoach) then
			    for key, value in pairs( tblClubTeamCoach ) do
		    		iCounter=iCounter+1
			    	myArgs[txtLabel .. iCounter]=value.txtName
				    myArgs[txtContent .. iCounter]=txtYears(value.yearfrom,value.yearto)   .. ' ' .. txtUnpackReference(frame,value.hasref,value.ref) .. value.edit
				    end
		    	end
		    if next(tblNationalTeamCoach) then
			    for key, value in pairs( tblNationalTeamCoach ) do
		    		iCounter=iCounter+1
			    	myArgs[txtLabel .. iCounter]=value.nationalteam
				    myArgs[txtContent .. iCounter]=txtYears(value.yearfrom,value.yearto)   .. ' ' .. txtUnpackReference(frame,value.hasref,value.ref) .. value.edit
				    end
		    	end
			iCounter=iCounter+1
			bHasResults,txtCoachingresults=coachingresults(frame,entity)
			if (bHasResults) then
			    myArgs[txtHeader .. iCounter]=txtCoachingResultHeader;
			    myArgs[txtHeader .. iCounter .. txtStyle]=txtStyleLevel2;
				iCounter=iCounter+1
			    myArgs[txtContent .. iCounter]=txtCoachingresults
				iCounter=iCounter+1
				end
			end
	    --show awards if the person has received any
	    tbl=awards(frame,entity)
	    if next(tbl) then
			iCounter=iCounter+1
		    myArgs[txtHeader .. iCounter]=txtIndividualAwards;
		    txtLastAward=''
	    	for key, value in pairs( tbl ) do
	    		iCounter=iCounter+1
	    		if (value.awardedby==nil) then
				    myArgs[txtContent .. iCounter]=value.award  .. txtUnpackReference(frame,value.hasref,value.ref) .. value.edit
	    			else
		    		if (value.award~=txtLastAward) then
					    myArgs[txtHeader .. iCounter]='[[' .. value.award .. ']] '
					    myArgs[txtHeader .. iCounter .. txtStyle]='background:#eaecf0' --txtStyleLevel2
					    txtLastAward=value.award
			    		iCounter=iCounter+1
					    end
				    myArgs[txtContent .. iCounter]=value.awardedby  .. txtUnpackReference(frame,value.hasref,value.ref) .. value.edit
				    end
			    end
			end
	
		--Finish with link to wikidata entity with information about that you can edit there
	    myArgs['under']='<br>[https://www.wikidata.org/wiki/' .. entityid .. ' '.. txtEditComment .. ']'
	    
	    --Fill the infobox template
		tmp = frame:expandTemplate{ title = txtInfoboxTemplate , args =myArgs}
		return tmp
		else
		return '' --Return nothing if no connected wikidata entity
		end
	end

--Fill tables with information about the teams (club & national) that the person has played with
function tblTeam(frame,entity,txtRole)
	local entityid=entity:getId()
	local outTeam = {}
	local outNationalTeam = {}
    local claimClubs = entity:getAllStatements( txtRole)
    local key, value
    --Loop through all teams (clubs,national,other)
    for key, value in pairs( claimClubs ) do
    	local idTeam = read(value,'id')
		if isClub( idTeam,'P31' ) then
			local tmp=tblTeamInfo(frame,value,entityid,txtRole)
			tmp.txtName=txtWikilink( idTeam, tmp.yearfrom )
			table.insert(outTeam, tmp)
		end
		if isNationalTeam( idTeam,'P31') then
			local tmp=tblTeamInfo(frame,value,entityid,txtRole)
			wdTeam=mw.wikibase.getEntity(idTeam)
			wdCountry = getOneValue(wdTeam ,'P17')
			txtSitelink=mw.wikibase.getSitelink(idTeam)
			if not (txtSitelink) then
				txtSitelink=getLabelByEntity(idTeam)
				end
			claimsAge = wdTeam:getBestStatements( 'P4135' )
			if next(claimsAge) then
				wdAge = string.sub(read(claimsAge[1],'amount'),2,-1)
				tmp.age=wdAge
				tmp.nationalteam=frame:expandTemplate{ title = txtFlagIconTemplate , args={wdCountry}} .. ' [[' ..  txtSitelink .. '|' .. wdCountry .. ' (U' .. wdAge .. ')]]'
				else
				tmp.age=''
				tmp.nationalteam=frame:expandTemplate{ title = txtFlagIconTemplate , args={wdCountry}} .. ' [[' ..  txtSitelink .. '|' .. wdCountry .. ']]'
				end
			if value['qualifiers'] then
				if value['qualifiers']['P1129'] then
					tmp.appearances=string.sub(readQualifier(value.qualifiers.P1129[1],'amount'),2,-1)
					else
					tmp.appearances=nil
					end
				end
			table.insert(outNationalTeam, tmp)
			end
	    end

    -- Sort after join date
    table.sort(outTeam, function(a, b) return 
    	(a.yearfrom < b.yearfrom) or  
    	(a.yearfrom == b.yearfrom and a.yearto < b.yearto) 
    	end)
    table.sort(outNationalTeam, function(a, b) return 
    	(a.age < b.age) or  
    	(a.age == b.age and a.yearfrom < b.yearfrom) or  
    	(a.age == b.age and a.yearto < b.yearto) 
    	end)
	return outTeam,outNationalTeam
end

--Fill table with information about the teams (club & national) that the person has coached
function coach(frame,entity)
	local entityid=entity:getId()
	local out = {}
    local claims = entity:getAllStatements( 'P6087' )
    for key, value in pairs( claims ) do
		local tmp=tblTeamInfo(frame,value,entityid,'P54')
    	local idTeam = read(value,'id')
		tmp.txtName=getLabelByEntity( idTeam )
		table.insert(out, tmp)
    	end
    table.sort(out, function(a, b) return a.yearfrom < b.yearfrom end)
	return out
end

function coachingresults (frame,entity)
	local txt='<table style="class: biography vcard" width="'.. txtWidth_px .. '"><tr><th width="25px">'.. txtPositionHeader .. '</th><th>' .. txtTeamHeader .. '</th><th>' .. txtSeasonHeader .. '</th></tr>'
	local all=tblTeams(frame,entity,'both','P6087')
    table.sort(all, function(a, b) return 
    	a.txtLeague < b.txtLeague or 
    	(a.txtLeague==b.txtLeague and a.txtDateFrom < b.txtDateFrom)
    	end)
	txtCompetitionOld=''
	for i = 1,#all do
		if (all[i].txtLeague~=txtCompetitionOld) then
			txt=txt .. '<tr ' .. txtTeamHeaderStyle .. '><td colspan="3"><b>' .. all[i].txtLeague .. '</b></td></tr>'
			txtCompetitionOld=all[i].txtLeague
			end
		if (all[i].bNationalTeam) then
			txtTeam=all[i].txtNationalTeam
			else
			txtTeam=txtWikilink(all[i].iTeam)
			end
		txt=txt .. '<tr>' .. txtPosition(all[i].iPosition) .. '<td>' .. txtTeam  .. '</td>'
		txtTmp=mw.wikibase.getSitelink(all[i].iSeason )
		if not (txtTmp) then
--			txtTmp=getLabelByEntity(all[i].iSeason)
			txtTmp=all[i].txtSeason
			else
			txtTmp='[['..txtTmp .. '|' .. all[i].txtSeason  .. ']] ' 
		end			
		txt=txt .. '<td>' .. txtTmp   .. txtUnpackReference(frame,all[i].hasref,all[i].ref) .. all[i].edit .. '</td>' .. '</tr>'
    end
	txt=txt .. '</table>'
	return #all>0,txt
end

--Fill table with information about awards won by the person
function awards(frame,entity)
	local entityid=entity:getId()
	local out = {}
    local claimAwards = entity:getAllStatements( 'P166' )
    for key, value in pairs( claimAwards ) do
		local tmp={}
    	local idAward = read(value,'id')
		tmp.award=getLabelByEntity( idAward )
		tmp.awardedby ="-"
		if value['qualifiers'] then
			if value['qualifiers']['P585'] then
				tmp.awardedby =string.sub(readQualifier(value['qualifiers']['P585'][1],'time'),2,5)
				else
  				if value['qualifiers']['P1027'] then
					tmp.awardedby =txtWikilink(readQualifier(value['qualifiers']['P1027'][1],'id'))
					end
				end
		end
		tmp.hasref,tmp.ref=tblProcessAllRefsForItemWD(frame,value['references'],entityid,'P166')
		tmp.edit=txtEditPen(entityid,value.id)
		table.insert(out, tmp)
    	end
    table.sort(out, function(a, b) return a.awardedby < b.awardedby end)
	return out
end

function tblTeams(frame,entity,txtAlternative,txtDetermination)
	local all={}
	--Find all statements for P1344 that has txtDetermination as determination
	local claimsCompetition
	if (txtDetermination=='none') then
	    claimsCompetition = entity:getAllStatements( 'P1344') 
	    else
	    claimsCompetition = entity:getAllStatements( 'P1344',txtDetermination) 
	    end
    local key,value
    for key, value in pairs( claimsCompetition ) do
		--Check if has determination (if it needs to have one, which is the case for team sports)
		if txtDetermination=='none' or (value['qualifiers'] and value['qualifiers'][txtDetermination]) then -- has a determination like P54 "medlem i idrottslag" for players or P6087  "tränare för idrottslag" for coaches
			local tmp={}
			--read id for the season
			tmp.iSeason = read(value,'id')
			if (txtAlternative=='individual') then
				iTeamPlay=getPropertyId(value,'P54')
				local checkInTeam=false
				if (iTeamPlay and (isClub(iTeamPlay,'P31') or isNationalTeam(iTeamPlay,'P31'))) then
					checkInTeam=true
					end
				iTeamManage=getPropertyId(value,'P6087')
				if (iTeamManage and (isClub(iTeamManage,'P31') or isNationalTeam(iTeamManage,'P31'))) then 
					checkInTeam=true
					end
				if (checkInTeam==false) then
					tmp.iPlayer=entity:getId()
					tmp.txtTeam=""
					tmp=sasongsinfo_local(frame,tmp,value,entity,'individual')
					table.insert(all,tmp)
					end
				else
				tmp.iTeam=getPropertyId(value,txtDetermination)
				tmp=sasongsinfo_local(frame,tmp,value,entity)
				entityTeam=mw.wikibase.getEntity(tmp.iTeam) 
				tmp.txtCountry = getOneValue(entityTeam,'P17')
				tmp.txtTeam=txtTeamname(tmp.iTeam,tmp.txtYearFrom)
				--tmp.txtTeam=getProperty(value,txtDetermination)
				if (txtAlternative=='club' and isClub(tmp.iTeam,'P31')) then
					table.insert(all,tmp)
					end
				if ((txtAlternative=='nationalteam') and isNationalTeam(tmp.iTeam,'P31')) then
	--				tmp=sasongsinfo_local(frame,tmp,value,entity)
					tmp.txtNationalTeam='[[' ..  getLabelByEntity( tmp.iTeam ) .. '|' .. tmp.txtCountry .. ']]'
					claimsAge = entityTeam:getBestStatements( 'P4135' )
					if next(claimsAge) then
						wdAge = string.sub(read(claimsAge[1],'amount'),2,-1)
						tmp.txtNationalTeam='[[' ..  getLabelByEntity( tmp.iTeam ) .. '|' .. tmp.txtCountry .. ' (U' .. wdAge .. ')]]'
						else
						tmp.txtNationalTeam='[[' ..  getLabelByEntity( tmp.iTeam ) .. '|' .. tmp.txtCountry .. ']]'
						end
					table.insert(all,tmp)
					end
				if (txtAlternative=='both') then
					tmp=sasongsinfo_local(frame,tmp,value,entity,txtPosition)
					if isNationalTeam(tmp.iTeam,'P31') then
						claimsAge = entityTeam:getBestStatements( 'P4135' )
						if next(claimsAge) then
							wdAge = string.sub(read(claimsAge[1],'amount'),2,-1)
							tmp.txtNationalTeam='[[' ..  getLabelByEntity( tmp.iTeam ) .. '|' .. tmp.txtCountry  .. ' (U' .. wdAge .. ')]]'
							else
							tmp.txtNationalTeam='[[' ..  getLabelByEntity( tmp.iTeam ) .. '|' .. tmp.txtCountry .. ']]'
							end
						tmp.bNationalTeam=true
						else
						tmp.bNationalTeam=false
						end
					table.insert(all,tmp)
					end
				end
			end
	    end 
	return all
end

function individualresults (frame,entity)
	-- get all teams the person has played with (according to P54)
	local all=tblTeams(frame,entity,'individual','none')
	--Sort them based on date
    table.sort(all, function(a, b) return 
    	(a.txtTeam < b.txtTeam) or
    	(a.txtTeam == b.txtTeam and a.txtDateTo < b.txtDateTo) or
    	(a.txtTeam == b.txtTeam and a.txtDateTo == b.txtDateTo and a.txtDateFrom < b.txtDateFrom)
    end)
	--Start creaing a table
	local txt='<table style="class: biography vcard" width="'..txtWidth_px..'"><tr><th width="20px">' .. txtPositionHeader .. '</th><th>' .. txtCompetitionHeader .. '</th><th width="100px">' .. txtSeasonHeader .. '</th></tr>'
	txtTeamOld=''
	for i = 1,#all do
		if (all[i].txtTeam~=txtTeamOld) then
			local txtTeam=all[i].txtTeam
			if (all[i].txtCountry) then
				txtTeam=frame:expandTemplate{ title = txtFlagIconTemplate , args={all[i].txtCountry,storlek='16px'}} .. ' ' .. txtTeam
				end
			txt=txt .. '<tr ' .. txtTeamHeaderStyle .. '><td colspan="3"><b>' .. txtTeam .. '</b></td></tr>'
			txtTeamOld=all[i].txtTeam
			end
		txt=txt .. "<tr>" .. txtPosition(all[i].iPosition)
		txtTmp=mw.wikibase.getSitelink(all[i].iSeason )
		if not (txtTmp) then
--			txtTmp=getLabelByEntity(all[i].iSeason)
			txtTmp=all[i].txtSeason
			else
			txtTmp='[['..txtTmp .. '|' .. all[i].txtSeason  .. ']] ' 
		end			
		txtSeasonTxt= txtTmp  .. txtUnpackReference(frame,all[i].hasref,all[i].ref) .. all[i].edit
		if (all[i].iStatus==1) then
			txt=txt .. '<td>' .. all[i].txtLeague  .. '</td>'
			txt=txt .. '<td>' .. txtSeasonTxt .. '</td>' 
			end
		if (all[i].iStatus==2) then
			txt=txt .. '<td colspan="2">' .. all[i].txtLeague  ..  txtSeasonTxt .. '</td>' 
			end
		if (all[i].iStatus==3) then
			txt=txt .. '<td colspan="2">' .. txtSeasonTxt .. '</td>' 
			end
		txt=txt .. '</tr>'
    end
	txt=txt .. '</table>'
	return #all>0,txt
end


function teamresults (frame,entity)
	-- get all teams the person has played with (according to P54)
	local all=tblTeams(frame,entity,'club','P54')
	--Sort them based on date
    table.sort(all, function(a, b) return 
    	(a.txtDateTo < b.txtDateTo) or
    	(a.txtDateTo == b.txtDateTo and a.txtDateFrom < b.txtDateFrom)
    end)
	--Start creaing a table
	local txt='<table style="class: biography vcard" width="'..txtWidth_px..'"><tr><th width="20px">' .. txtPositionHeader .. '</th><th>' .. txtCompetitionHeader .. '</th><th width="100px">' .. txtSeasonHeader .. '</th></tr>'
	txtTeamOld=''
	for i = 1,#all do
		if (all[i].txtTeam~=txtTeamOld) then
			local txtTeam=all[i].txtTeam
			if (all[i].txtCountry) then
				txtTeam=frame:expandTemplate{ title = txtFlagIconTemplate , args={all[i].txtCountry,storlek='16px'}} .. ' ' .. txtTeam
				end
			txt=txt .. '<tr ' .. txtTeamHeaderStyle .. '><td colspan="3"><b>' .. txtTeam .. '</b></td></tr>'
			txtTeamOld=all[i].txtTeam
			end
		txt=txt .. "<tr>" .. txtPosition(all[i].iPosition)
		txtTmp=mw.wikibase.getSitelink(all[i].iSeason )
		if not (txtTmp) then
--			txtTmp=getLabelByEntity(all[i].iSeason)
			txtTmp=all[i].txtSeason
			else
			txtTmp='[['..txtTmp .. '|' .. all[i].txtSeason  .. ']] ' 
		end			
		txtSeasonTxt= txtTmp  .. txtUnpackReference(frame,all[i].hasref,all[i].ref) .. all[i].edit
		if (all[i].iStatus==1) then
			txt=txt .. '<td>' .. all[i].txtLeague  .. '</td>'
			txt=txt .. '<td>' .. txtSeasonTxt .. '</td>' 
			end
		if (all[i].iStatus==2) then
			txt=txt .. '<td colspan="2">' .. all[i].txtLeague  ..  txtSeasonTxt .. '</td>' 
			end
		if (all[i].iStatus==3) then
			txt=txt .. '<td colspan="2">' .. txtSeasonTxt .. '</td>' 
			end
		txt=txt .. '</tr>'
    end
	txt=txt .. '</table>'
	return #all>0,txt
end

function nationalteamresults (frame,entity)
	local all=tblTeams(frame,entity,'nationalteam','P54')
    table.sort(all, function(a, b) return 
    	a.txtLeague < b.txtLeague or 
    	(a.txtLeague==b.txtLeague and a.txtDateTo < b.txtDateTo) or 
    	(a.txtLeague==b.txtLeague and a.txtDateTo == b.txtDateTo and a.txtDateFrom < b.txtDateFrom) 
    	end)
	local txt='<table style="class: biography vcard" width="100%"><tr><th width="30px">' .. txtPositionHeader .. '</th><th>'..txtNationalTeamHeader..'</th><th>' .. txtSeasonHeader .. '</th></tr>'
	txtCompetitionOld=''
	for i = 1,#all do
		if (all[i].txtLeague~=txtCompetitionOld) then
			txt=txt .. '<tr ' .. txtTeamHeaderStyle .. '><td colspan="3"><b>' .. all[i].txtLeague .. '</b></td></tr>'
			txtCompetitionOld=all[i].txtLeague
			end
		txt=txt .. '<tr>' .. txtPosition(all[i].iPosition) .. '<td>' .. all[i].txtNationalTeam  .. '</td>'
		txtTmp=mw.wikibase.getSitelink(all[i].iSeason )
		if not (txtTmp) then
--			txtTmp=getLabelByEntity(all[i].iSeason)
			txtTmp=all[i].txtSeason
			else
			txtTmp='[['..txtTmp .. '|' .. all[i].txtSeason  .. ']] ' 
		end			
		txt=txt .. '<td>'..txtTmp  .. txtUnpackReference(frame,all[i].hasref,all[i].ref) .. all[i].edit .. '</td>' .. '</tr>'
    end
	txt=txt .. '</table>'
	return #all>0,txt
end

-- from: https://stackoverflow.com/questions/2421695/first-character-uppercase-lua
function firstToUpper(str)
	if (str) then
	    return (str:gsub("^%l", string.upper))
	    else
	    return ''
	    end
end

-- Funktion från https://stackoverflow.com/questions/41942289/display-contents-of-tables-in-lua
function tprint (tbl, indent)
  if not indent then indent = 0 end
  local toprint = string.rep(" ", indent) .. "{\r\n"
  indent = indent + 2 
  for k, v in pairs(tbl) do
    toprint = toprint .. string.rep(" ", indent)
    if (type(k) == "number") then
      toprint = toprint .. "[" .. k .. "] = "
    elseif (type(k) == "string") then
      toprint = toprint  .. k ..  "= "   
    end
    if (type(v) == "number") then
      toprint = toprint .. v .. ",\r\n"
    elseif (type(v) == "string") then
      toprint = toprint .. "\"" .. v .. "\",\r\n"
    elseif (type(v) == "table") then
      toprint = toprint .. tprint(v, indent + 2) .. ",\r\n"
    else
      toprint = toprint .. "\"" .. tostring(v) .. "\",\r\n"
    end
  end
  toprint = toprint .. string.rep(" ", indent-2) .. "}"
  return toprint
end


return p