Aller au contenu

Poképédia subit actuellement quelques soucis techniques !
L'équipe est au courant des problèmes et fait le nécessaire pour les arranger le plus rapidement possible. Merci de votre compréhension !

Module:Infobox Console

De Poképédia

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