Module:Infobox/Fonctions/Personne

De Lagny-sur-Marne Wiki
< Module:Infobox‎ | Fonctions
Révision datée du 25 février 2016 à 10:50 par Odejea (discussion) (Conjoint -> époux ou épouse)
Aller à : navigation, rechercher

La documentation pour ce module peut être créée à Module:Infobox/Fonctions/Personne/doc

-- Functions utilisées par les infobox personnes
local p = {}
local wikidata = require "Module:Interface Wikidata".fromLua
local general = require "Module:Infobox/Fonctions"
local datemodule = require "Module:Date"
local linguistic = require "Module:Linguistique"

 -- libellés spéciaux lorsque ceux de Wikconidata ne conviennent pas
local occupations = require "Module:Dictionnaire Wikidata/Métiers"

local function setgender() -- établit la valeur de la variable "gender" qui sert à adapter la grammaire au sexe de la personne
	local vals = {
		['Q6581072'] = 'f',
		['Q6581097'] = 'm',
		default      = '?'
	}
	local gender = wikidata.formatStatements{entity = item, property = 'P21', displayformat = 'raw'}
	return vals[gender] or vals.default
end

local gender = setgender()

local function setgenderedlabels()
	if gender == 'f' then
		return occupations.female
	elseif gender == 'm' then
		return occupations.male
	end
end	
local genderedlabels = genderedlabels or setgenderedlabels()

local datelinks = { -- lien vers le domaine d'activité approprié
	Q483501 = 'en arts plastiques', -- artiste
	Q1028181 = 'en arts plastiques', -- peintre
	Q1281618 = 'en arts plastiques', -- sculpteur
	Q2309784 = 'en cyclisme', -- cycliste
	Q16947657 = 'en arts plastiques', -- lithographe
}

-- ========== Fonctions d'aide ====================================
local function getdatetopic() -- obtient le lien le plus approprié pour une date en fonction de la profession
	local claims = wikidata.getClaims{entity = item, property = 'P106', excludespecial = true}
	if not claims then
		return nil
	end
	for i, j in pairs(claims) do
		local v = wikidata.getmainid(j)
		if datelinks[v] then
			return datelinks[v]
		end
	end
end

local linktopic = getdatetopic()

local function wikidatadate(prop) 	-- fonction à vocation généraliste, à externaliser
	return wikidata.wikidataDate(prop, item, {linktopic = linktopic})
end
local birthdate = localdata['naissance'] or localdata['date de naissance'] or wikidatadate('P569')
local deathdate = localdata['décès'] or localdata['date de décès'] or wikidatadate('P570')

