Modulis:Classement musical
Lua kļūda Modulis:Documentation, 144. rinda: message: type error in message cfg.container (string expected, got nil).
-- 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