Module:Infobox/Fonctions/Personne : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
(Annulation des modifications de Odejea (retour à la précédente version de Odejea) : plusieurs ne sont pas mariés)
m (Révocation des modifications de Hercule (retour à la dernière version de Simon Villeneuve))
 
(179 révisions intermédiaires par 13 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 
-- Functions utilisées par les infobox personnes
 
-- Functions utilisées par les infobox personnes
 
local p = {}
 
local p = {}
local wikidata = require "Module:Interface Wikidata".fromLua
+
local localdata = require( 'Module:Infobox/Localdata' )
 +
local item = localdata.item
 +
local wikidata = require( "Module:Interface Wikidata" ).fromLua
 
local general = require "Module:Infobox/Fonctions"
 
local general = require "Module:Infobox/Fonctions"
 
local datemodule = require "Module:Date"
 
local datemodule = require "Module:Date"
 +
local complexdate = require "Module:Date complexe"
 
local linguistic = require "Module:Linguistique"
 
local linguistic = require "Module:Linguistique"
 +
local militaryranks = require "Module:Dictionnaire Wikidata/Grades militaires"
  
-- libellés spéciaux lorsque ceux de Wikconidata ne conviennent pas
+
--=== Accord en genre
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
+
-- établit la variable gender pour l'élément
 +
local function getgender(id)
 
local vals = {
 
local vals = {
 
['Q6581072'] = 'f',
 
['Q6581072'] = 'f',
Ligne 15 : Ligne 19 :
 
default      = '?'
 
default      = '?'
 
}
 
}
local gender = wikidata.formatStatements{entity = item, property = 'P21', displayformat = 'raw'}
+
local gender = wikidata.formatStatements{entity = id, property = 'P21', displayformat = 'raw'}
 
return vals[gender] or vals.default
 
return vals[gender] or vals.default
 
end
 
end
  
local gender = setgender()
+
local gender = getgender(item)
  
local function setgenderedlabels()
+
-- récupération des libellés spéciaux codés en dur sur Wikipédia (attention : contient à la fois le libellé et le lien)
if gender == 'f' then
+
local occupationlabels = require "Module:Dictionnaire Wikidata/Métiers"[gender]
return occupations.female
+
 
elseif gender == 'm' then
+
-- récupération des libellés genrés de Wikidata
return occupations.male
+
local function genderedlabel(id, labelgender)
 +
local label
 +
if not labelgender then
 +
labelgender = gender -- si le genre n'est pas indiqué, c'est celui de la personne dont c'est l'infobox
 +
end
 +
if labelgender == 'f' then -- femme : chercher le libellé dans P2521 (libellé féminin)
 +
label = wikidata.formatStatements{entity = id, property = 'P2521', isinlang = 'fr', numval = 1, ucfirst = '-'}
 +
elseif labelgender == 'm' then -- homme : chercher le libellé dans P3321 (libellé masculin)
 +
label = wikidata.formatStatements{entity = id, property = 'P3321', isinlang = 'fr', numval = 1, ucfirst = '-'}
 +
end
 +
if not label then
 +
label = wikidata.getLabel(id)
 
end
 
end
end
+
return label
local genderedlabels = genderedlabels or setgenderedlabels()
+
end
  
 +
-- === Gestion des dates
 +
 +
-- Liens thématiques vers les dates
 
local datelinks = { -- lien vers le domaine d'activité approprié
 
local datelinks = { -- lien vers le domaine d'activité approprié
 
Q483501 = 'en arts plastiques', -- artiste
 
Q483501 = 'en arts plastiques', -- artiste
Ligne 36 : Ligne 54 :
 
Q2309784 = 'en cyclisme', -- cycliste
 
Q2309784 = 'en cyclisme', -- cycliste
 
Q16947657 = 'en arts plastiques', -- lithographe
 
Q16947657 = 'en arts plastiques', -- lithographe
 +
Q11569986 = 'en arts plastiques', -- graveur
 +
Q13365770 = 'en arts plastiques', -- graveur sur cuivre
 +
Q21925567 = 'en arts plastiques', -- sérigraphe
 +
Q10862983 = 'en arts plastiques', -- aquafortiste
 
}
 
}
  
-- ========== Fonctions d'aide ====================================
 
 
local function getdatetopic() -- obtient le lien le plus approprié pour une date en fonction de la profession
 
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}
+
local claims = wikidata.stringTable{entity = item, property = 'P106', excludespecial = true, displayformat = "raw"}
 
if not claims then
 
if not claims then
 
return nil
 
return nil
 
end
 
end
 
for i, j in pairs(claims) do
 
for i, j in pairs(claims) do
local v = wikidata.getmainid(j)
+
if datelinks[j] then
if datelinks[v] then
+
return datelinks[j]
return datelinks[v]
 
 
end
 
end
 
end
 
end
Ligne 54 : Ligne 74 :
 
local linktopic = getdatetopic()
 
local linktopic = getdatetopic()
  
local function wikidatadate(prop) -- fonction à vocation généraliste, à externaliser
+
--=====
return wikidata.wikidataDate(prop, item, {linktopic = linktopic})
+
local function wikidatadate(prop, args) -- fonction à vocation généraliste, à externaliser
 +
if not args then
 +
args = {}
 +
end
 +
args.linktopic = args.linktopic or linktopic
 +
return wikidata.wikidataDate(prop, item, args)
 +
end
 +
local unknowndatelabel = "date inconnue"
 +
local birthdate = localdata['naissance'] or localdata['date de naissance'] or wikidatadate('P569', {unknownlabel = unknowndatelabel})
 +
local deathdate = localdata['décès'] or localdata['date de décès'] or wikidatadate('P570', {unknownlabel =unknowndatelabel })
 +
 
 +
 
 +
local function format1(event, period, predecessor, successor, displayformat)
 +
local mainstr = event
 +
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
 +
return {type = 'row', label = period or '', value = function() return mainstr end}
 
end
 
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
+
 
 +
local function format2(event, period, predecessor, successor, displayformat)
 +
if (not event) then
 
return nil
 
return nil
 
end
 
end
 +
 
local rows = {}
 
local rows = {}
  
local speciallabels = genderedlabels
+
local eventrow = {type = 'row1col', color = 'secondcolor', value = event }
local dateformat = {precision = 'year', linktopic = '-'}
+
table.insert(rows, eventrow)
-- 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)
+
if period then
for i, statement in pairs(statements) do
+
period = '<span style="font-weight:normal">' .. period .. '</span>'
local mainstr = wikidata.formatStatement(statement, {speciallabels = speciallabels, showqualifiers = qualifs, stilltrue = stilltrue})
+
local periodrow = {type = 'row1col', color = '#F9F9F9', value = period }
local period = wikidata.statementDate(statement, dateformat )
+
table.insert(rows, periodrow)
+
end
-- 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
+
if predecessor then
-- TODO gestion de "novalue" et "somevalue"
+
local prederow = {type = 'row', label = 'Prédécesseur', value = function() return predecessor end}
local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'})
+
table.insert(rows, prederow)
local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'})
+
end
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 successor then
if (i == #statements) and prop then
+
local succrow = {type = 'row', label = 'Successeur', value = function() return successor end}
mainstr = wikidata.formatAndCat{value = mainstr, property = prop, entity = item}
+
table.insert(rows, succrow)
end
 
 
local row = {type = 'row', label = period or '', value = function() return mainstr end}
 
table.insert(rows, row)
 
 
end
 
end
-- ajout de rétrolien, cat
+
return {type = 'multi', rows = rows}
return rows
 
 
end
 
end
  
  
local function timeline2(statements, prop) -- affiche date : événement (suppose les événements déjà triés)
+
local function format3(event, period, predecessor, successor, displayformat, details)
if not statements then
+
if details then
return nil
+
details = '<span style="font-weight:normal">' .. details .. '</span>'
 +
event = linguistic.conj({event, details}, "new line")
 +
end
 +
local mainrow =  {type = 'row1col', color = 'secondcolor', value = event }
 +
if period then
 +
period = '<span style="font-weight:normal">' .. period .. '</span>'
 
end
 
end
local rows = {}
+
local periodrow = {type = 'row1col', color = '#F9F9F9', value = period }
+
local successionrow = {
local speciallabels = genderedlabels
+
style = {['background-color'] = '#E1E1E1', ['padding-bottom'] = '2%'},
local dateformat = {precision = 'year', linktopic = '-'}
+
type = 'navbox',
-- qualificatifs à afficher "de", circonscription, diocèse, assemblée délibérante, parti, employeur
+
inner = true,
local qualifs =  {'P642', 'P768', 'P708', 'P194', 'P102', 'P108'}
+
previousval = function() return predecessor end,
+
nextval = function() return successor end,
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
+
return {type = 'multi', rows = {mainrow, periodrow, successionrow}}
-- ajout de rétrolien, cat
 
return rows
 
 
end
 
end
  
  
 +
local function timeline(localparam, wdconf, timelineformat, title, singtitle, details) -- affiche date : événement (suppose les événements déjà triés)
 +
local rows = {}
 +
local function returnTable()
 +
return {
 +
type = "table",
 +
title = title,
 +
rows = rows
 +
}
 +
end
 +
 +
-- avec données locales
 +
local val = localdata[localparam]
 +
if val == '-' then
 +
return nil
 +
elseif val then
 +
table.insert(rows, {type = 'row1col', color = 'secondcolor', value = val})
 +
return returnTable()
 +
end
 +
-- avec données wikidata
 +
if not wdconf then
 +
return nil
 +
end
 +
 +
wdconf.entity = wdconf.entity or item
 +
wdconf.sorttype = wdconf.sorttype or "chronological"
 +
wdconf.labelformat = wdconf.labelformat  or function(id) return genderedlabel(id) end
 +
wdconf.linktopic = wdconf.linktopic or "-"
 +
wdconf.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)
  
local function timeline3(statements, prop, color) -- affiche date : événement (suppose les événements déjà triés)
+
local statements = wikidata.getClaims(wdconf)
 
if not statements then
 
if not statements then
 
return nil
 
return nil
 
end
 
end
local rows = {}
+
if #statements == 1 then
 +
title = singtitle
 +
end
 +
local displayformats = {
 +
A = format1,
 +
B = format2,
 +
C = format3,
 +
}
 +
local applyformat = displayformats[timelineformat] or displayformats['A']
 
 
local speciallabels = genderedlabels
+
rows = {}
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
 
for i, statement in pairs(statements) do
local mainstr = wikidata.formatStatement(statement, {speciallabels = speciallabels, showqualifiers = qualifs, stilltrue = stilltrue})
+
local event = linguistic.ucfirst(wikidata.formatStatement(statement, wdconf))
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'})
 
local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'})
if predecessor then
+
local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'})
text['before'] = predecessor
+
local period = wikidata.statementDate(statement, wdconf )
 +
local detailstr
 +
if type(details) == "function" then
 +
detailstr = details(statement)
 
end
 
end
+
local row = applyformat(event, period, predecessor, successor, wdconf, detailstr)
local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'})
+
if row then
if successor then
+
table.insert(rows, row)
text['after'] = successor
 
 
end
 
end
 
local row3 = {type = 'succession', color = color, value = text }
 
table.insert(rows, row3)
 
 
end
 
end
-- ajout de rétrolien, cat
+
table.insert(rows, {type = "external text", value = function() return wikidata.addtrackingcat(wdconf.property) end})
return rows
+
return returnTable()
 
end
 
end
  
  
 
local function dateandplace(thedate, theplace)
 
local function dateandplace(thedate, theplace)
if thedate then
+
if thedate and theplace and mw.ustring.find(thedate, "inconnu") and mw.ustring.find(theplace, "inconnu") then
i, j = string.find(thedate, 'inconnu')
+
theplace = nil
if i then
+
thedate =  mw.ustring.gsub(thedate, unknowndatelabel, "Date et lieu inconnus")
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
 +
return linguistic.conj({thedate, theplace}, "new line")
 
end
 
end
  
Ligne 225 : Ligne 239 :
 
function p.mainimage()
 
function p.mainimage()
 
 
-- demande d'illustration que si la personne est née après 1900, sinon c'est souvent impossible à trouver
+
-- demande d'illustration que si la personne est née ou morte après 1900, sinon c'est souvent impossible à trouver
 
local defaultimage = 'Defaut 2.svg'
 
local defaultimage = 'Defaut 2.svg'
local age = wikidata.stringTable{property = 'P569', entity = item, displayformat = 'raw', excludespecial = true}
+
local age = wikidata.stringTable{property = 'P569,P570', entity = item, displayformat = 'raw', excludespecial = true}
  
 
if age then
 
if age then
Ligne 245 : Ligne 259 :
 
{'P1477', 'Nom de naissance', 'Noms de naissance', 'nom de naissance'},
 
{'P1477', 'Nom de naissance', 'Noms de naissance', 'nom de naissance'},
 
{'P1449', 'Surnom', 'Surnoms', 'surnom'},
 
{'P1449', 'Surnom', 'Surnoms', 'surnom'},
{'P1559', 'Nom dans la langue maternelle', 'Noms dans la langue maternelle', 'nom dans la langue maternelle'},
+
{'P2001', 'Romanisation révisée', 'Romanisation révisée', 'nom de pinceau'},
 +
{'P1942', 'McCune-Reischauer', 'McCune-Reischauer', 'nom de pinceau'},
 
{'P742', 'Pseudonyme', 'Pseudonymes', 'pseudonyme'},
 
{'P742', 'Pseudonyme', 'Pseudonymes', 'pseudonyme'},
 
{'P1782', 'Prénom social', 'Prénoms sociaux', 'prénom social'},
 
{'P1782', 'Prénom social', 'Prénoms sociaux', 'prénom social'},
Ligne 251 : Ligne 266 :
 
{'P1785', 'Nom de temple', 'Noms de temple', 'nom de temple'},
 
{'P1785', 'Nom de temple', 'Noms de temple', 'nom de temple'},
 
{'P1787', 'Nom de pinceau', 'Noms de pinceau', 'nom de pinceau'},
 
{'P1787', 'Nom de pinceau', 'Noms de pinceau', 'nom de pinceau'},
{nil, 'Autres noms', 'autres noms'}
+
{'P428', 'Abréviation en botanique', 'Abréviations en botanique', 'abréviation en botanique'},
 +
{'P835', 'Abréviation', 'Abréviations', 'abréviation'},
 +
{nil, 'Autres noms', 'Autres noms', 'autres noms'},
 
}
 
}
  
