« Module:Bases » : différence entre les versions

Une page de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
la variable "label" n'est pas utilisée en dehors de ce scope "if"
si le paramètre "headername" n'a pas été renseigné, essai de récupération de la valeur dans la table "basesHeadername" ; je laisse "args.headername", ce qui permet 1) de l'utiliser pour overrider la valeur 2) d'avoir la valeur dans le cas d'un nouveau modèle de bases que l'on aurait oublié d'ajouter aux tables "bases" et "basesHeadername" de ce module ; refs à propos 212193680
 
(28 versions intermédiaires par 9 utilisateurs non affichées)
Ligne 4 : Ligne 4 :
local langue = require "Module:Langue"
local langue = require "Module:Langue"
local Outils = require "Module:Outils"
local Outils = require "Module:Outils"
local defaultMaxLang = 3


local bases = {"architecture", "art", "astronomie", "audiovisuel", "bande dessinée", "géographie", "jeu", "littérature", "mode", "musique", "organisation", "recherche", "religion", "santé", "spectacle", "sport", "tourisme", "transport", "vie publique", "vivant" }
local bases = {"architecture", "art", "astronomie", "audiovisuel", "bande dessinée", "géographie", "jeu", "jeu vidéo", "littérature", "militaire", "mode", "multidisciplinaires", "musique", "organisation", "pornographie", "recherche", "religion", "santé", "spectacle", "sport", "tourisme", "transport", "vie publique", "vivant" }
local basesHeadername = {
local basesHeadername = {
["architecture"] = "à l'architecture",
["architecture"] = "à l'architecture",
Ligne 15 : Ligne 14 :
["géographie"] = "à la géographie",
["géographie"] = "à la géographie",
["jeu"] = "au jeu",
["jeu"] = "au jeu",
["jeu vidéo"] = "au jeu vidéo",
["littérature"] = "à la littérature",
["littérature"] = "à la littérature",
["militaire"] = "aux militaires",
["mode"] = "à la mode",
["mode"] = "à la mode",
["multidisciplinaires"] = "à plusieurs domaines",
["musique"] = "à la musique",
["musique"] = "à la musique",
["organisation"] = "aux organisations",
["organisation"] = "aux organisations",
["pornographie"] = "à la pornographie",
["recherche"] = "à la recherche",
["recherche"] = "à la recherche",
["religion"] = "à la religion",
["religion"] = "à la religion",
Ligne 32 : Ligne 35 :
--- fonctions internes ---
--- fonctions internes ---


local function table_contains(array, value)
local function langs(property, frame, showfr)
local lang_set = {}
-- je n'ai pas trouvé de fonction table.contains. Pourrait être remplacé par Module:TableTools.inArray
for ii,xx in pairs(array) do
if value == xx then return true end
end
return false
end

local function langs(property, frame, showfr, maxLang)
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
-- 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é.
-- ou alors les qualificatifs de langue de la déclaration « format de l’url » de l’élément de la propriété.
Ligne 48 : Ligne 42 :
local lang = codelang:snak().datavalue.value
local lang = codelang:snak().datavalue.value
if not showfr and lang == "fr" then
if not showfr and lang == "fr" then
lang_arr = {}
lang_set = {}
break
break
else
elseif not table_contains(lang_arr, lang) then
--ne pas insérer les doublons
--ne pas insérer les doublons
lang_set[lang] = true
table.insert(lang_arr, lang)
end
end
end
end
if #lang_set > 0 then
-- TODO : à trier par ordre de nom de langue ?? table.sort
-- TODO : à trier par ordre de nom de langue ?? table.sort
lang_str = table.concat(lang_arr, "+" )
local args = {}
if lang_str ~= "" then
for k, _ in pairs(lang_set) do
lang_str = langue.indicationMultilingue{lang_str, maxLang = maxLang }
args[#args+1] = k
end
args.maxLang = 3
return langue.indicationMultilingue(args)
end
end
return lang_str
return ""
end
end


Ligne 102 : Ligne 100 :
local complet = not (frame.args.complet and frame.args.complet == "faux")
local complet = not (frame.args.complet and frame.args.complet == "faux")
local restrict = frame.args.restrict
local restrict = frame.args.restrict
local maxLang = frame.args.maxLang
local lines = {}
local lines = {}
local linesNonFr = {}
local linesNonFr = {}
-- texte d'introduction
-- 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 , "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 rapport avec " .. namebis .. ", associée à la page wikipédia dans laquelle il est appelé ou à l’'''id''' spécifique appelé 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 , "")
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 , "La liste des liens vers les bases est affichée par ordre alphabétique. Les liens vers des bases francophones sont placés en premier.")
table.insert(lines , "")
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 , "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é par le modèle.")
table.insert(lines , "")
table.insert(lines , "")
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 , "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 cible l'élément dans la base de données depuis l’'''url''' de la base, dont le contenu est rédigé dans une ou plusieurs '''langues'''.")
table.insert(lines , "")
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 , "Tout ajout ou suppression de liens dans la base doit passer par [[Wikipédia:Ateliers Bases]].")
table.insert(lines , "")
table.insert(lines , "")
table.insert(lines , "L'édition du module se fait à la page [[Module:Bases/" .. name .."]].")
table.insert(lines , "La modification du module se fait à la page [[Module:Bases/" .. name .."]].")
table.insert(lines , "")
table.insert(lines , "")
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 , "Les pages utilisant le modèle sont listées 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 , "")


