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

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
m
(met aussi par le prédécesseur et le successeur pour les fonction (voir Ievhen Martchouk). Vu l'infobox Politicien sur Alain Juppé, ça a l'air qqch de recommandé, même aux dépens de la sobriété esthétique ))
Ligne 51 : Ligne 51 :
 
return nil
 
return nil
 
end
 
end
local vals = {}
+
local rows = {}
 +
local previousstr = '' -- pour fusionner deux lignes sans différences visibles
 +
 
for i, statement in pairs(statements) do
 
for i, statement in pairs(statements) do
local post = wikidata.formatStatement(statement, {showqualifiers = {'P642', 'P768', 'P708', 'P194', 'P102', 'P108'}})
+
local mainstr = wikidata.formatStatement(statement)
-- rétrolien pour la dernière valeur
+
local period = wikidata.getFormattedDate(statement, {precision = 'year', linktopic = '-'})
 +
 +
-- 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
 +
 +
-- "de", parti, circonscription, employeur, diocèse
 +
local qualifs = wikidata.getFormattedQualifiers(statement, {'P642', 'P768', 'P708', 'P194', 'P102', 'P108'})
 +
if qualifs then
 +
mainstr = mainstr .. '(' .. qualifs .. ')'
 +
end
 +
 +
-- prédecesseur et successeur
 +
local predecessor = wikidata.getFormattedQualifiers(statement, {'P155'})
 +
local successor = wikidata.getFormattedQualifiers(statement, {'P156'})
 +
if predecessor then
 +
mainstr = mainstr .. '<small><br />&nbsp;précédé par ' .. predecessor .. '</small>'
 +
end
 +
if successor then
 +
mainstr = mainstr .. '<small><br />&nbsp;suivi par ' .. successor .. '</small>'
 +
end
 +
 
 +
-- ajout rétrolien et catégorie de maintenance
 