local rows = {type = 'multi', rows = {}}
+
local birthnamerow = { -- un peu particulier, donc à part
 +
type = "row",
 +
wikidata  = function()
 +
local s = wikidata.formatAndCat{entity = item, property = "P1559"}
 +
if (not s) then
 +
return nil
 +
end
 +
-- regarde si le nom de la valeur ressemble au libellé (en tenant compte de la pollution des marqueures de langue
 +
local label = mw.ustring.lower(wikidata.getLabel(item) or "")
 +
local useless
 +
if mw.ustring.find(mw.ustring.lower(s), mw.ustring.lower(label), 0, true) then
 +
useless = true
 +
end
 +
if useless then
 +
return nil
 +
end
 +
return s
 +
end,
 +
label = 'Nom dans la langue maternelle',
 +
plurallabel = 'Noms dans la langue maternelle',
 +
value = 'nom dans la langue maternelle',
 +
}
 +
 +
local rows = {type = "multi", rows = {birthnamerow}}
 
for i, j in pairs(names) do
 
for i, j in pairs(names) do
 
local query
 
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
 
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 />'}
+
query = {property = j[1], showqualifiers = {'P1721'}, conjtype = 'new line'}
 
end
 
end
 
table.insert(rows.rows, {type = 'row', value = j[4], wikidata = query, label = j[2], plurallabel = j[3]})
 
table.insert(rows.rows, {type = 'row', value = j[4], wikidata = query, label = j[2], plurallabel = j[3]})
Ligne 273 : Ligne 313 :
 
function()
 
function()
 
local thedate = datemodule.dateInfobox{args = {[1] = 'naissance', [2] = birthdate or '', [3] = deathdate or '', qualificatif = linktopic}}
 
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 '})
+
local theplace = localdata['lieu de naissance'] or wikidata.formatAndCat({entity =item, property= 'P19', rank = 'best', conjtype= ' ou ', unknownlabel = "lieu inconnu"})
 
return dateandplace(thedate, theplace)
 
return dateandplace(thedate, theplace)
 
end
 
end
Ligne 280 : Ligne 320 :
  
 
function p.death() -- même fonctionnement que la fonction p.birth
 
function p.death() -- même fonctionnement que la fonction p.birth
 +
 +
local label = "Décès"
 +
 +
local val
 +
local thedate, theplace
 +
local disparitiondate, deathdate
 +
 +
-- date
 +
--- récup données locales
 +
disparitiondate = localdata["disparition"]
 +
deathdate = localdata['décès'] or localdata['date de décès']
 +
 +
--- récup Wikidata
 +
if not (disparitiondate or deathdate) then
 +
disparitiondate =  wikidata.formatAndCat{entity = item, property = "P746", rank = 'best', conjtype= ' ou '}
 +
if not disparitiondate then
 +
deathdate =  wikidatadate('P570', {unknownlabel = unknowndatelabel })
 +
end
 +
end
 +
 +
--- mise en forme
 +
thedate = datemodule.dateInfobox{args = {[1] = 'mort', [2] = birthdate or '', [3] = deathdate or disparitiondate or '', qualificatif = linktopic, unknownlabel = "date inconnue"}}
 +
 +
-- lieu
 +
theplace = localdata["lieu de décès"] or wikidata.formatAndCat{entity = item, property= 'P20', rank = 'best', conjtype= ' ou ', unknownlabel = "lieu inconnu"}
 +
 +
 +
-- Adaptations si on a la date de disparition à la place de la date de décès
 +
if disparitiondate then
 +
if theplace then -- cas un peu bizarre et pas très logique, ne vaut pas trop la peine d'un affichage plus élaboré
 +
disparitiondate = "Date de disparition : " .. thedate
 +
theplace = "Lieu de décès : " .. theplace
 +
else
 +
label = "Disparition"
 +
end
 +
end
 +
 +
 +
val = dateandplace(thedate, theplace)
 +
 
return {
 
return {
 
type = 'row',
 
type = 'row',
label = 'Décès',
+
label = label,
value =  
+
value = function() return val end,
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
 
end
Ligne 297 : Ligne 372 :
 
label = 'Période d’activité',
 
label = 'Période d’activité',
 
value = "Période d'activité",
 
value = "Période d'activité",
wikidata = function() return wikidatadate('P1317') end
+
wikidata = function()  
 +
local startDate = wikidata.formatStatements{entity = item, property = "P2031", conjtype = "or", sorttype = "chronological"}
 +
local endDate = wikidata.formatStatements{entity = item, property = "P2032", conjtype = "or", sorttype = "chronological"}
 +
if not (startDate or endDate) then
 +
return wikidatadate('P1317')
 +
end
 +
return complexdate.daterange(startDate, endDate, {precision = 11})
 +
end
 
}
 
}
 
end
 
end
  
 
function p.placeofburial()
 
function p.placeofburial()
local title = 'Lieu d\'enterrement'
 
 
return
 
return
{type = 'row', label = 'Lieu d\'enterrement', value = 'lieu d\'enterrement', property = 'P119'}
+
{type = 'row', label = "Sépulture", value = "sépulture", property = 'P119'}
 
end
 
end
  
 
function p.nationality()  
 
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
+
-- à améliorer étant donnée les moeurs Wikidata comme nationalité : Empire allemand (1901-1918)  République de Weimar (1918-1933)
 
 
local function wdDate()
 
local function wdDate()
 
local nation = require "Module:Country data".nationality
 
local nation = require "Module:Country data".nationality
local statements = wikidata.getClaims{entity = item, property = 'P27'}
+
if not statements then
+
-- désactivation si date de naissance avant l'Ère contemporaine : trop d'imprécisions et d'anachronismes
 +
local mindate = '1789'
 +
 +
local birthdate = wikidata.formatStatements{entity = item, property = 'P569', displayformat = 'raw', numval = 1}
 +
if (not birthdate) or complexdate.before(mindate, birthdate) then
 
return nil
 
return nil
 
end
 
end
return wikidata.formatAndCat{
+
 +
return {
 
property = 'P27',
 
property = 'P27',
vals = statements,
+
-- vals = statements, -- statments est une variable non déclarée dans ce module
 
showdate = true,
 
showdate = true,
 
entity = item,
 
entity = item,
Ligne 327 : Ligne 412 :
 
displayformat =  
 
displayformat =  
 
function(snak)
 
function(snak)
-- local g = gender -- ne sert plus: ici au féminin comme Nationalité
+
local g = gender -- genre de la personne, pour affichage du gentilé
-- if g == '?' then -- si inconnu, au féminin comme Nationalité
+
if g == '?' then -- si inconnu, au masculin
-- g = 'f'
+
g = 'm'
-- end
+
end
local val, success = nation(wikidata.getid(snak), 'f')
+
local val, success = nation(wikidata.getid(snak), g)
 
if not success then
 
if not success then
 
val = wikidata.formatSnak(snak)
 
val = wikidata.formatSnak(snak)
Ligne 337 : Ligne 422 :
 
return val
 
return val
 
end
 
end
}, #statements
+
}
 
end
 
end
 
 
Ligne 345 : Ligne 430 :
 
plurallabel = 'Nationalités',
 
plurallabel = 'Nationalités',
 
value = 'nationalité',
 
value = 'nationalité',
wikidata = function() return wdDate() end
+
wikidata = wdDate() -- wdDate() retourne une table
 
}
 
}
  
 
end
 
