Des modèles aux modules :
introduction au langage Lua


© NASA, DP
User:Arkanosis — WikiConvention francophone 2017

Où tester ?


© besopha, CC-BY 2.0

  • Remplacer « Modèle: » par « Template: »

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèle ?


© US Works Progress Administration, DP

  • Code wiki réutilisable
  • … dans autant de pages que souhaité
  • … y compris dans d'autres modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèle


Bonjour Strasbourg !
							
Modèle:WCFR17_Bonjour (wikicode)

{{WCFR17_Bonjour}}
							
Test (wikicode)

Bonjour Strasbourg !
							
Test (HTML)
  • Simple à écrire
  • Simple à utiliser
  • On parle de « transclusion »

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèle

  • On peut transclure n'importe quelle page, pas seulement un modèle

Bonjour Strasbourg !
							
WCFR17_Bonjour (wikicode)

{{:WCFR17_Bonjour}}
							
Test (wikicode)

Bonjour Strasbourg !
							
Test (HTML)
  • … même une page spéciale (si, si !)

=== Trois nouvelles pages ===

{{Spécial:Nouvelles pages/3}}

=== Three new pages ===

{{Special:Newpages/3}}
							
Test (wikicode)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles


{{quantité}} 
						
Test (wikicode)

{{Discussion_utilisateur:Jimbo Wales}} 
						
Test (wikicode)

{{:Jimbo Wales}} 
						
Test (wikicode)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles


{{{valeur}}} 
						
Modèle:Quantité (wikicode)

{{{valeur|42}}} 
						
Modèle:Quantité (wikicode)

{{{valeur|}}} 
						
Modèle:Quantité (wikicode)

{{quantité|valeur=2017}} 
						
Test (wikicode)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles


{{{valeur}}} 
						
Modèle:Quantité (wikicode)

{{{valeur|42}}} 
						
Modèle:Quantité (wikicode)

{{{valeur|}}} 
						
Modèle:Quantité (wikicode)

{{quantité}} 
						
Test (wikicode)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles


{{{valeur}}} 
						
Modèle:Quantité (wikicode)

{{{valeur|42}}} 
						
Modèle:Quantité (wikicode)

{{{valeur|}}} 
						
Modèle:Quantité (wikicode)

{{ {{{valeur}}} }} 
						
Modèle:Quantité (wikicode)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Parser functions