local function timeline(statements, prop) -- affiche date : événement (suppose les événements déjà triés)
	if not statements then
		return nil
	end
	local rows = {}

	local speciallabels = genderedlabels
	local dateformat = {precision = 'year', linktopic = '-'}
	-- qualificatifs à afficher "de", circonscription, diocèse, assemblée délibérante, parti, employeur	
	local qualifs =  {'P642', 'P768', 'P708', 'P194', 'P102', 'P108'}

	local stilltrue = not(deathdate)-- si la personne est vivante, on emploie "depuis" plutôt que "à partir de" (mais lorsque c'est fini mais que la date de fin manque, ça devient faux)
	for i, statement in pairs(statements) do
		local mainstr = wikidata.formatStatement(statement, {speciallabels = speciallabels, showqualifiers = qualifs, stilltrue = stilltrue})
		local period = wikidata.statementDate(statement, dateformat )
			
		-- rétrolien à activer si on veut inciter les gens à aller sur Wikidata
		--if (not period) and item then
		--	period = '[[:d:' .. item.id .. '#' .. (prop or '') .. '|<i>date à ajouter</i>]
		--end

		-- prédecesseur et successeur
		-- TODO gestion de "novalue" et "somevalue"
		local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'})
		local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'})
		if predecessor then
			local s = 'précédé par ' .. predecessor
			if gender == 'f' then
				s = 'précédée par ' .. predecessor
			end
			mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>'
		end
		if successor then
			local s = 'suivi par ' .. successor
			if gender == 'f' then
				s = 'suivie par ' .. successor
			end
			mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>'
		end

		-- à la dernière ligne : ajout rétrolien et catégorie de maintenance
		if (i == #statements) and prop then
			mainstr = wikidata.formatAndCat{value = mainstr, property = prop, entity = item}
		end
		
		local row = {type = 'row', label = period or '', value = function() return mainstr end}
		table.insert(rows, row)
	end
	-- ajout de rétrolien, cat
	return rows
end


local function timeline2(statements, prop) -- affiche date : événement (suppose les événements déjà triés)
	if not statements then
		return nil
	end
	local rows = {}
	
	local speciallabels = genderedlabels
	local dateformat = {precision = 'year', linktopic = '-'}
	-- qualificatifs à afficher "de", circonscription, diocèse, assemblée délibérante, parti, employeur	
	local qualifs =  {'P642', 'P768', 'P708', 'P194', 'P102', 'P108'}
	
	local stilltrue = not(deathdate)-- si la personne est vivante, on emploie "depuis" plutôt que "à partir de" (mais lorsque c'est fini mais que la date de fin manque, ça devient faux)
	for i, statement in pairs(statements) do
		local mainstr = wikidata.formatStatement(statement, {speciallabels = speciallabels, showqualifiers = qualifs, stilltrue = stilltrue})
		local row1 = {type = 'row1col', color = 'secondcolor', value = mainstr }
		--local row1 = {type = 'caption', style = 'text-align:center;background-color:#BFFFBF', value = function() return mainstr end}
		table.insert(rows, row1)
		
		local period = wikidata.statementDate(statement, dateformat )
		local row2 = {type = 'row1col', color = '#F9F9F9', value = period }
		--local row2 = {type = 'caption', style = 'text-align:center;background-color:#F9F9F9', value = function() return period end}
		table.insert(rows, row2)
			
		local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'})
		if predecessor then
			local row3 = {type = 'row', label = 'Prédécesseur', value = function() return predecessor end}
			table.insert(rows, row3)
		end
		
		local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'})
		if successor then
			local row4 = {type = 'row', label = 'Successeur', value = function() return successor end}
			table.insert(rows, row4)
		end

	end
	-- ajout de rétrolien, cat
	return rows
end



local function timeline3(statements, prop, color) -- affiche date : événement (suppose les événements déjà triés)
	if not statements then
		return nil
	end
	local rows = {}
	
	local speciallabels = genderedlabels
	local dateformat = {precision = 'year', linktopic = '-'}
	-- qualificatifs à afficher "de", circonscription, diocèse, assemblée délibérante, parti, employeur	
	local qualifs =  {'P642', 'P768', 'P708', 'P194', 'P102', 'P108'}
	
	local stilltrue = not(deathdate)-- si la personne est vivante, on emploie "depuis" plutôt que "à partir de" (mais lorsque c'est fini mais que la date de fin manque, ça devient faux)
	for i, statement in pairs(statements) do
		local mainstr = wikidata.formatStatement(statement, {speciallabels = speciallabels, showqualifiers = qualifs, stilltrue = stilltrue})
		local row1 = {type = 'row1col', color = 'secondcolor', value = mainstr }
		table.insert(rows, row1)
		
		local period = wikidata.statementDate(statement, dateformat )
		local row2 = {type = 'row1col', color = '#F9F9F9', value = period }
		table.insert(rows, row2)
		
		local text = {}
		
		local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'})
		if predecessor then
			text['before'] = predecessor
		end
		
		local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'})
		if successor then
			text['after'] = successor
		end
		
		local row3 = {type = 'succession', color = color, value = text }
		table.insert(rows, row3)
	end
	-- ajout de rétrolien, cat
	return rows
end


local function dateandplace(thedate, theplace)
	if thedate then
		i, j = string.find(thedate, 'inconnu')
		if i then
			thedate = nil
		end
	end
	if theplace then
		i, j = string.find(theplace, 'inconnu')
		if i then
			theplace = nil
		end
	end
	if thedate and theplace then
		return thedate .. '<br />' .. theplace
	else
		return thedate or theplace --retourne tout ce qu'il trouve
	end
end


--Titre
function p.title(icon, style)
	return general.title(icon, style)
end

--Image
function p.mainimage()
	
	 -- demande d'illustration que si la personne est née après 1900, sinon c'est souvent impossible à trouver
	local defaultimage = 'Defaut 2.svg'
	local age = wikidata.stringTable{property = 'P569', entity = item, displayformat = 'raw', excludespecial = true}

	if age then
		local pattern = "(%W)(%d+)%-(%d+)%-(%d+)"
		local era, year = age[1]:match(pattern)
		if (era == '-') or (tonumber(year)) < 1900 then
			defaultimage = nil
		end
	end
	return  general.mainimage('Article à illustrer/Biographie', defaultimage)
end

-- Noms
function p.othernames()

	local names = {
		{'P1477', 'Nom de naissance', 'Noms de naissance', 'nom de naissance'},
		{'P1449', 'Surnom', 'Surnoms', 'surnom'},
		{'P1559', 'Nom dans la langue maternelle', 'Noms dans la langue maternelle', 'nom dans la langue maternelle'},
		{'P742', 'Pseudonyme', 'Pseudonymes', 'pseudonyme'},
		{'P1782', 'Prénom social', 'Prénoms sociaux', 'prénom social'},
		{'P1786', 'Nom posthume', 'Noms posthumes', 'nom posthume'},
		{'P1785', 'Nom de temple', 'Noms de temple', 'nom de temple'},
		{'P1787', 'Nom de pinceau', 'Noms de pinceau', 'nom de pinceau'},
		{nil, 'Autres noms', 'autres noms'}
	}

	local rows = {type = 'multi', rows = {}}
	for i, j in pairs(names) do
		local query
		if j[1] and not localdata['autres noms'] then -- lorsqu'il y a un paramètre "autres noms", Wikidata est désactivée pour éviter risques de doublon
			query = {property = j[1], showqualifiers = {'P1721'}, conjtype = ',<br />'}
		end
		table.insert(rows.rows, {type = 'row', value = j[4], wikidata = query, label = j[2], plurallabel = j[3]})
	end
	return rows
end

-- NAISSANCE ET MORT
function p.birth() -- date de naissance en première ligne, lieu de naissance en deuxième
	return {
		type = 'row',
		label = 'Naissance',
		value =
			function()
			local thedate = datemodule.dateInfobox{args = {[1] = 'naissance', [2] = birthdate or '', [3] = deathdate or '', qualificatif = linktopic}}
			local theplace = localdata['lieu de naissance'] or wikidata.formatAndCat({entity =item, property= 'P19', rank = 'best', conjtype= ' ou '})
			return dateandplace(thedate, theplace)
			end
	}
end

function p.death() -- même fonctionnement que la fonction p.birth
	return {
		type = 'row',
		label = 'Décès',
		value = 
			function()
			local thedate = datemodule.dateInfobox{args = {[1] = 'mort', [2] = birthdate or '', [3] = deathdate or '', qualificatif = linktopic}}
			local theplace = localdata['lieu de décès'] or wikidata.formatAndCat({entity = item, property= 'P20', rank = 'best', conjtype= ' ou '})
			return dateandplace(thedate, theplace)
			end
	}
end

function p.floruit()
	return {
		type = 'row',
		label = 'Période d’activité',
		value = "Période d'activité",
		wikidata = function() return wikidatadate('P1317')	end
	}
end

function p.placeofburial()
	local title = 'Lieu d\'enterrement'
	return
	{type = 'row', label = 'Lieu d\'enterrement', value = 'lieu d\'enterrement', property = 'P119'}
end

function p.nationality() 
	
	-- à améliorer pour tenir compte des dates tout en évitant les doublons pour ceux qui ont Empire allemand + République de Weimar
	
	local function wdDate()
		local nation = require "Module:Country data".nationality
		local statements = wikidata.getClaims{entity = item, property = 'P27'}
		if not statements then
			return nil
		end
		return wikidata.formatAndCat{
			property = 'P27',
			vals = statements,
			showdate = true,
			entity = item,
			conjtype = 'comma',
			removedupes = true,
			linktopic = '-',
			displayformat = 
				function(snak)
					-- local g = gender -- ne sert plus: ici au féminin comme Nationalité
					-- if g == '?' then -- si inconnu, au féminin comme Nationalité
					-- 	g = 'f'
					-- end
					local val, success = nation(wikidata.getid(snak), 'f')
					if not success then
						val = wikidata.formatSnak(snak)
					end
					return val
				end
			}, #statements
	end
		
	return {
		type = 'row',
		label = 'Nationalité',
		plurallabel = 'Nationalités',
		value = 'nationalité',
		wikidata = function() return wdDate() end
	}

end

function p.nativelanguage()
	return
	{type = 'row', label = 'Langue maternelle', value = 'langue maternelle', property = 'P103'}
end

-- Domiciles
function p.places()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Domicile',
		plurallabel = 'Domiciles',
		value = 'domicile',
		wikidata = {property = 'P551', showdate = true, sorttype= 'chronological', precision = 'year'},
},
{
		type = 'row',
		label = 'Lieu de travail',
		plurallabel = 'Lieux de travail',
		value = 'lieu de travail',
		wikidata = {property = 'P937', sorttype= 'chronological', showdate = true, precision = 'year'},
},
	}}
end

-- parcours professionel
function p.education() -- à améliorer
	local query = {sorttype= 'chronological', property = 'P69', showdate = true, showqualifiers = 'P512', conjtype = '<br />', linktopic = '-'}
	return {
		type = 'row',
		value = {'éducation', 'formation'},
		wikidata = query,
		label = 'Formation',
	}
end

function p.occupation()
	return {
		type = 'row', 
		value = {'activité', 'activités'},
		wikidata = {
			property = 'P106',
			showdate = true,
			conjtype = 'comma',
			excludevalues = {
				'Q482980', -- auteur
				'Q15980158' -- auteur de non-fiction
				},
			speciallabels = genderedlabels,
			defaultlink = '-',
		}, 
		label = 'Activité',
		plurallabel = 'Activités'
	}
end

function p.employer()
	return {
		type = 'row', 
		value = 'employeur',
		wikidata = {property = 'P108', showdate = true, sorttype= 'chronological'}, 
		label = function() return localdata['intitulé employeur'] or 'A travaillé pour' end,
	}
end

function p.victories() 
	local title = 'Victoires'
	local singtitle = 'Victoire'
	
	local rows
	if localdata['victoire'] then
		return {type = 'table', rows = {
			{type = 'row',  label = title, value = 'victoire'}
		}
	}
	else
		local statements = wikidata.getClaims{property = 'P2522', entity = item, sorttype = 'chronological'}
		if not statements then
			return nil
		end
		if #statements == 1 then
			title = singtitle
		end
		rows = timeline2(statements, 'P2522')
	end
	return
	{
		type = 'table',
		title = title,
		rows = rows,
	}	

end

function p.officialposition() 
	local title = 'Fonctions'
	local singtitle = 'Fonction'
	
	local rows
	if localdata['fonction'] then
		return {type = 'table', rows = {
			{type = 'row',  label = title, value = 'fonction'}
		}
	}
	else
		local statements = wikidata.getClaims{property = 'P39', entity = item, rank = 'valid', sorttype = 'chronological'}
		if not statements then
			return nil
		end
		if #statements == 1 then
			title = singtitle
		end
		rows = timeline3(statements, 'P39', 'default')
	end
	return
	{
		type = 'table',
		title = title,
		rows = rows,
	}	

end

function p.nobilitytitle() 
	local title = 'Titres'
	local singtitle = 'Titre'
	
	local rows
	if localdata['titre'] then
		return {type = 'table', rows = {
			{type = 'row',  label = title, value = 'titre'}
		}
	}
	else
		local statements = wikidata.getClaims{property = 'P97', entity = item, rank = 'valid', sorttype = 'chronological'}
		if not statements then
			return nil
		end
		if #statements == 1 then
			title = singtitle
		end
		rows = timeline2(statements, 'P97')
	end
	return
	{
		type = 'table',
		title = title,
		rows = rows,
	}	

end

function p.honorifictitle() 
	local title = 'Titres'
	local singtitle = 'Titre'
	
	local rows
	if localdata['titre'] then
		return {type = 'table', rows = {
			{type = 'row',  label = title, value = 'titre'}
		}
	}
	else
		local statements = wikidata.getClaims{property = 'P511', entity = item, rank = 'valid', sorttype = 'chronological'}
		if not statements then
			return nil
		end
		if #statements == 1 then
			title = singtitle
		end
		rows = timeline(statements, 'P511')
	end
	return
	{
		type = 'table',
		title = title,
		rows = rows,
	}	

end

function p.blason()
	return {
		type = 'images',
		imageparameters =  {'blason'},
		defaultimages = nil,
		defaultsize = 	'150px',
		sizeparameter = 'taille blason',
		captionparameter = 'legende blason',
		defaultcaption = '',
		property = 'P94',
		numval = 1,
	}
end

function p.flag()
	return {
		type = 'images',
		imageparameters =  {'drapeau'},
		defaultimages = nil,
		defaultsize = 	'150px',
		sizeparameter = 'taille drapeau',
		captionparameter = 'legende drapeau',
		defaultcaption = 'Drapeau',
		property = 'P41',
		numval = 1,
	}
end

function p.politicalparty()
	return {
		type = 'row', 
		value = 'parti politique',
		label = 'Parti politique',
		plurallabel = 'Partis politiques',
		wikidata = { property = 'P102', sorttype= 'chronological', showdate = true, conjtype = '<br />', excludespecial = true}, 
	}
end

function p.memberof()
	return {
		type = 'row', 
		label = 'Membre de', 
		value = 'membre de', 
		wikidata = {property = 'P463', sorttype= 'chronological', showdate = true, precision = 'year'},
	}
end

function p.awards() -- à améliorer
	
local function awardsList(item)	
	local majorlist = require "Module:Dictionnaire Wikidata/Distinctions"

	local query = {
		entity = item, property= 'P166', sorttype= 'chronological',
		showqualifiers = 'P642', showdate= true, precision = 'year', textformat = 'minimum', linktopic = '-', conjtype = '<br />', defaultlinkquery = {property = 'P361'},
		speciallabels = majorlist
	}

	local major = {} -- récompenses importantes obtenues
	local all = {} 
	local message = "Liste détaillée"

	local claims = wikidata.getClaims(query)
	if not claims then
		return nil
	end
	
	if #claims < 3 then
		query.claims = claims
		return wikidata.formatAndCat(query), #claims
	end
	
	-- formate la liste des statements, en met certaine dans les "major"
	for i, j in pairs(claims) do
		local id = wikidata.getmainid(j)
		local s =  wikidata.formatStatement(j, query)
		table.insert(all, s)
		if majorlist[id] then
			table.insert(major, s)
		end
	end

	-- transforme la liste complète en chaîne
	query.value = table.concat(all, '<br />')
	local str = wikidata.formatAndCat(query) -- la liste complète des récompenses
	if (#all - #major < 2) then -- s'il n' a qu'une seule récompense mineure, ça ne sert à rien de la collapser
		return str
	end
	
	-- transforme la liste des valeurs importantes en chaîne
	if (#major > 0) then
		query.value = table.concat(major, '<br />')
		majorstr = wikidata.formatAndCat(query)
	else
		message = nil --=> pas de titre pour la liste complète
	end

	-- met la liste complète dans un menu replié
	local obj = mw.html.create('div') 
		:addClass("toccolours mw-collapsible mw-collapsed")
		:wikitext(message)
		:css{border = "none"}
		:tag('div')
			:addClass("mw-collapsible-content")
			:css{['line-height'] = '150%'} -- sinon c'est vraiment serré
			:wikitext(str)
			:done()
		:allDone()

	str = linguistic.conj({majorstr, tostring(obj)}, '<br />')

	return str, #claims
end			
	
	return {
		type = 'row', 
		value = {'prix', 'récompenses', 'distinction', 'distinctions'},
		label = 'Distinction',
		plurallabel = 'Distinctions',
		wikidata = function() return awardsList(item) end
	}
end

-- Influences 
function p.influencedby()
	return {
		type = 'row',
		label = 
		function(localdata, item) 
		if not gender then setgender(localdata, item) end
		if gender == 'f' then
			return 'Influencée par'
		elseif gender == 'm' then
			return 'Influencé par'
		else
			return 'Influencé(e) par'
		end
		end,
		value = 'influencé par',
		wikidata = {property = 'P737'},
    }
end

function p.influenced()
	return {
		type = 'row',
		label = 'A influencé',
		value = {'a influencé', 'influence de'},
		wikidata = {property = 'P738'},
}
end

-- Appartenances
function p.movement()
	return
	{type = 'row', label = 'Mouvement', value = 'mouvement', wikidata = {property = 'P135', sorttype= 'chronological', showdate = true, precision = 'year'},
}
end

-- Carrière militaire
function p.military()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Arme',
		plurallabel = 'Armes',
		value = 'arme',
		wikidata = {property = 'P241', showdate = true, sorttype= 'chronological', precision = 'year'},
},
{
		type = 'row',
		label = 'Grade militaire',
		plurallabel = 'Grades militaires',
		value = 'grade militaire',
		wikidata = {property = 'P410', showdate = true, sorttype= 'chronological', precision = 'year'},
},
{
		type = 'row',
		label = 'Conflit',
		plurallabel = 'Conflits',
		value = 'conflit',
		wikidata = {property = 'P607', showdate = true, sorttype= 'chronological', precision = 'year'},
},
	}}