end
 
 
function p.nativelanguage()
 
function p.nativelanguage()
 
return
 
return
Ligne 358 : Ligne 442 :
 
function p.places()
 
function p.places()
 
return {type = 'multi', rows = {
 
return {type = 'multi', rows = {
 +
{
 +
type = 'row',
 +
label = 'Dème',
 +
plurallabel = 'Dèmes',
 +
value = 'dème',
 +
wikidata = {property = 'P2462', showdate = true, sorttype= 'chronological', precision = 'year'},
 +
},
 
{
 
{
 
type = 'row',
 
type = 'row',
Ligne 377 : Ligne 468 :
 
-- parcours professionel
 
-- parcours professionel
 
function p.education() -- à améliorer
 
function p.education() -- à améliorer
local query = {sorttype= 'chronological', property = 'P69', showdate = true, showqualifiers = 'P512', conjtype = '<br />', linktopic = '-'}
+
local query = {sorttype= 'chronological', property = 'P69', showdate = true, showqualifiers = 'P512', conjtype = 'new line', linktopic = '-'}
 
return {
 
return {
 
type = 'row',
 
type = 'row',
Ligne 392 : Ligne 483 :
 
wikidata = {
 
wikidata = {
 
property = 'P106',
 
property = 'P106',
showdate = true,
+
defaultlink = '-',
conjtype = 'comma',
+
defaultlinkquery = {property = 'P425'},
excludevalues = {
+
labelformat = function(id) return genderedlabel(id) end,
 +
speciallabels = occupationlabels,
 +
excludevalues = { -- les occupations qui ne méritent pas d'être affichées
 
'Q482980', -- auteur
 
'Q482980', -- auteur
'Q15980158' -- auteur de non-fiction
+
--'Q15980158', "auteur de non-fiction" a depuis été traduit par "essayiste"
},
+
'Q18814623', -- autobiographe
speciallabels = genderedlabels,
+
'Q948329', -- acteur de genre
defaultlink = '-',
+
'Q1209498', -- juriste-poète
},  
+
}
 +
},
 
label = 'Activité',
 
label = 'Activité',
 
plurallabel = 'Activités'
 
plurallabel = 'Activités'
Ligne 416 : Ligne 510 :
  
 
function p.victories()  
 
function p.victories()  
local title = 'Victoires'
+
local title, singtitle = "Victoires", "Victoire"
local singtitle = 'Victoire'
+
local localparam = "victoire"
 +
local wdconf = {property = 'P2522'}
 +
local displayformat = "B"
 
 
local rows
+
return timeline(localparam, wdconf, displayformat, title, singtitle)
if localdata['victoire'] then
+
end
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()  
 
function p.officialposition()  
local title = 'Fonctions'
+
local title, singtitle = "Fonctions", "Fonction"
local singtitle = 'Fonction'
+
local localparam = "fonction"
 +
local wdconf =  {
 +
property = 'P39',
 +
rank = 'valid',
 +
sorttype = 'inverted',
 +
speciallabels = occupationlabels,
 +
defaultlinkquery =  {property = {'P2354', 'P2389', 'P453', 'P361', 'P108'}}, -- liens par défaut : liste, puise organisme dirigé, "membre de", "partie de", employeur
 +
}
 +
-- sur une ligne séparée : juridiction, "de", circonsription, diocèse, affiliation, assemblée, parti, emmloyeur
 +
local details = function(statement) return wikidata.getFormattedQualifiers(statement, {'P1001', 'P642', 'P768', 'P708', 'P1416', 'P194', 'P102', 'P108', 'P937'}) end
 +
local displayformat = "C"
 
 
local rows
+
return timeline(localparam, wdconf, displayformat, title, singtitle, details)
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
 
end
  
 
function p.nobilitytitle()  
 
function p.nobilitytitle()  
local title = 'Titres'
+
local title, singtitle = "Titres de noblesse", "Titre de noblesse"
local singtitle = 'Titre'
+
local localparam = "titre de noblesse"
 +
local wdconf = {
 +
property = 'P97',
 +
entity = item, rank = 'valid',
 +
showqualifiers =  {'P642'},
 +
defaultlinkquery =  {property = {'P2354', 'P361'}}, -- liens par défaut : liste, puise organisme dirigé, "membre de" et "partie de"
 +
}
 +
local displayformat = "B"
 
 
local rows
+
return timeline(localparam, wdconf, displayformat, title, singtitle)
if localdata['titre'] then
+
end
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()  
 
function p.honorifictitle()  
local title = 'Titres'
+
local title, singtitle = "Titres honorifiques", "Titre honorifique"
local singtitle = 'Titre'
+
local localparam = "titre honorifique"
 +
local wdconf = {property = 'P511', entity = item, rank = 'valid'}
 +
local displayformat = "C"
 
 
local rows
+
return timeline(localparam, wdconf, displayformat, title, singtitle)
if localdata['titre'] then
+
end
return {type = 'table', rows = {
+
 
{type = 'row', label = title, value = 'titre'}
+
function p.tombe()
}
+
return {
 +
type = 'images',
 +
imageparameters =  {'tombe'},
 +
defaultimages = nil,
 +
defaultupright = 0.7,
 +
uprightparameter = 'upright tombe',
 +
sizeparameter = 'taille tombe', -- obsolète
 +
captionparameter = 'légende tombe',
 +
defaultcaption = 'sépulture',
 +
property = 'P1442',
 +
numval = 1,
 
}
 
}
else
+
end
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,
 
}
 
  
 +
function p.plaque()
 +
return {
 +
type = 'images',
 +
imageparameters =  {'plaque'},
 +
defaultimages = nil,
 +
defaultupright = 0.7,
 +
uprightparameter = 'upright plaque',
 +
sizeparameter = 'taille plaque', -- obsolète
 +
captionparameter = 'légende plaque',
 +
defaultcaption = 'plaque commémorative',
 +
property = 'P1801',
 +
numval = 1,
 +
}
 
end
 
end
  
Ligne 536 : Ligne 595 :
 
imageparameters =  {'blason'},
 
imageparameters =  {'blason'},
 
defaultimages = nil,
 
defaultimages = nil,
defaultsize = '150px',
+
defaultupright = 0.7,
sizeparameter = 'taille blason',
+
uprightparameter = 'upright blason',
captionparameter = 'legende blason',
+
sizeparameter = 'taille blason', -- obsolète
defaultcaption = '',
+
captionparameter = 'légende blason',
 +
defaultcaption = 'blason',
 
property = 'P94',
 
property = 'P94',
 +
numval = 1,
 +
}
 +
end
 +
 +
function p.sceau()
 +
return {
 +
type = 'images',
 +
imageparameters =  {'sceau'},
 +
defaultimages = nil,
 +
defaultupright = 0.7,
 +
uprightparameter = 'upright sceau',
 +
sizeparameter = 'taille sceau', -- obsolète
 +
captionparameter = 'légende sceau',
 +
defaultcaption = 'sceau',
 +
property = 'P158',
 +
numval = 1,
 +
}
 +
end
 +
 +
function p.monogram()
 +
return {
 +
type = 'images',
 +
imageparameters =  {'monogramme'},
 +
defaultimages = nil,
 +
defaultsize = '100px',
 +
sizeparameter = 'taille monogramme',
 +
captionparameter = 'légende monogramme',
 +
defaultcaption = 'Monogramme',
 +
property = 'P1543',
 
numval = 1,
 
numval = 1,
 
}
 
}
Ligne 552 : Ligne 641 :
 
defaultsize = '150px',
 
defaultsize = '150px',
 
sizeparameter = 'taille drapeau',
 
sizeparameter = 'taille drapeau',
captionparameter = 'legende drapeau',
+
captionparameter = 'légende drapeau',
 
defaultcaption = 'Drapeau',
 
defaultcaption = 'Drapeau',
 
property = 'P41',
 
property = 'P41',
 +
numval = 1,
 +
}
 +
end
 +
 +
function p.logo()
 +
return {
 +
type = 'images',
 +
imageparameters =  {'logo'},
 +
defaultimages = nil,
 +
defaultsize = '150px',
 +
sizeparameter = 'taille logo',
 +
captionparameter = 'légende logo',
 +
defaultcaption = 'Marque ou logotype',
 +
property = 'P154',
 
numval = 1,
 
numval = 1,
 
}
 
}
Ligne 565 : Ligne 668 :
 
label = 'Parti politique',
 
label = 'Parti politique',
 
plurallabel = 'Partis politiques',
 
plurallabel = 'Partis politiques',
wikidata = { property = 'P102', sorttype= 'chronological', showdate = true, conjtype = '<br />', excludespecial = true},  
+
wikidata = { property = 'P102', sorttype= 'chronological', showdate = true, conjtype = 'new line', excludespecial = true},  
 
}
 
}
 
end
 
end
  
 
function p.memberof()
 
function p.memberof()
return {
+
return {type = 'multi', rows = {
type = 'row',  
+
{
label = 'Membre de',  
+
type = 'row',
value = 'membre de',  
+
value = 'ordre de chevalerie',
wikidata = {property = 'P463', sorttype= 'chronological', showdate = true, precision = 'year'},
+
label = 'Ordre de chevalerie',
}
+
plurallabel = 'Ordres de chevalerie',
 +
wikidata = {property = 'P550', sorttype= 'chronological', showdate = true},
 +
},
 +
{
 +
type = 'row',  
 +
label = 'Membre de',  
 +
value = 'membre de',  
 +
wikidata = {property = 'P463', sorttype= 'chronological', showdate = true, precision = 'year'},
 +
},
 +
}}
 
end
 
end
  
function p.awards() -- à améliorer
+
function p.awards()
 
 
local function awardsList(item)
+
local function awardsList()
local majorlist = require "Module:Dictionnaire Wikidata/Distinctions"
+
local majorawards = require "Module:Dictionnaire Wikidata/Distinctions"
 +
local query = {
 +
entity = item,
 +
property= 'P166',
 +
sorttype= 'chronological',
 +
grouped = true,
 +
showqualifiers = 'P642',
 +
showdate= true,
 +
precision = 'year',
 +
conjtype = 'new line',
 +
textformat = 'minimum',
 +
linktopic = '-',
 +
defaultlinkquery = {property = {'P2354', 'P361'}},
 +
excludevalues = 'Q15631401', -- membre de la Royal Society, redondance avec le champ « membre de » (P463)
 +
speciallabels = majorawards,
 +
labelformat = function(id) return genderedlabel(id) end,
 +
}
 +
local claims = wikidata.getClaims(query)
 +
if (not claims) then
 +
return nil
 +
end
 +
local str = wikidata.formatAndCat(query)
 +
if #claims < 4 then
 +
return str, #claims
 +
end
  
local query = {
+
--si trop de valeurs, n'afficher que les importantes de [[Module:Dictionnaire Wikidata/Distinctions]], et mettre les autrs dans un menu pliant
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
+
--- récupération des importantes
local all = {}  
+
local majorStr
local message = "Liste détaillée"
+
local targetvalues = {}
 +
for i, j in pairs(majorawards) do
 +
table.insert(targetvalues, i)
 +
end
 +
query.targetvalue = targetvalues
 +
query.value, query.claims, query.valuetable = nil, nil, nil -- apparemment sinon ce n'est pas le cas, pourquoi ? BUG IMPORTANT
 +
majorStr = wikidata.formatAndCat(query)
  
local claims = wikidata.getClaims(query)
+
--- repliage des autres
if not claims then
+
local message = "'''Liste détaillée'''"
return nil
+
local allAwardsTable = mw.html.create('div')  
end
+
:addClass("toccolours mw-collapsible mw-collapsed")
+
:wikitext(message)
if #claims < 3 then
+
:css{border = "none"}
query.claims = claims
+
:tag('div')
return wikidata.formatAndCat(query), #claims
+
:addClass("mw-collapsible-content")
end
+
:css{['line-height'] = '150%'} -- sinon c'est vraiment serré
+
:wikitext( str)
-- formate la liste des statements, en met certaine dans les "major"
+
:done()
for i, j in pairs(claims) do
+
:allDone()
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
+
return linguistic.conj({majorStr, tostring(allAwardsTable)}, "<br />"), #claims
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
 
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 {
 
return {
 
type = 'row',  
 
type = 'row',  
 
value = {'prix', 'récompenses', 'distinction', 'distinctions'},
 
value = {'prix', 'récompenses', 'distinction', 'distinctions'},
label = 'Distinction',
+
label = 'Distinctions',
plurallabel = 'Distinctions',
+
singularlabel = 'Distinction',
wikidata = function() return awardsList(item) end
+
wikidata = function() return awardsList() end
 
}
 
}
 
end
 
end
Ligne 659 : Ligne 761 :
 
type = 'row',
 
type = 'row',
 
label =  
 
label =  
function(localdata, item)  
+
function(localdata, item)
if not gender then setgender(localdata, item) end
 
 
if gender == 'f' then
 
if gender == 'f' then
 
return 'Influencée par'
 
return 'Influencée par'
Ligne 679 : Ligne 780 :
 
label = 'A influencé',
 
label = 'A influencé',
 
value = {'a influencé', 'influence de'},
 
value = {'a influencé', 'influence de'},
wikidata = {property = 'P738'},
 
 
}
 
}
 
