« Module:Infobox/Fonctions/Personne » : différence entre les versions
Aucun résumé des modifications |
mAucun résumé des modifications |
||
| Ligne 290 : | Ligne 290 : | ||
label = 'Lieu de travail', | label = 'Lieu de travail', | ||
plurallabel = 'Lieux de travail', | plurallabel = 'Lieux de travail', | ||
value = ' | value = 'lieu de travail', | ||
wikidata = {property = 'P937', sorttype= 'chronological', showdate = true, precision = 'year'}, | wikidata = {property = 'P937', sorttype= 'chronological', showdate = true, precision = 'year'}, | ||
}, | }, | ||
Version du 6 septembre 2015 à 11:29
-- Functions utilisées par les infobox personnes local p = {} local wikidata = require "Module:Interface Wikidata".fromLua local general = require "Module:Infobox/Fonctions" local datemodule = require "Module:Date" local linguistic = require "Module:Linguistique"
-- libellés spéciaux lorsque ceux de Wikconidata ne conviennent pas
local occupations = require "Module:Dictionnaire Wikidata/Métiers"
local function setgender() -- établit la valeur de la variable "gender" qui sert à adapter la grammaire au sexe de la personne local vals = { ['Q6581072'] = 'f', ['Q6581097'] = 'm', default = '?' } local gender = wikidata.formatStatements{entity = item, property = 'P21', displayformat = 'raw'} return vals[gender] or vals.default end local gender = gender or setgender()
local function setgenderedlabels() if gender == 'f' then return occupations.female elseif gender == 'm' then return occupations.male end end local genderedlabels = genderedlabels or setgenderedlabels()
local datelinks = { -- lien vers le domaine d'activité approprié Q483501 = 'en arts plastiques', -- artiste Q1028181 = 'en arts plastiques', -- peintre Q1281618 = 'en arts plastiques', -- sculpteur Q2309784 = 'en cyclisme', -- cycliste Q16947657 = 'en arts plastiques', -- lithographe }
-- ========== Fonctions d'aide ==================================== local function getdatetopic() -- obtient le lien le plus approprié pour une date en fonction de la profession local claims = wikidata.getClaims{entity = item, property = 'P106', excludespecial = true} if not claims then return nil end for i, j in pairs(claims) do local v = wikidata.getmainid(j) if datelinks[v] then return datelinks[v] end end end
local linktopic = getdatetopic()
local function timeline(statements, prop) -- affiche date : événement (suppose les événements déjà triés) if not statements then return nil end local rows = {}
local speciallabels = genderedlabels local dateformat = {precision = 'year', linktopic = '-'} -- qualificatifs à afficher "de", circonscription, diocèse, assemblée délibérante, parti, employeur local qualifs = {'P642', 'P768', 'P708', 'P194', 'P102', 'P108'}
for i, statement in pairs(statements) do
local mainstr = wikidata.formatStatement(statement, {speciallabels = speciallabels, showqualifiers = qualifs})
local period = wikidata.statementDate(statement, dateformat )
-- rétrolien à activer si on veut inciter les gens à aller sur Wikidata --if (not period) and item then -- period = '[[:d:' .. item.id .. '#' .. (prop or ) .. '|date à ajouter] --end
-- prédecesseur et successeur
local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'})
local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'})
if predecessor then
local s = 'précédé par ' .. predecessor
if gender == 'f' then
s = 'précédée par ' .. predecessor
end
mainstr = mainstr .. '
' .. s .. ''
end
if successor then
local s = 'suivi par ' .. successor
if gender == 'f' then
s = 'suivie par ' .. successor
end
mainstr = mainstr .. '
' .. s .. ''
end
-- à la dernière ligne : ajout rétrolien et catégorie de maintenance
if (i == #statements) and prop then mainstr = wikidata.formatAndCat{value = mainstr, property = prop, entity = entity} end
local row = {type = 'row', label = period or , value = function() return mainstr end} table.insert(rows, row) end -- ajout de rétrolien, cat return rows end
local function dateandplace(thedate, theplace)
if thedate and theplace then
return thedate .. '
' .. theplace
else
return thedate or theplace --retourne tout ce qu'il trouve
end
end
--Titre
function p.title(icon, style)
return general.title(icon, style)
end
--Image function p.mainimage()
-- demande d'illustration que si la personne est née après 1900, sinon c'est souvent impossible à trouver local defaultimage = 'Defaut 2.svg' local age = wikidata.stringTable{property = 'P569', entity = item, displayformat = 'raw', excludespecial = true}
if age then local pattern = "(%W)(%d+)%-(%d+)%-(%d+)" local era, year = age[1]:match(pattern) if (era == '-') or (tonumber(year)) < 1900 then defaultimage = nil end end return general.mainimage('Article à illustrer/Biographie', defaultimage) end
-- Noms function p.othernames()
-- si "autres noms" existe, le renvoie, sinon, fait plusieurs lignes en utilisant diverses propriétés ed Wikidata if localdata['autres noms'] or localdata['nom de naissance'] then return {type = 'multi', rows = { {type = 'row', label = 'Autres noms', value = 'autres noms'}, {type = 'row', label ='Nom de naissance', value = 'nom de naissance'}, } } end local names = { {'P1477', 'Nom de naissance', 'Noms de naissance', 'nom de naissance'}, {'P1449', 'Surnom', 'Surnoms', 'surnom'}, {'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'}, }
local rows = {type = 'multi', rows = {}}
for i, j in pairs(names) do
local query = {property = j[1], showqualifiers = {'P1721'}, conjtype = ',
'}
table.insert(rows.rows, {type = 'row', value = j[4], wikidata = query, label = j[2], plurallabel = j[3]})
end
return rows
end
-- NAISSANCE ET MORT local function wikidatadate(prop) -- fonction à vocation généraliste, à externaliser local vals = wikidata.getClaims{entity = item, property = prop, excludespecial = true} if not vals then return nil end local newvals = {} for i, val in pairs(vals) do local v = wikidata.statementDate(val, {linktopic = linktopic}) -- essaye les qualifs date de début/fin pour une date plus précise (en attendant un bon fonctionnement du "before/after" intégré) if not v then if val.mainsnak.snaktype ~= 'value' then v = wikidata.formatStatement(val, {linktopic = linktopic}) elseif val.mainsnak.datavalue.value.precision > 7 then v = wikidata.formatStatement(val, {linktopic = linktopic}) end end if val.qualifiers and val.qualifiers.P1480 then local q = wikidata.getid( val.qualifiers.P1480[1]) if q == 'Q5727902' then v = 'vers ' .. v end end if v then table.insert(newvals, v) end end local str = linguistic.conj(newvals, 'or') if str then return wikidata.formatAndCat{entity = item, property = prop, value = str} end end
local birthdate = localdata['naissance'] or localdata['date de naissance'] or wikidatadate('P569') or local deathdate = localdata['décès'] or localdata['date de décès'] or wikidatadate('P570') or
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, [3] = deathdate, qualificatif = linktopic}}
local theplace = localdata['lieu de naissance'] or wikidata.formatAndCat({entity =item, property= 'P19', rank = 'best', conjtype= ' ou '})
return dateandplace(thedate, theplace)
end
}
end
function p.death() -- même fonctionnement que la fonction p.birth return { type = 'row', label = 'Décès', value = function() local thedate = datemodule.dateInfobox{args = {[1] = 'décès', [3] = birthdate, [2] = deathdate, qualificatif = linktopic}} local theplace = localdata['lieu de décès'] or wikidata.formatAndCat({entity = item, property= 'P20', rank = 'best', conjtype= ' ou '}) return dateandplace(thedate, theplace) end } end
function p.floruit() return { type = 'row', label = 'Période d’activité', value = "Période d'activité", wikidata = function() return wikidatadate('P1317') end } end
function p.nationality()
-- à améliorer pour tenir compte des dates tout en évitant les doublons pour ceux qui ont Empire allemand + République de Weimar
local function wdDate() local nation = require "Module:Country data".nationality local statements = wikidata.getClaims{entity = item, property = 'P27'} if not statements then return nil end return wikidata.formatAndCat{ property = 'P27', vals = statements, showdate = true, entity = item, conjtype = 'comma', removedupes = true, linktopic = '-', displayformat = function(snak) local val, success = nation(wikidata.getid(snak), 'f') if not success then val = wikidata.formatSnak(snak) end return val end }, #statements end
return { type = 'row', label = 'Nationalité', plurallabel = 'Nationalités', value = 'nationalité', wikidata = function() return wdDate() end }
end
-- Domiciles function p.places() return {type = 'multi', rows = { { type = 'row', label = 'Domicile', plurallabel = 'Domiciles', value = 'domicile', wikidata = {property = 'P551', showdate = true, sorttype= 'chronological', precision = 'year'}, }, { type = 'row', label = 'Lieu de travail', plurallabel = 'Lieux de travail', value = 'lieu de travail', wikidata = {property = 'P937', sorttype= 'chronological', showdate = true, precision = 'year'}, }, }} end
-- parcours professionel
function p.education() -- à améliorer
local query = {sorttype= 'chronological', property = 'P69', showdate = true, showqualifiers = 'P512', conjtype = '
'}
return {
type = 'row',
value = {'éducation', 'formation'},
wikidata = query,
label = 'Formation',
}
end
function p.occupation() return { type = 'row', value = 'activité', wikidata = {property = 'P106', showdate = true, conjtype = 'comma', speciallabels = genderedlabels, defaultlink = '-'}, label = 'Activité', plurallabel = 'Activités' } end
function p.employer() return { type = 'row', value = 'employeur', wikidata = {property = 'P108', showdate = true}, label = function() return localdata['intitulé employeur'] or 'A travaillé pour' end, } end
function p.officialposition() local title = 'Fonctions' local singtitle = 'Fonction'
local rows if localdata['fonction'] then return {type = 'table', rows = { {type = 'row', label = title, value = 'fonction'} } } else local statements = wikidata.getClaims{property = 'P39', entity = item, sorttype = 'chronological'} if not statements then return nil end if #statements == 1 then title = singtitle end rows = timeline(statements, 'P39') end return { type = 'table', title = title, rows = rows, }
end
function p.politicalparty()
return {
type = 'row',
value = 'parti politique',
label = 'Parti politique',
plurallabel = 'Partis politiques',
wikidata = { property = 'P102', sorttype= 'chronological', showdate = true, conjtype = '
', excludespecial = true},
}
end
function p.awards() -- à améliorer
local function awardsList(item) local majorlist = require "Module:Dictionnaire Wikidata/Distinctions"
local query = {
entity = item, property= 'P166', sorttype= 'chronological',
showqualifiers = 'P642', showdate= true, precision = 'year', textformat = 'minimum', linktopic = '-', conjtype = '
',
speciallabels = majorlist
}
local major = {} -- récompenses importantes obtenues local all = {} local message = "Liste détaillée"
local claims = wikidata.getClaims(query) if not claims then return nil end
if #claims < 3 then query.claims = claims return wikidata.formatAndCat(query), #claims end
-- formate la liste des statements, en met certaine dans les "major" for i, j in pairs(claims) do local id = wikidata.getmainid(j) local s = wikidata.formatStatement(j, query) table.insert(all, s) if majorlist[id] then table.insert(major, s) end end
-- transforme la liste complète en chaîne
query.value = table.concat(all, '
')
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, '
')
majorstr = wikidata.formatAndCat(query)
else
message = nil --=> pas de titre pour la liste complète
end
-- met la liste complète dans un menu replié local obj = mw.html.create('div') :addClass("toccolours mw-collapsible mw-collapsed") :wikitext(message) :css{border = "none"} :tag('div') :addClass("mw-collapsible-content") :css{['line-height'] = '150%'} -- sinon c'est vraiment serré :wikitext(str) :done() :allDone()
str = linguistic.conj({majorstr, tostring(obj)}, '
')
return str, #claims end
return { type = 'row', value = {'prix', 'récompenses', 'distinction', 'distinctions'}, label = 'Distinction', plurallabel = 'Distinctions', wikidata = function() return awardsList(item) end } end
-- Influences function p.influencedby() return { type = 'row', label = function(localdata, item) if not gender then setgender(localdata, item) end if gender == 'f' then return 'Influencée par' elseif gender == 'm' then return 'Influencé par' else return 'Influencé(e) par' end end, value = 'influencé par', wikidata = {property = 'P737'},
}
end
function p.influenced() return { type = 'row', label = 'A influencé', value = {'a influencé', 'influence de'}, wikidata = {property = 'P738'}, } end
-- 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'}, }, }} end
-- Sport
function p.sport()
return {type = 'multi', rows = {
{
type = 'row',
label = 'Sport',
plurallabel = 'Sports',
value = 'sport',
wikidata = {property = 'P641', showdate = true},
},
{
type = 'row',
label = 'Équipe',
plurallabel = 'Équipes',
value = 'équipe',
wikidata = {property = 'P54', sorttype= 'chronological', showdate = true, precision = 'year', conjtype = '
'},
},
{
type = 'row',
label = 'Sponsor',
plurallabel = 'Sponsors',
value = 'sponsor',
wikidata = {property = 'P859', sorttype= 'chronological', showdate = true, precision = 'year'},
},
}}
end
-- Famille
function p.family()
return {type = 'multi', rows = {
{
type = 'row',
label = 'Père',
value = 'père',
property = 'P22',
},
{
type = 'row',
label = 'Mère',
value = 'mère',
property = 'P25',
},
{
type = 'row',
label = 'Frère',
plurallabel = 'Frères',
value = 'Frère',
property = 'P7',
},
{
type = 'row',
label = 'Sœur',
plurallabel = 'Sœurs',
value = 'Sœur',
property = 'P9',
},
{
type = 'row',
label = function()
-- retourne une forme singulière ou plurielle. Pourrait éventuellement adapter féminin masculine, mais demanderait logiquement de vérifier le sexe de chaque valeur
local claims = wikidata.getClaims{property = 'P26', entity = item}
if (not claims) or #claims == 1 then
return "Conjoint"
end
return "Conjoints"
end,
value = 'conjoint',
wikidata = function()
local claims = wikidata.getClaims{entity = item, property = 'P26', sorttype = 'chronological'}
if not claims then
return nil
end
if #claims > 4 then -- quand il y a trop de conjoints, on ne va pas à la ligne à chaque fois
return wikidata.formatStatements{entity = item, property = 'P26', showdate = true, textformat = 'minimum', precision = 'year', linktopic = '-'}
end
-- sinon si (textformat = 'long', showdate = true, precision = 'year', linktopic = '-')
return wikidata.formatStatements{entity = item, property = 'P26', showdate = true, textformat = 'long', precision = 'year', linktopic = '-', conjtype = '
'}
end
},
{
type = 'row',
label = 'Enfant',
plurallabel = 'Enfants',
value = 'enfant',
wikidata = {property = 'P40'}
},
}}
end
-- oeuvres function p.works() local title = 'Œuvres réputées' -- on pourrait mettre quelque chose comme "oeuvre principale" lorsque #vals == 1 mais les données de Wikidata sont trop approximatives pour que cela ait du sens return {type = 'table', title = title, rows = { { type = 'row', value = 'œuvres principales', wikidata = { property = 'P800', numval = 5, excludespecial = true, displayformat = function(snak) return '' .. wikidata.formatEntity(wikidata.getid(snak), {defaultlink = 'image'}) .. '' end } } } } end
-- Signature function p.signature(default) return { type = 'images', imageparameters = {'signature'}, defaultimage = default, defaultsize = '150px', captionparameter = 'légende signature', defaultcaption = 'signature', property = 'P109', numval = 1 } end
--== Site web function p.website() return general.website() end
return p