Modulis:Classement musical

Dokumentācijas ikona Moduļa dokumentācija[skatīt] [labot] [hronoloģija] [pārlādēt]
Chart (1997) Peak
position
Karogs: Austrālija Austrālija (ARIA)[1] 37
Karogs: Norvēģija Norvēģija (VG-lista)[2] 40
Karogs: Jaunzēlande Jaunzēlande (RIANZ)[3] 8
Karogs: Nīderlande Nīderlande (Mega Album Top 100)[4] 25
Karogs: Austrija Austrija (Ö3 Austria Top 40)[5] 34
Karogs: Beļģija Beļģija (Flandre Ultratop)[6] 7
Karogs: Beļģija Beļģija (Wallonie Ultratop)[7] 9
Karogs: Kanāda Kanāda (Canadian Albums)[8] 15
Karogs: Somija Somija (Suomen virallinen lista)[9] 34
Karogs: Francija Francija (SNEP)[10] 3
Karogs: Zviedrija Zviedrija (Sverigetopplistan)[11] 16
Karogs: Amerikas Savienotās Valstis ASV (Billboard 200)[12] 150
  1. (angliski) Australian-charts.com – Daft Punk – Homework. ARIA Top 50 album. Hung Medien. Atjaunināts 30 May 2012.
  2. (angliski) Norwegiancharts.com – Daft Punk – Homework. VG-lista. Hung Medien. Atjaunināts 30 May 2012.
  3. (angliski) Charts.org.nz – Daft Punk – Homework. RIANZ. Hung Medien. Atjaunināts 30 May 2012.
  4. (nīderlandiski) Dutchcharts.nl – Daft Punk – Homework. Mega Album Top 100. Hung Medien. Atjaunināts 30 May 2012.
  5. (vāciski) Austriancharts.at – Daft Punk – Homework. Ö3 Austria Top 40. Hung Medien. Atjaunināts 30 May 2012.
  6. (nīderlandiski) Ultratop.be – Daft Punk – Homework. Ultratop 200 albums. Ultratop et Hung Medien / hitparade.ch. Atjaunināts 30 May 2012.
  7. Ultratop.be – Daft Punk – Homework. Ultratop 200 albums. Ultratop et Hung Medien / hitparade.ch. Atjaunināts 30 May 2012.
  8. (angliski) Daft Punk - Chart history – Billboard. Canadian Albums Chart. Prometheus Global Media. Atjaunināts 30 May 2012.
  9. (somiski) Finnishcharts.com – Daft Punk – Homework. Suomen virallinen lista. Hung Medien. Atjaunināts 30 May 2012.
  10. Lescharts.com – Daft Punk – Homework. SNEP. Hung Medien. Atjaunināts 30 May 2012.
  11. (angliski) Swedishcharts.com – Daft Punk – Homework. Sverigetopplistan. Hung Medien. Atjaunināts 30 May 2012.
  12. (angliski) Daft Punk - Chart history – Billboard. Billboard 200. Prometheus Global Media. Atjaunināts 30 May 2012.

-- 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')

-- Portée lexicale et définition.
local typeChart
local args

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

local 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

local 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 ~= 'artistid'
				and nomArg ~= 'week'
				and nomArg ~= 'year'
				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 == 'year' 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 ~= 'artistid' 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.week and args['year'] then
			res = res .. format(donnees.cfg['noteInsertion'], args['year'] .. args.week)
		else
			res = res .. format(donnees.cfg['noteInsertion'], "l'année et la semaine")
		end
	end

	return res
end

local 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

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

	-- 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

local 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['accessdate'] then
		res:wikitext(format('Atjaunināts %s.', args['accessdate']))
	end

	return tostring(res)
end

local 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

local 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[cleChart]

	return cleChart, valChart
end

function p.ligneChart(_typeChart, 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.
	typeChart = _typeChart
	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

local 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 args
end

function p.albumChart(frame)
	local typeChart = 'a'
	local args = gestionArgs(frame)

	return p.ligneChart(typeChart, args)
end

function p.singleChart(frame)
	local typeChart = 's'
	local args = gestionArgs(frame)

	return p.ligneChart(typeChart, args)
end

return p