end
 
end
Ligne 686 : Ligne 786 :
 
function p.movement()
 
function p.movement()
 
return
 
return
{type = 'row', label = 'Mouvement', value = 'mouvement', wikidata = {property = 'P135', sorttype= 'chronological', showdate = true, precision = 'year'},
+
{
 +
type = 'row',
 +
label = 'Mouvement',
 +
value = 'mouvement',
 +
wikidata = {property = 'P135', sorttype= 'chronological', showdate = true, precision = 'year'},
 
}
 
}
 +
end
 +
 +
-- Religion
 +
function p.religion()
 +
return {type = 'multi', rows = {
 +
{
 +
type = 'row',
 +
label = 'Religion',
 +
plurallabel = 'Religions',
 +
value = 'religion',
 +
wikidata = {property = 'P140', sorttype= 'chronological', showdate = true, precision = 'year', excludevalues = 'Q7066'},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Date de baptême',
 +
value = 'date de baptême',
 +
property = 'P1636',
 +
},
 +
{
 +
type = 'row',
 +
label = 'Parrain',
 +
plurallabel = 'Parrains',
 +
value = 'parrain',
 +
property = 'P1290',
 +
},
 +
{
 +
type = 'row',
 +
label = 'Nom en religion',
 +
plurallabel = 'Noms en religion',
 +
value = 'nom en religion',
 +
property = 'P1635',
 +
},
 +
{
 +
type = 'row',
 +
label = 'Ordre religieux',
 +
plurallabel = 'Ordres religieux',
 +
value = 'ordre religieux',
 +
property = 'P611',
 +
},
 +
{
 +
type = 'row',
 +
label = 'Consécrateur',
 +
plurallabel = 'Consécrateurs',
 +
value = 'consécrateur',
 +
property = 'P1598',
 +
},
 +
{
 +
type = 'row',
 +
label =
 +
function(localdata, item)
 +
if gender == 'f' then
 +
return 'Vénérée par'
 +
elseif gender == 'm' then
 +
return 'Vénéré par'
 +
else
 +
return 'Vénéré(e) par'
 +
end
 +
end,
 +
value = 'vénéré par',
 +
property = 'P1049',
 +
},
 +
{
 +
type = 'row',
 +
label = 'Étape de canonisation',
 +
value = 'étape de canonisation',
 +
wikidata = {
 +
property = 'P411',
 +
labelformat = function(id) return genderedlabel(id) end,
 +
},
 +
},
 +
}}
 
end
 
end
  
Ligne 705 : Ligne 880 :
 
plurallabel = 'Grades militaires',
 
plurallabel = 'Grades militaires',
 
value = 'grade militaire',
 
value = 'grade militaire',
wikidata = {property = 'P410', showdate = true, sorttype= 'chronological', precision = 'year'},
+
wikidata = {property = 'P410', showdate = true, sorttype= 'chronological', precision = 'year', speciallabels = militaryranks, conjtype ='new line'},
 
},
 
},
 
{
 
{
Ligne 713 : Ligne 888 :
 
value = 'conflit',
 
value = 'conflit',
 
wikidata = {property = 'P607', showdate = true, sorttype= 'chronological', precision = 'year'},
 
wikidata = {property = 'P607', showdate = true, sorttype= 'chronological', precision = 'year'},
 +
},
 +
}}
 +
end
 +
 +
-- Carrière de torero
 +
function p.torero()
 +
return {type = 'multi', rows = {
 +
{
 +
type = "row",
 +
label = "Alternative",
 +
value = "alternative",
 +
wikidata = function() return wikidata.keyDate("Q2840411", item) end
 +
},
 +
{
 +
type = "row",
 +
label = "Confirmation d'alternative",
 +
value = "confirmation alt",
 +
wikidata = function() return wikidata.keyDate("Q23308805", item) end
 
},
 
},
 
}}
 
}}
Ligne 722 : Ligne 915 :
 
{
 
{
 
type = 'row',
 
type = 'row',
label = 'Sport',
+
label = 'Spécialité',
plurallabel = 'Sports',
+
plurallabel = 'Spécialités',
value = 'sport',
+
value = 'spécialité',
wikidata = {property = 'P641', showdate = true},
+
wikidata = {property = 'P413',
 +
labelformat = function(id) return genderedlabel(id) end,
 +
},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Discipline sportive',
 +
plurallabel = 'Disciplines sportives',
 +
value = 'discipline sportive',
 +
wikidata = {property = 'P2416'},
 
},
 
},
 
{
 
{
 
type = 'row',
 
type = 'row',
label = 'Spécialité',
+
label = 'Prise de raquette',
plurallabel = 'Spécialités',
+
value = 'prise de raquette',
value = 'spécialité',
+
wikidata = {property = 'P741'},
wikidata = {property = 'P413'},
+
},
 +
{
 +
type = 'row',
 +
label = 'Tire de la',
 +
value = 'tire',
 +
wikidata = {property = 'P423'},
 
},
 
},
 
{
 
{
Ligne 739 : Ligne 946 :
 
plurallabel = 'Équipes',
 
plurallabel = 'Équipes',
 
value = 'équipe',
 
value = 'équipe',
wikidata = {property = 'P54', sorttype= 'chronological', showdate = true, precision = 'year', conjtype = '<br />', showqualifiers = {'P1350', 'P1351'}},
+
wikidata = {
 +
property = 'P54',
 +
sorttype= 'chronological',
 +
conjtype = "new line",
 +
statementformat = function(statement)
 +
local str = wikidata.formatStatement(statement, {showdate = true})
 +
local compets = wikidata.getFormattedQualifiers(statement, {"P1350"})
 +
if compets and (tonumber(compets) > 1) then
 +
compets = compets .. " matchs joués"
 +
elseif compets then
 +
compets = compets .. " match joué"
 +
end
 +
local points = wikidata.getFormattedQualifiers(statement, {"P1351"})
 +
if points and (tonumber(points) > 1) then
 +
points = points .. " points marqués"
 +
elseif points then
 +
points = points  .. "point marqué"
 +
end
 +
local qualifiers = linguistic.conj{compets, points}
 +
if qualifiers then
 +
str= str .. " <small> – " .. qualifiers .. " </small>"
 +
end
 +
return str
 +
end
 +
}
 
},
 
},
 
