Module:Suivi des biographies

 Documentation

Utilisation

Fonctions exportables :

  • fonction(frame) – description (courte description de fonction(frame) et autres informations pertinentes).
  • fonction2() – description2 (courte description de fonction2() et autres informations pertinentes).

Autres fonctions :

  • fonction() – description2 (courte description de fonction() et autres informations pertinentes).

Modules externes et autres éléments dont ce module a besoin pour fonctionner :

  • mw.title – description (courte description expliquant la dépendance de ce module externe).

Exemples

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



--[[Module servant au modèle:Suivi des biographies.Ce module catégorise les biographies.--]]local p = {}-- module wikidatalocal wd = require 'Module:Wikidata'-- les données associéeslocal data = require "Module:Suivi des biographies/données"--[[  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' ou une table vide si rien n'est trouvé]]--function p.cherche_parents(el, prof, checked)if (prof <= 0) thenreturn nil  -- fin de récursionend-- évite de vérifier deux fois le même élémentif type(checked) ~= 'table' thenchecked = {}endif checked[el] thenreturn nilelsechecked[el] = trueend-- si l'élément courant est dans la table on le retourne (récursion)if (data.association[el] ~= nil) thenreturn elend-- si l'élément n'est pas une entity valide on quitteif not el:match( '^Q%d+$' ) thenif el:match( '^environ Q%d+$' ) thenel = el:gsub( '^environ ','' )elsereturn nilendend-- 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) doif (data.association[v] ~= nil) thenreturn v  -- trouvé, on quitteendendend-- si on arrive ici c'est qu'il n'a pas d'équivalence. On parcours-- les "sous-classe de" (P279) récursivementargs = { ["property"] = "P279", ["entity"] = el, link = "-", displayformat = "raw" }id = wd.stringTable(args)if (id ~= nil) then-- pour chaque "sur-classe" on se ré-appellelocal retfor k, v in pairs(id) doret = p.cherche_parents(v, prof-1)if (ret ~= nil) thenreturn retendendend-- ici on n'a rien trouvé → nilreturn nilend--[[  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')]]--function p.propriete_parente(property, entity)local args = { ["property"] = property, link = "-", displayformat = "raw" }local out = {} -- table des résultatsif (entity ~= nil) thenargs["entity"] = entityendlocal res = wd.stringTable(args)-- si aucun résultat on retourne nilif (type(res) ~= "table") thenreturn nilend-- 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 euxlocal checked = {}for k, v in pairs(res) do-- si l'élément est présent on l'insert directementchecked[k] = trueif (data.association[v] ~= nil) then-- bidouille pour les professions "Environ "if v:match( '^environ Q%d+$' ) thenv = v:gsub( '^environ ','' )endtable.insert(out, v)else-- on cherche "récursivement" chez les parents-- la valeur numérique est la profondeur max de recherchelocal d = p.cherche_parents(v, 10, checked)if (d ~= nil) thentable.insert(out, d)endendendreturn outend--[[  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) thenargs["entity"] = entityendlocal res = wd.stringTable(args)-- pas de résultat, cette propriété WD est absente je présumeif (res == nil) thenreturn falseend-- on parcours les résultats pour voir si celle qu'on veut est làfor k, v in pairs(res) doif (v == value) thenreturn true  -- trouvéendendreturn false -- pas trouvéendfunction p.existence_propriete(property, entity)local args = { ["property"] = property, link = "-", displayformat = "raw" }if (entity ~= nil) thenargs["entity"] = entityendlocal res = wd.stringTable(args)-- pas de résultat, cette propriété WD est absente je présumeif (res == nil) thenreturn falseendreturn true -- trouvéend-- dédoublonne le contenufunction p.dedoublonne(tbl)if (type(tbl) ~= "table") thenreturn tblendlocal out = {}local tmp = {}for k, v in ipairs(tbl) doif (tmp[v] == nil) thentable.insert(out, v)tmp[v] = trueendendreturn outend-- conversion affichage d'une liste de 'association'function p.affiche_elements(tbl)local ret = ""for k, v in ipairs(tbl) doret = ret .. data.association[v]["texte"] .. " (" .. v .. ") "endreturn retend--[[  retourne true si un élément wikidata existe pour l'article courant et false sinon]]--function p.a_wikidata()return mw.wikibase.getEntityIdForCurrentPage() ~= nilend--[[  Fonction externe (appelable) qui catégorise l'article courant en fonction de WD  Ne reçoit actuellement aucun paramètre]]--function p.categorise(frame)-- si on n'est pas dans l'espace encyclopédique on ne fait rienlocal titre = mw.title.getCurrentTitle()if ((titre == nil) or (titre.namespace ~= 0)) thenreturn ""  -- on retourne un texte vide, donc l'action est inexistanteend-- on regarde si la page a une entrée wikidatalocal awd = p.a_wikidata()if (not awd) then-- on catégorise et on quittereturn "[[Catégorie:Wikipédia:Article sans Wikidata appelant le modèle Suivi des biographies]]"end-- on regarde si c'est un humainlocal hwd = p.presence_propriete("P31", "Q5", nil)if (not hwd) then-- on catégorise et on quittereturn "[[Catégorie:Wikipédia:Article non biographique appelant le modèle Suivi des biographies]]"end-- là il faut aller plus loin et récupérer les métiers pour catégoriserlocal mwd = p.propriete_parente("P106", nil)-- si aucune réponse on le place dans "autres"if (mwd == nil) then-- on catégorise et on quittereturn "[[Catégorie:Portail:Biographie/Articles liés/Général]]"end-- on a (au moins) une réponse : on regarde ce que contient le 1er élément (le "principal")--[[ note : on pourrait faire du multi-catégorie (ne pas utiliser de else/elseif alors              mais "cumuler" diverses catégories et retourner le tout à la fin)            on pourrait aussi faire des tests plus complexes du style si militaire et pas              homme politique alors faire ci sinon si cela faire ça…]]--if (mwd[1] == "Q483501") thenreturn "[[Catégorie:Portail:Biographie/Articles liés/Culture et arts]]"elseif (mwd[1] == "Q47064") thenreturn "[[Catégorie:Portail:Biographie/Articles liés/Militaire]]"elseif (mwd[1] == "Q82955") thenreturn "[[Catégorie:Portail:Biographie/Articles liés/Politique]]"elseif (mwd[1] == "Q2066131") thenreturn "[[Catégorie:Portail:Biographie/Articles liés/Sport]]"else-- catégorie par défautreturn mwd[1]endreturn "" -- on ne devrait pas arriver iciend--[[  Fonction externe (appelable) qui catégorise l'article courant en fonction de WD  Ne reçoit actuellement aucun paramètre  version "2", avec cumul de catégories]]--function p.categoriseBiographie(frame)-- si on n'est pas dans l'espace encyclopédique on ne fait rienlocal titre = mw.title.getCurrentTitle()if ((titre == nil) or (titre.namespace ~= 0)) thenreturn ""  -- on retourne un texte vide, donc l'action est inexistanteend-- on regarde si la page a une entrée wikidatalocal awd = p.a_wikidata()if (not awd) thenreturn data.cat_badwdend-- on regarde si la page a une nature de l'élément définielocal nature = wd.formatStatements{property = 'P31', displayformat = 'raw'}if (not nature) then-- on retourne un texte vide, donc l'action est inexistantereturn ""end-- pour cumuler les éléments à retournerlocal out = data.cat_biographie-- on regarde si c'est un humain-- traitement spécifique pour les personnages humains de la Biblelocal awd2 = p.presence_propriete("P31", "Q20643955", nil)-- traitement spécifique pour les humains possiblement fictifslocal awd3 = p.presence_propriete("P31", "Q21070568", nil)if (awd2 or awd3) then-- catégorisation dans Croyance et religionreturn out .. data.cat_religionendlocal hwd = p.presence_propriete("P31", "Q5", nil)if (not hwd) then-- pas une biographiereturn nulend-- On est sur une biographie, on affine la catégorisationlocal genre = p.existence_propriete("P21", nil)if (not genre) then-- catégorisation des biographies sans genreout = out .. data.cat_nongenreend-- là il faut aller plus loin et récupérer les métiers pour catégoriserlocal mwd = p.propriete_parente("P106", nil)-- en l'absence de profession on regarde la fonctionif (mwd == nil) thenmwd = p.propriete_parente("P39", nil)end-- en l'absence de profession et de fonction on regarde le titre de noblesseif (mwd == nil) thenmwd = p.propriete_parente("P97", nil)end-- si aucune réponse on le place dans "autres"if (mwd == nil) then-- on catégorise-- traitement spécifique pour les sahabahlocal hwd3 = p.presence_propriete("P361", "Q188711", nil)-- traitement spécifique pour les saintslocal hwd7 = p.existence_propriete("P411", nil)if (hwd3 or hwd7) then-- catégorisation dans Religionout = out .. data.cat_religionelsereturn out .. data.cat_defautendelse-- on a (au moins) une réponse : on parcours chaque entrée et on cumule les catégories associéeslocal nb = 0for k, v in ipairs(mwd) do-- bidouille pour les professions "Environ "if not v:match( '^Q%d+$' ) thenif v:match( '^environ Q%d+$' ) thenv = v:gsub( '^environ ','' )endendout = out .. data.association[v]["catégorie"]nb = nb + 1end-- si 0 catégorie insérée on met celle par défautif (nb == 0) then-- traitement spécifique pour les personnages humains de la Biblelocal hwd4 = p.presence_propriete("P31", "Q20643955", nil)-- traitement spécifique pour les sahabahlocal hwd5 = p.presence_propriete("P361", "Q188711", nil)-- traitement spécifique pour les saintlocal hwd6 = p.presence_propriete("P411", "Q43115", nil)if (hwd4 or hwd5 or hdw6) then-- catégorisation dans Religionreturn out .. data.cat_religionelseout = out .. data.cat_defautendendend-- on retourne le résultat finalreturn outendreturn p