Module:Bacasable
Apparence
La documentation de ce module est générée par le modèle {{Documentation module}}.
Les éditeurs peuvent travailler dans le bac à sable (créer).
Voir les statistiques d'appel depuis le wikicode sur l'outil wstat et les appels depuis d'autres modules.
-- Ce module implémente les modèles {{Albumchart}} et {{Singlechart}}.
local p = {}
local data = {
cfg = {
publishDate = 'en ligne le',
acessDate = 'consulté le',
acessDatePrefix = 'Consulté le',
albumData = 'Module:Classement musical/Données/Album',
singleData = 'Module:Classement musical/Données/Single'
},
formats = {
}
}
-- Useful definitions.
local format = mw.ustring.format
local insert = table.insert
local isTrue = require('Module:Yesno')
local Chart = {}
Chart.__index = Chart
function Chart.new(args, cfg, chartType)
local cleanArgs = {}
for k, v in pairs(args) do
if type(k) == 'string' and v ~= '' then
cleanArgs[k] = mw.text.trim(v)
end
end
local chartName = mw.ustring.lower(cleanArgs[1] or '')
-- Loading the data module.
local data = data--mw.loadData('Module:Classement musical/Données')
local cfg = data.cfg
local moduleName = chartType == 'album' and cfg.albumData or cfg.singleData
local chartData = mw.loadData(moduleName)[chartName]
local root = mw.html.create()
-- To reproduce the behavior of the wikicode, the HTML code is deliberately
-- raw and does not use mw.html.
if isTrue(args.rowheader) then
root:wikitext('! scope="row" style="font-weight:normal;"')
end
root:wikitext('|')
local fields = {
args = cleanArgs,
isAlbumChart = chartType == 'album',
chartName = chartName,
chartData = chartData,
formatData = data.formats[chartData.format] or {},
cfg = cfg,
root = mw.html.create(),
errorDetect = false
}
return setmetatable(fields, Chart)
end
function Chart:__tostring()
return tostring(self.root)
end
local function formattingError(missingParams)
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 res
end
function Chart:checkFormat()
local missingParams = {}
local requiredParams = self.formatData.params
for _, requiredParam in pairs(requiredParams) do
if not self.args[requiredParam] then
insert(missingParams, requiredParam)
end
end
if next(missingParams) then
self.root:node(formattingError(missingParams))
self.errorDetect = true
end
end
function Chart:buildRefLink()
-- Fonction retournant la mise en forme du lien URL dans le format [lien titre].
local formatParams = formats[chartData.format]
local formatArgs = {}
for _, param in pairs(formatParams) do
local arg = formatParams.encode
and encode(args[param])
or args[param]
insert(formatArgs, arg)
end
local link = format(chartData.link, unpack(formatArgs))
local title = format(chartData.title, unpack(formatArgs))
return format('[%s %s]', link, title)
end
function Chart:buildRef()
local res = mw.html.create()
local frame = mw.getCurrentFrame()
if chartData.lang then
local lang = frame:expandTemplate{title = chartData.lang}
res:wikitext(format('%s ', lang))
end
res:wikitext(format('%s. %s. %s.',
self:buildRefLink(),
chartData.chartNote or chartData.chart,
chartData.publisher))
if args[self.cfg.publishDate] then
res:wikitext(format(' Mis en ligne le %s. ', args[self.cfg.publishDate]))
end
if args[self.cfg.accessDate] then
res:wikitext(format(' %s %s.',
self.cfg.accessDatePrefix,
args[self.cfg.accessDate]))
end
return mw.html.create():wikitext(frame:extensionTag('ref', tostring(res), {
name = args.refname or chartType .. 'c_' .. chartName,
group = args.refgroup
}))
end
function Chart:buildChartRow()
if self.errorDetect then return end
local frame = mw.getCurrentFrame()
node
:wikitext(frame:expandTemplate{title = chartData.flag})
:wikitext(format(' (%s)', chartData.name))
:node(self:buildRef())
if args.note then
node
:tag('br')
:done()
:tag('span')
:css('font-style', 'italic')
:css('font-size', '89%')
:wikitext(args.note)
end
end
function Chart:buildPositionRow()
self.root
:newline()
:wikitext('| style="text-align:center;"|')
:wikitext(self.args[2] or '{{{2}}}')
end
-- Access in the module space.
function p._main(args, chartType)
local chart = Chart.new(args, cfg, chartType)
return tostring(chart:checkFormat():buildChartRow():buildPositionRow())
end
-- Access outside the module space.
function p.main(frame)
local argsParent = frame:getParent().args
return p._main(argsParent, frame.args[1])
end
function p.buildRefLink(args)
local encode = function() end
local formats = {
-- http://www.lescharts.com/showitem.asp?interpret=(Booba)&titel=(DKR)&cat=s
-- Lescharts.com – (Booba) – (DKR)
hungMedienSong = { encode = true, 'artiste', 'chanson' },
hungMedienAlbum = { encode = true, 'artiste', 'album' }
}
local chartData = {
format = 'hungMedienSong',
flag = 'France',
chart = "[[Syndicat national de l'édition phonographique|SNEP]]",
link = 'http://www.lescharts.com/showitem.asp?interpret=%s&titel=%s&cat=s',
title = 'Lescharts.com – %s – %s',
publisher = 'Hung Medien'
}
local formatParams = formats[chartData.format]
local formatArgs = {}
for _, param in pairs(formatParams) do
local arg = formatParams.encode
and encode(args[param])
or args[param]
insert(formatArgs, arg)
end
local link = format(chartData.link, unpack(formatArgs))
local title = format(chartData.title, unpack(formatArgs))
return format('[%s %s]', link, title)
end
return p