Projet:Scribunto/Guide/Exemple 1

Une page de Wikipédia, l'encyclopédie libre.

Description[modifier | modifier le code]

Certains projets testent ou ont choisi de mettre le titre de certains articles en italiques (pour respecter des conventions typographiques). Le problème actuel avec les modèles est qu'il n'est pas possible de détecter la présence d'une mention d'homonymie (titre avec un éléments final entre parenthèses, donc) et qu'il ne faut pas mettre cette partie en italique − qui n'est pas concernée.
Exemple : l'article Princesse Mononoké est présenté en italique : Princesse Mononoké, ce qui peut se régler automatiquement à travers l'infobox (si "titre article" égal "nom du film" alors mettre le titre en italique). Si l'article s'était appelé Princesse Mononoké (film) (s'il existait un autre article de même nom) l'affichage correct serait : Princesse Mononoké (film). Ceci ne peut se faire directement (par exemple depuis l'infobox qui est en mesure de comparer le titre du film avec le titre de l'article) et doit donc passer par une commande spécifique du genre : {{Titre mis en forme|''Princesse Mononoké'' (film)}}.

Lua permet de gérer cela, voici une façon de le faire :

-- module Italiques sur titre
local z = {}

-- Note : utilisation de preprocess car DISPLAYTITLE doit être interprété

-- fonction principale (et unique). Paramètre à l'appel : aucun
function z.titre_mis_en_italique(frame)

  -- récupération des paramètres -> on n'a pas de paramètre
  
  -- on récupère le titre de l'article
  local titre = frame:preprocess("{{PAGENAME}}")

  -- on cherche la présence d'une "(" dans le titre
   -- retourne la position dans le texte du premier "(" trouvé
  local pos = string.find (titre, "(", 1, true)
  -- si 'nil' il n'y a pas de "(" -> tout le titre en italique
  if (nil == pos) then
    return frame:preprocess("{{DISPLAYTITLE:<i>" .. titre .. "</i>}}")
  end

  -- on récupère la partie homonymie (à partir de 'pos', donc)
  local p2 = string.sub (titre, pos, -1)
  -- on récupère le début (de 1 jusqu'à pos-1)
  local p1 = string.sub (titre, 1, pos-1)
  -- il ne faut pas mettre les italiques sur l'espace terminal (avant la "(")
  -- donc on enlève tout ce qui est "séparateur" de la fin de la chaîne
  p1 = string.gsub (p1, "[%s]*$", "")

  -- on retourne la première partie en italique, la deuxième normal, dans DISPLAYTITLE
  return frame:preprocess("{{DISPLAYTITLE:<i>" .. p1 .. "</i> " .. p2 .. "}}")
end

return z

Commentaires[modifier | modifier le code]

Remarques / explications[modifier | modifier le code]

  • frame:preprocess("{{PAGENAME}}") : accès au titre de la page courante. Il n'existe actuellement pas de méthode « interne » à Lua pour obtenir cette information (→ c'est corrigé, voir mw.title.getCurrentTitle)
  • frame:preprocess("{{DISPLAYTITLE:<i>" .. p1 .. "</i> " .. p2 .. "}}") : là on est obligé d'utiliser preprocess sinon c'est le texte {{DISPLAYTITLE:…}} qui serait affiché dans l'article. Même si c'est un « pseudo-modèle » le {{DISPLAYTITLE:}} doit être interprété par mediawiki pour remplacement par sa valeur (son effet)
  • {{DISPLAYTITLE:}} prend du code HTML, pas du code wiki (d'où les <i>)
  • on se reportera au String Manipulation du Reference Manual de Lua pour mieux comprendre les fonctions liées à string (manipulation de chaînes de caractères)

Limites de ce code[modifier | modifier le code]

  • cette fonction/ce module ne se pose aucune question : il traite simplement l'article courant et met son titre en italique en excluant la partie homonymie.
  • si on l'appelle sur une sous-page il mettra tout en italique
  • il considère qu'il y a soit aucune parenthèse soit une seule paire
  • la technique repose sur string.find qui retourne la position du caractère "(". Faire pos+1 ne marche que parce que "(" est un caractère ASCII, codé sur 1 octet. S'il s'était agit d'un caractère codé sur plus d'un octet couper à partir de pos+1 aurait retourné un « bout » de caractère invalide.

Évolutions possibles / souhaitables[modifier | modifier le code]

  • valider qu'on est dans l'espace des articles
  • recevoir en paramètre le nom théorique pour comparaison (exemple en biologie : les noms scientifiques s'écrivent en italique − pour simplifier − mais un article peut avoir comme titre le nom scientifique (auquel cas il faut mettre en italique) ou un nom « vernaculaire » c'est-à-dire en français (auquel cas il ne faut pas mettre en italiques))
  • gérer les cas tordus comme un titre entièrement entre parenthèses (auquel cas p1 dans notre code est vide, il n'y a donc pas de sens à mettre des italiques, et l'espace inséré ensuite serait de trop)