Aller au contenu

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

De Wreck
Modèle:Pistes>Od1n
balise <cite> pour meilleure sémantique ; il existe des gestions plus évoluées, voir par exemple dans Module:Biblio/Ouvrage, la classe "italique" (mais ici, ça ne serait pas utile, ni même souhaitable) et le Langue.nonLatin (refs 113688445) (pourquoi pas, mais impact performances, pour l'instant restons sur quelque chose de simple et d'aussi bon que précédemment)
Modèle:Pistes>Od1n
je n'avais même pas remarqué, il y a déjà un Langue.nonLatin… balisage <cite> (mais en font-style:normal) aussi pour les titres contenant des caractères non latins, et j'en profite pour virer la double négation
Ligne 162 : Ligne 162 :
local titrePiste = rowArgs.piste or rowArgs.title
local titrePiste = rowArgs.piste or rowArgs.title
if titrePiste then
if titrePiste then
if not langue.nonLatin( titrePiste ) then
if langue.nonLatin( titrePiste ) then
titrePiste = '<cite style="font-style:normal">' .. titrePiste .. '</cite>'
else
titrePiste = '<cite>' .. titrePiste .. '</cite>'
titrePiste = '<cite>' .. titrePiste .. '</cite>'
end
end

Version du 27 juin 2024 à 00:38

La documentation pour ce module peut être créée à Module:Pistes/doc

local p = {}

local langue = require 'Module:Langue'

local nbPistes = 0

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

	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 = mw.ustring.match( k, '^(.-)(%d+)$' )
		if param and param ~= '' then
			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
			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 or args.total_length) 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 or args.headline 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.headline }) or (args.titre or args.headline) )
	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 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 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' or args.lyrics_credits == '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' or args.music_credits == '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' or args.writing_credits == '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 or args.extra_column 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 or args.extra_column )
					: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 = 1, nbPistes do
		local rowArgs = rowArgsTable[i]

		if rowArgs and (rowArgs.piste or rowArgs.title or rowArgs.note or rowArgs.temps or rowArgs.length) 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 or rowArgs.title
			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' or args.lyrics_credits == 'oui' then
				ligne:tag( 'td' ):wikitext( rowArgs.paroles or rowArgs.lyrics )
			end
			if args.credits_musique == 'oui' or args.music_credits == 'oui' then
				ligne:tag( 'td' ):wikitext( rowArgs.musique or rowArgs.music )
			end
			if args.credits_ecriture == 'oui' or args.writing_credits == 'oui' then
				ligne:tag( 'td' ):wikitext( rowArgs.auteur or rowArgs.writer )
			end
			if args.colonne_extra or args.extra_column then
				ligne:tag( 'td' ):wikitext( rowArgs.extra )
			end
			ligne:tag('td')
						:addClass( 'pistes-duree' )
						:wikitext( rowArgs.temps or rowArgs.length )
		end
	end

	-- 6. Affichage de la durée totale le cas échéant
	if args.total_temps or args.total_length then
		tabPistes:tag( 'tr' ):tag('td')
						:addClass( 'pistes-dureetotale' )
						:attr( 'colspan', '10' )
						:wikitext( args.total_temps or args.total_length )
	end

	return tostring( divPistes )
end

return p