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 = 'tit',
		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 = 'pis',
		length = 'temps',
		lyrics = 'pawòl',
		music = 'mizik',
		writer = 'otè',
	}

	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( " " )
	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( "Tit" )
					: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( "Pawòl" )
					: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( "Mizike" )
					: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( "Otè" )
					: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( "Dire" )
					: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