{
 
{
Ligne 745 : Ligne 976 :
 
label = 'Capes internationales',
 
label = 'Capes internationales',
 
value = 'capes',
 
value = 'capes',
wikidata = {property = 'P1129', numval = '1'},
+
wikidata = {property = 'P1129', numval = 1},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Titre aux échecs',
 +
plurallabel = 'Titres aux échecs',
 +
value = 'titre aux échecs',
 +
wikidata = {property = 'P2962', sorttype= 'chronological', showdate = true, precision = 'year'},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Classement Elo',
 +
value = 'classement elo',
 +
wikidata = {property = 'P1087', numval = '3', sorttype = 'inverted', conjtype = 'new line', showdate = true, precision = 'month', removedupes = true},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Record détenu',
 +
plurallabel = 'Records détenus',
 +
value = 'record détenu',
 +
wikidata = {property = 'P1000', sorttype= 'chronological', showdate = true},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Entraîneur',
 +
plurallabel = 'Entraîneurs',
 +
value = 'entraîneur',
 +
wikidata = {property = 'P286', sorttype= 'chronological', showdate = true, precision = 'year'},
 
},
 
},
 
{
 
{
Ligne 769 : Ligne 1 027 :
 
{
 
{
 
type = 'row',
 
type = 'row',
label = 'Maître',
+
label = localdata['intitulé maître'] or 'Maître',
 
plurallabel = 'Maîtres',
 
plurallabel = 'Maîtres',
 
value = {'maître', 'maîtres'},
 
value = {'maître', 'maîtres'},
Ligne 786 : Ligne 1 044 :
 
label =  
 
label =  
 
function(localdata, item)  
 
function(localdata, item)  
if not gender then setgender(localdata, item) end
 
 
if gender == 'f' then
 
if gender == 'f' then
 
return 'Représentée par'
 
return 'Représentée par'
Ligne 810 : Ligne 1 067 :
 
plurallabel = 'Élèves',
 
plurallabel = 'Élèves',
 
value = {'élève', 'élèves'},
 
value = {'élève', 'élèves'},
wikidata = {property = 'P802', sorttype= 'chronological', showdate = true, precision = 'year', numval = '5'},
+
wikidata = {property = 'P802', sorttype= 'chronological', showdate = true, precision = 'year', numval = 5},
 
},
 
},
 
{
 
{
Ligne 817 : Ligne 1 074 :
 
plurallabel = 'Étudiants de thèse',
 
plurallabel = 'Étudiants de thèse',
 
value = 'étudiant de thèse',
 
value = 'étudiant de thèse',
wikidata = {property = 'P185', sorttype= 'chronological', showdate = true, precision = 'year', numval = '5'},
+
wikidata = {property = 'P185', sorttype= 'chronological', showdate = true, precision = 'year', numval = 5},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Personne liée',
 +
plurallabel = 'Personnes liées',
 +
value = 'personne liée',
 +
wikidata = {property = 'P3342', numval = 5, showqualifiers = 'P794'},
 
},
 
},
 
}}
 
}}
Ligne 826 : Ligne 1 090 :
 
return {
 
return {
 
type = 'row',  
 
type = 'row',  
label = '[[Mécénat|Mécènes]]', singularlabel = '[[Mécénat|Mécène]]', plurallabel = '[[Mécénat|Mécènes]]',  
+
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',  
 
value = 'mécènes',  
 
wikidata = {property = 'P1962', showdate = true, sorttype = 'chronological', conjtype = 'comma'},
 
wikidata = {property = 'P1962', showdate = true, sorttype = 'chronological', conjtype = 'comma'},
Ligne 860 : Ligne 1 126 :
 
value = 'label',
 
value = 'label',
 
wikidata = {property = 'P264', sorttype= 'chronological', showdate = true, precision = 'year'},
 
wikidata = {property = 'P264', sorttype= 'chronological', showdate = true, precision = 'year'},
 +
},
 +
}}
 +
end
 +
 +
-- Victimes
 +
function p.victims()
 +
return {type = 'multi', rows = {
 +
{
 +
type = 'row',
 +
label = 'Victimes',
 +
value = 'victimes',
 +
wikidata = {property = 'P1345'},
 +
},
 +
}}
 +
end
 +
 +
-- Condamnations
 +
function p.penalties()
 +
return {type = 'multi', rows = {
 +
{
 +
type = 'row',
 +
label =
 +
function(localdata, item)
 +
if gender == 'f' then
 +
return 'Condamnée pour'
 +
elseif gender == 'm' then
 +
return 'Condamné pour'
 +
else
 +
return 'Condamné(e) pour'
 +
end
 +
end,
 +
value = 'condamné pour',
 +
wikidata = {property = 'P1399', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Condamnation',
 +
plurallabel = 'Condamnations',
 +
value = 'condamnation',
 +
wikidata = {property = 'P1596', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Lieu de détention',
 +
plurallabel = 'Lieux de détention',
 +
value = 'lieu de détention',
 +
wikidata = {property = 'P2632', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'},
 
},
 
},
 
}}
 
}}
Ligne 871 : Ligne 1 184 :
 
label = 'Taille',
 
label = 'Taille',
 
value = 'taille',
 
value = 'taille',
wikidata = {property = 'P2048'},
+
wikidata = {property = 'P2048', targetunit = 'metre', rounding = '2'},
 
},
 
},
 
{
 
{
Ligne 877 : Ligne 1 190 :
 
label = 'Poids',
 
label = 'Poids',
 
value = 'poids',
 
value = 'poids',
wikidata = {property = 'P2067'},
+
wikidata = {property = 'P2067', targetunit = 'kilogram', rounding = '1'},
 
},
 
},
 
{
 
{
Ligne 908 : Ligne 1 221 :
 
label = 'Père',  
 
label = 'Père',  
 
value = 'père',
 
value = 'père',
property = 'P22',
+
wikidata = {property = 'P22', conjtype = ' ou '},
 
},
 
},
 
{
 
{
Ligne 914 : Ligne 1 227 :
 
label = 'Mère',
 
label = 'Mère',
 
value = 'mère',
 
value = 'mère',
property = 'P25',
+
wikidata = {property = 'P25', conjtype = ' ou '},
 
},
 
},
 
{
 
{
 
type = 'row',
 
type = 'row',
label = function()
+
label = 'Beau-parent',
-- retourne une forme singulière ou plurielle.
+
plurallabel = 'Beaux-parents',
local claims = wikidata.getClaims{property = 'P7', entity = item}
+
value = {'beau-parent', 'beau-père', 'belle-mère'},
if (not claims) or #claims == 1 then
+
property = 'P3448',
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',
 
type = 'row',
label = function()
+
label = 'Fratrie',
-- retourne une forme singulière ou plurielle.
+
value = 'fratrie',
local claims = wikidata.getClaims{property = 'P9', entity = item}
+
wikidata = {
if (not claims) or #claims == 1 then
+
property = 'P3373',
return "Sœur"
+
sorttype = 'chronological',
end
+
conjtype = 'new line',
return "Sœurs"
+
textformat = 'long',
end,
+
precision = 'year',
value = 'sœur',
+
stilltrue = (not deathdate),
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',
 
type = 'row',
label = function()
+
label = 'Conjoint', -- todo : adapter le libellé en genre ?
-- retourne une forme singulière ou plurielle. Pourrait éventuellement adapter féminin masculine, mais demanderait logiquement de vérifier le sexe de chaque valeur
+
plurallabel = 'Conjoints',
local claims = wikidata.getClaims{property = 'P26', entity = item}
 
if (not claims) or #claims == 1 then
 
return "Conjoint"
 
end
 
return "Conjoints"
 
end,
 
 
value = 'conjoint',
 
value = 'conjoint',
wikidata = function()
+
wikidata = {
local claims = wikidata.getClaims{entity = item, property = 'P26', sorttype = 'chronological'}
+
property = 'P26',
if not claims then
+
showdate = true,
return nil
+
sorttype = 'chronological',
end
+
conjtype = 'new line',
local conjtype, textformat = '<br />', 'long'
+
textformat = 'long',
if #claims > 4 then
+
precision = 'year',
conjtype, textformat = 'comma', 'minimum'
+
stilltrue = (not deathdate),
end
+
precision = 'year',
return wikidata.formatAndCat{entity = item, property = 'P26', showdate = true, textformat = textformat, precision = 'year', linktopic = '-', conjtype = conjtype, stilltrue = (not deathdate)}
+
}
end
 
 
},
 
},
 
{
 
{
 
type = 'row',
 
type = 'row',
label = function()
+
label = localdata['intitulé enfant'] or 'Enfant',-- todo : adapter le libellé en genre ?
-- retourne une forme singulière ou plurielle.
+
plurallabel = 'Enfants',
local claims = wikidata.getClaims{property = 'P40', entity = item}
+
value = 'enfant',
if (not claims) or #claims == 1 then
+
wikidata = {
return "Enfant"
+
property = 'P40',
 +
sorttype = 'chronological',
 +
conjtype = 'new line',
 +
textformat = 'long',
 +
precision = 'year',
 +
stilltrue = (not deathdate),
 +
precision = 'year',
 +
}
 +
},
 +
{
 +
type = 'row',
 +
label = 'Parentèle',
 +
value = 'parentèle',
 +
wikidata = {
 +
property = 'P1038',
 +
excludespecial = true,
 +
conjtype = 'new line',
 +
statementformat = function(statement)
 +
local personid = wikidata.getmainid(statement)
 +
local personlabel = wikidata.formatEntity(personid)
 +
local persongender = getgender(personid)
 +
local kintype = wikidata.getFormattedQualifiers(
 +
statement,
 +
"P1039",
 +
{
 +
labelformat = function(id) return genderedlabel(id, persongender) end,
 +
link = "-"
 +
}
 +
)
 +
if kintype then
 +
return personlabel .. " " .. linguistic.inparentheses(kintype)
 
end
 
end
return "Enfants"
+
return personlabel
 
end,
 
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
 
 
},
 
},
 +
}}
 +
end
 +
 +
-- Esclavage
 +
function p.slavery()
 +
return {type = 'multi', rows = {
 
{
 
{
 
type = 'row',
 
type = 'row',
label = 'Parentèle',
+
label = 'Propriétaire',
value = 'parentèle',
+
plurallabels = 'Propriétaires',
wikidata = {property = 'P1038', showqualifiers = {'P1039'}}
+
value = 'propriétaire',
 +
property = 'P127',
 
},
 
},
 
}}
 
}}
Ligne 1 009 : Ligne 1 324 :
  
 
-- Œuvres
 
-- Œuvres
function p.works()
+
function p.works(params)
local title = 'Œuvres réputées'
+
params = params or {}
-- 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
+
local title = params.title or 'Œuvres réputées'
 +
 
 +
local wikidata = {
 +
excludespecial = true,
 +
numval = 5,
 +
property = 'P800',
 +
defaultlink = 'image',
 +
showdate= true,
 +
labelformat = function(id) local label = wikidata.getLabel(id) if label then return '<i>' .. label .. '</i>' end end,
 +
}
 +
 +