end

-- Sport
function p.sport()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Sport',
		plurallabel = 'Sports',
		value = 'sport',
		wikidata = {property = 'P641', showdate = true},
},
{
		type = 'row',
		label = 'Spécialité',
		plurallabel = 'Spécialités',
		value = 'spécialité',
		wikidata = {property = 'P413'},
},
{
		type = 'row',
		label = 'Équipe',
		plurallabel = 'Équipes',
		value = 'équipe',
		wikidata = {property = 'P54', sorttype= 'chronological', showdate = true, precision = 'year', conjtype = '<br />', showqualifiers = {'P1350', 'P1351'}},
},
{
		type = 'row',
		label = 'Capes internationales',
		value = 'capes',
		wikidata = {property = 'P1129', numval = '1'},
},
{
		type = 'row',
		label = 'Copilote',
		plurallabel = 'Copilotes',
		value = 'copilote',
		wikidata = {property = 'P2095', sorttype= 'chronological', showdate = true, precision = 'year'},
},
{
		type = 'row',
		label = 'Sponsor',
		plurallabel = 'Sponsors',
		value = 'sponsor',
		wikidata = {property = 'P859', sorttype= 'chronological', showdate = true, precision = 'year'},
},
	}}
end

-- Contacts
function p.contacts()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Maître',
		plurallabel = 'Maîtres',
		value = {'maître', 'maîtres'},
		wikidata = {property = 'P1066', sorttype= 'chronological', showdate = true, precision = 'year'},
},
{
		type = 'row',
		label = 'Directeur de thèse',
		plurallabel = 'Directeurs de thèse',
		value = 'directeur de thèse',
		wikidata = {property = 'P184', sorttype= 'chronological', showdate = true, precision = 'year'},
},
{
		type = 'row',
		label = 'Agent',
		label = 
		function(localdata, item) 
		if not gender then setgender(localdata, item) end
		if gender == 'f' then
			return 'Représentée par'
		elseif gender == 'm' then
			return 'Représenté par'
		else
			return 'Représenté(e) par'
		end
		end,
		value = 'représenté par',
		wikidata = {property = 'P1875'},
},
{
		type = 'row',
		label = 'Partenaire',
		plurallabel = 'Partenaires',
		value = 'partenaire',
		wikidata = {property = 'P1327'},
},
{
		type = 'row',
		label = localdata['intitulé élève'] or 'Élève',
		plurallabel = 'Élèves',
		value = {'élève', 'élèves'},
		wikidata = {property = 'P802', sorttype= 'chronological', showdate = true, precision = 'year', numval = '5'},
},
{
		type = 'row',
		label = 'Étudiant de thèse',
		plurallabel = 'Étudiants de thèse',
		value = 'étudiant de thèse',
		wikidata = {property = 'P185', sorttype= 'chronological', showdate = true, precision = 'year', numval = '5'},
},
	}}
