Aller au contenu

Module:Classement musical

Cette page est semi-protégée.
Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 16 juillet 2014 à 22:14 et modifiée en dernier par Hlm Z. (discuter | contributions) (autogestion des balises auto-fermantes par mw.html). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[voir] [modifier] [historique] [purger]

Ce module implémente les modèles {{Albumchart}} et {{Singlechart}}. Voir la documentation des modèles pour les instructions d'utilisation. Le module produit dans un tableau une ligne avec le pays d'information, la meilleure position de l'album ou du single dans le classement musical ainsi que la référence en question. Il permet de simplifier la mise en forme des articles et des références.

Fonctions exportables

  • main(frame) – Fonction implémentant le modèle {{Albumchart}} et {{Singlechart}} – à appeler avec #invoke.
  • _main(args, chartType) – Fonction qui peut être appelée dans un autre module avec require(). Ceci est une bonne pratique d'appeler cette fonction dans un autre module car cela permet d'omettre certains champs de l'objet frame, ce qui améliore les performances et simplifie la gestion des arguments. Le paramètre typeChart définit avec l'argument :
    • 'album' importera les classements pour les albums,
    • 'single' importera les classements pour les singles.

Insertion

Pour insérer un nouveau classement musical, voir les modules de données :

Voir aussi

--Ce module implémente les modèles {{Albumchart}} et {{Singlechart}}.

local p = {}

--Chargement du module de données.
local donnees = mw.loadData('Module:Classement musical/Données')

--Redéfinitions utiles.
local format = mw.ustring.format
local insert = table.insert

function p.singleChart(frame)
	typeChart = 's'
	return gestionArgs(frame)
end

function p.albumChart(frame)
	typeChart = 'a'
	return gestionArgs(frame)
end

function gestionArgs(frame)
	local args = {}
	local argsParent = frame:getParent().args

	--Paramètres vides interprétés par Lua.
	for cle, val in pairs(argsParent) do
		if val ~= '' then
			args[cle] = mw.text.trim(val)
		end
	end
	return p._ligneChart(args)
end

function p._ligneChart(argsChart)
	--Fonction retournant la ligne du classement. Pour reproduire le comportement
	--du wikicode, le code HTML est volontairement brut et n'utilise pas mw.html.
	args = argsChart
	local res = mw.html.create()
	local cleChart, valChart = elementChart()

	if args.rowheader == 'oui' then
		res:wikitext('! scope="row" style="font-weight:normal;"')
	end

	res
		:wikitext('|')
		:node(celluleClassement(cleChart, valChart) or erreurArgs(cleChart))
		:newline()
		:wikitext('| style="text-align:center;"|')
		:wikitext(args[2] or '{{{2}}}')

	return tostring(res)
end

function elementChart()
	local data
	if typeChart == 's' then
		--Récupération de la table de données pour les singles.
		data = mw.loadData('Module:Classement musical/Données/Single')
	else
		--Récupération de la table de données pour les albums.
		data = mw.loadData('Module:Classement musical/Données/Album')
	end
	local cleChart = mw.ustring.lower(args[1] or '')
	local valChart = data.charts[cleChart]

	--Récupération de l'alias du classement si existant.
	if not valChart then
		for nomChart, aliasCharts in pairs(data.alias) do
			for _, aliasChart in ipairs(aliasCharts) do
				if aliasChart == cleChart then
					return nomChart, data.charts[nomChart]
				end
			end
		end
	end

	return cleChart, valChart
end

function celluleClassement(cleChart, valChart)
	if not valChart then return end
	local res = mw.html.create()
	local frame = mw.getCurrentFrame()
	local argsManquants = gestionErreurArgs(valChart)

	--Gestion des exceptions des arguments du modèle.
	if next(argsManquants) then
		res:wikitext(erreurArgs(argsManquants))
		return tostring(res)
	end

	res
		:wikitext(frame:expandTemplate{title = valChart.drapeau})
		:wikitext(format(' (%s)', valChart.chart))
		:wikitext(frame:extensionTag('ref', contenuReference(valChart), {
			name = args.refname or typeChart .. 'c_' .. cleChart,
			group = args.refgroup
		}))

	if args.note then
		res
			:tag('br')
			:done()
			:tag('span')
				:css('font-style', 'italic')
				:css('font-size', '89%')
				:wikitext(args.note)
	end

	return tostring(res)
