Documentation du module [voir] [modifier] [purger]
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, '<', '&lt;') .. '--'
--    -- 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, '<', '&lt;') .. '--'
      -- szCode = '--<nowiki>' .. szSousChaine .. '</nowiki>--'
    else
      szCode = 'Msg erreur : ' .. szSousChaine
    end
  else
    szCode = 'PAS trouvé'
  end

  return szCode
end

return p