for i, j in pairs(params) do
 +
wikidata[i] = j
 +
end
 +
 
return  
 
return  
{type = 'table', title = title, rows =
+
{type = 'table', title = title, singulartitle = singulartitle, rows =
 
{
 
{
 
{
 
{
 
type = 'row',
 
type = 'row',
 
value = 'œuvres principales',
 
value = 'œuvres principales',
wikidata = {
+
wikidata = wikidata
property = 'P800',
 
numval = 5,
 
excludespecial = true,
 
displayformat =
 
function(snak)
 
return '<i>' .. wikidata.formatEntity(wikidata.getid(snak), {defaultlink = 'image'}) .. '</i>'
 
end
 
}
 
 
}
 
}
 
}
 
}
Ligne 1 046 : Ligne 1 367 :
 
-- Signature
 
-- Signature
 
function p.signature(default)
 
function p.signature(default)
 +
local nom = localdata.nom or mw.title.getCurrentTitle().text
 +
local alt = 'signature de ' .. nom
 +
if mw.ustring.match( nom, '^[AEÈÉIOUY]' )  then
 +
alt = "signature d'" .. nom
 +
end
 
return {
 
return {
 
type = 'images',
 
type = 'images',
 
imageparameters =  {'signature'},
 
imageparameters =  {'signature'},
 
defaultimage = default,
 
defaultimage = default,
defaultsize = '150px',
 
 
captionparameter = 'légende signature',
 
captionparameter = 'légende signature',
 
defaultcaption = 'signature',
 
defaultcaption = 'signature',
 +
uprightparameter = 'upright signature',
 +
defaultupright = 0.5,
 +
defaultalt = alt,
 
property = 'P109',
 
property = 'P109',
 
numval = 1
 
numval = 1
 +
}
 +
end
 +
 +
-- Enregistrement vocal
 +
function p.voice()
 +
return {
 +
type     = 'images',
 +
style            = {['padding-top'] = '25px'},--{['border-width'] = '10px', ['border-style'] = 'solid'},
 +
label     = 'Enregistrement vocal',
 +
captionparameter = 'légende voix',
 +
value     = 'voix',
 +
property     = 'P990',
 +
numval          = 1,
 
}
 
}
 
end
 
end

Version actuelle datée du 31 mai 2017 à 13:54

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

-- Functions utilisées par les infobox personnes
local p = {}
local localdata = require( 'Module:Infobox/Localdata' )
local item = localdata.item
local wikidata = require( "Module:Interface Wikidata" ).fromLua
local general = require "Module:Infobox/Fonctions"
local datemodule = require "Module:Date"
local complexdate = require "Module:Date complexe"
local linguistic = require "Module:Linguistique"
local militaryranks = require "Module:Dictionnaire Wikidata/Grades militaires"

--=== Accord en genre

-- établit la variable gender pour l'élément
local function getgender(id)
	local vals = {
		['Q6581072'] = 'f',
		['Q6581097'] = 'm',
		default      = '?'
	}
	local gender = wikidata.formatStatements{entity = id, property = 'P21', displayformat = 'raw'}
	return vals[gender] or vals.default
end

local gender = getgender(item)

-- récupération des libellés spéciaux codés en dur sur Wikipédia (attention : contient à la fois le libellé et le lien)
local occupationlabels = require "Module:Dictionnaire Wikidata/Métiers"[gender]

-- récupération des libellés genrés de Wikidata
local function genderedlabel(id, labelgender)
	local label
	if not labelgender then
		labelgender = gender -- si le genre n'est pas indiqué, c'est celui de la personne dont c'est l'infobox
	end
	if labelgender == 'f' then -- femme : chercher le libellé dans P2521 (libellé féminin)
		label = wikidata.formatStatements{entity = id, property = 'P2521', isinlang = 'fr', numval = 1, ucfirst = '-'}
	elseif labelgender == 'm' then -- homme : chercher le libellé dans P3321 (libellé masculin)
		label = wikidata.formatStatements{entity = id, property = 'P3321', isinlang = 'fr', numval = 1, ucfirst = '-'}
	end
	if not label then
		label = wikidata.getLabel(id)
	end
	return label
end

-- === Gestion des dates

-- Liens thématiques vers les dates
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
	Q11569986 = 'en arts plastiques', -- graveur
	Q13365770 = 'en arts plastiques', -- graveur sur cuivre
	Q21925567 = 'en arts plastiques', -- sérigraphe
	Q10862983 = 'en arts plastiques', -- aquafortiste
}

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

local linktopic = getdatetopic()

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


local function format1(event, period, predecessor, successor, displayformat)
	local mainstr = event
	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
	return {type = 'row', label = period or '', value = function() return mainstr end}
end

-----------------

local function format2(event, period, predecessor, successor, displayformat)
	if (not event) then
		return nil
	end
	
	local rows = {}

	local eventrow = {type = 'row1col', color = 'secondcolor', value = event }
	table.insert(rows, eventrow)

	if period then
		period = '<span style="font-weight:normal">' .. period .. '</span>'
		local periodrow = {type = 'row1col', color = '#F9F9F9', value = period }
		table.insert(rows, periodrow)
	end

	if predecessor then
		local prederow = {type = 'row', label = 'Prédécesseur', value = function() return predecessor end}
		table.insert(rows, prederow)
	end

	if successor then
		local succrow = {type = 'row', label = 'Successeur', value = function() return successor end}
		table.insert(rows, succrow)
	end
	return {type = 'multi', rows = rows}
end


local function format3(event, period, predecessor, successor, displayformat, details)
	if details then
		details = '<span style="font-weight:normal">' .. details .. '</span>'
		event = linguistic.conj({event, details}, "new line")
	end
	local mainrow =  {type = 'row1col', color = 'secondcolor', value = event }
	if period then
		period = '<span style="font-weight:normal">' .. period .. '</span>'
	end
	local periodrow = {type = 'row1col', color = '#F9F9F9', value = period }
	local successionrow = {
		style = {['background-color'] = '#E1E1E1', ['padding-bottom'] = '2%'},
		type = 'navbox',
		inner = true,
		previousval = function() return predecessor end,
		nextval = function() return successor end,
	}

	return {type = 'multi', rows = {mainrow, periodrow, successionrow}}
end


local function timeline(localparam, wdconf, timelineformat, title, singtitle, details) -- affiche date : événement (suppose les événements déjà triés)
	local rows = {}
	local function returnTable()
		return {
			type = "table",
			title = title,
			rows = rows
	}
	end
	
	-- avec données locales
	local val = localdata[localparam]
	if val == '-' then
		return nil
	elseif val then
		table.insert(rows, {type = 'row1col', color = 'secondcolor', value = val})
		return returnTable()
	end
	-- avec données wikidata
	if not wdconf then
		return nil
	end
	
	wdconf.entity = wdconf.entity or item
	wdconf.sorttype = wdconf.sorttype or "chronological"
	wdconf.labelformat = wdconf.labelformat  or function(id) return genderedlabel(id) end
	wdconf.linktopic = wdconf.linktopic or "-"
	wdconf.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)

	local statements = wikidata.getClaims(wdconf)
	if not statements then
		return nil
	end
	if #statements == 1 then
		title = singtitle
	end
	local displayformats = {
		A = format1,
		B = format2,
		C = format3,
	}
	local applyformat = displayformats[timelineformat] or displayformats['A']
	
	rows = {}
	for i, statement in pairs(statements) do
		local event =  linguistic.ucfirst(wikidata.formatStatement(statement, wdconf))
		local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'})
		local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'})
		local period = wikidata.statementDate(statement, wdconf )
		local detailstr		
		if type(details) == "function" then
			detailstr = details(statement)
		end
		local row = applyformat(event, period, predecessor, successor, wdconf, detailstr)
		if row then
			table.insert(rows, row)
		end
	end
	table.insert(rows, {type = "external text", value = function() return wikidata.addtrackingcat(wdconf.property) end})
	return returnTable()
end


local function dateandplace(thedate, theplace)
	if thedate and theplace and mw.ustring.find(thedate, "inconnu") and mw.ustring.find(theplace, "inconnu") then
		theplace = nil
		thedate =  mw.ustring.gsub(thedate, unknowndatelabel, "Date et lieu inconnus")	
	end
	return linguistic.conj({thedate, theplace}, "new line")
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 ou morte après 1900, sinon c'est souvent impossible à trouver
	local defaultimage = 'Defaut 2.svg'
	local age = wikidata.stringTable{property = 'P569,P570', 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'},
		{'P2001', 'Romanisation révisée', 'Romanisation révisée', 'nom de pinceau'},
		{'P1942', 'McCune-Reischauer', 'McCune-Reischauer', 'nom de pinceau'},
		{'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'},
		{'P428', 'Abréviation en botanique', 'Abréviations en botanique', 'abréviation en botanique'},
		{'P835', 'Abréviation', 'Abréviations', 'abréviation'},
		{nil, 'Autres noms', 'Autres noms', 'autres noms'},
	}

	local birthnamerow = { -- un peu particulier, donc à part
		type = "row",
		wikidata  = function()
			local s = wikidata.formatAndCat{entity = item, property = "P1559"}
			if (not s) then
				return nil
			end
			-- regarde si le nom de la valeur ressemble au libellé (en tenant compte de la pollution des marqueures de langue
			local label = mw.ustring.lower(wikidata.getLabel(item) or "")
			local useless
			if mw.ustring.find(mw.ustring.lower(s), mw.ustring.lower(label), 0, true) then
				useless = true
			end
			if useless then
				return nil
			end
			return s		
			end,
		label = 'Nom dans la langue maternelle',
		plurallabel = 'Noms dans la langue maternelle',
		value = 'nom dans la langue maternelle',
	}
	
	local rows = {type = "multi", rows = {birthnamerow}}
	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 = 'new line'}
		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 ', unknownlabel = "lieu inconnu"})
			return dateandplace(thedate, theplace)
			end
	}
end

