Aller au contenu

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

De Wreck
Modèle:Pistes>Od1n
plutôt une balise pour la mise en italique (résultat identique), parce que j'imagine bien le coup de titres qui commencent ou se terminent par une apostrophe, causant un résultat bogué
m 56 versions importées
 
(22 versions intermédiaires par un autre utilisateur non affichées)
Ligne 1 : Ligne 1 :
-- luacheck: globals mw, no max line length
local p = {}
local p = {}


local langue = require 'Module:Langue'
local langue = require 'Module:Langue'


local nbPistes = 0
function p.tableauPistes( frame )
 
function p.main( frame )
-- 1. Lecture des paramètres
-- 1. Lecture des paramètres
local args = {}
local args = {}
local rowArgsTable = {}
local rowArgsTable = {}
local maxNumPiste = 0
-- 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
-- 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)
match:
local param, nb = mw.ustring.match( k, '^(.-)(%d+)$' )
* foobar42
if param and param ~= '' then
* foo21bar42 (digits in base name)
nb = tonumber(nb)
* 21foo42 (leading digits in base name)
if rowArgsTable[nb] == nil then
* foobar0 (track zero)
if nb > nbPistes then
 
nbPistes = nb
do not match:
end
* 42 (only digits)
rowArgsTable[nb] = {}
* foobar (no digits suffix)
* foobar042 (leading zeroes)
 
alternative pattern: ^(.+)%f[%d]([1-9]%d*)$
--]]
local param, num = string.match( k, '^(.*%D)([1-9]%d*)$' ) -- in this specific case, multibyte mw.ustring.match() is not needed
if not param then
param, num = string.match( k, '^(.*%D)(0)$' ) -- also search for track zero
end
if param then
if aliasesN[param] then
param = aliasesN[param]
end
end
if v ~= "" or param == "numero" then -- il est possible de renseigner des paramètres « numeroN » vides
if v ~= "" or param == "numero" then -- il est possible de renseigner des paramètres « numeroN » vides
rowArgsTable[nb][param] = v
num = tonumber(num)
if rowArgsTable[num] == nil then
if num > maxNumPiste then
maxNumPiste = num
end
rowArgsTable[num] = {}
end
rowArgsTable[num][param] = v
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 37 : Ligne 78 :
: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 45 : Ligne 86 :


-- 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 52 : Ligne 93 :
: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 63 : Ligne 104 :


-- 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 86 : Ligne 127 :
: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 97 : Ligne 138 :
: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 108 : Ligne 149 :
: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 119 : Ligne 160 :
: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 127 : Ligne 168 :
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 143 : Ligne 184 :


-- 5. Tracé des lignes du tableau
-- 5. Tracé des lignes du tableau
for i = 1, nbPistes do
for i = 0, maxNumPiste do -- on commence à 0, pour éventuel [[morceau caché]] dans le [[prégap]]
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 160 : Ligne 201 :
: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 not langue.nonLatin( titrePiste ) then
if langue.nonLatin( titrePiste ) then
titrePiste = '<i>' .. titrePiste .. '</i>'
titrePiste = '<cite style="font-style:normal">' .. titrePiste .. '</cite>'
else
titrePiste = '<cite>' .. titrePiste .. '</cite>'
end
end
if rowArgs["langue titre"] or args["langue titres"] then -- "langue titreN" puis "langue titres"
if rowArgs["langue titre"] or args["langue titres"] then -- "langue titreN" puis "langue titres"
Ligne 173 : Ligne 216 :
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



Dernière version du 12 mars 2026 à 00:58

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'

function p.tableauPistes( frame )
	-- 1. Lecture des paramètres
	local args = {}
	local rowArgsTable = {}
	local maxNumPiste = 0

	-- 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)
			* foobar0 (track zero)

			do not match:
			* 42 (only digits)
			* foobar (no digits suffix)
			* foobar042 (leading zeroes)

			alternative pattern: ^(.+)%f[%d]([1-9]%d*)$
		--]]
		local param, num = string.match( k, '^(.*%D)([1-9]%d*)$' ) -- in this specific case, multibyte mw.ustring.match() is not needed
		if not param then
			param, num = string.match( k, '^(.*%D)(0)$' ) -- also search for track zero
		end
		if param then
			if aliasesN[param] then
				param = aliasesN[param]
			end
			if v ~= "" or param == "numero" then -- il est possible de renseigner des paramètres « numeroN » vides
				num = tonumber(num)
				if rowArgsTable[num] == nil then
					if num > maxNumPiste then
						maxNumPiste = num
					end
					rowArgsTable[num] = {}
				end
				rowArgsTable[num][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, maxNumPiste 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