Ligne 156 : Ligne 153 :
local val = base[2]
local val = base[2]
local label = wikidata.getLabel(base[2])
if complet then
if not label then
val = '<strong class="error">' .. base[2] .. ' : propriété inconnue</strong>'
elseif complet then
val = frame:expandTemplate{title='WD P', args = {propertie,'pages'} }
val = frame:expandTemplate{title='WD P', args = {propertie,'pages'} }
else
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>'
val = '[[d:P:' .. base[2] .. '|' .. base[2] ..' <small>(«&nbsp;' .. label .. '&nbsp;»)</small>]] &nbsp;→&nbsp; <small>[[:Catégorie:Page utilisant ' .. base[2] ..'|catégorie]]</small>'
end
end
local lang_str = langs and langs(base[2], frame, true, maxLang)
local lang_str = label and langs(base[2], frame, true) or ""
local subject = wikidata.formatStatements{entity = base[2], property = 'P1629'} or ''
local subject = wikidata.formatStatements{entity = base[2], property = 'P1629'} or ''
Ligne 205 : Ligne 205 :
local sortBySizeInverse = tri == "taille min"
local sortBySizeInverse = tri == "taille min"
local sortByAlpha = tri == "alphabétique"
local sortByAlpha = tri == "alphabétique"
args.noarchive = true
args.noinactifcat = true
for _, base in ipairs(bases) do
for _, base in ipairs(bases) do
if args[base] ~= "-" then
if args[base] ~= "-" then
local baseArgs = args
local baseArgs = args
baseArgs.noinactifcat = true
baseArgs.name = base
baseArgs.name = base
baseArgs.headername = basesHeadername[base]
baseArgs.headername = basesHeadername[base]
--- baseArgs.maxLang = args.maxLang
local texte, taille, len = p.main(baseArgs, true)
local texte, taille, len = p.main(baseArgs, true)
if taille then
if taille then
Ligne 271 : Ligne 272 :
local id = Outils.validTextArg(args , 'id', 'wikidata', 'entity', 1)
local id = Outils.validTextArg(args , 'id', 'wikidata', 'entity', 1)
local name = args.name
local name = args.name
local headername = args.headername
local headername = args.headername or basesHeadername[name]
local noarchive = args.noarchive
local noarchive = args.noarchive
local nocat = args.nocat or mw.title.getCurrentTitle().namespace ~= 0
local nocat = args.nocat or mw.title.getCurrentTitle().namespace ~= 0
local noinactifcat = nocat or args.noinactifcat
local noinactifcat = nocat or args.noinactifcat
local maxLang = args.maxLang or defaultMaxLang
local len = 0
local len = 0
Ligne 312 : Ligne 312 :
if value ~= "-" then
if value ~= "-" then
if value then
if value then
val = wikidata.getDataValue({snaktype = 'value', datatype = 'external-id', datavalue = {value = value } }, {urlpattern = base[3], text = texte})
val = wikidata.getDataValue({snaktype = 'value', excludespecial=true, datatype = 'external-id', datavalue = {value = value } }, {urlpattern = base[3], text = texte})
else
else
val = wikidata.formatStatements{entity = entityId, text = texte, property = base[2], urlpattern = base[3], numval = 1, addcat = not nocat, qualifier = 'P407', qualifiervalue = 'Q150'} or wikidata.formatStatements{entity = entityId, text = texte, property = base[2], urlpattern = base[3], numval = 1, addcat = not nocat}
val = wikidata.formatStatements{entity = entityId, excludespecial=true, text = texte, property = base[2], urlpattern = base[3], numval = 1, addcat = not nocat, qualifier = 'P407', qualifiervalue = 'Q150'} or wikidata.formatStatements{entity = entityId, text = texte, property = base[2], urlpattern = base[3], numval = 1, addcat = not nocat}
end
end
end
end
if val then
if val and val:sub(1, 1) ~= "-" then
local lang_str = langs and langs(base[2], frame, false, maxLang)
local lang_str = langs and langs(base[2], frame, false)