end

function contenuReference(valChart)
	local res = mw.html.create()
	local frame = mw.getCurrentFrame()

	if valChart.langue then
		res
			:wikitext(frame:expandTemplate{title = valChart.langue})
			:wikitext(' ')
	end

	res:wikitext(format('%s. %s. %s. ',
		gestionLienUrl(valChart),
		valChart.noteChart or valChart.chart,
		valChart.editeur))

	if args['en ligne le'] then
		res:wikitext(format('Mis en ligne le %s. ', args['en ligne le']))
	end

	if args['consulté le'] then
		res:wikitext(format('Consulté le %s.', args['consulté le']))
	end

	return tostring(res)
end

function erreurArgs(argsManquants)
	local res = mw.html.create('span')
		:addClass('error')
		:css('font-size', '100%')
		:wikitext('Erreur : ')

	--Catégorie de détection pour maintenance.
	res:wikitext(donnees.cfg['catDetection' .. typeChart])

	--Exception de type classement non répertorié.
	if type(argsManquants) == 'string' then
		res:wikitext(format(donnees.cfg['chartErreur'], argsManquants))
		return tostring(res)
	end

	--Mise en forme des arguments manquants.
	for cle, val in ipairs(argsManquants) do
		argsManquants[cle] = '<code>|' .. val .. '=</code>'
	end

	--Maximum de 2 arguments manquants.
	res:wikitext(format(donnees.cfg['argErreur' .. #argsManquants],
		args[1],
		unpack(argsManquants)))

	return tostring(res)
end

function gestionErreurArgs(valChart)
	--Fonction retournant la table des arguments manquants si existant.
	local erreurArgs = {}

	for cleFormats, valFormats in pairs(donnees.formatsLiens) do
		if valChart[cleFormats] then
			for _, argManquant in ipairs(valFormats) do
				if not args[argManquant] then
					insert(erreurArgs, argManquant)
				end
			end
			return erreurArgs
		end
	end

	return erreurArgs
end

function gestionLienUrl(valChart)
	--Fonction retournant la mise en forme du lien URL dans le format [lien titre].
	local argLien, argTitre = {}, {}
	local res
 
	for cleFormats, valFormats in pairs(donnees.formatsLiens) do
		if valChart[cleFormats] then
			--Récupération du lien et du titre du classement.
			insert(argLien, valChart[cleFormats])
			insert(argTitre, valChart[valFormats.titre])
 
			--Récupération des arguments nécessaires au lien et au titre.
			for _, nomArg in ipairs(valFormats) do
				if nomArg ~= 'artisteid'
				and nomArg ~= 'semaine'
				and nomArg ~= 'année'
				and nomArg ~= 'date' then
					insert(argLien, encodeUrl(args[nomArg], valFormats.encode))
				else
					--Cas de l'insertion de l'année à deux reprises (lienAnnee2).
					if valFormats.doubleAnnee and nomArg == 'année' then
						insert(argLien, args[nomArg])
					end
					insert(argLien, args[nomArg])
				end
 
				if nomArg == 'chanson' or nomArg == 'album' then
					insert(argTitre, format("''%s''", args[nomArg]))
				elseif nomArg ~= 'artisteid' then
					insert(argTitre, args[nomArg])
				end
			end
			break
		end
	end
 
	--Récupération des valeurs de la table et transformation en
	--argument pour mise en forme avec la fonction de formatage.
	local lien = format(unpack(argLien))
	local titre = format(unpack(argTitre))
 
	--Mise en forme de l'URL.
	res = format('[http://%s %s]', lien, titre)

	if valChart.noteInsertion then
		if args.semaine and args['année'] then
			res = res .. format(donnees.cfg['noteInsertion'], args.semaine .. args['année'])
		else
			res = res .. format(donnees.cfg['noteInsertion'], "l'année et la semaine")
		end
	end

	return res
end

function encodeUrl(texteEncode, lienHungMedien)
	--Fonction permettant de corriger le problème d'encodage des liens Hung Medien.
	local res = mw.uri.encode(texteEncode)
	
	if lienHungMedien then
		--Parcours de la table et substitution.
		for cle, val in pairs(donnees.encHungMedien) do
			local copie, valeurMatch = res:gsub(cle, val)
			if valeurMatch > 0 then
				res = copie
			end
		end
	end

	return res
end

return p