{{#if: | quelque chose | rien}}
{{#if: truc | quelque chose | rien}}
							
Test (wikicode)

rien
quelque chose
							
Test (HTML)

{{#ifexpr: 1 = 2 | Ça alors ! | Ah ben non !}}
{{#ifexpr: 0 = 0 | La tête à toto | Autre chose}}
							
Test (wikicode)

Ah ben non !
La tête à toto
							
Test (HTML)

{{#ifexist: Utilisateur:Arkanosis
 | J'existe
 | Je n'existe pas }}
							
Test (wikicode)

J'existe
							
Test (HTML)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

strlen

  • Compter le nombre de lettres d'une chaîne de caractères
  • Ajout de fonctionnalité refusé par les développeurs

{{
#ifeq: x{{{1}}}|x{{padleft:{{{1}}}|20}}
| {{#ifeq: x{{{1}}}|x{{padleft:{{{1}}}|30}}
  | {{#ifeq: x{{{1}}}|x{{padleft:{{{1}}}|40}}
    | {{#switch: x{{{1}}}
      | {{padleft:|41|x{{{1}}}}} = 40
      | {{padleft:|42|x{{{1}}}}} = 41
      | {{padleft:|43|x{{{1}}}}} = 42
      | {{padleft:|44|x{{{1}}}}} = 43
      | {{padleft:|45|x{{{1}}}}} = 44
      | {{padleft:|46|x{{{1}}}}} = 45
      | {{padleft:|47|x{{{1}}}}} = 46
      | {{padleft:|48|x{{{1}}}}} = 47
      | {{padleft:|49|x{{{1}}}}} = 48
      | {{padleft:|50|x{{{1}}}}} = 49
      | {{padleft:|51|x{{{1}}}}} = 50
      | {{padleft:|52|x{{{1}}}}} = 51
      | {{padleft:|53|x{{{1}}}}} = 52
      | {{padleft:|54|x{{{1}}}}} = 53
      | {{padleft:|55|x{{{1}}}}} = 54
      | {{padleft:|56|x{{{1}}}}} = 55
      | {{padleft:|57|x{{{1}}}}} = 56
      | {{padleft:|58|x{{{1}}}}} = 57
      | {{padleft:|59|x{{{1}}}}} = 58
      | {{padleft:|60|x{{{1}}}}} = 59
      | {{padleft:|61|x{{{1}}}}} = 60
      | {{padleft:|62|x{{{1}}}}} = 61
      | {{padleft:|63|x{{{1}}}}} = 62
      | {{padleft:|64|x{{{1}}}}} = 63
      | {{padleft:|65|x{{{1}}}}} = 64
      | {{padleft:|66|x{{{1}}}}} = 65
      | {{padleft:|67|x{{{1}}}}} = 66
      | {{padleft:|68|x{{{1}}}}} = 67
      | {{padleft:|69|x{{{1}}}}} = 68
      | {{padleft:|70|x{{{1}}}}} = 69
      | {{padleft:|71|x{{{1}}}}} = 70
      | #default= {{{extra|-1}}} 
      }}
    | {{#switch: x{{{1}}}
      | {{padleft:|31|x{{{1}}}}} = 30
      | {{padleft:|32|x{{{1}}}}} = 31
      | {{padleft:|33|x{{{1}}}}} = 32
      | {{padleft:|34|x{{{1}}}}} = 33
      | {{padleft:|35|x{{{1}}}}} = 34
      | {{padleft:|36|x{{{1}}}}} = 35
      | {{padleft:|37|x{{{1}}}}} = 36
      | {{padleft:|38|x{{{1}}}}} = 37
      | {{padleft:|39|x{{{1}}}}} = 38
      | #default= 39
      }}
    }}
  | {{#switch: x{{{1}}}
    | {{padleft:|21|x{{{1}}}}} = 20
    | {{padleft:|22|x{{{1}}}}} = 21
    | {{padleft:|23|x{{{1}}}}} = 22
    | {{padleft:|24|x{{{1}}}}} = 23
    | {{padleft:|25|x{{{1}}}}} = 24
    | {{padleft:|26|x{{{1}}}}} = 25
    | {{padleft:|27|x{{{1}}}}} = 26
    | {{padleft:|28|x{{{1}}}}} = 27
    | {{padleft:|29|x{{{1}}}}} = 28
    | #default= 29
    }}
  }}
| {{#ifeq: x{{{1}}}|x{{padleft:{{{1}}}|10}}
  | {{#switch: x{{{1}}}
    | {{padleft:|18|x{{{1}}}}} = 17
    | {{padleft:|19|x{{{1}}}}} = 18
    | {{padleft:|17|x{{{1}}}}} = 16
    | {{padleft:|20|x{{{1}}}}} = 19
    | {{padleft:|16|x{{{1}}}}} = 15
    | {{padleft:|15|x{{{1}}}}} = 14
    | {{padleft:|14|x{{{1}}}}} = 13
    | {{padleft:|13|x{{{1}}}}} = 12
    | {{padleft:|12|x{{{1}}}}} = 11
    | #default= 10 
     }}
  | {{#switch: x{{{1}}}
    | {{padleft:|10|x{{{1}}}}} = 9
    | {{padleft:|9|x{{{1}}}}} = 8
    | {{padleft:|8|x{{{1}}}}} = 7
    | {{padleft:|7|x{{{1}}}}} = 6
    | {{padleft:|6|x{{{1}}}}} = 5
    | {{padleft:|5|x{{{1}}}}} = 4
    | {{padleft:|4|x{{{1}}}}} = 3
    | {{padleft:|3|x{{{1}}}}} = 2
    | #default= 1
    }}
  }}
}}{{documentation}}

[[Category:Templates|{{PAGENAME}}]]

						
Template:Strlen_quick (wikicode), © Wikid77, CC-BY-SA 3.0

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

strlen


{{{{{|safesubst:}}}#ifeq: x{{{{{|safesubst:}}}#if:x|{{{1|}}}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| 500 }}   
| 500
| {{{{{|safesubst:}}}str len/core   
  |{{{{{|safesubst:}}}#if:x|{{{1|}}}}}
  | {{{{{|safesubst:}}}str len/core   
    |{{{{{|safesubst:}}}#if:x|{{{1|}}}}}
    | {{{{{|safesubst:}}}str len/core   
      |{{{{{|safesubst:}}}#if:x|{{{1|}}}}}
      | | hundreds
      }}| tens
    }}| ones
  }}
}}

{{documentation}}




{{historical}}{{{{{|safesubst:}}}#switch: {{{3|}}}

| hundreds =   
{{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| 100 }}  
| {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| 200 }}
  | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| 300 }}
    | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| 400 }}
      | 4
      | 3
      }}
    | 2
    }}
  | 1
  }}
|   
}}

| tens =   
{{{2|}}}{{
{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}10 }}  
| {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}20 }}
  | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}30 }}
    | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}40 }}
      | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}60 }}
        | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}80 }}
          | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}90 }}
            | 9
            | 8
            }}
          | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}70 }}
            | 7
            | 6
            }}
          }}
        | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}50 }}
          | 5
          | 4
          }}
        }}
      | 3
      }}
    | 2
    }}
  | 1
  }}
