Aller au contenu

« Module:Pistes » : différence entre les versions

De Wreck
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'] = (args.total_temps or args.total_length) and '0.5em' or '1em'
['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 or args.headline then
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 or args.headline }) or (args.titre or args.headline) )
: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 = ((args.credits_paroles or args.lyrics_credits) and 1 or 0) + ((args.credits_musique or args.music_credits) and 1 or 0) + ((args.credits_ecriture or args.writing_credits) and 1 or 0) + ((args.colonne_extra or args.extra_column) and 1 or 0)
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 == 'oui' or args.lyrics_credits == 'oui' then -- Colonne « 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 == 'oui' or args.music_credits == 'oui' then -- Colonne « 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 == 'oui' or args.writing_credits == 'oui' then -- Colonne « Auteur »
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 or args.extra_column then -- 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 or args.extra_column )
: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 or rowArgs.title or rowArgs.note or rowArgs.temps or rowArgs.length) then
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 or rowArgs.title
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 == 'oui' or args.lyrics_credits == 'oui' then
if args.credits_paroles == 'oui' then
ligne:tag( 'td' ):wikitext( rowArgs.paroles or rowArgs.lyrics )
ligne:tag( 'td' ):wikitext( rowArgs.paroles )
end
end
if args.credits_musique == 'oui' or args.music_credits == 'oui' then
if args.credits_musique == 'oui' then
ligne:tag( 'td' ):wikitext( rowArgs.musique or rowArgs.music )
ligne:tag( 'td' ):wikitext( rowArgs.musique )
end
end
if args.credits_ecriture == 'oui' or args.writing_credits == 'oui' then
if args.credits_ecriture == 'oui' then
ligne:tag( 'td' ):wikitext( rowArgs.auteur or rowArgs.writer )
ligne:tag( 'td' ):wikitext( rowArgs.auteur )
end
end
if args.colonne_extra or args.extra_column then
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 or rowArgs.length )
: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 or args.total_length then
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 or args.total_length )
: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( "&nbsp;" )
	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