Module:Bases

La bibliothèque libre.

La documentation pour ce module peut être créée à Module:Bases/Documentation

local p = {}
local wikidata = require "Module:Wikidata"
local wdpath = require "Module:Wikidata/Chemin"
local langue = require "Module:Langue"

local function table_contains(array, value)
-- je n'ai pas trouvé de fonction table.contains
	for ii,xx in pairs(array) do
		if value == xx then return true end
	end
	return false
end

local function langs(property, frame, showfr) 
	local lang_str = "" ;
	local lang_arr = {} ;
	-- P1629 : élément de la base de la propriété d’identification ; P407 = langue de cette oeuvre ; P305 = code IETF de la langue
	-- ou alors les qualificatifs de langue de la déclaration « format de l’url » de l’élément de la propriété. 
	for codelang in wdpath.iterate(property, "(P1629/P407|P1630>P407)/P305") do
		local lang = codelang:snak().datavalue.value
		if not showfr and lang == "fr" then
			lang_arr = {}
			break
		elseif not table_contains(lang_arr, lang) then
			--ne pas insérer les doublons
			table.insert(lang_arr, lang)
		end
	end
	
	-- TODO : à trier par ordre de nom de langue ?? table.sort
	lang_str = table.concat(lang_arr, "+" )
	if lang_str ~= "" then
		lang_str = langue.indicationMultilingue{lang_str}
	end
	return lang_str
end

function p.count(frame)
	local TableTools = require('Module:TableTools')
	local name = frame.args.name
	local bases = require("Module:Bases/" .. name)
	return TableTools.size(bases)
end

function p.documentation(frame)
	local name = frame.args.name
	local headername = frame.args.headername or name
	local namebis = frame.args.namebis or headername
	local categorie = "Page pointant vers des bases relatives " .. headername
	local bases = require("Module:Bases/" .. name)
	local pagesincat = require("Module:Pagesincat")
	local complet = not (frame.args.complet and frame.args.complet == "faux")
	local restrict = frame.args.restrict
	
	local lines = {}
	local linesNonFr = {}
	
	-- texte d'introduction
	table.insert(lines , "Modèle à utiliser principalement dans la section [[WP:LE|Liens externes]] d'une page. Il affiche une liste de liens vers des bases de données en lien avec " .. namebis .. " associée avec la page wikipédia dans lequel il est appelé ou à l’'''id''' spécifique appelée par le modèle. Le paramètre optionnel <code>id=</code> peut être utilisé pour désigner un élément Wikidata autre que celui de la page de Wikipédia où le modèle est employé.")
	table.insert(lines , "")
	table.insert(lines , "La liste des liens vers les bases est affichées par ordre alphabétique. Les liens vers des bases francophones sont placés en premier.")
	table.insert(lines , "")
	table.insert(lines , "La liste est générée automatiquement à partir des données de l'élément Wikidata relié à la page ou à l’'''id''' spécifique appelée par le modèle.")
	table.insert(lines , "")
	table.insert(lines , "")
	table.insert(lines , "Les liens affichables par la base  " .. name .. " sont chacune des '''propriétés''' du tableau. Le '''sujet''' de ces bases est le lien vers la page wikipédia associée à cette base, ou par défaut d'un wiki d'une autre langue quand il existe. Le modèle ciblent l'élément dans la base de données depuis l’'''url''' de la bases dont le contenu est rédigé dans une ou plusieurs '''langues'''.")
	table.insert(lines , "")
	table.insert(lines , "Tout ajout ou suppression de liens dans la base doit passer par [[Wikipédia:Ateliers Bases]].")
	table.insert(lines , "")
	table.insert(lines , "L'édition du module se fait à la page [[Module:Bases/" .. name .."]].")
	table.insert(lines , "")
	table.insert(lines , "")
	table.insert(lines , "Les pages utilisant le modèle tombent dans la catégorie [[:Catégorie:" .. categorie .. "|" .. categorie .. "]], qui contient actuellement " .. pagesincat.pagesincat{categorie, type='pages', mise_en_forme='oui'} .. " pages.")
	table.insert(lines , "")

	table.insert(lines , '{| class="wikitable"')
	table.insert(lines , '|-')
	table.insert(lines , '! Propriété')
	table.insert(lines , '! Sujet')
	table.insert(lines , '! Libellé')
	table.insert(lines , '! URL')
	table.insert(lines , '! Langue')
	
	for i, base in pairs(bases) do
		local texte = base[1]
		
		local found
		if restrict ~= nil then
			local firstletter = string.sub(texte, 1, 1)

			if firstletter == "'" then
				firstletter = string.sub(texte, 3, 3)
			end
			found = string.find(restrict, string.upper(firstletter))
		end
		
		if restrict == nil or found ~= nil then

			if type( texte ) == 'table' then
				texte = langue.langue{texte[2], texte = texte[1]}
			end
			local propertie = string.sub(base[2], 2)
			
			local val = base[2]
	 		if complet then
				val = frame:expandTemplate{title='WD P', args = {propertie,'pages'} }
			else
				val = '[[d:P:' .. base[2] .. '|' .. base[2] ..' <small>(«&nbsp;' .. wikidata.getLabel(base[2]) .. '&nbsp;»)</small>]] &nbsp;→&nbsp; <small>[[:Catégorie:Page utilisant ' .. base[2] ..'|catégorie]]</small>'
			end
			
			local lang_str = langs and langs(base[2], frame, true)
			local subject = wikidata.formatStatements{entity = base[2], property = 'P1629'} or ''
			
			if string.find(lang_str, "fr") ~= nil then
				table.insert(lines , '|-')
				table.insert(lines , '| ' .. val)
				table.insert(lines , '| ' .. subject)
				table.insert(lines , '| ' .. texte)
				table.insert(lines , '| ' .. base[3])
				table.insert(lines , '| ' .. lang_str )
			else
				table.insert(linesNonFr , '|-')
				table.insert(linesNonFr , '| ' .. val)
				table.insert(linesNonFr , '| ' .. subject)
				table.insert(linesNonFr , '| ' .. texte)
				table.insert(linesNonFr , '| ' .. base[3])
				table.insert(linesNonFr , '| ' .. lang_str )
			end
		end
	end
	-- fusion de bases fr en 1er, puis des autres bases
	for i, v in ipairs(linesNonFr) do table.insert(lines, v) end
	table.insert(lines , '|}')
	
	return table.concat(lines, "\n" )