if lang_str ~= "" then
if lang_str ~= "" then
Ligne 374 : Ligne 374 :
end
end


-- XXX: c'est invalide de mettre un <ul> (block-level) dans un <span> (inline-level)
local elementsHtml = mw.html.create('span')
local elementsHtml = mw.html.create('span')
:addClass('liste-horizontale')
:addClass('liste-horizontale')
Ligne 379 : Ligne 380 :
:wikitext(title .. ' : ')
:wikitext(title .. ' : ')
:tag('ul')
:tag('ul')
for _, val in pairs(vals) do
for _, val in ipairs(vals) do
elementsHtml:tag('li'):wikitext(val):done():wikitext(' ')
elementsHtml:tag('li'):wikitext(val):done():wikitext(' ')
end
end

Dernière version du 6 février 2024 à 02:47

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

Utilisation

Ce module permet de renseigner la documentation des modèles thématiques du Projet:Bases.

Pour renseigner la documentation du modèle en insérant ou en remplaçant le contenu de la section Utilisation par (exemple donné pour le modèle {{Bases littérature}})
{{#invoke:Bases|documentation|name=littérature|headername=à la littérature|namebis=la littérature}}
<!-- L'édition du module se fait à la page [[Module:Bases/littérature]] en particulier pour l'édition des colonnes Libellé et URL. Pour renseigner la langue cliquez sur le propriété correspondante, éditez le paramètre ''format de l'URL'' et ajoutez le qualifier ''langue de l'œuvre, du nom ou du terme'' avec la ou les langues voulues.-->
Les paramètres name et headername doivent être identiques à ceux présents dans le modèle,

le paramètre namebis doit compléter la phrase bases de données en lien avec xxx

Le paramètre complet=faux enlève l'affichage du nombre de pages dans chaque catégorie, l'appel à Pagesincat étant très coûteux, ce paramètre est recommandé pour les bases importantes en taille afin de permettre leur affichage.

Exemples

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

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

local bases = {"architecture", "art", "astronomie", "audiovisuel", "bande dessinée", "géographie", "jeu", "jeu vidéo", "littérature", "militaire", "mode", "multidisciplinaires", "musique", "organisation", "pornographie", "recherche", "religion", "santé", "spectacle", "sport", "tourisme", "transport", "vie publique", "vivant" }
local basesHeadername = {
	["architecture"] = "à l'architecture",
	["art"] = "aux beaux-arts",
	["astronomie"] = "à l'astronomie",
	["audiovisuel"] = "à l'audiovisuel",
	["bande dessinée"] = "à la bande dessinée",
	["géographie"] = "à la géographie",
	["jeu"] = "au jeu",
	["jeu vidéo"] = "au jeu vidéo",
	["littérature"] = "à la littérature",
	["militaire"] = "aux militaires",
	["mode"] = "à la mode",
	["multidisciplinaires"] = "à plusieurs domaines",
	["musique"] = "à la musique",
	["organisation"] = "aux organisations",
	["pornographie"] = "à la pornographie",
	["recherche"] = "à la recherche",
	["religion"] = "à la religion",
	["santé"] = "à la santé",
	["spectacle"] = "au spectacle",
	["sport"] = "au sport",
	["tourisme"] = "au tourisme",
	["transport"] = "au transport",
	["vie publique"] = "à la vie publique",
	["vivant"] = "au vivant"
}

--- fonctions internes ---

local function langs(property, frame, showfr) 
	local lang_set = {}
	-- 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_set = {}
			break
		else
			--ne pas insérer les doublons
			lang_set[lang] = true
		end
	end
	
	if #lang_set > 0 then
		-- TODO : à trier par ordre de nom de langue ?? table.sort
		local args = {}
		for k, _ in pairs(lang_set) do
			args[#args+1] = k
		end
		args.maxLang = 3
		return langue.indicationMultilingue(args)
	end
	return ""
end

local function inBase(base, valueToFind)
	for _, v in ipairs(base) do
		if v[2] == valueToFind then
			return true
		end
	end
	return false
end

--- fonctions à ne pas utiliser dans l'espace encyclopédique ---

function p.contient(frame)
	local property = frame.args["propriété"] or frame.args.property
	local basesWithProperty = {}
	for _, base in ipairs(bases) do
		if inBase(require("Module:Bases/" .. base ), property) then
			table.insert(basesWithProperty, base)
		end
	end
	return table.concat(basesWithProperty, ",")
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 rapport avec " .. namebis .. ", associée à la page wikipédia dans laquelle il est appelé ou à l’'''id''' spécifique appelé 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ée 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é 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 cible l'élément dans la base de données depuis l’'''url''' de la base, 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 , "La modification du module se fait à la page [[Module:Bases/" .. name .."]].")
	table.insert(lines , "")
	table.insert(lines , "")
	table.insert(lines , "Les pages utilisant le modèle sont listées 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 rawtext = texte
			if type( rawtext ) == 'table' then
				rawtext = rawtext[1]
			end
			local firstletter = string.sub(rawtext , 1, 1)

			if firstletter == "'" then
				firstletter = string.sub(rawtext , 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]
			local label = wikidata.getLabel(base[2])
			if not label then
				val = '<strong class="error">' .. base[2] .. ' : propriété inconnue</strong>'
	 		elseif complet then
				val = frame:expandTemplate{title='WD P', args = {propertie,'pages'} }
			else
				val = '[[d:P:' .. base[2] .. '|' .. base[2] ..' <small>(«&nbsp;' .. label .. '&nbsp;»)</small>]] &nbsp;→&nbsp; <small>[[:Catégorie:Page utilisant ' .. base[2] ..'|catégorie]]</small>'
			end
			
			local lang_str = label and langs(base[2], frame, true) or ""
			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



--- fonctions pour l'espace encyclopédique ---

function p.tout_comme_table(frame)
	local args = Outils.extractArgs(frame)
	
	local keysPrio = {}
	local keys = {}
	local valsPrio = {}
	local vals = {}
	local valsFinal = {}
	local tri = args["tri"] or args["trie"] or args["sort"] or "none"
	local sortBySize = tri == "taille max"
	local sortBySizeInverse = tri == "taille min"
	local sortByAlpha = tri == "alphabétique"
	
	args.noarchive = true
	args.noinactifcat = true
	
	for _, base in ipairs(bases) do
		if args[base] ~= "-" then
			local baseArgs = args
			baseArgs.name = base
			baseArgs.headername = basesHeadername[base]
			local texte, taille, len = p.main(baseArgs, true)
			if taille then
				if args[base] then
					local key = args[base] * 100
					while valsPrio[key] do
						key = key+ 1
					end
					table.insert(keysPrio, key)
					valsPrio[key] = texte
				else
					local key = taille * 1000 + len
					while vals[key] do
						key = key + 1
					end
					table.insert(keys, key)
					vals[key] = texte
				end
			end
		end
	end
	
	table.sort(keysPrio)
	if sortByAlpha then
		-- ne rien faire
	elseif sortBySizeInverse then
		table.sort(keys)
	else -- par défaut : if sortBySize then
		table.sort(keys, function(a,b) return a>b end)
	end
	
	for _, k in ipairs(keysPrio) do table.insert(valsFinal, valsPrio[k]) end
	for _, k in ipairs(keys) do table.insert(valsFinal, vals[k]) end
	
	return valsFinal
end


function p.tout(frame)
	local valsFinal = p.tout_comme_table(frame)

	local rendu = table.concat(valsFinal, "\n*")
	if rendu == "" and mw.title.getCurrentTitle().namespace == 0 and not frame:getParent().args.nocat then
		return "[[Catégorie:Page utilisant un modèle Bases inactif]]"
	end
	
	-- TODO : surveiller [[phab:T280260]], et lorsque le bug sera corrigé, défaire [[Spécial:Diff/181960530]]
	-- discussion : [[Discussion Projet:Bases#Petite régression d'affichage : ligne à puce parasite]]
	
	return rendu
end

function p.main(frame , returnSize)
	local args = Outils.extractArgs(frame)

	-- Récupération des paramètres, soit ceux passés par le modèle,
	-- soit ceux passés au modèle
	local id = Outils.validTextArg(args , 'id', 'wikidata', 'entity', 1)
	local name = args.name
	local headername = args.headername or basesHeadername[name]
	local noarchive = args.noarchive
	local nocat = args.nocat or mw.title.getCurrentTitle().namespace ~= 0
	local noinactifcat = nocat or args.noinactifcat
	local len = 0
	
	-- 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 entityId = id or mw.wikibase.getEntityIdForCurrentPage() or ''
	if not (mw.wikibase.isValidEntityId(entityId) and mw.wikibase.entityExists(entityId)) then
		if noinactifcat then
			return ""
		else
			return "[[Catégorie:Page utilisant le modèle Bases " .. name .. " inactif]]"
		end
	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
		local value = args[nom] or args[base[2]]
		if value ~= "-" then
			if value then
				val = wikidata.getDataValue({snaktype = 'value', excludespecial=true, datatype = 'external-id', datavalue = {value = value } }, {urlpattern = base[3], text = texte})
			else
				val = wikidata.formatStatements{entity = entityId, excludespecial=true, text = texte, property = base[2], urlpattern = base[3], numval = 1, addcat = not nocat, qualifier = 'P407', qualifiervalue = 'Q150'} or wikidata.formatStatements{entity = entityId, text = texte, property = base[2], urlpattern = base[3], numval = 1, addcat = not nocat}
			end
		end
		
		if val and val:sub(1, 1) ~= "-" 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
			if returnSize then
				len = len + string.len(nom)
			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
		if noinactifcat then
			return ""
		else
		 	return "[[Catégorie:Page utilisant le modèle Bases " ..  name .. " inactif]]"
		end
	end
	
	-- Ajout du label si l'id wikidata a été précisé manuellement
	local entityInfo = ''
	if id then
		local label = mw.wikibase.getLabel(entityId)
		local link = wikidata.siteLink(entityId)
		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, entityId, 'identifiers')

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

	-- XXX: c'est invalide de mettre un <ul> (block-level) dans un <span> (inline-level)
	local elementsHtml = mw.html.create('span')
		:addClass('liste-horizontale')
		:addClass(noarchive and 'noarchive' or nil)
		:wikitext(title .. ' : ')
		:tag('ul')
	for _, val in ipairs(vals) do
		elementsHtml:tag('li'):wikitext(val):done():wikitext(' ')
	end

	if returnSize then
		len = len + string.len(header)
		return tostring(elementsHtml:allDone()) .. categories, #vals, len
	else
		return tostring(elementsHtml:allDone()) .. categories
	end
end

return p