Module:Bases
La documentation pour ce module peut être créée à Module:Bases/doc
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", "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 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 --- 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 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 rapport avec " .. namebis .. ", associée à la page wikipédia dans lequel 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] 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" 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] --- 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 id = 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é 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, 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 = '' 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