Aller au contenu

Module:Essai

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 13 janvier 2016 à 13:54 et modifiée en dernier par Hexasoft (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[créer] [purger]
--[[
test de fonctionnalités. J'effacerai moi-même lorsque ce sera
terminé
--]]

local p = {}

p.dump = ""
function p.add(txt)
	p.dump = p.dump .. txt .. "<br/>"
end

local wd = require 'Module:Wikidata'

--[[ table des métiers (WD) que l'on veut gérer
  cette table est indexée par le code WD de l'élément recherché, et
  contient une table avec (à faire évoluer) :
    'catégorie' (la catégorie à associer)
    'infobox' (l'infobox dédiée)
    'texte' (un libélé utilisable)
]]--
p.association = {
  ["Q483501"] = { ["catégorie"] = "Artiste", ["infobox"] = "Infobox Artiste", ["texte"] = "[[artiste]]" },
  ["Q2066131"] = { ["catégorie"] = "Sportif", ["infobox"] = "Infobox Sportif", ["texte"] = "[[sportif]]" },
  ["Q82955"] = { ["catégorie"] = "Personnalité politique", ["infobox"] = "Infobox Politique", ["texte"] = "[[homme politique]]" },
  ["Q47064"] = { ["catégorie"] = "Militaire", ["infobox"] = "Infobox Militaire", ["texte"] = "[[militaire]]" },
}

--[[
  fonction parcourant les "parents" de l'élément indiqué et retournant
  le premier élément présent dans la table 'association' durant ce processus
  (ou référencé par un 'identique à').
  Fait au maximum 'prof' itérations.
  Retourne 'nil' si rien n'est trouvé.
]]--
function p.cherche_parents(el, prof)
	p.add("> cherche_parents(" .. el .. "," .. prof .. ")")
	if (prof <= 0) then
		return nil  -- fin de récursion
	end
	
	-- si l'élément courant est dans la table on le retourne (récursion)
	if (p.association[el] ~= nil) then
		return el
	end
	
	-- on récupère les P460 (réputé identique à) au cas où
	local args = { ["property"] = "P460", ["entity"] = el, link = "-", displayformat = "raw" }
	local id = wd.stringTable(args)
	if (id ~= nil) then
		-- correspond ?
		for k, v in pairs(id) do
			if (p.association[v] ~= nil) then
				return v  -- trouvé, on quitte
			end
		end
	end
	-- si on arrive ici c'est qu'il n'a pas d'équivalence. On parcours
	-- les "sous-classe de" (P279) récursivement
	args = { ["property"] = "P279", ["entity"] = el, link = "-", displayformat = "raw" }
	id = wd.stringTable(args)
	if (id ~= nil) then
		-- pour chaque "sur-classe" on se ré-appelle
		local ret
		for k, v in pairs(id) do
			ret = p.cherche_parents(v, prof-1)
			if (ret ~= nil) then
				return ret
			end
		end
	end
	-- ici on n'a rien trouvé → nil
	return nil
end

--[[
  fonction retournant une liste des éléments de la table 'p.association'
  trouvés à partir de la propriété 'property' pour l'entité 'entity' (ou l'article
  courant si 'entity' vaut 'nil')
  si une propriété présente n'est pas référencée ???
]]--
function p.propriete_parente(property, entity)
	local args = { ["property"] = property, link = "-", displayformat = "raw" }
	local out = {} -- table des résultats
	if (entity ~= nil) then
		args["entity"] = entity
	end
	local res = wd.stringTable(args)
	
	-- si aucun résultat on retourne nil
	if (type(res) ~= "table") then
		return nil
	end
	
	-- on parcours tous les résultats à la recherche de ceux qui sont dans la
	-- liste 'association' ou ayant un élément fils de l'un d'entre eux
	for k, v in pairs(res) do
		-- si l'élément est présent on l'insert directement
		if (p.association[v] ~= nil) then
			table.insert(out, v)
		else
			-- on cherche "récursivement" chez les parents
			-- la valeur numérique est la profondeur max de recherche
			local d = p.cherche_parents(v, 4)
			if (d ~= nil) then
				table.insert(out, v)
			end
		end
	end
	
	return nil	
end

--[[
  fonction retournant true si la valeur 'value' est présente dans la liste des
  propriétés 'property' pour l'entité 'entity' (ou l'article courant si 'entity'
  vaut 'nil')
  retourne false sinon
]]--
function p.presence_propriete(property, value, entity)
	local args = { ["property"] = property, link = "-", displayformat = "raw" }
	if (entity ~= nil) then
		args["entity"] = entity
	end
	local res = wd.stringTable(args)
	
	-- pas de résultat, cette propriété WD est absente je présume
	if (res == nil) then
		return false
	end
	-- on parcours les résultats pour voir si celle qu'on veut est là
	for k, v in pairs(res) do
		if (v == value) then
			return true  -- trouvé
		end
	end
	return false -- pas trouvé
end

--[[
  fonction qui retourne true si un élément wikidata existe pour l'article
  courant (ou l'élément 'entity' si différent de 'nil') et false sinon
  Note : le paramètre 'entity' n'a pas de sens, c'est juste pour du test. En
         effet si on a une 'entity' c'est que ça existe…
]]--
function p.a_wikidata(entity)
	if (entity == nil) then
		if (mw.wikibase.getEntity() ~= nil) then
			return true
		else
			return false
		end
	else -- cette partie disparaitra
		if (mw.wikibase.getEntity(entity) ~= nil) then
			return true
		else
			return false
		end
	end
end


function p.traite(entity, nom)
	local ret = "Pour " .. nom .. ":<br/>"
	local t1 = p.a_wikidata(entity)
	if (t1) then
		ret = ret .. "possède une entrée WD<br/>"
		local t2 = p.presence_propriete("P31", "Q5", entity)
		if (t2) then
			ret = ret .. "c'est un être humain<br/>"
			-- suite : les métiers
			local t3 = p.propriete_parente("P106", entity)
			if (t3) then
				ret = ret .. "métier(s) (P106) trouvés : "
				ret = ret .. table.concat(t3, " / ") .. "<br/>"
			else
				ret = ret .. "pas de métiers (P106) trouvé dans la liste<br/>"
			end
		else
			ret = ret .. "ce n'est pas un être humain<br/>"
		end
	else
		ret = ret .. "n'a pas d'entrée WD<br/>"
	end
	ret = ret .. "fin test pour " .. nom .. ".<br/><br/>"
	return ret
end


function p.essai(frame)
	local ret = ""
	-- test sur l'article en cours (page de discussion)
	ret = ret .. p.traite(nil, "[[Discussion module:Essai]]") -- traite la page en cours
	ret = ret .. p.traite("Q392", "[[Bob Dylan]]") -- traite Bob Dylan

	return ret .. p.dump
end




return p