Aller au contenu

Module:Description

Une page de Wikipédia, l'encyclopédie libre.

 Documentation[voir] [modifier] [historique] [purger]

Utilisation

[modifier le code]

Fonctions exportables :

  • description(frame) – calcule une description textuelle d'une entité Wikidata (paramètre 1=identifiant de l'entité) à partir des déclaration génériques (nature, sous-classe, …) et de la description Wikidata.
  • description_par_prio(frame) – calcule une description textuelle d'une entité Wikidata. Si une description Wikidata est présente, l’afficher, sinon calculer la description auto.

Pour des exemples, voir la page de test permettant de tester diverses modifications apportées.

local wd = require("Module:Wikidata")
local util = require("Module:Utilitaire")
local qid = require("Module:Numéro Q")

local p= {}

local proprietes = {instance_de= "P31", sous_classe_de = "P279" }

local function descriptionManuelle(label, description)
	local res = nil
	if label ~= nil and description ~= nil then
		res =  label .. ": " .. description
	elseif label ~= nil then
		res =  label
	elseif description ~= nil then
		res =  description
	else
		res = "" -- label manquant
	end
	return res
end	


function mainValueEntityId(statement)
	-- TODO check the snak type : property, novalue, somevalue ...
	return "Q" .. tostring(statement.mainsnak.datavalue.value["numeric-id"]) 
end


-- get the labels of the values of statements for property "prop_id" on "entite"
local function extract_lbls(entite, prop_id)
	local stmts = mw.wikibase.getBestStatements(entite, prop_id)
	if util.tablelength(stmts) > 0 then 
		local ids = util.map (mainValueEntityId, stmts)
		local lbls = util.map (mw.wikibase.label, ids)
		return lbls
	end
	return {}
end

-- test avec = p.decrireEntite("Q8183")
local function descriptionAuto(entite)
	local autodesc = nil
	
	local props = util.Set:new(entite:getProperties())

	local instance = proprietes["instance_de"]
	local sousclasse = proprietes["sous_classe_de"]
	
	if props:is_in(instance) or 
		props:is_in(sousclasse) then
		 
		 -- instance de
		 
		if props:is_in(instance) then
			local lbls = extract_lbls(entite, instance)
			autodesc = ""
			if util.tablelength(lbls) > 0 then 
				autodesc = util.formatTableWithLastSep(lbls, ", ", " et ")
			end
		end

		-- sous classe de
		
		if props:is_in(sousclasse) then
			local lbls = extract_lbls(entite, sousclasse)
			if util.tablelength(lbls) > 0 then 
				if autodesc ~= nil then
					autodesc = autodesc .. " ; "
				else
					autodesc = ""
				end
				autodesc = autodesc .. "type de " .. util.formatTableWithLastSep(lbls, ", type de ", " et type de ")
			end
		end
	end
	
	return autodesc
end

function p.decrireEntite(id, includelabel, mode)
	if not id or id == '' then
		return
	end
	if (includelabel == nil) then includelabel = true end 
	
	if tonumber(id) then
		id = 'Q' .. id
	end
	-- supprime une éventuelle ancre vers une propriété (ex. Q1#P580)
	
	id = id:gsub('#.+$', '')
	
	-- local entite = mw.wikibase.getEntity(id)

	if entite then
		local description = mw.wikibase.description(id)
		local label = mw.wikibase.label(id)
		
		local desc = description or ""
		
		if includelabel then
			desc = descriptionManuelle(label, description)
		end
		
		if (not(mode=="manuel_seul")) then
			local autodesc = descriptionAuto(id)
			local sep = ""
		end
		
		if description ~= nil then
			sep =  " ; " 
		elseif includelabel then
			sep = ": "
		end
		
		if autodesc ~= nil then 
			desc = desc .. sep .. autodesc
		else
			
		end
		return desc
	else
		return '<span class="error">identifiant wikidata inconnu</span>'
	end
end

p.PropClass = PropClass

-- Affiche, sans libellé, la description manuelle si elle existe sinon une description auto

function p.description_par_prio(frame)
	local id = qid._numero(frame.args[1], frame.args[2], frame.args[3])
	
	if not id then return end
	
	local description = mw.wikibase.description(id)
	
	if description and description ~= "" then
		return description
	end
	
	return descriptionAuto(id)
end


function p.description(frame)
	if frame.args["nolabel"] then 
		return p.decrireEntite(frame.args[1], false)
	end
	return p.decrireEntite(frame.args[1])
end

return p