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.
local data = {
cfg = {
rowheader = 'rowheader',
publishDate = 'en ligne le',
accessDate = 'consulté le',
accessDatePrefix = 'Consulté le',
albumData = 'Module:Classement musical/Données/Album',
singleData = 'Module:Classement musical/Données/Single'
},
formats = {
-- http://www.lescharts.com/showitem.asp?interpret=(artiste)&titel=(chanson)&cat=s
-- Lescharts.com – (artiste) – (chanson)
-- order is relevant
hungMedienSong = { 'artiste', 'chanson', encoder = hungMedienEncoder },
hungMedienAlbum = { 'artiste', 'album', encoder = hungMedienEncoder }
}
}
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'
}
function hungMedienEncoder(s)
return s
end
-- Ce module implémente les modèles {{Albumchart}} et {{Singlechart}}.
local p = {}
-- 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 args = args or {}
local isAlbumChart = chartType == 'album'
local chartName = mw.ustring.lower(args[1] or '')
-- Loading the data module.
local data = data--mw.loadData('Module:Classement musical/Données')
local moduleName = isAlbumChart and cfg.albumData or cfg.singleData
local chartData = chartData--mw.loadData(moduleName)[chartName] or {}
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[cfg.rowheader]) then
root:wikitext('! scope="row" style="font-weight:normal;"')
end
root:wikitext('|')
local fields = {
args = args,
cfg = data.cfg, -- cfg = cfg,
isAlbumChart = isAlbumChart,
chartName = chartName,
chartData = chartData,
formatData = data.formats[chartData.format] or {},
errorDetect = false,
root = root
}
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()
-- check empty chartData
local missingParams = {}
local requiredParams = self.formatData
for _, requiredParam in ipairs(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
return self
end
function Chart:buildRefLink()
-- Fonction retournant la mise en forme du lien URL dans le format [lien titre].
local formatParams = self.formatData
local formatArgs = {}
for _, param in ipairs(formatParams) do
insert(formatArgs, self.args[param])
end
local link = format(chartData.link, unpack(formatArgs))
local title = format(chartData.title, unpack(formatArgs))
local refLink = format('[%s %s]', link, title)
return formatParams.encoder and formatParams:encoder(refLink) or refLink
end
function Chart:buildRef()
local res = mw.html.create()
local frame = mw.getCurrentFrame()
local args = self.args
local cfg = self.cfg
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[cfg.publishDate] then
res:wikitext(format(' %s. ', args[cfg.publishDate]))
end
if args[cfg.accessDate] then
res:wikitext(format(' %s %s.',
cfg.accessDatePrefix,
args[cfg.accessDate]))
end
return mw.html.create():wikitext(frame:extensionTag('ref', tostring(res), {
name = args.refname
or (isAlbumChart and 'a' or 's') .. 'c_' .. self.chartName,
group = args.refgroup
}))
end
function Chart:buildChartRow()
if self.errorDetect then
return self
end
self.root
:wikitext(mw.getCurrentFrame():expandTemplate{title = chartData.flag})
:wikitext(format(' (%s)', chartData.chart))
:node(self:buildRef())
if self.args[self.cfg.note] then
self.root
:tag('br')
:done()
:tag('span')
:css('font-style', 'italic')
:css('font-size', '89%')
:wikitext(args.note)
end
return self
end
function Chart:buildPositionRow()
self.root
:newline()
:wikitext('| style="text-align:center;"|')
:wikitext(self.args[2] or '{{{2}}}')
return self
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
local cleanArgs = {}
for k, v in pairs(argsParent) do
if type(k) == 'string' and v ~= '' then
cleanArgs[k] = mw.text.trim(v)
end
end
return p._main(cleanArgs, frame.args[1])
end
return p