| {{{{{|safesubst:}}}#if:{{{2|}}}|0}}   
}}

| ones =   
{{{2|}}}{{
{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}4 }}  
| {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}6 }}
  | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}8 }}
    | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}9 }}
      | 9
      | 8
      }}
    | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}7 }}
      | 7
      | 6
      }}
    }}
  | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}5 }}
    | 5
    | 4
    }}
  }}
| {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}2 }}
  | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}3 }}
    | 3
    | 2
    }}
  | {{{{{|safesubst:}}}#ifeq: x{{{1|}}} | x{{{{{|safesubst:}}}padleft:{{{1|}}}| {{{2|}}}1 }}
    | 1
    | 0
    }}
  }}
}}

}}
{{documentation}}



						
Template:Str len, Template:Str len/core (wikicode), © Dragons flight et al., CC-BY-SA 3.0

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

© 0x010C, CC-BY-SA 4.0

Performances

  • Parser certains modèles peut prendre 20~30 secondes
  • À défaut de cache, faire le rendu d'une page peut prendre des minutes
  • Le cache donne parfois des résultats « faux » (exemple : références)
  • Limitation nécessaire du nombre de transclusions par page
  • Les administrateurs système doivent tirer la sonnette d'alarme


© Alex Gorzen, CC-BY-SA 2.0

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèles : conclusion

  • La complexité du code augmente avec celle de la fonctionnalité
    • Facile pour les choses simples
    • Difficile pour les choses modérément complexes
    • Impossible pour les choses complexes


© Picknick, CC-BY-SA 4.0

  • Écriture seule (write-only)
  • … et en plus, c'est lent !

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

© Warner Bros, DP
© Auteur inconnu

Lua ?


© Alexandre Nakonechnyj & Lua-Team, DP

  • Langage de programmation inventé en 1993
  • « Lune » en portugais (auteurs brésiliens)
  • Licence permissive (MIT)
  • Léger, facile à intégrer
    • … dans les jeux vidéos (WoW, FarCry…)
    • … dans le gestionnaire de fenêtres Awesome
    • … et dans MediaWiki !

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Pourquoi pas PHP, JavaScript ou Python ?


© Colin Viebrock, CC-BY-SA 4.0


© Chris Williams, DP


© Tango! project, CC-BY-SA 3.0

  • Plus facile à intégrer que PHP et JavaScript
  • Plus performant que PHP et Python
  • Limitation possible de la mémoire et du processeur utilisés
  • Limitation des risques de sécurité
  • Facile à apprendre (ressemble un peu à JavaScript)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Scribunto

  • Extension pour MediaWiki
  • « Qu'ils écrivent » en latin (auteurs ita… non, aucun rapport)
  • Développée par VasilievVV (vvv) et Tim Starling
  • Conçue en 2012 et déployée en 2013


© Dragons flight, CC-BY-SA 3.0

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Scribunto

  • Éditeur de code (Ace)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Scribunto

  • Éditeur de code (Ace)
  • … à tendance IDE

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Scribunto

  • Éditeur de code (Ace)
  • … à tendance IDE
  • … avec debugger

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Scribunto

  • Éditeur de code (Ace)
  • … à tendance IDE
  • … avec debugger
  • … et backtraces

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

© Oliver Merkel, CC-BY-SA 3.0

Bonjour monde !


Bonjour Strasbourg !
							
Modèle:Bonjour_monde (wikicode)

{{Bonjour monde}}
							
Test (wikicode)

Bonjour Strasbourg !
							
Test (HTML)

local p = {}

function p.bonjour()
    return 'Bonjour Strasbourg !'
end

return p
							
Module:Bonjour_monde (Lua)

