Documentația acestui modul poate fi creată la Modul:InfoboxBiography/doc

local p = {}
local getArgs = require('Modul:Arguments').getArgs
local wikidata = require('Modul:Wikidata')
local lc = require('Modul:LocationAndCountry')
local bda = require('Modul:BirthDateAndAge')
local infobox = require('Modul:Infobox')
local infoboxImage = require('Modul:InfoboxImage').InfoboxImage
local join = require('Modul:Separated entries')._main
local StringUtils = require('Modul:StringUtils')
local DateUtils = require('Modul:DateUtils')
local Lang = require('Modul:Lang')
local TableTools = require('Modul:TableTools')
local toWdLinkGenerator = require('Modul:EditAtWikidata')
local NameAndImage = require('Modul:NameAndImage')
local libraryUtil = require( 'libraryUtil' )
local plural = require('Modul:Plural')
local wdu_b = require('Modul:WikidataUtils/Biography')
local Transliteration = require('Modul:Transliteration')

local MIN_YEAR_TO_DISPLAY_CITIZENSHIP = 1800

local _br_ = tostring(mw.html.create('br'))
local appendToString = StringUtils._appendToString
local prependToString = StringUtils._prependToString
local encloseString = StringUtils._encloseString

local function extractDedicatedArgFromInputArgs(retainedInputArgs, args, argNames, wikidataCallback)
	libraryUtil.checkType('extractDedicatedArgFromInputArgs', 1, retainedInputArgs, 'table', true)
	libraryUtil.checkType('extractDedicatedArgFromInputArgs', 2, args, 'table', false)
	libraryUtil.checkType('extractDedicatedArgFromInputArgs', 3, argNames, 'table', true)
	libraryUtil.checkType('extractDedicatedArgFromInputArgs', 4, wikidataCallback, 'function', true)
	
	if argNames == nil then return nil end
	local foundValue = nil
	for argNameIdx,argName in pairs(argNames) do
		local argv = args[argName]
		if argv and foundValue == nil then
			foundValue = argv
			break
		end
	end

	if foundValue then
		for argNameIdx,argName in pairs(argNames) do
			table.insert(retainedInputArgs, argName)
		end
		return foundValue
	end

	if args['embed'] ~= 'yes' and args['embed'] ~= 'y' and args['embed'] ~= 'da' then
		local wikidataValue, wikidataId, wikidataEntId = wikidataCallback()
		if wikidataValue and mw.ustring.len(mw.text.trim(wikidataValue)) > 0 then return wikidataValue .. toWdLinkGenerator.displayMessage(wikidataId, wikidataEntId) end
	end
	return nil
end

local function copyProperty(outputTable, inputTable, propName)
	libraryUtil.checkType('copyProperty', 1, outputTable, 'table', false)
	libraryUtil.checkType('copyProperty', 2, inputTable, 'table', false)
	libraryUtil.checkTypeMulti('copyProperty', 3, propName, {'string', 'number'})
	outputTable[propName] = inputTable[propName]
end

local function tableContains(haystackTable, needle)
	libraryUtil.checkType('tableContains', 1, haystackTable, 'table', true)
	if haystackTable == nil or needle == nil then return false end
	for k, v in pairs(haystackTable) do
		if v == needle then return true end
	end
	return false
end

