Module:HhakP2
Apparence
La documentation de ce module Scribunto écrit en Lua est incluse depuis sa sous-page de documentation.
local p = {}
local szCode = ''
function p.ObtenirSousChaine(szChaine, nPosDebut, szBaliseOuvrante, szBaliseFermante)
-- Dans une chaîne de caractères, trouve la sous-chaîne encadrée par la balise ouvrante
-- et la balise fermante (les deux comprises) au début de la balise ouvrante.
-- Le nombre de balises ouvrantes égale le nombre de balises fermantes.
-- Si aucune erreur, la fonction retourne la sous-chaîne et zéro.
-- Par exemple, pour " ABC <div> DEF </div> GHI" avec les balises "<div>" et </div>",
-- la fonction retourne "<div> DEF </div>" et 0.
-- Si erreur, la fonction retourne un message d'erreur et un nombre négatif.
-- Par exemple, pour " ABC <div> DEF </div" avec les balises "<div>" et </div>", la
-- fonction retourne le message d'erreur 9 et 9.
-- La fonction teste pour d'autres erreurs potentielles. Les cas répertoriés sont
-- inscrits dans les messages qui suivent.
-- Messages d'erreur
local aszErrMsg = {
[1] = "La longueur de la chaîne est nulle." ,
[2] = "La position de la balise ouvrante est négative." ,
[3] = "La position de la balise ouvrante est plus grande que la longueur de la chaîne." ,
[4] = "La taille de la balise ouvrante est nulle.",
[5] = "La taille de la balise fermante est nulle.",
[6] = "La taille de la balise ouvrante est plus grande ou égale à la longueur de la chaîne.",
[7] = "La taille de la balise fermante est plus grande ou égale à la longueur de la chaîne.",
[8] = "La taille de la chaîne de caractères est plus petite que la taille combinée des deux balises",
[9] = "Le début de la chaîne de caractères ne commence pas par la balise ouvrante.",
[10] = "Le nombre de balises ouvrantes est différent du nombre de balises fermantes."
}
local nLongueurChaine = #szChaine
local nLongueurBaliseOuvrante = #szBaliseOuvrante
local nLongueurBaliseFermante = #szBaliseFermante
local nErrMsg = 0
if nErrMsg == 0 and nLongueurChaine == 0 then nErrMsg = 1 end
if nErrMsg == 0 and nPosDebut < 1 then nErrMsg = 2 end
if nErrMsg == 0 and nPosDebut > nLongueurChaine then nErrMsg = 3 end
if nErrMsg == 0 and nLongueurBaliseOuvrante == 0 then nErrMsg = 4 end
if nErrMsg == 0 and nLongueurBaliseFermante == 0 then nErrMsg = 5 end
if nErrMsg == 0 and nLongueurBaliseOuvrante >= nLongueurChaine then nErrMsg = 6 end
if nErrMsg == 0 and nLongueurBaliseFermante >= nLongueurChaine then nErrMsg = 7 end
if nErrMsg == 0 and nLongueurChaine < (nLongueurBaliseOuvrante + nLongueurBaliseFermante) then nErrMsg = 8 end
if nErrMsg == 0 and szBaliseOuvrante ~= mw.ustring.sub(szChaine, nPosDebut, nPosDebut + nLongueurBaliseOuvrante - 1) then nErrMsg = 9 end
local nPosFin = nPosDebut + nLongueurBaliseOuvrante
local nQuant = 1
if nErrMsg == 0 then
local sz = ''
for n = nPosFin, nLongueurChaine, 1 do
-- Rechercher prochaine balise ouvrante
sz = mw.ustring.sub(szChaine, n, n + nLongueurBaliseOuvrante - 1)
if sz == szBaliseOuvrante then nQuant = nQuant + 1 end
-- Rechercher prochaine balise fermante
sz = mw.ustring.sub(szChaine, n, n + nLongueurBaliseFermante - 1)
if sz == szBaliseFermante then nQuant = nQuant - 1 end
if nQuant == 0 then break end
nPosFin = nPosFin + 1
end
if nQuant ~= 0 then nErrMsg = 10 end
end
if nErrMsg == 0 then
return nErrMsg, mw.ustring.sub(szChaine, nPosDebut, nPosFin + nLongueurBaliseFermante - 1)
else
return nErrMsg, aszErrMsg[nErrMsg]
end
end
function p.Construire( frame )
--------------------------------------------------------------------------------------------------------
-- Noter les paramètres évalués dans le code du modèle :
-- |2={{{1}}} |3={{{2}}} |4={{{di}}} |5={{{début}}} |6={{{fin}}} |7={{{long}} |8={{{3}}} (de trop)
---------------------------------------------------------------------------------------------------------
-- local nErrMsg, szSousChaine = p.ObtenirSousChaine('CCC <div AAA </div> DDD EEE', 5, '<div', '</div>')
-- if nErrMsg == 0 then
-- szCode = '--' .. string.gsub( szSousChaine, '<', '<') .. '--'
-- -- szCode = '--<nowiki>' .. szSousChaine .. '</nowiki>--'
-- else
-- szCode = 'Msg erreur : ' .. szSousChaine
-- end
local szChaine = frame.args[1]
local nDebutChaine, nFinChaine = mw.ustring.find( szChaine, '<div id="sommaire"', 1, true )
if nDebutChaine ~= nil then
local nErrMsg, szSousChaine = p.ObtenirSousChaine(szChaine, nDebutChaine, '<div', '</div>')
if nErrMsg == 0 then
-->>> szCode = '--' .. string.gsub( szSousChaine, '<', '<') .. '--'
-- szCode = '--<nowiki>' .. szSousChaine .. '</nowiki>--'
else
szCode = 'Msg erreur : ' .. szSousChaine
end
else
szCode = 'PAS trouvé'
end
return szCode
end
return p