Module:Bases/Bac à sable
Utilisation
[modifier le code]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.-->
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
[modifier le code]Pour des exemples, voir la page de test permettant de tester diverses modifications apportées.
La documentation de ce module est générée par le modèle {{Documentation module}}.
Elle est incluse depuis sa sous-page de documentation. Veuillez placer les catégories sur cette page-là.
Les éditeurs peuvent travailler dans le bac à sable (modifier).
Voir les statistiques d'appel depuis le wikicode sur l'outil wstat et les appels depuis d'autres modules.
local p = {}
local wikidata = require "Module:Wikidata"
local wdpath = require "Module:Wikidata/Chemin"
local langue = require "Module:Langue"
local Outils = require "Module:Outils"
local defaultMaxLang = 3
local bases = {"architecture", "art", "astronomie", "audiovisuel", "bande dessinée", "géographie", "jeu", "littérature", "mode", "multidisciplinaires", "musique", "organisation", "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",
["littérature"] = "à la littérature",
["mode"] = "à la mode",
["multidisciplinaires"] = "multidisciplinaires",
["musique"] = "à la musique",
["organisation"] = "aux organisations",
["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 table_contains(array, value)
-- 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
-- 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, maxLang = maxLang }
end
return lang_str
end
local function inBase(base, valueToFind)
for _, v in ipairs(base) do
if v[2] == valueToFind then
return true
end
end
return false
end
local function get_url_differentes(baseName)
local url_differentes = {}
local basei = require("Module:Bases/" .. baseName)
for _, v in ipairs(basei) do
local p = v[2]
local url = v[3]
local wdurls = wikidata.stringTable{entity = p, property = 'P1630', ucfirst = '-', rank = 'valid'}
local found = false
if url == '$1' and not wdurl then
found = true
end
for _, wdurl in ipairs(wdurls) do
if url == wdurl then
found = true
end
end
if not found then
v[4] = table.concat(wdurls, "\n")
table.insert(url_differentes , v )
end
end
return url_differentes
end
--- fonctions à ne pas utiliser dans l'espace encyclopédique ---
function p.check_url(frame)
local baseName = frame.args[1]
local url_differentes = get_url_differentes(baseName)
local lines = {}
table.insert(lines , '{| class="wikitable"')
table.insert(lines , '|-')
table.insert(lines , '! Propriété')
table.insert(lines , '! URL')
table.insert(lines , '! URL sur Wikidata')
for _, v in ipairs(url_differentes) do
table.insert(lines , '|-')
table.insert(lines , '| ' .. frame:expandTemplate{title='WD P', args = {v[2]} })
table.insert(lines , '| ' .. v[3])
if v[4] then
table.insert(lines , '| ' .. v[4])
end
end
table.insert(lines , '|}')
return table.concat(lines, "\n" )
end
function p.requete_suivi_bases(frame)
local ids = {}
for _, base in ipairs(bases) do
local base_ids = require("Module:Bases/" .. base )
for _, base_id in ipairs(base_ids) do
ids[#ids + 1] = "wd:" .. base_id[2]
end
end
requete =[[
select ?item ?itemLabel ?format_url {
values ?item { $propertys }
?item wdt:P1630 ?format_url .
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
} order by desc(?item)
]]
local p_ids = table.concat(ids, " ")
local requete, n = requete:gsub( "$propertys", p_ids)
return requete
end
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 maxLang = frame.args.maxLang
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 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]
if complet then
val = frame:expandTemplate{title='WD P', args = {propertie,'pages'} }
else
val = '[[d:P:' .. base[2] .. '|' .. base[2] ..' <small>(« ' .. wikidata.getLabel(base[2]) .. ' »)</small>]] → <small>[[:Catégorie:Page utilisant ' .. base[2] ..'|catégorie]]</small>'
end
local lang_str = langs and langs(base[2], frame, true, maxLang)
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"
for _, base in ipairs(bases) do
if args[base] ~= "-" then
local baseArgs = args
baseArgs.noinactifcat = true
baseArgs.name = base
baseArgs.headername = basesHeadername[base]
--- baseArgs.maxLang = args.maxLang
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 entity = Outils.validTextArg(args , 'id', 'wikidata', 'entity', 1)
local name = args.name
local headername = args.headername
local noarchive = args.noarchive
local nocat = args.nocat or mw.title.getCurrentTitle().namespace ~= 0
local noinactifcat = nocat or args.noinactifcat
local maxLang = args.maxLang or defaultMaxLang
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é
entity = entity or mw.wikibase.getEntityIdForCurrentPage() or ''
if not mw.wikibase.isValidEntityId(entity) 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', datatype = 'external-id', datavalue = {value = value } }, {urlpattern = base[3], text = texte})
else
val = wikidata.formatStatements{entity = entity, text = texte, property = base[2], urlpattern = base[3], numval = 1, addcat = not nocat, qualifier = 'P407', qualifiervalue = 'Q150'} or wikidata.formatStatements{entity = entity, text = texte, property = base[2], urlpattern = base[3], numval = 1, addcat = not nocat}
end
end
if val then
local lang_str = langs and langs(base[2], frame, false, maxLang)
if lang_str ~= "" then
table.insert(valsNonFr, lang_str .. " " .. 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 = ''
local label = mw.wikibase.getLabel(entity)
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
-- Concaténation des liens et formatage final
local header = ''
if #vals > 1 then
if headername == "multidisciplinaires" then
header = "Ressources multidisciplinaires " .. entityInfo
else
header = "Ressources relatives " .. headername .. entityInfo
end
else
if headername == "multidisciplinaires" then
header = "Ressource multidisciplinaire " .. entityInfo
else
header = "Ressource relative " .. headername .. entityInfo
end
end
local title = wikidata.addLinkBack(header, entity, '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
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():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