{{#invoke:Bonjour monde|bonjour}}
							
Test (wikicode)

Bonjour Strasbourg !
							
Test (HTML)
  • Intérêt discutable pour les cas simples

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Bonjour $MONDE !


Bonjour {{{qui}}} !
							
Modèle:Bonjour (wikicode)

{{Bonjour|qui=Strasbourg}}
							
Test (wikicode)

Bonjour Strasbourg !
							
Test (HTML)

local p = {}

function p.bonjour(frame)
    return 'Bonjour ' .. frame.args.qui .. ' !'
end

return p
							
Module:Bonjour (Lua)

{{#invoke:Bonjour
 |bonjour
 |qui= Strasbourg }}
							
Test (wikicode)

Bonjour Strasbourg !
							
Test (HTML)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Bonjour $1 !


Bonjour {{{1}}} !
							
Modèle:Bonjour (wikicode)

{{Bonjour|Strasbourg}}
							
Test (wikicode)

Bonjour Strasbourg !
							
Test (HTML)

local p = {}

function p.bonjour(frame)
    return 'Bonjour ' .. frame.args[1] .. ' !'
end

return p
							
Module:Bonjour (Lua)

{{#invoke:Bonjour
 |bonjour
 |Strasbourg}}
							
Test (wikicode)

Bonjour Strasbourg !
							
Test (HTML)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Bonjour $MONDE et $1 !


Bonjour {{{qui}}} de {{{1}}} !
							
Modèle:Bonjour (wikicode)

{{Bonjour
 |qui=les wikimédiens
 |Strasbourg}}
							
Test (wikicode)

Bonjour les wikimédiens de Strasbourg !
							
Test (HTML)

local p = {}

function p.bonjour(frame)
    return 'Bonjour ' .. frame.args.qui .. ' de ' .. frame.args[1] .. ' !'
end

return p
							
Module:Bonjour (Lua)

{{#invoke:Bonjour
 |bonjour
 |qui=les wikimédiens
 |Strasbourg}}
							
Test (wikicode)

Bonjour les wikimédiens de Strasbourg !
							
Test (HTML)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Bonjour $MONDE et $1 !


local p = {}

function p.bonjour(frame)
    return 'Bonjour ' .. frame.args.qui .. ' de ' .. frame.args[1] .. ' !'
end

return p
							
Module:Bonjour (Lua)

{{#invoke:Bonjour
 |bonjour
 |qui= {{{qui}}}
 |{{{1}}} }}
							
Modèle:Bonjour (wikicode)

{{Bonjour
 |qui=les wikimédiens
 |Strasbourg}}
							
Test (wikicode)

Bonjour les wikimédiens de Strasbourg !
							
Test (HTML)
  • Transparent pour l'utilisateur
  • Un peu verbeux

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Bonjour $@ !


local p = {}

function p.bonjour(frame)
    return 'Bonjour ' .. frame:getParent().args.qui .. ' de ' .. frame:getParent().args[1] .. ' !'
end

return p
							
Module:Bonjour (Lua)

{{#invoke:Bonjour|bonjour}}
							
Modèle:Bonjour (wikicode)

{{Bonjour
 |qui=les wikimédiens
 |Strasbourg}}
							
Test (wikicode)

Bonjour les wikimédiens de Strasbourg !
							
Test (HTML)
  • Transparent pour l'utilisateur
  • Transparent pour le modèle

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

© AfricanInformer, DP

Variables locales


local p = {}

function p.bonjour(frame)
    return 'Bonjour ' .. frame:getParent().args.qui .. ' de ' .. frame:getParent().args[1] .. ' !'
end

return p
							
Module:Bonjour (Lua)

local p = {}

function p.bonjour(frame)
    local args = frame:getParent().args
    return 'Bonjour ' .. args.qui .. ' de ' .. args[1] .. ' !'
end

return p
							
Module:Bonjour (Lua)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Fonctions multiples


local p = {}

function p.bonjour(frame)
    local args = frame:getParent().args
    return 'Bonjour ' .. args.qui .. ' de ' .. args[1] .. ' !'
end

function p.salut(frame)
    local args = frame:getParent().args
    return 'Salut ' .. args.qui .. ' de ' .. args[1] .. ' !'
end

return p
							
Module:Bonjour (Lua)

{{#invoke:Bonjour|salut}}
							
Modèle:Bonjour (wikicode)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Fonctions locales


local p = {}

local function internal(frame, mot)
    local args = frame:getParent().args
    return mot .. ' ' .. args.qui .. ' de ' .. args[1] .. ' !'
end

function p.bonjour(frame)
    return internal(frame, 'Bonjour')
end

function p.salut(frame)
    return internal(frame, 'Salut')
end

return p
							
Module:Bonjour (Lua)
  • Réduit la redondance
  • Facilite les corrections et améliorations

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Import de modules


local p = {}

function p.message(frame, mot)
    local args = frame:getParent().args
    return mot .. ' ' .. args.qui .. ' de ' .. args[1] .. ' !'
end

return p
							
Module:Message (Lua)

local p = {}

local internal = require('Module:Message')

function p.bonjour(frame)
    return internal.message(frame, 'Bonjour')
end

function p.salut(frame)
    return internal.message(frame, 'Salut')
end

return p
							
Module:Bonjour (Lua)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Parserfunctions vs
structures de contrôle


{{#if: {{{qui}}}
 | Bonjour {{{qui}}} !
 | Bonjour cher inconnu ! }}
							
Modèle:Bonjour (wikicode)

local p = {}

function p.bonjour(frame)
    if frame.args.qui ~= nil then
        return 'Bonjour ' .. frame.args.qui .. ' !'
    else
        return 'Bonjour cher inconnu !'
    end
end

return p
							
Module:Bonjour (Lua)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Parserfunctions vs
structures de contrôle


{{#if: {{{qui}}}
 | Bonjour {{{qui}}} !
 | {{#if: {{{quidautre}}}
    | Bonjour {{{quidautre}}} !
    | Bonjour cher inconnu ! }} }}
							
Modèle:Bonjour (wikicode)

local p = {}

function p.bonjour(frame)
    if frame.args.qui ~= nil then
        return 'Bonjour ' .. frame.args.qui .. ' !'
    elseif frame.args.quidautre ~= nil then
        return 'Bonjour ' .. frame.args.quidautre .. ' !'
    else
        return 'Bonjour cher inconnu !'
    end
end

return p
							
Module:Bonjour (Lua)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

© Morio, CC-BY-SA 3.0

Boucles


local p = {}

function p.bonjour(frame)

    local repetitions = tonumber(frame.args.repetitions)

    if repetitions < 0 then
        error('Nombre de répétitions négatif')

    elseif repetitions > 10 then
        error('Nombre de répétitions trop élevé')

    else
        local resultat = ''

        for iter = 1, repetitions do
            resultat = resultat .. '* Bonjour ' .. frame.args.qui .. ' !\n'
        end

        return resultat
    end

end

return p
							
Module:Bonjour (Lua)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Boucles


{{#invoke:Bonjour|bonjour|qui=Strasbourg|repetitions=-1}}
----
{{#invoke:Bonjour|bonjour|qui=Strasbourg|repetitions=3}}
----
{{#invoke:Bonjour|bonjour|qui=Strasbourg|repetitions=42}}
							
Bonjour (wikicode)


Bonjour (rendu)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Itérateurs


local p = {}

function p.parametres(frame)

    local resultat = ''

    for index, valeur in ipairs(frame.args) do
        resultat = resultat .. '* ' .. valeur .. '\n'
    end

    resultat = resultat .. '----\n'

    for clef, valeur in pairs(frame.args) do
        resultat = resultat .. '* ' .. clef .. ' => ' .. valeur .. '\n'
    end

    return resultat

end

return p
							
Module:Paramètres (Lua)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Itérateurs


{{#invoke:Parametres|parametres|qui=les Wikipédiens|Strasbourg|quoi=Lua|quand=jeudi|Bonjour}}
							
Paramètres (wikicode)


Bonjour (rendu)

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

© NASA/Bill Ingalls, DP

Strlen


local p = {}

function p.strlen(frame)
    return mw.ustring.len(p.args[1])
end

return p
							
Module:Strlen (Lua)


© stux, DP

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèle vs module


© Elliott Brown, CC-BY 2.0


© Øyvind Holmstad, CC-BY-SA 4.0

  • Morceaux de pages « préfabriqués »
  • … vs éléments composables facilement
  • Approches complémentaires

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Modèle vs module

Fonctionnalité simple

Modèle Module
Débutant Difficile Difficile
Intermédiaire Facile Difficile
Expert Trivial Facile

Fonctionnalité complexe

Modèle Module
Débutant Impossible Difficile
Intermédiaire Impossible Difficile
Expert Impossible Facile

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

Aller plus loin


© NASA, DP

© User:Arkanosis — CC-BY 4.0 — WikiConvention francophone 2017

~~~~


© Dirk Ingo Franke, CC-BY-SA 3.0