if (i == #statements) and prop then
 
if (i == #statements) and prop then
post = wikidata.addLinkback(post, item, prop) .. wikidata.addtrackingcat(prop)
+
mainstr = wikidata.addLinkback(mainstr, item, prop) .. wikidata.addtrackingcat(prop)
 
end
 
end
local period = wikidata.getFormattedDate(statement, {precision = 'year', linktopic = '-'})
+
local row = {type = 'row', label = period, value = function() return post end}
+
local row = {type = 'row', label = period or '', value = function() return mainstr end}
table.insert(vals, row)
+
table.insert(rows, row)
 
end
 
end
 
-- ajout de rétrolien, cat
 
-- ajout de rétrolien, cat
return vals
+
return rows
 
end
 
end
  
Ligne 252 : Ligne 277 :
 
function p.officialposition()
 
function p.officialposition()
 
local title = 'Fonctions'
 
local title = 'Fonctions'
local singtitle = 'Fonctions'
+
local singtitle = 'Fonction'
 
 
 
local rows
 
local rows

Version du 26 juillet 2015 à 14:08

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

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

 -- libellés spéciaux lorsque ceux de Wikidata ne conviennent pas
local occupations = mw.loadData "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 validvalues = {
		m = 'm',
		f = 'f',
		['féminin'] = 'f',
		['masculin'] = 'm',
		['Q6581072'] = 'f',
		['Q6581097'] = 'm',
	}
	local gender = localdata['sexe'] or localdata['genre'] or wikidata._formatStatements{item= item, property = 'P21', format = 'raw'}
	return validvalues[gender]
end

local gender = gender or setgender()

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.getRawvalue(j.mainsnak)
		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 previousstr = '' -- pour fusionner deux lignes sans différences visibles
	
	for i, statement in pairs(statements) do
		local mainstr = wikidata.formatStatement(statement)
		local period = wikidata.getFormattedDate(statement, {precision = 'year', linktopic = '-'})
			
		-- 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
	
		-- "de", parti, circonscription, employeur, diocèse
		local qualifs = wikidata.getFormattedQualifiers(statement, {'P642', 'P768', 'P708', 'P194', 'P102', 'P108'})
		if qualifs then
			mainstr = mainstr .. '(' .. qualifs .. ')' 
		end
		
		-- prédecesseur et successeur
		local predecessor = wikidata.getFormattedQualifiers(statement, {'P155'})
		local successor = wikidata.getFormattedQualifiers(statement, {'P156'})
		if predecessor then
			mainstr = mainstr .. '<small><br />&nbsp;précédé par ' .. predecessor .. '</small>'
		end
		if successor then
			mainstr = mainstr .. '<small><br />&nbsp;suivi par ' .. successor .. '</small>'
		end	

		-- ajout rétrolien et catégorie de maintenance
		if (i == #statements) and prop then
			mainstr = wikidata.addLinkback(mainstr, item, prop) .. wikidata.addtrackingcat(prop)
		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 .. '<br />' .. theplace
	else
		return thedate or theplace --retourne tout ce qu'il trouve
	end
end


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

--Image
function p.mainimage()
	return  general.mainimage('Article à illustrer/Biographie', 'Defaut 2.svg')
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',},
		{'P742', 'Peudonyme', 'Pseudonymes'},
		{'P1782', 'Prénom social', 'Prénoms sociaux'},
		{'P1787', 'Nom de pinceau', 'Noms de pinceau'},
	}

	local rows = {type = 'multi', rows = {}}
	for i, j in pairs(names) do
		local query = {property = j[1], showqualifiers = {'P1721'}, conjtype = ',<br />'}
		table.insert(rows.rows, {type = 'row', wikidata = query, label = j[2], plurallabel = j[3]})
	end
	return rows
end

-- NAISSANCE ET MORT
local function wikidatadate(prop)
	local val = wikidata.getClaims{entity = item, property = prop}
	if val and
		val[1].mainsnak.snaktype == 'value'
		and
		val[1].mainsnak.datavalue.value.precision < 8 then -- les dates précises au siècle près seulement ne marchent sont problématiques
		return nil
	end
	return wikidata.formatAndCat{entity = item, property = prop, vals = vals, conjtype = ' ou ', linktopic = linktopic}
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({item = 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({item = 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()
				local claims = wikidata.getClaims{entity = item, property = 'P1317', numval = 1}
				if not claims then
					return
				end
				local startpoint = wikidata.getFormattedQualifiers(claims[1], {'P580'})
				local endpoint = wikidata.getFormattedQualifiers(claims[1], {'P582'})
				return require "Module:Date complexe".daterange(startpoint, endpoint)
			end
	}
end

function p.nationality() -- Wikidata désactivé avant 1800 (problème de fiabilité des données
	return {
		type = 'row',
		label = 'Nationalité',
		plurallabel = 'Nationalités',
		value = 'nationalité',
		wikidata = 
			function()
				-- désactivé pour les personnes nées avant 1800, trop d'erreurs
				local timestamp = wikidata.formatStatements{entity = entity, property = 'P569', numval = 1, displayformat = 'raw'}
				if timestamp then 
					local era, year = timestamp:match("(%W)(%d+)%-(%d+)%-(%d+)")
					if (not year) or tonumber(year) < 1700 then
						return nil
					end
				end
				--
				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,
					conjtype = 'comma',
					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
	}
end

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

function p.occupation()
	local speciallabels
	if gender == 'f' then
		speciallabels = occupations.female
	elseif gender == 'm' then
		speciallabels = occupations.male
	end
	
	return {
		type = 'row', 
		value = 'activité',
		wikidata = {property = 'P106', showdate = true, conjtype = 'comma', speciallabels = speciallabels}, 
		label = 'Activité',
		plurallabel = 'Activités'
	}
end

function p.employer()
	return {
		type = 'row', 
		value = 'employeur',
		wikidata = {property = 'P108', showdate = true}, 
		label = 'Employeur',
		plurallabel = 'Employeurs'
	}
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 = '<br />'}, 
	}
end

function p.awards() -- à améliorer
	return {
		type = 'row', 
		value = {'prix', 'récompenses', 'distinction', 'distinctions'},
		wikidata = { property= 'P166', sorttype= 'chronological' , showdate= true, conjtype= '<br />'}, 
		label = 'Distinction',
		plurallabel = 'Distinctions',
	}
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

-- 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 = 'Conjoint', -- à faire : le féminin
		plurallabel = 'Conjoints',
		value = 'conjoint',
		wikidata = {property = 'P26', sorttype = 'chronological', textformat = 'long', showdate = true, precision = 'year', linktopic = '-'}
					 -- textformat = long sinon on se demande si c'est pas les dates de vie du conjoint
},
{
		type = 'row',
		label = 'Enfant',
		plurallabel = 'Enfants',
		value = 'enfant',
		wikidata = {property = 'P40'}
},
	}}
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 p.website()
end

return p