function p.death() -- même fonctionnement que la fonction p.birth
	
	local label = "Décès"

	local val
	local thedate, theplace
	local disparitiondate, deathdate

	-- date
	--- récup données locales
	disparitiondate = localdata["disparition"]
	deathdate = localdata['décès'] or localdata['date de décès']

	--- récup Wikidata
	if not (disparitiondate or deathdate) then
		disparitiondate =  wikidata.formatAndCat{entity = item, property = "P746", rank = 'best', conjtype= ' ou '}
		if not disparitiondate then
			deathdate =  wikidatadate('P570', {unknownlabel = unknowndatelabel })
		end
	end

	--- mise en forme
	thedate = datemodule.dateInfobox{args = {[1] = 'mort', [2] = birthdate or '', [3] = deathdate or disparitiondate or '', qualificatif = linktopic, unknownlabel = "date inconnue"}}

	-- lieu
	theplace = localdata["lieu de décès"] or wikidata.formatAndCat{entity = item, property= 'P20', rank = 'best', conjtype= ' ou ', unknownlabel = "lieu inconnu"}


	-- Adaptations si on a la date de disparition à la place de la date de décès
	if disparitiondate then
		if theplace then -- cas un peu bizarre et pas très logique, ne vaut pas trop la peine d'un affichage plus élaboré
			disparitiondate = "Date de disparition : " .. thedate
			theplace = "Lieu de décès : " .. theplace
		else
			label = "Disparition"
		end
	end


	val = dateandplace(thedate, theplace)

	return {
		type = 'row',
		label = label,
		value = function() return val end,
	}
end

function p.floruit()
	return {
		type = 'row',
		label = 'Période d’activité',
		value = "Période d'activité",
		wikidata = function() 
			local startDate = wikidata.formatStatements{entity = item, property = "P2031", conjtype = "or", sorttype = "chronological"}
			local endDate = wikidata.formatStatements{entity = item, property = "P2032", conjtype = "or", sorttype = "chronological"}
			if not (startDate or endDate) then
				return wikidatadate('P1317')
			end
			return complexdate.daterange(startDate, endDate, {precision = 11})
			end
	}
end

function p.placeofburial()
	return
		{type = 'row', label = "Sépulture", value = "sépulture", property = 'P119'}
end

function p.nationality() 
	
	-- à améliorer étant donnée les moeurs Wikidata comme nationalité : Empire allemand (1901-1918)  République de Weimar (1918-1933)
	local function wdDate()
		local nation = require "Module:Country data".nationality
		
		-- désactivation si date de naissance avant l'Ère contemporaine : trop d'imprécisions et d'anachronismes
		local mindate = '1789'
		
		local birthdate = wikidata.formatStatements{entity = item, property = 'P569', displayformat = 'raw', numval = 1}
		if (not birthdate) or complexdate.before(mindate, birthdate) then
			return nil
		end
		
		return {
			property = 'P27',
			-- vals = statements, -- statments est une variable non déclarée dans ce module
			showdate = true,
			entity = item,
			conjtype = 'comma',
			removedupes = true,
			linktopic = '-',
			displayformat = 
				function(snak)
					local g = gender -- genre de la personne, pour affichage du gentilé
					if g == '?' then -- si inconnu, au masculin
						g = 'm'
					end
					local val, success = nation(wikidata.getid(snak), g)
					if not success then
						val = wikidata.formatSnak(snak)
					end
					return val
				end
			}
	end
		
	return {
		type = 'row',
		label = 'Nationalité',
		plurallabel = 'Nationalités',
		value = 'nationalité',
		wikidata = wdDate() -- wdDate() retourne une table
	}

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 = 'Dème',
		plurallabel = 'Dèmes',
		value = 'dème',
		wikidata = {property = 'P2462', showdate = true, sorttype= 'chronological', precision = 'year'},
},
{
		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 = 'new line', 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',
			defaultlink = '-',
			defaultlinkquery = {property = 'P425'},
			labelformat = function(id) return genderedlabel(id) end,
			speciallabels = occupationlabels,
			excludevalues = { -- les occupations qui ne méritent pas d'être affichées 
				'Q482980', -- auteur
				--'Q15980158', "auteur de non-fiction" a depuis été traduit par "essayiste"
				'Q18814623', -- autobiographe
				'Q948329', -- acteur de genre
				'Q1209498', -- juriste-poète
			}
		},
		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, singtitle = "Victoires", "Victoire" 
	local localparam = "victoire"
	local wdconf = {property = 'P2522'}
	local displayformat = "B"
	
	return timeline(localparam, wdconf, displayformat, title, singtitle)
end


function p.officialposition() 
	local title, singtitle = "Fonctions", "Fonction"
	local localparam = "fonction"
	local wdconf =  {
		property = 'P39',
		rank = 'valid',
		sorttype = 'inverted',
		speciallabels = occupationlabels,
		defaultlinkquery =  {property = {'P2354', 'P2389', 'P453', 'P361', 'P108'}}, -- liens par défaut : liste, puise organisme dirigé, "membre de", "partie de", employeur
	}
	-- sur une ligne séparée : juridiction, "de", circonsription, diocèse, affiliation, assemblée, parti, emmloyeur
	local details = function(statement) return wikidata.getFormattedQualifiers(statement, {'P1001', 'P642', 'P768', 'P708', 'P1416', 'P194', 'P102', 'P108', 'P937'}) end
	local displayformat = "C"
	
	return timeline(localparam, wdconf, displayformat, title, singtitle, details)
end

function p.nobilitytitle() 
	local title, singtitle = "Titres de noblesse", "Titre de noblesse"
	local localparam = "titre de noblesse"
	local wdconf = {
		property = 'P97', 
		entity = item, rank = 'valid', 
		showqualifiers =  {'P642'},
		defaultlinkquery =  {property = {'P2354', 'P361'}}, -- liens par défaut : liste, puise organisme dirigé, "membre de" et "partie de"
	}
	local displayformat = "B"
	
	return timeline(localparam, wdconf, displayformat, title, singtitle)
end


function p.honorifictitle() 
	local title, singtitle = "Titres honorifiques", "Titre honorifique"
	local localparam = "titre honorifique"
	local wdconf = {property = 'P511', entity = item, rank = 'valid'}
	local displayformat = "C"
	
	return timeline(localparam, wdconf, displayformat, title, singtitle)
end

function p.tombe()
	return {
		type = 'images',
		imageparameters =  {'tombe'},
		defaultimages = nil,
		defaultupright = 0.7,
		uprightparameter = 'upright tombe',
		sizeparameter = 'taille tombe', -- obsolète
		captionparameter = 'légende tombe',
		defaultcaption = 'sépulture',
		property = 'P1442',
		numval = 1,
	}
end

function p.plaque()
	return {
		type = 'images',
		imageparameters =  {'plaque'},
		defaultimages = nil,
		defaultupright = 0.7,
		uprightparameter = 'upright plaque',
		sizeparameter = 'taille plaque', -- obsolète
		captionparameter = 'légende plaque',
		defaultcaption = 'plaque commémorative',
		property = 'P1801',
		numval = 1,
	}
end

function p.blason()
	return {
		type = 'images',
		imageparameters =  {'blason'},
		defaultimages = nil,
		defaultupright = 0.7,
		uprightparameter = 'upright blason',
		sizeparameter = 'taille blason', -- obsolète
		captionparameter = 'légende blason',
		defaultcaption = 'blason',
		property = 'P94',
		numval = 1,
	}
end

function p.sceau()
	return {
		type = 'images',
		imageparameters =  {'sceau'},
		defaultimages = nil,
		defaultupright = 0.7,
		uprightparameter = 'upright sceau',
		sizeparameter = 'taille sceau', -- obsolète
		captionparameter = 'légende sceau',
		defaultcaption = 'sceau',
		property = 'P158',
		numval = 1,
	}
end

function p.monogram()
	return {
		type = 'images',
		imageparameters =  {'monogramme'},
		defaultimages = nil,
		defaultsize = 	'100px',
		sizeparameter = 'taille monogramme',
		captionparameter = 'légende monogramme',
		defaultcaption = 'Monogramme',
		property = 'P1543',
		numval = 1,
	}
end

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

function p.logo()
	return {
		type = 'images',
		imageparameters =  {'logo'},
		defaultimages = nil,
		defaultsize = 	'150px',
		sizeparameter = 'taille logo',
		captionparameter = 'légende logo',
		defaultcaption = 'Marque ou logotype',
		property = 'P154',
		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 = 'new line', excludespecial = true}, 
	}
end

function p.memberof()
	return {type = 'multi', rows = {
{
	type = 'row', 
	value = 'ordre de chevalerie',
	label = 'Ordre de chevalerie',
	plurallabel = 'Ordres de chevalerie',
	wikidata = {property = 'P550', sorttype= 'chronological', showdate = true}, 
},
{
	type = 'row', 
	label = 'Membre de', 
	value = 'membre de', 
	wikidata = {property = 'P463', sorttype= 'chronological', showdate = true, precision = 'year'},
},
	}}
end

function p.awards()
	
	local function awardsList()
		local majorawards = require "Module:Dictionnaire Wikidata/Distinctions"
		local query = {
			entity = item,
			property= 'P166',
			sorttype= 'chronological',
			grouped = true,
			showqualifiers = 'P642',
			showdate= true,
			precision = 'year',
			conjtype = 'new line',
			textformat = 'minimum',
			linktopic = '-',
			defaultlinkquery = {property = {'P2354', 'P361'}},
			excludevalues = 'Q15631401', -- membre de la Royal Society, redondance avec le champ « membre de » (P463)
			speciallabels = majorawards,
			labelformat = function(id) return genderedlabel(id) end,
		}
		local claims = wikidata.getClaims(query)
		if (not claims) then
			return nil
		end
		local str = wikidata.formatAndCat(query)
		if #claims < 4 then
			return str, #claims
		end

		--si trop de valeurs, n'afficher que les importantes de [[Module:Dictionnaire Wikidata/Distinctions]], et mettre les autrs dans un menu pliant

		--- récupération des importantes
		local majorStr
		local targetvalues = {}
		for i, j in pairs(majorawards) do
			table.insert(targetvalues, i)
		end
		query.targetvalue = targetvalues
		query.value, query.claims, query.valuetable = nil, nil, nil -- apparemment sinon ce n'est pas le cas, pourquoi ? BUG IMPORTANT
		majorStr = wikidata.formatAndCat(query)

		--- repliage des autres
		local message = "'''Liste détaillée'''"
		local allAwardsTable = 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()

		return linguistic.conj({majorStr, tostring(allAwardsTable)}, "<br />"), #claims
	end
	
	return {
		type = 'row', 
		value = {'prix', 'récompenses', 'distinction', 'distinctions'},
		label = 'Distinctions',
		singularlabel = 'Distinction',
		wikidata = function() return awardsList() end
	}
end

-- Influences 
function p.influencedby()
	return {
		type = 'row',
		label = 
		function(localdata, item)
		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'},
}
end

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