end

function p.main(frame)
	local frameArgs = frame.args
	local parentArgs = frame:getParent().args
	
	-- Récupération des paramètres, soit ceux passés par le modèle,
	-- soit ceux passés au modèle
	local id = frameArgs.id
	local name = frameArgs.name
	local headername = frameArgs.headername
	local noarchive = frameArgs.noarchive
	if parentArgs.id then
		id = parentArgs.id
	end
	
	-- Chargement des données de la base souhaitée
	local bases = require("Module:Bases/" .. name)

	-- Récupération des propriétés wikidata de l'entité sélectionné
	local entity = mw.wikibase.getEntityObject(id)
	if not entity then
		return "[[Catégorie:Page utilisant le modèle Bases " .. name .. " inactif]]"
	end
	
	-- Pour chaque base dans notre liste, on vérifie si notre entité la possède
	-- si c'est le cas, on formate et ajoute un lien vers elle dans une liste
	local vals = {}
	local valsNonFr = {}
	for i, base in pairs(bases) do
		-- Pour gérer les cas comme sur Module:Bases/art où des tables sont dans
		-- des tables => langue du titre de la base pour l'accessibilité
		local nom
		local texte
		if type( base[1] ) == 'table' then
			nom = base[1][1]
			texte = langue.langue{ base[1][2], texte = base[1][1] }
		else
			nom = base[1]
			texte = base[1]
		end
		
		local val = wikidata.formatStatements{entity = entity, text = texte, property = base[2], urlpattern = base[3], numval = 1, addcat = true, qualifier = 'P407', qualifiervalue = 'Q150', value = parentArgs[nom] or parentArgs[base[2]]} or wikidata.formatStatements{entity = entity, text = texte, property = base[2], urlpattern = base[3], numval = 1, addcat = true, value = parentArgs[nom] or parentArgs[base[2]]}
		
		if val then
			local lang_str = langs and langs(base[2], frame, false)

			if lang_str ~= "" then
				table.insert(valsNonFr, lang_str .. "&nbsp;" .. val)
			else
				table.insert(vals, val)
			end
		end
	end
	-- fusion de bases fr en 1er, puis des autres bases
	for i, v in ipairs(valsNonFr) do table.insert(vals, v) end
	
	-- On catégorise si l'entité ne possède aucune des bases listés
	if #vals == 0 then
		return "[[Catégorie:Page utilisant le modèle Bases " ..  name .. " inactif]]"
	end
	
	-- Ajout du label si l'id wikidata a été précisé manuellement
	local entityInfo = ''
	if id and entity then --Has "entity" parameter, Wikidata item was found
		local label = entity:getLabel()
		local link= wikidata.siteLink(entity)
		if label then
			if link then
				entityInfo = ' (pour [[' .. link .. '|' .. label  .. ']])'
			else
				entityInfo = ' (pour ' .. label  .. ')'
			end
		elseif link then
			entityInfo = ' (pour [[' .. link .. ']])'
		end
	end
	
	-- Concaténation des liens et formatage final
	local header = ''
	if #vals > 1 then
		header = "Ressources relatives " .. headername .. entityInfo
	else
		header = "Ressource relative " .. headername .. entityInfo
	end
	local title = wikidata.addLinkBack(header, entity, 'identifiers')

	-- Ajout des catégories qui vont bien
	local categories = "[[Catégorie:Page pointant vers des bases externes]] [[Catégorie:Page pointant vers des bases relatives " .. headername .. "]]"

	local elementsHtml = mw.html.create('span')
		:addClass('liste-horizontale')
		:addClass(noarchive and 'noarchive' or nil)
		:wikitext(title .. ' : ')
		:tag('ul')
	for _, val in pairs(vals) do
		elementsHtml:tag('li'):wikitext(val):done()
	end

	return tostring(elementsHtml:allDone()) .. categories
end

return p