local function processArgs(args)
	local processedArgs = {}
	local retainedInputArgs = {}
	local labeldatacount = 2
	
	processedArgs['child'] = (args['embed'] == 'yes' or args['embed'] == 'da' or args['embed'] == 'y') and 'yes' or nil
	if args['culoare cadru'] then processedArgs['culoare cadru'] = args['culoare cadru'] end
	if args['culoare text'] then processedArgs['culoare text'] = args['culoare text'] end
	copyProperty(processedArgs, args, 'aboveclass')
	processedArgs['navbar'] = 'false'
	local q = args.q or mw.wikibase.getEntityIdForCurrentPage()

	if (processedArgs['child'] == nil) then
		processedArgs['header1'] = 'Date personale'
		local genderSuffix = wdu_b.isFemale() and 'ă' or ''
		
		local imageName = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'image', 'Imagine', 'imagine', 'foto'}, function() return nil, nil, nil end)
		if imageName then
			if StringUtils._startsWithAny({mw.text.trim(imageName), '[['}) then
				imageName = StringUtils._substringBefore({mw.text.trim(imageName), ']]', '|'})
				imageName = StringUtils._removeStart({imageName, '[['})
			end
			imageName = StringUtils._removeStart({mw.text.trim(imageName), 'File:'})
			imageName = StringUtils._removeStart({imageName, 'Fișier:'})
			imageName = StringUtils._removeStart({imageName, 'Fişier:'})
			imageName = StringUtils._removeStart({imageName, 'Image:'})
			imageName = StringUtils._removeStart({imageName, 'Imagine:'})
			imageName = StringUtils._removeStart({imageName, 'Media:'})
			local imgTitle = mw.title.new(imageName, 6)
			if not imgTitle or not imgTitle.file or not imgTitle.file.exists then
				imageName = nil
			end
		end
		local imageCaption = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'caption', 'descriere', 'comentariu', 'Descriere'}, function() return nil, nil, nil end)
		
		local wdImageName, wdImageCaption
		if imageName == nil then
			wdImageName, wdImageCaption = wikidata.findImageAndCaption(q)
			imageName = wdImageName
			imageCaption = wdImageCaption
		end
		if imageName and mw.ustring.len(imageName) > 0 then
			local imageSize = args['imagesize'] or args['image_size'] or args['Lățime']
			processedArgs['image'] = infoboxImage{image=imageName, size=imageSize, sizedefault='frameless', upright='1', suppressplaceholder='yes'}
			processedArgs['caption'] = imageCaption
		end
		
		local birthName = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'nume_naștere', 'birth_name'}, function() 
			local birthNameClaims = wikidata.findClaimsForProperty(q, 'P1477')
			local roVal = nil
			local otherLangVals = {}
			if birthNameClaims then for _,eachBirthNameClaim in ipairs(birthNameClaims) do
				if wikidata.isClaimTrue(eachBirthNameClaim) and wikidata.hasValueSnak(eachBirthNameClaim) then
					if eachBirthNameClaim.mainsnak.datavalue.value.language == 'ro' then
						roVal = eachBirthNameClaim.mainsnak.datavalue.value.text
					else
						local thisName = nil
						if Transliteration.isTransliterationSupported(eachBirthNameClaim.mainsnak.datavalue.value.language) then
							thisName = Lang.fromArgs(eachBirthNameClaim.mainsnak.datavalue.value.language .. '-Latn', nil, Transliteration.transliterate(eachBirthNameClaim.mainsnak.datavalue.value.text, eachBirthNameClaim.mainsnak.datavalue.value.language), false)
						else
							thisName = Lang.fromArgs(eachBirthNameClaim.mainsnak.datavalue.value.language, nil, eachBirthNameClaim.mainsnak.datavalue.value.text, false)
						end
						table.insert(otherLangVals, thisName)
					end
				end
			end end
			if roVal then return roVal, 'P1477', q
			elseif #otherLangVals then return mw.text.listToText(otherLangVals, tostring(mw.html.create('br'))), 'P1449', q
			else return nil
			end
		end)
		if birthName and mw.ustring.len(birthName) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = 'Nume la naștere'
			processedArgs['data' .. tostring(labeldatacount)] = birthName
			labeldatacount = labeldatacount + 1
		end

		local nickname = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'porecla', 'poreclă', 'nickname'}, function() 
			local birthNameClaims = wikidata.findClaimsForProperty(q, 'P1449')
			local roVals = {}
			local otherLangVals = {}
			if birthNameClaims then for _,eachBirthNameClaim in ipairs(birthNameClaims) do
				if wikidata.hasValueSnak(eachBirthNameClaim) and wikidata.claimHasRankAtLeastNormal(eachBirthNameClaim) then
					if eachBirthNameClaim.mainsnak.datavalue.value.language == 'ro' then
						table.insert(roVals, eachBirthNameClaim.mainsnak.datavalue.value.text)
					else
						table.insert(otherLangVals, Lang.fromArgs(eachBirthNameClaim.mainsnak.datavalue.value.language, nil, eachBirthNameClaim.mainsnak.datavalue.value.text, false))
					end
				end
			end end
			if #roVals == 0 and #otherLangVals == 0 then return nil end
			return mw.text.listToText(#roVals > 0 and roVals or otherLangVals, ', ', ', '), 'P1449', q
		end)
		if nickname and mw.ustring.len(nickname) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = args['tip_poreclă'] or 'Poreclă'
			processedArgs['data' .. tostring(labeldatacount)] = nickname
			labeldatacount = labeldatacount + 1
		end

		local birthDate = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'data_nașterii', 'data_nasterii', 'birth_date', 'Născut'}, function() return bda._getBdaByWikidata{link = 'yes', q = q}, 'P569', q end)
		local birthPlace = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'locul_nașterii', 'locul_nasterii', 'birth_place', 'Loc naștere'}, function() return lc.displayFromParams('P19', nil, 'P569', 1, '; ', true), 'P19', q end)
		if birthDate and mw.ustring.len(birthDate) > 0 or birthPlace and mw.ustring.len(birthPlace) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = 'Născut' .. genderSuffix
			processedArgs['data' .. tostring(labeldatacount)] = join({birthDate, birthPlace, separator = _br_})
			labeldatacount = labeldatacount + 1
		end

		local deathDate = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'data_deces', 'data_decesului', 'death_date', 'Decedat'}, function() return bda._getDdaByWikidata{link = 'yes', q = q}, 'P570', q end)
		local deathPlace = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'locul_decesului', 'death_place', 'Loc deces'	}, function() return lc.displayFromParams('P20', q, 'P570', 1, '; ', true), 'P20', q end)
		if deathDate and mw.ustring.len(deathDate) > 0 or deathPlace and mw.ustring.len(deathPlace) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = 'Decedat' .. genderSuffix
			processedArgs['data' .. tostring(labeldatacount)] = join({deathDate, deathPlace, separator = _br_})
			labeldatacount = labeldatacount + 1
		end
		
		local burialSite = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'loc_odihna', 'locodihna', 'burial_place', 'final_resting_place'}, function() return table.concat(wikidata.findValueListWithDecoratedQualifiers(q, 'P119', false, {'$P580', '$P582'}, {'–'}) or {}, tostring(mw.html.create('br'))), 'P119', q end)
		if burialSite and mw.ustring.len(mw.text.trim(burialSite)) > 0 or args['burial_date'] then
			processedArgs['label' .. tostring(labeldatacount)] = 'Înmormântat' .. genderSuffix
			processedArgs['data' .. tostring(labeldatacount)] = table.concat(TableTools.compressSparseArray({args['burial_date'], burialSite}), tostring(mw.html.create('br')))
			labeldatacount = labeldatacount + 1
		end
		
		local causeOfDeath = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'cauza_decesului', 'death cause', 'death_cause'}, function()
				local mOD = wikidata.findOneValue('P1196', q)
				local cOD = wikidata.findOneValue('P509', q)
				local cODTbl = {}
				local cODPropTbl = {}
				if mOD then
					table.insert(cODTbl, mOD)
					table.insert(cODPropTbl, 'P1196')
				end
				if cOD then
					table.insert(cODTbl, cOD)
					table.insert(cODPropTbl, 'P509')
				end
				if #cODTbl == 2 then
					return appendToString({cODTbl[1], prependToString({encloseString({cODTbl[2], '(', ')'}), ' '})}), 'P509', q
				elseif #cODTbl == 1 then
					return cODTbl[1], cODPropTbl[1], q
				end
			return nil
		end)
		
		if causeOfDeath and mw.ustring.len(mw.text.trim(causeOfDeath)) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = 'Cauza decesului'
			processedArgs['data' .. tostring(labeldatacount)] = causeOfDeath
			labeldatacount = labeldatacount + 1
		end

		local parents = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'părinți', 'parents', 'parinti'}, function() return join({wikidata.findOneValue('P22', q), wikidata.findOneValue('P25', q), separator = _br_}), 'P22', q end)
		if parents and mw.ustring.len(mw.text.trim(parents)) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = 'Părinți'
			processedArgs['data' .. tostring(labeldatacount)] = parents
			labeldatacount = labeldatacount + 1
		end
		
		local siblings = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'frați', 'frati', 'siblings'}, function()
			local tbl = {}
			local props = {'P7', 'P9', 'P3373'}
			local actualProp = nil
			local wdTbl = {wikidata.getValueList(q, 'P7'), wikidata.getValueList(q, 'P9'), wikidata.getValueList(q, 'P3373')}
			for _i,lst in ipairs(wdTbl) do
				for _i1,v in ipairs(lst or {}) do 
					table.insert(tbl, v)
					actualProp = props[_i]
				end
			end
			tbl.separator = _br_
			return join(tbl), actualProp, q
		end)
		if siblings and mw.ustring.len(mw.text.trim(siblings)) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = 'Frați și surori'
			processedArgs['data' .. tostring(labeldatacount)] = siblings
			labeldatacount = labeldatacount + 1
		end

		local partners = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'partener', 'partners'}, function() return nil, nil, nil end)
		if partners and mw.ustring.len(mw.text.trim(partners)) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = 'Partener(i)'
			processedArgs['data' .. tostring(labeldatacount)] = partners
			labeldatacount = labeldatacount + 1
		end
		
		local spouse = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'soț', 'soție', 'sot', 'sotie', 'spouse', 'căsătorit'}, function() return wikidata._getTimestampedValueListWithSeparator({_br_, 'P26', q}), 'P26', q end)
		if spouse and mw.ustring.len(mw.text.trim(spouse)) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = args['spouse-type'] or ('Căsătorit' .. genderSuffix .. ' cu')
			processedArgs['data' .. tostring(labeldatacount)] = spouse
			labeldatacount = labeldatacount + 1
		end
		
		local numberChildren = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'număr_copii', 'numărcopii', 'number_children', 'childrennumber'}, function() return wikidata._getValueListWithSeparator({_br_, 'P1971', q}), 'P1971', q end)
		if numberChildren and mw.ustring.len(mw.text.trim(numberChildren)) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = 'Număr de copii'
			processedArgs['data' .. tostring(labeldatacount)] = numberChildren
			labeldatacount = labeldatacount + 1
		end
		
		local children = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'copii', 'children'}, function() return wikidata._getValueListWithSeparator({_br_, 'P40', q, '10'}), 'P40', q end)
		if children and mw.ustring.len(mw.text.trim(children)) > 0 then
			processedArgs['label' .. tostring(labeldatacount)] = 'Copii'
			processedArgs['data' .. tostring(labeldatacount)] = children
			labeldatacount = labeldatacount + 1
		end

		local rude = processedArgs['rude'] or processedArgs['relations']
		if rude then
			processedArgs['label' .. tostring(crtLineIndex)] = 'Rude'
			processedArgs['data' .. tostring(crtLineIndex)] = rude
			labeldatacount = labeldatacount + 1
		end

		local citizenship = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'cetatenie', 'cetățenie', 'citizenship'}, function() 
			if wdu_b.isDead() then
				local dateOfDeathClaims = wikidata.findBestClaimsForProperty(q, 'P570')
				for _,eachDateOfDeathClaim in ipairs(dateOfDeathClaims) do
					local dateOfDeath = DateUtils.extractDateFromWikidataSnak(eachDateOfDeathClaim.mainsnak)
					if dateOfDeath and dateOfDeath.year < MIN_YEAR_TO_DISPLAY_CITIZENSHIP then return nil end
				end
			end
			local endOfCitizenship = wikidata.loadOneValueInChain({q, 'P27', '_P582'})
			if not endOfCitizenship or endOfCitizenship == '' then endOfCitizenship = wikidata.loadOneValueInChain({q, 'P570', 'raw'}) end
			local list = wikidata.findValueListWithDecoratedQualifiers(q, 'P27', false, {'$P580–$P582'}, {}, 'P41', '20px')
			if list then return mw.text.listToText(list, _br_, _br_), 'P27', q else return nil end
			--return NameAndImage._nameAndFlagFromPropOfEntity('P27', nil, DateUtils.parseWikidataDate(endOfCitizenship))
		end)
		if citizenship then
			processedArgs['label' .. tostring(labeldatacount)] = 'Cetățenie'
			processedArgs['data' .. tostring(labeldatacount)] = citizenship
			labeldatacount = labeldatacount + 1
		end

		local ethnicityWdRetriever = function(entity)
			local ethnicityClaims = wikidata.findBestClaimsForProperty(entity, 'P172') -- ethnic group
			local retList = {}
			local female = wdu_b.isFemale(entity)
			
			if ethnicityClaims then
				for _,eachEthnicityClaim in pairs(ethnicityClaims) do
					if wikidata.hasValueSnak(eachEthnicityClaim) then
						local callFunction = function(objectId, female)
							local returnValue = nil
							if objectId then
								local demonymClaims = wikidata.findClaimsForProperty(objectId, 'P1549')
								for eachClaimIdx, eachClaim in pairs(demonymClaims) do
									if wikidata.isClaimTrue(eachClaim) and wikidata.hasValueSnak(eachClaim) then
										if eachClaim.mainsnak.datavalue.value.language == 'ro' then
											local qualifierIsFeminine = eachClaim.qualifiers and ( ( eachClaim.qualifiers['P21'] and eachClaim.qualifiers['P21'][1] and eachClaim.qualifiers['P21'][1].snaktype == 'value' and eachClaim.qualifiers['P21'][1].datavalue.value['numeric-id'] == 1775415 )
																					or ( eachClaim.qualifiers['P21'] and eachClaim.qualifiers['P21'][1] and eachClaim.qualifiers['P21'][1].snaktype == 'value' and eachClaim.qualifiers['P21'][1].datavalue.value['numeric-id'] == 6581072 )
																					or (eachClaim.qualifiers['P518'] and eachClaim.qualifiers['P518'][1] and eachClaim.qualifiers['P518'][1].snaktype == 'value' and eachClaim.qualifiers['P518'][1].datavalue.value['numeric-id'] == 1775415) )
											if (qualifierIsFeminine and female) or (not qualifierIsFeminine and not female) then
												returnValue = eachClaim.mainsnak.datavalue.value.text
											end
										end
									end
								end
							end
							return returnValue
						end
						local callFunctionWithGender = function(object) return callFunction(object, false) end
						
						if female then callFunctionWithGender = function(object) return callFunction(object, true) end end
						table.insert(retList, wikidata.findLinkToItemWithCallback(eachEthnicityClaim.mainsnak.datavalue.value['numeric-id'], false, nil, callFunctionWithGender))
					end
				end
			end
			if #retList > 0 then
				retList.separator = tostring(mw.html.create('br'))
				return join(retList), 'P172', nil
			end
			return nil, nil, nil
		end
		local ethnicity = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'etnie', 'ethnicity'}, ethnicityWdRetriever)
		if ethnicity then
			processedArgs['label' .. tostring(labeldatacount)] = 'Etnie'
			processedArgs['data' .. tostring(labeldatacount)] = ethnicity
			labeldatacount = labeldatacount + 1
		end
		
		local nationality = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'nationalitate', 'nationality', 'naționalitate', 'Naționalitate'}, function() return nil end)
		if not ethnicity and not citizenship and nationality then
			processedArgs['label' .. tostring(labeldatacount)] = 'Naționalitate'
			processedArgs['data' .. tostring(labeldatacount)] = nationality
			labeldatacount = labeldatacount + 1
		end
		
		local religion = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'religie', 'religion', 'confesiune'}, function() return wikidata._getValueListWithSeparator({_br_, 'P140', q}), 'P140', q end)
		if religion then
			processedArgs['label' .. tostring(labeldatacount)] = 'Religie'
			processedArgs['data' .. tostring(labeldatacount)] = religion
			labeldatacount = labeldatacount + 1
		end
		
		local occupation = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'ocupație', 'occupation', 'ocupatie', 'profesiune', 'profesie'}, function() 
			local occupationClaims = wikidata.findBestClaimsForProperty(q, 'P106')
			local fem = wdu_b.isFemale()
			local occupationList = {}
			if occupationClaims then for _,eachOccupationClaim in ipairs(occupationClaims) do
				if eachOccupationClaim.mainsnak.snaktype == 'value' then
					table.insert(occupationList, wikidata.findLinkToItem(eachOccupationClaim.mainsnak.datavalue.value['numeric-id'], false, fem))
				end
			end end
			return table.concat(occupationList, tostring(mw.html.create('br'))), 'P106', q
		end)
		
		if occupation then
			processedArgs['label' .. tostring(labeldatacount)] = 'Ocupație'
			processedArgs['data' .. tostring(labeldatacount)] = occupation
			labeldatacount = labeldatacount + 1
		end
		
		local work_location = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'loc_activitate', 'work_location'}, function() 
			local workLocations = wikidata.findValueListWithQualifiersInBrackets(q, 'P937', false, {'$P580', '$P582'}, {'–'})
			if workLocations then return mw.text.listToText(workLocations, _br_, _br_), 'P937', q end
		end)
		if work_location then
			processedArgs['label' .. tostring(labeldatacount)] = 'Locul desfășurării activității'
			processedArgs['data' .. tostring(labeldatacount)] = work_location
			labeldatacount = labeldatacount + 1
		end
		
		local spoken_langs = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'limbi_vorbite', 'limba_vorbita'}, function() 
			local spokenLangs = wikidata.findValueListWithQualifiersInBrackets(q, 'P1412', false, {'$P3831'}, {', '})
			if spokenLangs then return mw.text.listToText(spokenLangs, _br_, _br_), 'P1412', q end
		end)
		if spoken_langs then
			processedArgs['label' .. tostring(labeldatacount)] = 'Limbi vorbite'
			processedArgs['data' .. tostring(labeldatacount)] = spoken_langs
			labeldatacount = labeldatacount + 1
		end
			
		local net_worth = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'avere', 'net_worth'}, function() 
			return wikidata.findOneValue('P2218', q), 'P2218', q
		end)
		if net_worth then
			processedArgs['label' .. tostring(labeldatacount)] = 'Avere'
			processedArgs['data' .. tostring(labeldatacount)] = net_worth
			labeldatacount = labeldatacount + 1
		end
		
		index = 1
		processedArgs['subheaderstyle'] = args['stilsubtitlu'] or args['subheaderstyle'] or 'font-weight: bold; font-size: 110%'
		if args['aniversare_naștere'] then
			local by = wikidata.findAnniversary('P569', q, args['aniversare_naștere'])
			if by and by > 0 then
				processedArgs['subheader' .. tostring(index)] = plural.build_plural(by, "an", "ani") .. ' de la naștere'
				index = index + 1
			end
		end
		if args['aniversare_deces'] then
			local dy = wikidata.findAnniversary('P570', mw.wikibase.getEntityIdForCurrentPage(), args['aniversare_deces'])
			if dy and dy > 0 then
				processedArgs['subheader' .. tostring(index)] = plural.build_plural(dy, "an", "ani") .. ' de la moarte'
				index = index + 1
			end
		end
		processedArgs['title'] = args['Nume'] or args['nume'] or args['name'] or wikidata.findRoLabel(q) or wikidata.findNativeOrEnglishLabel(q)
		processedArgs['doc'] = args['doc']
		processedArgs['wikidata'] = args['wikidata']
	else
		processedArgs['title'] = args['default_title']
		processedArgs['parent_colspan'] = args['parent_colspan'] or '2'
	end
	table.insert(retainedInputArgs, 'title')
	
	labeldatacount = labeldatacount + 1

	local earliestHeaderNumberAfterGeneralLabels = 0
	local earliestDataNumberAfterGeneralLabels = 0

	local largestIndex = labeldatacount

	for argN, argV in pairs(args) do
		local headerStart
		local headerEnd
		local labelStart
		local labelEnd
		local dataStart
		local dataEnd
		headerStart, headerEnd = mw.ustring.find(argN, "header")
		labelStart, labelEnd = mw.ustring.find(argN, "label")
		dataStart, dataEnd = mw.ustring.find(argN, "data")
		styleStart, styleEnd = mw.ustring.find(argN, "style")
		classStart, classEnd = mw.ustring.find(argN, "class")
		
		local nr = ""
		local argumentName = nil
		if dataStart == 1 then
			nr = mw.ustring.sub(argN, 1 + dataEnd, mw.ustring.len(argN))
			argumentName = 'data'
			if argV and mw.ustring.len(mw.text.trim(argV)) > 0 and nr ~= nil and mw.ustring.match(nr, '%d+') then
				if earliestDataNumberAfterGeneralLabels == 0 or earliestDataNumberAfterGeneralLabels < tonumber(nr) then
					earliestDataNumberAfterGeneralLabels = tonumber(nr)
				end
			end
		elseif labelStart == 1 then
			nr = mw.ustring.sub(argN, 1 + labelEnd, mw.ustring.len(argN))
			argumentName = 'label'
		elseif headerStart == 1 then
			nr = mw.ustring.sub(argN, 1 + headerEnd, mw.ustring.len(argN))
			argumentName = 'header'
			if argV and mw.ustring.len(mw.text.trim(argV)) > 0 and nr ~= nil and mw.ustring.match(nr, '%d+') then
				if earliestHeaderNumberAfterGeneralLabels == 0 or earliestHeaderNumberAfterGeneralLabels < tonumber(nr) then
					earliestHeaderNumberAfterGeneralLabels = tonumber(nr)
				end
			end
		elseif styleStart == 1 then
			nr = mw.ustring.sub(argN, 1 + styleEnd, mw.ustring.len(argN))
			argumentName = 'style'
		elseif classStart == 1 then
			nr = mw.ustring.sub(argN, 1 + classEnd, mw.ustring.len(argN))
			argumentName = 'class'
		end
		if argumentName and nr and mw.ustring.len(mw.text.trim(nr)) > 0 and mw.ustring.gsub(nr, '%d+', '') == '' then
			local argumentidx = labeldatacount + tonumber(nr)
			processedArgs[argumentName .. tostring(argumentidx)] = argV
			largestIndex = math.max(largestIndex, argumentidx)
		elseif not tableContains(retainedInputArgs, argN) then
			processedArgs[argN] = argV
		end
	end
	if earliestDataNumberAfterGeneralLabels > 0 and (earliestHeaderNumberAfterGeneralLabels > earliestDataNumberAfterGeneralLabels or earliestHeaderNumberAfterGeneralLabels == 0) then
		processedArgs['header' .. tostring(labeldatacount - 1)] = args['bio_header'] or 'Activitate'
	end

	if not processedArgs['child'] then	
		local crtLineIndex = largestIndex + 1
		local signature = args['semnătură'] or args['semnatura'] or args['signature'] or wikidata.findOneValueNoRef('P109', q)
		if signature and signature ~= '' then
			processedArgs['header' .. tostring(crtLineIndex)] = 'Semnătură'
			crtLineIndex = crtLineIndex + 1
			processedArgs['data' .. tostring(crtLineIndex)] = infoboxImage{image=signature, size='150', sizedefault='frameless', suppressplaceholder='yes', class='skin-invert'}
			crtLineIndex = crtLineIndex + 1
		end
		
		local onlinelinks = {}
		local linkstopullfromwd = {'P2013', 'P2002', 'P2035', 'P2847', 'P345', 'P3265', 'P3579', 'P3435', 'P2003', 'P2471', 'P2397', 'P6634', 'P2572', 'P7085', 'P3789', 'P11245'}
		local webaddr = extractDedicatedArgFromInputArgs(retainedInputArgs, args, {'sit', 'site', 'web', 'website', 'sit-web', 'site-web', 'sit-adresă', 'URL', 'url'}, function() return nil end)
		if webaddr then
			if mw.ustring.find(webaddr, '[', 1, true) then
				webaddr = StringUtils._substringBefore({StringUtils._substringAfter({webaddr, '['}), ' '})
			end
		end
		if webaddr and mw.ustring.len(mw.text.trim(webaddr)) > 0 then
			table.insert(onlinelinks, '[' .. webaddr .. ' Site web]')
		else
			table.insert(linkstopullfromwd, 1, 'P856')
		end
		local wdonlinelinks = wikidata.findOnlineLinks(linkstopullfromwd, q)
		for _,eachWdOnlineLink in ipairs(wdonlinelinks) do
			table.insert(onlinelinks, eachWdOnlineLink)
		end

		if #onlinelinks > 0 then
			processedArgs['header' .. tostring(crtLineIndex)] = 'Prezență online'
			crtLineIndex = crtLineIndex + 1
			processedArgs['data' .. tostring(crtLineIndex)] = tostring(
				mw.html.create('div')
					:css('text-align', 'center')
					:wikitext(table.concat(onlinelinks, tostring(mw.html.create('br'))))
			)
			crtLineIndex = crtLineIndex + 1
		end
	end
	return processedArgs
end

p.displayInfoboxFromArgs = function(args)
	local processedArgs = processArgs(args)
	local outtext = infobox._infobox(processedArgs)
	local maintcats = {}
	if not processedArgs.image then
		table.insert(maintcats, 'Articole biografice fără fotografii')
	end
	
	for _,eachMaintCat in ipairs(maintcats) do
		outtext = outtext .. '[[Categorie:' .. eachMaintCat .. ']]'
	end
	
	return outtext
end

p.displayInfobox = function(frame)
	local args = getArgs(frame, {parentFirst = true})
	return p.displayInfoboxFromArgs(args)
end

return p