-- Religion
function p.religion()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Religion',
		plurallabel = 'Religions',
		value = 'religion',
		wikidata = {property = 'P140', sorttype= 'chronological', showdate = true, precision = 'year', excludevalues = 'Q7066'},
},
{
		type = 'row',
		label = 'Date de baptême',
		value = 'date de baptême',
		property = 'P1636',
},
{
		type = 'row',
		label = 'Parrain',
		plurallabel = 'Parrains',
		value = 'parrain',
		property = 'P1290',
},
{
		type = 'row',
		label = 'Nom en religion',
		plurallabel = 'Noms en religion',
		value = 'nom en religion',
		property = 'P1635',
},
{
		type = 'row',
		label = 'Ordre religieux',
		plurallabel = 'Ordres religieux',
		value = 'ordre religieux',
		property = 'P611',
},
{
		type = 'row',
		label = 'Consécrateur',
		plurallabel = 'Consécrateurs',
		value = 'consécrateur',
		property = 'P1598',
},
{
		type = 'row',
		label = 
		function(localdata, item) 
		if gender == 'f' then
			return 'Vénérée par'
		elseif gender == 'm' then
			return 'Vénéré par'
		else
			return 'Vénéré(e) par'
		end
		end,
		value = 'vénéré par',
		property = 'P1049',
},
{
		type = 'row',
		label = 'Étape de canonisation',
		value = 'étape de canonisation',
		wikidata = {
			property = 'P411',
			labelformat = function(id) return genderedlabel(id) end,
		},
},
	}}
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', speciallabels = militaryranks, conjtype ='new line'},
},
{
		type = 'row',
		label = 'Conflit',
		plurallabel = 'Conflits',
		value = 'conflit',
		wikidata = {property = 'P607', showdate = true, sorttype= 'chronological', precision = 'year'},
},
	}}
end

-- Carrière de torero
function p.torero()
	return {type = 'multi', rows = {
{
		type = "row",
		label = "Alternative",
		value = "alternative",
		wikidata = function() return wikidata.keyDate("Q2840411", item) end
},
{
		type = "row",
		label = "Confirmation d'alternative",
		value = "confirmation alt",
		wikidata = function() return wikidata.keyDate("Q23308805", item) end
},
	}}
end

-- Sport
function p.sport()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Spécialité',
		plurallabel = 'Spécialités',
		value = 'spécialité',
		wikidata = {property = 'P413',
			labelformat = function(id) return genderedlabel(id) end,
			},
},
{
		type = 'row',
		label = 'Discipline sportive',
		plurallabel = 'Disciplines sportives',
		value = 'discipline sportive',
		wikidata = {property = 'P2416'},
},
{
		type = 'row',
		label = 'Prise de raquette',
		value = 'prise de raquette',
		wikidata = {property = 'P741'},
},
{
		type = 'row',
		label = 'Tire de la',
		value = 'tire',
		wikidata = {property = 'P423'},
},
{
		type = 'row',
		label = 'Équipe',
		plurallabel = 'Équipes',
		value = 'équipe',
		wikidata = {
			property = 'P54',
			sorttype= 'chronological',
			conjtype = "new line",
			statementformat = function(statement)
				local str = wikidata.formatStatement(statement, {showdate = true})
				local compets = wikidata.getFormattedQualifiers(statement, {"P1350"})
				if compets and (tonumber(compets) > 1) then
					compets = compets .. " matchs joués"
				elseif compets then
					compets = compets .. " match joué"
				end
				local points = wikidata.getFormattedQualifiers(statement, {"P1351"})
				if points and (tonumber(points) > 1) then
					points = points .. " points marqués"
				elseif points then
					points = points  .. "point marqué"
				end
				local qualifiers = linguistic.conj{compets, points}
				if qualifiers then
					str= str .. " <small> – " .. qualifiers .. " </small>"
				end
				return str
			end
		}
},
{
		type = 'row',
		label = 'Capes internationales',
		value = 'capes',
		wikidata = {property = 'P1129', numval = 1},
},
{
		type = 'row',
		label = 'Titre aux échecs',
		plurallabel = 'Titres aux échecs',
		value = 'titre aux échecs',
		wikidata = {property = 'P2962', sorttype= 'chronological', showdate = true, precision = 'year'},
},
{
		type = 'row',
		label = 'Classement Elo',
		value = 'classement elo',
		wikidata = {property = 'P1087', numval = '3', sorttype = 'inverted', conjtype = 'new line', showdate = true, precision = 'month', removedupes = true},
},
{
		type = 'row',
		label = 'Record détenu',
		plurallabel = 'Records détenus',
		value = 'record détenu',
		wikidata = {property = 'P1000', sorttype= 'chronological', showdate = true},
},
{
		type = 'row',
		label = 'Entraîneur',
		plurallabel = 'Entraîneurs',
		value = 'entraîneur',
		wikidata = {property = 'P286', sorttype= 'chronological', showdate = true, precision = 'year'},
},
{
		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 = localdata['intitulé maître'] or '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 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},
},
{
		type = 'row',
		label = 'Personne liée',
		plurallabel = 'Personnes liées',
		value = 'personne liée',
		wikidata = {property = 'P3342', numval = 5, showqualifiers = 'P794'},
},
	}}
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

-- Victimes
function p.victims()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Victimes',
		value = 'victimes',
		wikidata = {property = 'P1345'},
},
	}}
end

-- Condamnations
function p.penalties()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 
		function(localdata, item) 
		if gender == 'f' then
			return 'Condamnée pour'
		elseif gender == 'm' then
			return 'Condamné pour'
		else
			return 'Condamné(e) pour'
		end
		end,
		value = 'condamné pour',
		wikidata = {property = 'P1399', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'},
},
{
		type = 'row', 
		label = 'Condamnation',
		plurallabel = 'Condamnations', 
		value = 'condamnation', 
		wikidata = {property = 'P1596', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'},
},
{
		type = 'row', 
		label = 'Lieu de détention',
		plurallabel = 'Lieux de détention', 
		value = 'lieu de détention', 
		wikidata = {property = 'P2632', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'},
},
	}}
end

-- Physique
function p.appearance()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Taille',
		value = 'taille',
		wikidata = {property = 'P2048', targetunit = 'metre', rounding = '2'},
},
{
		type = 'row',
		label = 'Poids',
		value = 'poids',
		wikidata = {property = 'P2067', targetunit = 'kilogram', rounding = '1'},
},
{
		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',
		wikidata = {property = 'P22', conjtype = ' ou '},
},
{
		type = 'row',
		label = 'Mère',
		value = 'mère',
		wikidata = {property = 'P25', conjtype = ' ou '},
},
{
		type = 'row',
		label = 'Beau-parent',
		plurallabel = 'Beaux-parents',
		value = {'beau-parent', 'beau-père', 'belle-mère'},
		property = 'P3448',
},
{
		type = 'row',
		label = 'Fratrie',
		value = 'fratrie',
		wikidata = {
			property = 'P3373',
			sorttype = 'chronological',
			conjtype = 'new line',
			textformat = 'long',
			precision = 'year',
			stilltrue = (not deathdate),
		}
},
{
		type = 'row',
		label = 'Conjoint', -- todo : adapter le libellé en genre ?
		plurallabel = 'Conjoints',
		value = 'conjoint',
		wikidata = {
			property = 'P26',
			showdate = true,
			sorttype = 'chronological',
			conjtype = 'new line',
			textformat = 'long',
			precision = 'year',
			stilltrue = (not deathdate),
			precision = 'year',
		}
},
{
		type = 'row',
		label = localdata['intitulé enfant'] or 'Enfant',-- todo : adapter le libellé en genre ?
		plurallabel = 'Enfants',
		value = 'enfant',
		wikidata = {
			property = 'P40',
			sorttype = 'chronological',
			conjtype = 'new line',
			textformat = 'long',
			precision = 'year',
			stilltrue = (not deathdate),
			precision = 'year',
		}
},
{
	type = 'row',
	label = 'Parentèle',
	value = 'parentèle',
	wikidata = {
		property = 'P1038',
		excludespecial = true,
		conjtype = 'new line',
		statementformat = function(statement)
			local personid = wikidata.getmainid(statement)
			local personlabel = wikidata.formatEntity(personid)
			local persongender = getgender(personid)
			local kintype = wikidata.getFormattedQualifiers(
				statement,
				"P1039", 
				{
					labelformat = function(id) return genderedlabel(id, persongender) end,
					link = "-"
				}
				)
			if kintype then
				return personlabel .. " " .. linguistic.inparentheses(kintype)
			end
			return personlabel 
			end,
		}
},
	}}
end

-- Esclavage
function p.slavery()
	return {type = 'multi', rows = {
{
		type = 'row',
		label = 'Propriétaire',
		plurallabels = 'Propriétaires',
		value = 'propriétaire',
		property = 'P127',
},
	}}
end

-- Œuvres
function p.works(params)
	params = params or {}
	local title = params.title or 'Œuvres réputées'

	local wikidata = {
		excludespecial = true,
		numval = 5,
		property = 'P800',
		defaultlink = 'image',
		showdate= true,
		labelformat = function(id) local label =  wikidata.getLabel(id) if label then return '<i>' .. label .. '</i>' end end,
	}
	
	for i, j in pairs(params) do
		wikidata[i] = j
	end
	
	return 
	{type = 'table', title = title, singulartitle = singulartitle, rows =
		{
			{
			type = 'row',
			value = 'œuvres principales',
			wikidata = wikidata
			}
		}
	}
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)
	local nom = localdata.nom or mw.title.getCurrentTitle().text
	local alt = 'signature de ' .. nom
	if mw.ustring.match( nom, '^[AEÈÉIOUY]' )  then
		alt = "signature d'" .. nom
	end
	return {
		type = 'images',
		imageparameters =  {'signature'},
		defaultimage = default,
		captionparameter = 'légende signature',
		defaultcaption = 'signature',
		uprightparameter = 'upright signature',
		defaultupright = 0.5,
		defaultalt = alt,
		property = 'P109',
		numval = 1
	}
end

-- Enregistrement vocal
function p.voice()
	return {
		type		     = 'images',
		style            = {['padding-top'] = '25px'},--{['border-width'] = '10px', ['border-style'] = 'solid'},
		label		     = 'Enregistrement vocal',
		captionparameter = 'légende voix',
		value		     = 'voix',
		property	     = 'P990',
		numval           = 1,
	}
end

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

return p