end

-- Mécénat
function p.patron()
	return {
		type = 'row', 
		label = '[[Mécénat|Mécènes]]', singularlabel = '[[Mécénat|Mécène]]', plurallabel = '[[Mécénat|Mécènes]]', 
		value = 'mécènes', 
		wikidata = {property = 'P1962', showdate = true, sorttype = 'chronological', conjtype = 'comma'},
		}
end

-- Musique
function p.music()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Tessiture',
		value = 'tessiture',
		property = 'P412',
},
{
		type = 'row',
		label = 'Fach',
		value = 'fach',
		property = 'P1731',
},
{
		type = 'row',
		label = 'Instrument',
		plurallabel = 'Instruments',
		value = 'instrument',
		wikidata = {property = 'P1303', sorttype= 'chronological'},
},
{
		type = 'row',
		label = 'Label',
		plurallabel = 'Labels',
		value = 'label',
		wikidata = {property = 'P264', sorttype= 'chronological', showdate = true, precision = 'year'},
},
	}}
end

-- Physique
function p.appearance()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Taille',
		value = 'taille',
		wikidata = {property = 'P2048'},
},
{
		type = 'row',
		label = 'Poids',
		value = 'poids',
		wikidata = {property = 'P2067'},
},
{
		type = 'row',
		label = 'Cheveux',
		value = 'cheveux',
		wikidata = {property = 'P1884'},
},
{
		type = 'row',
		label = 'Yeux',
		value = 'yeux',
		wikidata = {property = 'P1340'},
},
	}}
