Module:Infobox Console
Apparence
La documentation pour ce module peut être créée à Module:Infobox Console/doc
local p = {}
local PROPRIETES = {
type_console = 'P117',
date_sortie = 'P118',
region_sortie = 'P119',
generation_dediee = 'P120',
generation_compatible = 'P121',
}
local ORDRE_SORTIES = { 'Japon', 'Amérique du Nord', 'Australie', 'Europe' }
local GENERATIONS = {
['Première génération'] = '[[Première génération|1]]',
['Deuxième génération'] = '[[Deuxième génération|2]]',
['Troisième génération'] = '[[Troisième génération|3]]',
['Quatrième génération'] = '[[Quatrième génération|4]]',
['Cinquième génération'] = '[[Cinquième génération|5]]',
['Sixième génération'] = '[[Sixième génération|6]]',
['Septième génération'] = '[[Septième génération|7]]',
['Huitième génération'] = '[[Huitième génération|8]]',
['Neuvième génération'] = '[[Neuvième génération|9]]',
['Dixième génération'] = '[[Dixième génération|10]]',
}
local function non_vide(valeur)
return valeur ~= nil and mw.text.trim(valeur) ~= ''
end
local function get_args(frame)
local args = {}
local parent = frame:getParent()
if parent then
for cle, valeur in pairs(parent.args) do
if non_vide(valeur) then
args[cle] = valeur
end
end
end
for cle, valeur in pairs(frame.args) do
if non_vide(valeur) then
args[cle] = valeur
end
end
return args
end
local function get_entity(args)
if non_vide(args.item) then
return mw.wikibase.getEntity(mw.text.trim(args.item))
end
return mw.wikibase.getEntity()
end
local function get_string_value(statement)
if not statement or not statement.mainsnak or not statement.mainsnak.datavalue then
return nil
end
return statement.mainsnak.datavalue.value
end
local function get_first_value(entity, property_id)
local statements = entity:getBestStatements(property_id)
return get_string_value(statements[1])
end
local function get_all_values(entity, property_id)
local values = {}
for _, statement in ipairs(entity:getBestStatements(property_id)) do
local value = get_string_value(statement)
if non_vide(value) then
table.insert(values, value)
end
end
return values
end
local function get_first_qualifier_value(statement, property_id)
if not statement.qualifiers or not statement.qualifiers[property_id] then
return nil
end
local qualifier = statement.qualifiers[property_id][1]
if not qualifier or not qualifier.datavalue then
return nil
end
return qualifier.datavalue.value
end
local function format_time(statement)
local value = get_string_value(statement)
if type(value) ~= 'table' or type(value.time) ~= 'string' then
return nil
end
local annee, mois, jour = value.time:match('^%+?(%d%d%d%d)%-(%d%d)%-(%d%d)T')
if not annee then
return nil
end
local iso = annee .. '-' .. mois .. '-' .. jour
if jour == '01' then
return '1<sup>er</sup> ' .. mw.getContentLanguage():formatDate('F Y', iso)
end
return mw.getContentLanguage():formatDate('j F Y', iso)
end
local function get_sorties(entity)
local sorties = {}
for _, statement in ipairs(entity:getBestStatements(PROPRIETES.date_sortie)) do
local region = get_first_qualifier_value(statement, PROPRIETES.region_sortie)
local date = format_time(statement)
if non_vide(region) and non_vide(date) then
sorties[region] = date
end
end
return sorties
end
local function format_generation(valeur)
if not non_vide(valeur) then
return nil
end
return GENERATIONS[valeur] or valeur
end
local function concatener(valeurs)
if #valeurs == 0 then
return '{{?}}'
end
if #valeurs == 1 then
return valeurs[1]
end
if #valeurs == 2 then
return valeurs[1] .. ' et ' .. valeurs[2]
end
return table.concat(valeurs, ', ', 1, #valeurs - 1) .. ' et ' .. valeurs[#valeurs]
end
local function format_generations(entity, property_id)
local resultat = {}
for _, valeur in ipairs(get_all_values(entity, property_id)) do
local generation = format_generation(valeur)
if non_vide(generation) then
table.insert(resultat, generation)
end
end
return concatener(resultat)
end
function p.infobox(frame)
local args = get_args(frame)
local entity = get_entity(args)
if not entity then
return ''
end
local nom_page = non_vide(args.titre) and mw.text.trim(args.titre) or mw.title.getCurrentTitle().text
local sorties = get_sorties(entity)
local entete = nom_page
local resultat = {
'{| class="tableaustandard ficheinfo"',
}
if args.miniature == 'oui' then
entete = '<div style="float:right;">[[Fichier:Miniat ' .. nom_page .. '.png]]</div>' .. entete
end
table.insert(resultat, '|-')
table.insert(resultat, '! colspan="2" class="entêtesection" | ' .. entete)
table.insert(resultat, '|-')
table.insert(resultat, '| colspan="2" class="illustration" | [[Fichier:' .. nom_page .. '.png|200px]]')
if args.logo ~= 'non' then
table.insert(resultat, '|-')
table.insert(resultat, '! width="30%" | Logo')
table.insert(resultat, '| [[Fichier:Logo ' .. nom_page .. '.png|x30px]]')
end
table.insert(resultat, '|-')
table.insert(resultat, '! Type de console')
table.insert(resultat, '| ' .. (get_first_value(entity, PROPRIETES.type_console) or ''))
table.insert(resultat, '|-')
table.insert(resultat, '! colspan="2" class="entêtesection" | Dates de sortie')
for _, region in ipairs(ORDRE_SORTIES) do
if non_vide(sorties[region]) then
table.insert(resultat, '|-')
table.insert(resultat, '! ' .. region)
table.insert(resultat, '| ' .. sorties[region])
end
end
table.insert(resultat, '|-')
table.insert(resultat, '! colspan="2" class="entêtesection" | Générations')
table.insert(resultat, '|-')
table.insert(resultat, '! Dédiées')
table.insert(resultat, '| ' .. format_generations(entity, PROPRIETES.generation_dediee))
table.insert(resultat, '|-')
table.insert(resultat, '! Compatibles')
table.insert(resultat, '| ' .. format_generations(entity, PROPRIETES.generation_compatible))
table.insert(resultat, '|}')
return table.concat(resultat, '\n')
end
return p