« Module:Pistes » : différence entre les versions
Apparence
Modèle:Pistes>Od1n je viens de faire un essai avec la ligne d'introduction aussi en Lua, mais ça complique le code plus qu'autre chose ; renommage de la fonction Lua, pour mieux montrer qu'elle ne génère pas la totalité du résultat ; il existe déjà des variables "divPistes" et "tabPistes", donc attention au "name masking" (ça fonctionnerait quand même, mais autant éviter) |
Modèle:Pistes>Od1n système d'aliases pour les noms de paramètres : centralise les aliases au début du code, ce qui permet de les visualiser d'un coup, et surtout évite de les éparpiller (et répéter) partout dans le code ; cela permettrait aussi d'ajouter facilement des aliases supplémentaires (espaces au lieu d'underscores, accents…) |
||
| Ligne 11 : | Ligne 11 : | ||
local args = {} | local args = {} | ||
local rowArgsTable = {} | local rowArgsTable = {} | ||
-- map de noms de paramètres "alias → nom canonique" (attention à bien utiliser le nom canonique dans le code du module) | |||
local aliases = { | |||
headline = 'titre', | |||
total_length = 'total_temps', | |||
lyrics_credits = 'credits_paroles', | |||
music_credits = 'credits_musique', | |||
writing_credits = 'credits_ecriture', | |||
extra_column = 'colonne_extra', | |||
} | |||
-- même chose avec les paramètres "trucmucheN" | |||
local aliasesN = { | |||
title = 'piste', | |||
length = 'temps', | |||
lyrics = 'paroles', | |||
music = 'musique', | |||
writer = 'auteur', | |||
} | |||
for k, v in pairs(frame:getParent().args) do | for k, v in pairs(frame:getParent().args) do | ||
| Ligne 17 : | Ligne 36 : | ||
local param, nb = string.match( k, '^(.-)(%d+)$' ) -- in this specific case, multibyte mw.ustring.match() is not needed | local param, nb = string.match( k, '^(.-)(%d+)$' ) -- in this specific case, multibyte mw.ustring.match() is not needed | ||
if param and param ~= '' then | if param and param ~= '' then | ||
if aliasesN[param] then | |||
param = aliasesN[param] | |||
end | |||
nb = tonumber(nb) | nb = tonumber(nb) | ||
if rowArgsTable[nb] == nil then | if rowArgsTable[nb] == nil then | ||
| Ligne 28 : | Ligne 50 : | ||
end | end | ||
else | else | ||
if aliases[k] then | |||
k = aliases[k] | |||
end | |||
local trimmed = ( type(k) == "number" ) and mw.text.trim(v) or v | local trimmed = ( type(k) == "number" ) and mw.text.trim(v) or v | ||
if trimmed ~= "" then | if trimmed ~= "" then | ||
| Ligne 39 : | Ligne 64 : | ||
:addClass( "overflow pistes-marge" ) | :addClass( "overflow pistes-marge" ) | ||
:css({ | :css({ | ||
['margin-bottom'] = | ['margin-bottom'] = args.total_temps and '0.5em' or '1em' | ||
}) | }) | ||
local tabPistes = divPistes | local tabPistes = divPistes | ||
| Ligne 47 : | Ligne 72 : | ||
-- 3. Éventuel code avant l'entête du tableau (titre ou boîte repliable) | -- 3. Éventuel code avant l'entête du tableau (titre ou boîte repliable) | ||
if args.titre | if args.titre then | ||
tabPistes | tabPistes | ||
:tag( "tr" ) | :tag( "tr" ) | ||
| Ligne 54 : | Ligne 79 : | ||
:attr( "scope", "col" ) | :attr( "scope", "col" ) | ||
:attr( "colspan", "10" ) | :attr( "colspan", "10" ) | ||
:wikitext( (args["langue titre"] or args["langue titres"]) and langue.langue({ args["langue titre"] or args["langue titres"], args.titre | :wikitext( (args["langue titre"] or args["langue titres"]) and langue.langue({ args["langue titre"] or args["langue titres"], args.titre }) or args.titre ) | ||
elseif args.collapsed == 'oui' then | elseif args.collapsed == 'oui' then | ||
tabPistes | tabPistes | ||
| Ligne 65 : | Ligne 90 : | ||
-- 4. Création de l'entête du tableau | -- 4. Création de l'entête du tableau | ||
local nbColonnesExtra = | local nbColonnesExtra = (args.credits_paroles and 1 or 0) + (args.credits_musique and 1 or 0) + (args.credits_ecriture and 1 or 0) + (args.colonne_extra and 1 or 0) | ||
local entetesPistes = tabPistes | local entetesPistes = tabPistes | ||
| Ligne 88 : | Ligne 113 : | ||
:wikitext( "Titre" ) | :wikitext( "Titre" ) | ||
:done() | :done() | ||
if args.credits_paroles | if args.credits_paroles == 'oui' then -- Colonne « Paroles » | ||
entetesPistes | entetesPistes | ||
:tag( "th" ) | :tag( "th" ) | ||
| Ligne 99 : | Ligne 124 : | ||
:done() | :done() | ||
end | end | ||
if args.credits_musique | if args.credits_musique == 'oui' then -- Colonne « Musique » | ||
entetesPistes | entetesPistes | ||
:tag( "th" ) | :tag( "th" ) | ||
| Ligne 110 : | Ligne 135 : | ||
:done() | :done() | ||
end | end | ||
if args.credits_ecriture | if args.credits_ecriture == 'oui' then -- Colonne « Auteur » | ||
entetesPistes | entetesPistes | ||
:tag( "th" ) | :tag( "th" ) | ||
| Ligne 121 : | Ligne 146 : | ||
:done() | :done() | ||
end | end | ||
if args.colonne_extra | if args.colonne_extra then -- Colonne extra | ||
entetesPistes | entetesPistes | ||
:tag( "th" ) | :tag( "th" ) | ||
| Ligne 129 : | Ligne 154 : | ||
width = ({[1]='40%', [2]='30%', [3]='20%', [4]='20%'})[nbColonnesExtra] | width = ({[1]='40%', [2]='30%', [3]='20%', [4]='20%'})[nbColonnesExtra] | ||
}) | }) | ||
:wikitext( args.colonne_extra | :wikitext( args.colonne_extra ) | ||
:done() | :done() | ||
end | end | ||
| Ligne 148 : | Ligne 173 : | ||
local rowArgs = rowArgsTable[i] | local rowArgs = rowArgsTable[i] | ||
if rowArgs and (rowArgs.piste | if rowArgs and (rowArgs.piste or rowArgs.note or rowArgs.temps) then | ||
local ligne = tabPistes:tag( 'tr' ) | local ligne = tabPistes:tag( 'tr' ) | ||
local numero | local numero | ||
| Ligne 162 : | Ligne 187 : | ||
:attr{ scope = 'row' } | :attr{ scope = 'row' } | ||
:wikitext( numero ) | :wikitext( numero ) | ||
local titrePiste = rowArgs.piste | local titrePiste = rowArgs.piste | ||
if titrePiste then | if titrePiste then | ||
if langue.nonLatin( titrePiste ) then | if langue.nonLatin( titrePiste ) then | ||
| Ligne 177 : | Ligne 202 : | ||
ligne:tag( 'td' ):wikitext(titrePiste .. (rowArgs.note and (' <small>(' .. rowArgs.note .. ')</small>') or '') ) | ligne:tag( 'td' ):wikitext(titrePiste .. (rowArgs.note and (' <small>(' .. rowArgs.note .. ')</small>') or '') ) | ||
if args.credits_paroles | if args.credits_paroles == 'oui' then | ||
ligne:tag( 'td' ):wikitext( rowArgs.paroles | ligne:tag( 'td' ):wikitext( rowArgs.paroles ) | ||
end | end | ||
if args.credits_musique | if args.credits_musique == 'oui' then | ||
ligne:tag( 'td' ):wikitext( rowArgs.musique | ligne:tag( 'td' ):wikitext( rowArgs.musique ) | ||
end | end | ||
if args.credits_ecriture | if args.credits_ecriture == 'oui' then | ||
ligne:tag( 'td' ):wikitext( rowArgs.auteur | ligne:tag( 'td' ):wikitext( rowArgs.auteur ) | ||
end | end | ||
if args.colonne_extra | if args.colonne_extra then | ||
ligne:tag( 'td' ):wikitext( rowArgs.extra ) | ligne:tag( 'td' ):wikitext( rowArgs.extra ) | ||
end | end | ||
ligne:tag('td') | ligne:tag('td') | ||
:addClass( 'pistes-duree' ) | :addClass( 'pistes-duree' ) | ||
:wikitext( rowArgs.temps | :wikitext( rowArgs.temps ) | ||
end | end | ||
end | end | ||
-- 6. Affichage de la durée totale le cas échéant | -- 6. Affichage de la durée totale le cas échéant | ||
if args.total_temps | if args.total_temps then | ||
tabPistes:tag( 'tr' ):tag('td') | tabPistes:tag( 'tr' ):tag('td') | ||
:addClass( 'pistes-dureetotale' ) | :addClass( 'pistes-dureetotale' ) | ||
:attr( 'colspan', '10' ) | :attr( 'colspan', '10' ) | ||
:wikitext( args.total_temps | :wikitext( args.total_temps ) | ||
end | end | ||
Version du 20 septembre 2024 à 07:54
La documentation pour ce module peut être créée à Module:Pistes/doc
-- luacheck: globals mw, no max line length
local p = {}
local langue = require 'Module:Langue'
local nbPistes = 0
function p.tableauPistes( frame )
-- 1. Lecture des paramètres
local args = {}
local rowArgsTable = {}
-- map de noms de paramètres "alias → nom canonique" (attention à bien utiliser le nom canonique dans le code du module)
local aliases = {
headline = 'titre',
total_length = 'total_temps',
lyrics_credits = 'credits_paroles',
music_credits = 'credits_musique',
writing_credits = 'credits_ecriture',
extra_column = 'colonne_extra',
}
-- même chose avec les paramètres "trucmucheN"
local aliasesN = {
title = 'piste',
length = 'temps',
lyrics = 'paroles',
music = 'musique',
writer = 'auteur',
}
for k, v in pairs(frame:getParent().args) do
-- match: foobar42, foo21bar42 (digits in base name), 21foo42 (leading digits in base name), foobar04 (leading zeroes)
-- do not match: 42 (only digits; the regex matches actually, but we reject in the following conditional), foobar (no digits suffix)
local param, nb = string.match( k, '^(.-)(%d+)$' ) -- in this specific case, multibyte mw.ustring.match() is not needed
if param and param ~= '' then
if aliasesN[param] then
param = aliasesN[param]
end
nb = tonumber(nb)
if rowArgsTable[nb] == nil then
if nb > nbPistes then
nbPistes = nb
end
rowArgsTable[nb] = {}
end
if v ~= "" or param == "numero" then -- il est possible de renseigner des paramètres « numeroN » vides
rowArgsTable[nb][param] = v
end
else
if aliases[k] then
k = aliases[k]
end
local trimmed = ( type(k) == "number" ) and mw.text.trim(v) or v
if trimmed ~= "" then
args[k] = trimmed
end
end
end
-- 2. Initialisation du tableau de la liste des titres
local divPistes = mw.html.create( 'div' )
:addClass( "overflow pistes-marge" )
:css({
['margin-bottom'] = args.total_temps and '0.5em' or '1em'
})
local tabPistes = divPistes
:tag( "table" )
:addClass( "tracklist" .. (args.collapsed == 'oui' and " collapsible collapsed" or "") )
:attr( 'cellpadding', "0" )
-- 3. Éventuel code avant l'entête du tableau (titre ou boîte repliable)
if args.titre then
tabPistes
:tag( "tr" )
:tag( "th" )
:addClass( "tlheader pistes-titre" )
:attr( "scope", "col" )
:attr( "colspan", "10" )
:wikitext( (args["langue titre"] or args["langue titres"]) and langue.langue({ args["langue titre"] or args["langue titres"], args.titre }) or args.titre )
elseif args.collapsed == 'oui' then
tabPistes
:tag( "tr" )
:tag( "th" )
:addClass( "tlheader pistes-titre" )
:attr( "colspan", "10" )
:wikitext( " " )
end
-- 4. Création de l'entête du tableau
local nbColonnesExtra = (args.credits_paroles and 1 or 0) + (args.credits_musique and 1 or 0) + (args.credits_ecriture and 1 or 0) + (args.colonne_extra and 1 or 0)
local entetesPistes = tabPistes
:tag( "tr" )
:tag( "th" ) -- Colonne « Numéro »
:addClass( "tlheader pistes-entete" )
:attr( "scope", "col" )
:css({
width = '20px',
['padding-left'] = '10px',
['padding-right'] = '10px',
['text-align'] = 'right'
})
:wikitext( '<abbr class="abbr" title="Numéro">N<sup>o</sup></abbr>' ) -- résultat de {{Numéro avec majuscule|espace=non}}
:done()
:tag( "th" ) -- Colonne « Titre »
:addClass( "tlheader pistes-entete" )
:attr( "scope", "col" )
:css({
width = ({[0]='100%', [1]='60%', [2]='40%', [3]='30%', [4]='20%'})[nbColonnesExtra]
})
:wikitext( "Titre" )
:done()
if args.credits_paroles == 'oui' then -- Colonne « Paroles »
entetesPistes
:tag( "th" )
:addClass( "pistes-entete" )
:attr( "scope", "col" )
:css({
width = ({[1]='40%', [2]='30%', [3]='20%', [4]='20%'})[nbColonnesExtra]
})
:wikitext( "Paroles" )
:done()
end
if args.credits_musique == 'oui' then -- Colonne « Musique »
entetesPistes
:tag( "th" )
:addClass( "pistes-entete" )
:attr( "scope", "col" )
:css({
width = ({[1]='40%', [2]='30%', [3]='20%', [4]='20%'})[nbColonnesExtra]
})
:wikitext( "Musique" )
:done()
end
if args.credits_ecriture == 'oui' then -- Colonne « Auteur »
entetesPistes
:tag( "th" )
:addClass( "pistes-entete" )
:attr( "scope", "col" )
:css({
width = ({[1]='40%', [2]='30%', [3]='20%', [4]='20%'})[nbColonnesExtra]
})
:wikitext( "Auteur" )
:done()
end
if args.colonne_extra then -- Colonne extra
entetesPistes
:tag( "th" )
:addClass( "pistes-entete" )
:attr( "scope", "col" )
:css({
width = ({[1]='40%', [2]='30%', [3]='20%', [4]='20%'})[nbColonnesExtra]
})
:wikitext( args.colonne_extra )
:done()
end
entetesPistes
:tag( "th" ) -- Colonne « Durée »
:addClass( "tlheader pistes-entete" )
:attr( "scope", "col" )
:css({
width = '60px',
['padding-right'] = '10px',
['text-align'] = 'right'
})
:wikitext( "Durée" )
:done()
-- 5. Tracé des lignes du tableau
for i = 0, nbPistes do -- on commence à 0, pour éventuel [[morceau caché]] dans le [[prégap]]
local rowArgs = rowArgsTable[i]
if rowArgs and (rowArgs.piste or rowArgs.note or rowArgs.temps) then
local ligne = tabPistes:tag( 'tr' )
local numero
if rowArgs.numero == '' then
numero = ''
else
numero = (rowArgs.numero or tostring(i)) .. '.'
end
ligne
:addClass( (i%2 == 0) and 'pistes-pair' or 'pistes-impair' )
:tag( 'th' )
:addClass( "pistes-numero" )
:attr{ scope = 'row' }
:wikitext( numero )
local titrePiste = rowArgs.piste
if titrePiste then
if langue.nonLatin( titrePiste ) then
titrePiste = '<cite style="font-style:normal">' .. titrePiste .. '</cite>'
else
titrePiste = '<cite>' .. titrePiste .. '</cite>'
end
if rowArgs["langue titre"] or args["langue titres"] then -- "langue titreN" puis "langue titres"
titrePiste = langue.langue({ rowArgs["langue titre"] or args["langue titres"], titrePiste })
end
else
titrePiste = 'Sans titre'
end
ligne:tag( 'td' ):wikitext(titrePiste .. (rowArgs.note and (' <small>(' .. rowArgs.note .. ')</small>') or '') )
if args.credits_paroles == 'oui' then
ligne:tag( 'td' ):wikitext( rowArgs.paroles )
end
if args.credits_musique == 'oui' then
ligne:tag( 'td' ):wikitext( rowArgs.musique )
end
if args.credits_ecriture == 'oui' then
ligne:tag( 'td' ):wikitext( rowArgs.auteur )
end
if args.colonne_extra then
ligne:tag( 'td' ):wikitext( rowArgs.extra )
end
ligne:tag('td')
:addClass( 'pistes-duree' )
:wikitext( rowArgs.temps )
end
end
-- 6. Affichage de la durée totale le cas échéant
if args.total_temps then
tabPistes:tag( 'tr' ):tag('td')
:addClass( 'pistes-dureetotale' )
:attr( 'colspan', '10' )
:wikitext( args.total_temps )
end
return tostring( divPistes )
end
return p