end

-- Famille
function p.family()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Famille',
		plurallabels = 'Familles',
		value = 'famille',
		property = 'P53',
},
{
		type = 'row',
		label = 'Père', 
		value = 'père',
		property = 'P22',
},
{
		type = 'row',
		label = 'Mère',
		value = 'mère',
		property = 'P25',
},
{
		type = 'row',
		label = function()
			-- retourne une forme singulière ou plurielle.
			local claims = wikidata.getClaims{property = 'P7', entity = item}
			if (not claims) or #claims == 1 then
				return "Frère"
			end
			return "Frères"
			end,
		value = 'frère',
		wikidata = function() 
			local claims = wikidata.getClaims{entity = item, property = 'P7', sorttype = 'chronological'}
			if not claims then
				return nil
			end
			local conjtype, textformat = '<br />', 'long'
			return wikidata.formatAndCat{entity = item, property = 'P7', showdate = true, textformat = textformat, precision = 'year', linktopic = '-', conjtype = conjtype, stilltrue = (not deathdate)}	
			end
},
{
		type = 'row',
		label = function()
			-- retourne une forme singulière ou plurielle.
			local claims = wikidata.getClaims{property = 'P9', entity = item}
			if (not claims) or #claims == 1 then
				return "Sœur"
			end
			return "Sœurs"
			end,
		value = 'sœur',
		wikidata = function() 
			local claims = wikidata.getClaims{entity = item, property = 'P9', sorttype = 'chronological'}
			if not claims then
				return nil
			end
			local conjtype, textformat = '<br />', 'long'
			return wikidata.formatAndCat{entity = item, property = 'P9', showdate = true, textformat = textformat, precision = 'year', linktopic = '-', conjtype = conjtype, stilltrue = (not deathdate)}	
			end
},
{
		type = 'row',
		label = function()
			-- retourne une forme singulière ou plurielle. Pourrait éventuellement adapter féminin masculine, mais demanderait logiquement de vérifier le sexe de chaque valeur
			local claims = wikidata.getClaims{property = 'P26', entity = item}
			if (not claims) or #claims == 1 then
				if gender == 'f' then
					return "Époux"
				end
				if gender == 'm' then
					return "Épouse"
				end
				return "Conjoint"
			end
			if gender == 'f' then
				return "Époux"
			end
			if gender == 'm' then
				return "Épouses"
			end
			return "Conjoints"
			end,
		value = 'conjoint',
		wikidata = function() 
			local claims = wikidata.getClaims{entity = item, property = 'P26', sorttype = 'chronological'}
			if not claims then
				return nil
			end
			local conjtype, textformat = '<br />', 'long'
			if #claims > 4 then
				conjtype, textformat = 'comma', 'minimum'
			end
			return wikidata.formatAndCat{entity = item, property = 'P26', showdate = true, textformat = textformat, precision = 'year', linktopic = '-', conjtype = conjtype, stilltrue = (not deathdate)}	
			end
},
{
		type = 'row',
		label = function()
			-- retourne une forme singulière ou plurielle.
			local claims = wikidata.getClaims{property = 'P40', entity = item}
			if (not claims) or #claims == 1 then
				return "Enfant"
			end
			return "Enfants"
			end,
		value = 'enfant',
		wikidata = function() 
			local claims = wikidata.getClaims{entity = item, property = 'P40', sorttype = 'chronological'}
			if not claims then
				return nil
			end
			local conjtype, textformat = '<br />', 'long'
			return wikidata.formatAndCat{entity = item, property = 'P40', showdate = true, textformat = textformat, precision = 'year', linktopic = '-', conjtype = conjtype, stilltrue = (not deathdate)}	
			end
},
{
		type = 'row',
		label = 'Parentèle',
		value = 'parentèle',
		wikidata = {property = 'P1038', showqualifiers = {'P1039'}}
},
	}}
