Module:Nsm/Lib/Sub
< Module:Nsm | Lib
Librairie de fonctions pour l’outil wmflabs/fr-wikiversity-ns aussi appelé Namespace monitor. Cette Bibliothèque regroupe les sous-fonctions, communes aux suivi des différents espaces de noms ; elle complète les librairies suivantes :
- la librairie Module:Nsm/Lib bibliothèque principale.
- la librairie Module:Nsm/Lib/Sortable class est responsable de la production des tableaux wikitexte.
- ns_prop
- Affiche la table des propriétés de l’espace de noms.
- ns_pages(table, filtre)
- Lit la table des pages et affiche son contenu sous forme de tableau triable. L’argument optionnel filtre permet d’indiquer le nom de(s) pages que vous souhaitez afficher.
- ns_stat_sub
- Calcul les statistiques sur les sous-pages de l’espace de noms.
…
Documentation du Module:Nsm/Lib/Sub : v · d · m · h.
--[[Librairie de fonction pour l'analyse des espaces de noms de la wikiversité]]--
function prefix(lang, label, chaine) -- REVISER principal 0... Calcul le prefixe des titres, accèpte une chaine de caractère comme 3ème argument voir dept. de rech.
local pfix = lang .. ':'
--REVISER PROVISOIRE
--or label ~= 'Principal'
-- si principal label ne vaut pas nil c'est une chaine vide ''
if label == '' then pfix = pfix else pfix = pfix .. label .. ':' end
if chaine ~= nil then pfix = pfix .. chaine end
return pfix
end
function prefix_OLD(lang, label, chaine) -- REVISER PASSER nom=motif dans cahine... Calcul le prefixe des titres, accèpte une chaine de caractère comme 3ème argument voir dept. de rech.
local pfix = lang .. ':' .. label .. ':'
if chaine ~= nil then pfix = pfix .. chaine end
return pfix
end
function redir(ns_t) --, frame, ns_id Nouvelle version étape 4 ; Vérifier ordre des condition (ne pas iterer la table si nombre ou taux). Voir split_redir pour la table des redirections.
ns_t = split_redir(ns_t) -- Filtre les pages de redirection
return ns_t
end
function redir_tx(t_prop) -- sous-fonction pour calcul du taux de redirection
local n = t_prop.redirection
local d = t_prop.total - n
local tx = n/d*100
local r = tx .. ' % ' -- Limiter affichage 2 decimales
return r
end
function split_redir(t, o) --reçoit une table retourne les pages de re-directions ; le paramètre o = '-r' retourne la liste des pages à l'exception des redirections
local redir, no_redir = {}, {}
for k, v in pairs(t) do
if v.cible == nil then no_redir[k] = t[k]
else
redir[k] = t[k]
end
end
if o == '-r' then return no_redir else return redir end
end
function pages(ns_t, motif) -- La fonction reçoit une table au format namespace monitor et un motif pour le nom des pages à filtrer
if motif ~= nil then ns_t = filtre(ns_t, motif) end -- ajoute le prefixe au filtre
return ns_t
end
-- la fonction est difficile à désactiver il faut réusir à simplifier (voir modules recherche)
function ns_pages(t, filtre) -- attend la table des pages et un filtre optionnel
local data_set = {} -- tables des résultats
for k, v in pairs(t) do -- itération de la table en entrée avec PAIRS
if filtre ~= nil then -- si filtre
match_filtre = mw.ustring.match(v.page, filtre) --USTRING test match filtre/v.page
if match_filtre ~= nil then -- Si match
data_set[k] = v -- implémente le set de données
end
else data_set[k] = v end end -- Pas de filtre implémente tout
return data_set -- retourne une table
end
-- Une fonction pour filtrer les titres de pages dans la table en entrée
-- COMMENT la fonction p.doc() utilise filtre() ; corriger la fonction pages() et déployer le filtrage sur les autres fonctions AJOUTER liste inverse et nombre de pages
function filtre(it, motif) -- it désigne la table en entrée, motif désigne l'argument utilisateur
motif = prefix(lang, label, motif) -- ajoute le prefixe Python
local to = {} -- to désigne la table en sortie (table output)
for k, v in pairs(it) do -- itéreation de la table en entrée
test = mw.ustring.match(v.page, motif) --USTRING test match filtre/v.page
if test ~= nil then -- Si le test n'est pas nul, match
to[k] = v -- implémente la table en sortie
end end
return to -- Retourne la table filtrée
end
-- A SUIVRE une fonction pour extraire la valeur Lua baseTexte à partir de la chaine Python
function nsm_base_text(page) -- A documenter !
local base_text = mw.ustring.match(page, '.*/')
return base_text
end
function split_nsep(t) -- Scinde la table des titres par nombre de séparateurs, retourne une table t_niv avec k=nsep et v=ts{titre, nsep} - (sous-fx de sort_nsep)
--local table_tri = require("Module:Lib table tri") --spairs VERIFIER SI NECESSAIRE ??
local t_niv = {} -- l'index auto désigne nsep et contient une table de noms
local ts = {} -- table reduite pour le tri
for k, v in pairs(t) do ts[v.page] = v.nsep end --table titre/nombre de séparateur
for k, v in pairs(ts) do --spairs VERIFIER SI NECESSAIRE ?? TEST SANS
if t_niv[v] == nil then -- si pas de table
t_niv[v] = {} -- créer la table
table.insert(t_niv[v], k) -- insère titre comme valeur
else -- donc la table existe
table.insert(t_niv[v], k) -- insère titre comme valeur
end end
return t_niv
end
function merge_nsep(t_niv, opt) -- Regroupe les titres par prefixe, par défaut montre les sous-pages "orphelines" de la table.
-- opt = all : ajoute les pages racines au résultat
local table_tri = require("Module:Lib table tri")
local result = {}
for niv, t_title in pairsByKeys(t_niv, function(a, b) return b < a end) do
--table.sort(t_niv, function(a, b) return b < a end) -- Provoque tri de v
--for niv, t_title in pairs(t_niv) do -- qui contient des tables
-- itération selon k ordre decroissant avec k not index auto
for ia, title in pairs(t_title) do --Boucle par Niveau = table
if t_niv[niv-1] ~= nil then -- vérifie si existe table au niveau suivant
is_sub = false -- initialise test sous-page
for ia_n, title_n in pairs(t_niv[niv - 1]) do -- Cherche niveau sup.
local s = title .. '/' -- construit patern avec separateur et compare les titres à partir du début 0
if string.match(s, title_n, 0)~= nil then is_sub = true end
end -- mw.ustring error
if is_sub == false then table.insert(result, title) end -- Ajoute dans table des resultats
else -- pas de table au niveau suivant
if opt == 'all' then table.insert(result, title) end -- Ajoute dans table des resultats si l'option all est active
end end end
return result
end
function merge_nsep_(t_niv, opt) -- Regroupe les titres par prefixe, par défaut montre les sous-pages "orphelines" de la table.
-- opt = all : ajoute les pages racines au résultat
--local table_tri = require("Module:Lib table tri")
local result = {}
local r = '' -- DEBUG
local init = 0 --mw.ustring
-- itération selon k ordre decroissant avec k not index auto
--for niv, t_title in pairsByKeys(t_niv, function(a, b) return b < a end) do
for niv, t_title in pairs(t_niv, function(a, b) return b < a end) do
--r = r..'*'..niv..tostring(t_title)..'\n'
for ia, title in pairs(t_title) do --Boucle par Niveau = table
--r = r ..': '..ia..title..'\n'
--sc_title = scribunto_title(title, lang)
base_text = nsm_base_text(title) --sc_title.baseText
--r = r ..'::'..tostring(base_text).. tostring(init)..'\n'
if t_niv[niv-1] ~= nil then -- vérifie si existe table au niveau suivant
is_sub = false -- initialise test sous-page
for ia_n, title_n in pairs(t_niv[niv - 1]) do -- Cherche niveau sup.
if title_n == base_text then --mw.ustring.match(title_n, base_text, init)
is_sub = true
--ia = ia + 1
end end
if is_sub == false then table.insert(result, title) end -- Ajoute dans table des resultats
else -- pas de table au niveau suivant
if opt == 'all' then table.insert(result, title) end -- Ajoute dans table des resultats si l'option all est active
end end end
return result -- r --
end
function group(t_pages, t_sub, frame, label) -- Affiche uniquement les groupes de pages qui contiennent des sous-pages ; groupes racine et groupes isolés.
local r = '; group() : Affiche uniquement les groupes de pages à la racine.\n'
local t_group = sub_lost(t_pages, 'all') -- Calcul groupes isolés + racines (all)
t = ns_find_subpages(t_group, t_sub) -- Calcul nombre de sous-pages
local t_group = {} -- résultats
local col = {'page', 'nsep', 'nsub'} -- Colonnes à afficher
for k, v in pairs(t) do if v.nsub ~= nil and v.nsub > 0 then t_group[k] = t[k] end
end -- Filtre les groupes contenant au moins une sous-page
r = r .. st_print(t_group, col, '-i') -- imprime le tableau
--r = r .. t_foot(frame, label) -- Ajoute le pied de page
return r
end
function ns_find_subpages(t_root, t_sub) --cherche les sous pages de la ns_table from dans la ns_table 'to' ; ajoute les paramètres subpages et nsub et retourne la table 'from'
local r = '' --DEBUG
--to = ns_subpages_only(to) --FILTRER SUBPAGES AVANT d'entrer dans la fx
for k1, v1 in pairs(t_root) do -- Itération de la table racine
--r = r ..'* '..k1.. tostring(v1.page)..'\n'
local subpages = {} -- Table pour les résultats
local motif = v1.page..'/' --prefixe des sous-pages
for k2, v2 in pairs(t_sub) do -- Itération table sous-pages
--r = r ..'* '.. tostring(v2.page)..'\n'
test = mw.ustring.match(v2.page, motif) -- ATTENTION BUG MODèLES Unclosed capture beginning at pattern character 11
if test ~= nil then -- Comparaison MW.USTRING
-- r=r..v2.page..', ' --DEBUG
table.insert(subpages, v2.page) end -- Ajoute dans résultats
end
local nsub = table.maxn(subpages)
v1['nsub'] = nsub -- RENOMMER n_sub(pages)
v1['subpages'] = subpages -- RENOMMER l_sub
end
return t_root --r --
end
function compte(t) -- Compte occurrences de la table
local compteur = 0 -- Utile lorsque table.maxn retourne total de la table
for k, v in pairs(t) do compteur = compteur + 1 end -- itération du set
return compteur -- retourne nbre d'ccurences dans le set de données
end
function scribunto_title(pywikibot_page, lang) -- Convertit page pywikibot en titre scribunto. Tronque langue et separateur
local title = mw.ustring.sub(pywikibot_page, (mw.ustring.len(lang) +1 ))
title = mw.title.new(title) -- Construit table Lua
return title -- Retourne objet titre Lua Scribunto
end
function racine(root_pages, sub_pages, frame) -- Frame/label ?
local t = root_pages
local col = {'page', 'nsep'} --, 'nsub'
local result = '; racine() : Liste les pages racines et affiche le nombre de sous-pages (nsub). \n'
if frame.args['col'] == 'nsub' then
t = ns_find_subpages(root_pages, sub_pages) -- nombre sous-pages dans nsub
table.insert(col,'nsub') end
result = result .. st_print(t, col, '-i')
--result = result .. t_foot(frame, label)
return result
end
--[[
function racine_old(ns_t, frame, label) --COMMENTER NOUVELLE VERSION !
local root_page = ns_root_only(ns_t)
local result = '; racine() : Liste les pages racines et affiche le nombre de sous-pages (nsub). \n'
local t = ns_find_subpages(root_page, ns_t) -- nombre sous-pages dans nsub
local col = {'page', 'nsep', 'nsub'}
result = result .. st_print(t, col, '-i')
result = result .. t_foot(frame, label)
return result
end
]]--
function list_to_nstable(simple_table, ns_table) --reçoit une liste simple et une table au format t_pages retourne, compare les titres et retourne la liste au format ns_table
local r = {}
for i, page in pairs(simple_table) do
for k, v in pairs(ns_table) do
if v.page == page then r[k] = ns_table[k] end end end
return r
end
function unique_v(liste) --[[ A suivre importé depuis rch - Supprime les doublons de la valeur (v) dans une table simple (k,v) ]]--
local unique = {} -- filtre le resultat dans unique
table.sort(liste) -- tri sur nom des documents
for k, v in pairs(liste) do --PAIRS
local inside = false -- Pas cherché
for ku , vu in pairs(unique) do -- Cherche
if vu == v then inside = true end end --Trouvé
if inside == false then table.insert(unique, v) end end
return unique
end
function ns_root_only(t) --filtre les pages racines d'une table au format t_pages sur la base de la valeur nsep ; retourne les pages racines
local r = {}
for k, v in pairs(t) do if v.nsep == 0 then r[k] = t[k] end end
return r
end
function ns_subpages_only(t) --filtre les pages racines d'une table au format t_pages sur la base de la valeur nsep ; retourne les sous-pages
local r = {}
for k, v in pairs(t) do if v.nsep > 0 then r[k] = t[k] end end
return r
end
--[[
function ns_find_subpages_old(from, to) --cherche les sous pages de la ns_table from dans la ns_table 'to' ; ajoute les paramètres subpages et nsub et retourne la table 'from'
--local cumul = 0
to = ns_subpages_only(to) --FILTRER SUBPAGES AVANT DE COMPARER
for k1, v1 in pairs(from) do -- Itération de la table initiale
local subpages = {} -- Table pour les sous-pages
local motif = v1.page..'/' --prefixe des sous-pages
for k2, v2 in pairs(to) do
if mw.ustring.match(v2.page, motif) ~= nil then -- MW.USTRING
table.insert(subpages, v2.page) end end
local nsub = table.maxn(subpages)
v1['nsub'] = nsub -- RENOMMER n_sub(pages)
v1['subpages'] = subpages -- RENOMMER l_sub
end
return from
end
]]--
--COMPARER avec ns_find_subpages
function chk_sub(t_mysub, t_pages) --[[RENOMMER GET_SUB reçoit une table filtrée au format t_pages, cherche les sous-pages dans la table principale et retourne la tables des sous-pages ]]--
sub_pages = {}
for kp, mypage in pairs(t_mysub) do --compare la table reçue
local patern = mypage.page .. '/'
for k, v in pairs(t_pages) do -- à la table principale
if mw.ustring.match(v.page, patern) ~= nil then sub_pages[k] = t_pages[k] end
end --copie les sous-pages de la 1ere table contenues dans la seconde
end
return sub_pages -- retourne les sous-page dans une troisième table
end
function add_subpages(from_all, to_set) --Ajoute les sous pages via la fx chk_sub.
local subt = chk_sub(to_set, from_all) -- Filtre les sous-pages
for k, v in pairs(subt) do to_set[k] = subt[k] end --copie dans la table destination
return to_set
end
function sub_lost(ns_t, opt) --[[Retourne la liste des sous-pages isolées. opt='all' indique à merge_split d'afficher également les pages racine]]--
local t_niv = split_nsep(ns_t) --place les titres dans des tables par niveaux
local result = merge_nsep(t_niv, opt) --compare les titre et retourne les pages isolées
result = list_to_nstable(result, ns_t) -- convertit au format ns_tableTEST
return result --retrourne une table à imprimer dans chaque module via p.sub_lost
end
--CATEGORY FUNCTIONS
function lnk(var) -- Test si la variable correspond à une page de catégorie
local prefix = lang .. ':Catégorie:' --CALCULER LE PREFIX LOCAL POUR NS_ID 14
-- Test pour fichier, modèle
local len_prefix = mw.ustring.len(prefix)
local lnk = ''
if mw.ustring.sub(var, 0, len_prefix) == lang..':Catégorie:' then --lang GLOBAL
lnk = '[[:' .. var .. ']]' -- Ajoute ':' pour lier une catégorie
else
lnk = '[[' .. var .. ']]' -- lien classique
end
return lnk
end
function lastrev(frame, ns_id) --NEW VER.
local data_module = table_module(ns_id)
local lastrev = frame:preprocess('{{#time: d M Y | {{REVISIONTIMESTAMP:'..data_module..'}} }}')
--local lastrev = frame:preprocess( '{{REVISIONTIMESTAMP:'..data_module..'}}' )
return lastrev
end
function t_foot(frame, ns_id)--Affiche la date de dernière MODIFICATION de la table de données RENOMMER FOOTER--
local footer = '<small>Dernière modification de la table de données : ' .. lastrev(frame, ns_id) ..'</small>'
return footer
end
function table_module(ns_id)
local table_module = "Module:Nsm/Table/"..tostring(ns_id)
return table_module
end
--[[
function lastrev_old(frame, label) --la fonction à besoin du frame et du label, elle retourne la date de dernière mise à jour de la table des données module:ns_label.
local lastrev = frame:preprocess( '{{REVISIONTIMESTAMP:Module:Ns '..label..'}}' )
return lastrev
end
function t_foot_old(frame, label) --Affiche la date de dernière MODIFICATION de la table de données RENOMMER FOOTER
local foot = '<small>Dernière modification de la table de données : ' .. lastrev(frame, label) ..'</small>'
return foot
end
]]--
function ns_prop(t) --[[Attend la table des propriétés à afficher (nombre de pages, de redir, de sous-pages, label ]]--
local r = 'Espace de noms: ' .. t.id .. ' : ' .. t.label .. '\n'
r = r .. ': Nombre total de pages: ' .. t.total .. ' ; pages racines: ' .. t.racine .. ', sous-pages :' .. t.sous_page .. '\n'
r = r .. ': Nombre de redirections: ' .. t.redirection .. '\n'
return r
end
function ns_stat_sub(t) --[[Statistiques sur le nombre de sous-page à chaque niveau.]]--
--local t_merged = ns_merge(t) -- Scinde racine/sous-page
local root_page = ns_root_only(t) -- table des pages racine --t_merged[1]
local sub_page = ns_subpages_only(t) -- table des sous-pages --t_merged[2]
local nsub_set = {} -- initialise table de séparateurs
local prop_sub = {} -- initialise table de statistiques
local count = 0 -- compteur de sous-pages
--[[chaque sous-pages du tuple copiée dans un set ; tri]]--
for sp, nsub in pairs(sub_page) do table.insert(nsub_set, nsub.nsep) end
table.sort(nsub_set)
for i, v in ipairs(nsub_set) do
if i == 1 then -- IF ONLY ONE PAGE INTO ?
count = count+1
else
u = nsub_set[i-1]
if v == nsub_set[i-1] then
count = count +1
else
prop_sub[u] = count -- niveau/nombre de sous-pages
count = 1
end end end
maxnsub=table.maxn(nsub_set) --
last_nsub = nsub_set[maxnsub]
prop_sub[last_nsub] = count --
local r = ';Nombre de sous-pages:\n'
for u, count in pairs(prop_sub) do
r = r.. '* Niveau -' .. u .. ' : ' .. count .. '\n' end
return r
end
--[[
function group_old(ns_t, frame, label) -- Nouvelle version étape 3
local r = '; group() : Affiche uniquement les groupes de pages à la racine.\n'
local t = sub_lost(ns_t, 'all') -- lost + racines (all)
t = ns_find_subpages(t, ns_t) -- nombre de sous-pages
local t_group = {} -- résultats
local col = {'page', 'nsep', 'nsub'} --Colonnes à afficher
for k, v in pairs(t) do -- Filtre les groupes
if v.nsub ~= nil and v.nsub > 0 then t_group[k] = t[k] end
end
r = r .. st_print(t_group, col, '-i') -- imprime le tableau
r = r .. t_foot(frame, label) -- Ajoute le piede de page
return r
end
function ns_groupe_old(t) --Reçoit une table de pages et retourne un jeu de trois tables dont celle des groupes. SIMPLIFIER avec ns_find_subpages, ns_split et/ou ns_merge (processus inverse) en vérifiant l'absence de sous-page orpheline...
--local t_merged = ns_merge(t) -- Sous fonction DESACTIVE
local root_page = ns_root_only(t) --t_merged[1] -- racines DESACTIVE t_merge()
local sub_page = ns_subpages_only(t) --t_merged[2] --sous-pages DESACTIVE t_merge()
local group_page = {} -- uniquement les groupes
local count_page = 0 -- compteur de pages racines
for i, v in pairs(root_page) do -- itération des pages racines
count_page = count_page +1
local pattern = v.page ..'/' -- determine le prefixe
local count_sub = 0 -- compteur de sous-pages par groupe
for i, v in pairs(sub_page) do -- pour chaque sous-page
mysub = mw.ustring.match(v.page, pattern) -- comparaison prefixe racine et sous-pages
if mysub ~= nil then -- si le prefixe correspond (not false)
count_sub = count_sub +1 -- incrémente le compteur page suivante
end end
v.n_sub = count_sub
root_page[i] = v
if count_sub > 0 then group_page[i] = v end
end
t_grouped = {root_page, sub_page, group_page}
return t_grouped
end
]]--