end

-- Œuvres
function p.works()
	local title = 'Œuvres réputées'
	-- on pourrait mettre quelque chose comme "oeuvre principale" lorsque #vals == 1 mais les données de Wikidata sont trop approximatives pour que cela ait du sens
	return 
	{type = 'table', title = title, rows =
		{
			{
			type = 'row',
			value = 'œuvres principales',
			wikidata = {
				property = 'P800',
				numval = 5,
				excludespecial = true,
				displayformat =
					function(snak)
						return '<i>' .. wikidata.formatEntity(wikidata.getid(snak), {defaultlink = 'image'}) .. '</i>'
					end
			}
			}
		}
	}
end

function p.filmography()
	local title = 'Films notables'
	return
	{type = 'row', label = 'Films notables', value = 'films notables', property = 'P1283'}
	end

function p.discography()
	local title = 'Discographie'
	return
	{type = 'row', label = 'Discographie', value = 'discographie', property = 'P358'}
end

-- Signature
function p.signature(default)
	return {
		type = 'images',
		imageparameters =  {'signature'},
		defaultimage = default,
		defaultsize = '150px',
		captionparameter = 'légende signature',
		defaultcaption = 'signature',
		property = 'P109',
		numval = 1
	}
end

--== Site web
function p.website()
	return general.website()
end

return p