Aller au contenu

Légendes Pokémon : Z-A est là !

Le contenu du jeu est déjà disponible sur le wiki, mais beaucoup de choses restent encore à ajouter. Vous pouvez rejoindre le Discord pour en discuter.
Attention aux spoils, et bonne navigation sur Poképédia !

Module:Test

De Poképédia

Seulement pour tester. Si un modèle utilise une fonction de ce module, il cassera un jour !


local p = {}
local ressources = {
	["infosPokemon"] = require("Module:Ressources/infosPokemon")
}

function p.yop() -- met un mot en lowercase
	return mw.ustring.lower( "ÉLLOÈ" )
end

function p.poy() -- première lettre en majuscule
	return mw.getContentLanguage():ucfirst( "ébloubi" )
end

local numeros = mw.loadData("Module:Data/NumérosPokémon")

function p.infosPokemon( poke, mode )
	local forme, sexe, nom, lien, jeu, jeu_miniature
	if ( string.match(poke, "forme%([^)]*%)") ) then
		forme = " " .. string.sub(string.match(poke, "forme%([^)]*%)"), 7, -2)
		poke = string.gsub( poke, "forme%([^)]*%)", "" )
	else forme = "" end
	if ( string.match(poke, "sexe%([^)]*%)") ) then
		sexe = string.sub(string.match(poke, "sexe%([^)]*%)"), 6, -2)
		if sexe == "f" then sexe = " ♀" else sexe = " ♂" end
		poke = string.gsub( poke, "sexe%([^)]*%)", "" )
	else sexe = "" end
	if ( string.match(poke, "jeu%([^)]*%)") ) then
		jeu = mw.getCurrentFrame():expandTemplate{ title = 'Sup', args = { string.sub(string.match(poke, "jeu%([^)]*%)"), 5, -2) } }
		poke = string.gsub( poke, "jeu%([^)]*%)", "" )
	else jeu = "" end
	if ( string.match(poke, "jeu%-miniature%([^)]*%)") ) then
		jeu_miniature = " " .. string.sub(string.match(poke, "jeu%-miniature%([^)]*%)"), 15, -2)
		poke = string.gsub( poke, "jeu%-miniature%([^)]*%)", "" )
	else jeu_miniature = "" end
	
	if forme == " Alola" then
		poke = mw.text.trim( poke )
		nom = "Forme d'Alola"
		lien = poke .. " d'Alola"
	elseif forme == " Galar" then
		poke = mw.text.trim( poke )
		nom = "Forme de Galar"
		lien = poke .. " de Galar"
	elseif forme == " Gigamax" then
		poke = mw.text.trim( poke )
		nom = "Gigamax"
		lien = poke .. " Gigamax"
	else
		if ( string.match(poke, "nom%([^)]*%)") ) then
			nom = string.sub(string.match(poke, "nom%([^)]*%)"), 5, -2)
			poke = string.gsub( poke, "nom%([^)]*%)", "" )
		elseif forme ~= "" then nom = "Forme" .. forme
		elseif sexe == " ♀" then nom = "Femelle"
		elseif sexe == " ♂" then nom = "Mâle"
		else nom = "" end
		if ( string.match(poke, "lien%([^)]*%)") ) then
			lien = string.sub(string.match(poke, "lien%([^)]*%)"), 6, -2)
			poke = string.gsub( poke, "lien%([^)]*%)", "" )
		else lien = mw.text.trim( poke ) end
	end
	
	poke = mw.text.trim( poke )
	local num = numeros[poke]
	if num == nil then num = "???" end
	
	if mode == "miniature" then 
		if nom == "" then return "[[Fichier:Miniature " .. num .. forme .. sexe .. jeu_miniature .. ".png|link=" .. lien .. "|alt=" .. lien .. "|" .. lien .. "]]" .. jeu
		else return "[[Fichier:Miniature " .. num .. forme .. sexe .. jeu_miniature .. ".png|link=" .. lien .. "|alt=" .. poke .. " (" .. nom .. ")|" .. poke .. " (" .. nom .. ")]]" .. jeu
		end
	else
		if nom == "" then return "<span style='white-space: nowrap;' class='miniat-poke'>" .. num .. " [[Fichier:Miniature  " .. num .. forme .. sexe .. jeu_miniature .. ".png|link=" .. lien .. "|alt=]] [[" .. lien .. "|" .. poke .. "]]" .. jeu .. "</span>"
		else return "<span style='white-space: nowrap;' class='miniat-poke'>" .. num .. " [[Fichier:Miniature " .. num .. forme .. sexe .. jeu_miniature .. ".png|link=" .. lien .. "|alt=]] [[" .. lien .. "|" .. poke .. "]]" .. jeu .. "</span><br /><span style='font-style: italic; font-size: 90%;'>" .. nom .. "</span>"
		end
	end
end

function p.infosPokemon2(frame)
	poke = frame.args[1]
	mode = frame.args[2]
	return p.infosPokemon(poke, mode)
end

function p.testregexp(frame)
	a = frame.args[1]
	
	b = a:gsub(".*{{Abréviation|(.*)}}.*", "%1")
	return b
end

local numeros = mw.loadData("Module:Data/NumérosPokémon")

function p.newInfosPokemon(frame)
	local numeros = mw.loadData("Module:Data/NumérosPokémon")
	local poke = frame.args[1]
	local mode = frame.args[2]
	local forme, sexe, nom, lien, jeu, sup
	
	-- Fonction qui récupère les détails indiqués d'un Pokémon entre parenthèses
	-- '\' fait office de caractère d'échappement en cas de parenthèse fermante
	local function get_modifier(modifier)
		local regex = modifier .. "%([^)]*[^\\]%)"
		if (string.match(poke, regex)) then
			local ret = string.sub(string.match(poke, regex), string.len(modifier)+2, -2)
			ret = string.gsub(ret, "\\", "")
			poke = string.gsub(poke, regex, "")
			return ret
		else return "" end
	end
	
	-- Récupération des données additionnelles
	forme = get_modifier("forme")
	jeu = get_modifier("jeu")
	sexe = get_modifier("sexe")
	if (sexe == "f") then sexe = "♀" 
	elseif (sexe == "m") then sexe = "♂" end
	sup = get_modifier("sup")
	if (sup ~= "") then sup = mw.getCurrentFrame():expandTemplate{ title = 'Sup', args = { sup } } end
	-- Pour pouvoir overwrite par la suite si nécessaire
	local temp_nom = get_modifier("nom")
	local temp_lien = get_modifier("lien")
	
	-- Nettoyage du nom et valeurs par défaut
	poke = mw.text.trim(poke)
	lien = poke
	nom = ""
	local poke_file = poke -- Si jamais on veut changer le nom du lien
	local num = numeros[poke] or "???"
		
	if (forme ~= "")
	then
		-- Dictionnaires pour largement simplifier la gestion des formes spéciales
		local common_forms = {
			["Alola"] = { "Forme d'Alola", " d'Alola" },
			["Galar"] = { "Forme de Galar", " de Galar" },
			["Hisui"] = { "Forme de Hisui", " de Hisui" },
			["Paldea"] = { "Forme de Paldea", " de Paldea" },
			["Gigamax"] = { "Gigamax", " Gigamax" }
		}
		
		-- Lorsque le nom d'affichage = nom des formes
		local poke_short_forms = { ["Évoli"] = true, ["Zarbi"] = true, ["Arceus"] = true,
			["Magaerna"] = true, ["Charmilly"] = true, ["Bekaglaçon"] = true, ["Zacian"] = true,
			["Zamazenta"] = true, ["Éthernatos"] = true, ["Sylveroy"] = true, ["Ursaking"] = true }
		
		-- Lorsque le nom d'affichage = préfix autre que "Forme " + nom des formes
		local poke_prefix_forms = {
			["Cheniti"] = "Cape ",
			["Cheniselle"] = "Cape ",
			["Ceriflor"] = "Temps ",
			["Sancoki"] = "Mer ",
			["Tritosor"] = "Mer ",
			["Bargantua"] = "Motif ",
			["Keldeo"] = "Aspect ",
			["Genesect"] = "Module ",
			["Prismillon"] = "Motif ",
			["Flabébé"] = "Fleur ",
			["Floette"] = "Fleur ",
			["Florges"] = "Fleur ",
			["Pitrouille"] = "Taille ",
			["Banshitrouye"] = "Taille ",
			["Xerneas"] = "Mode ",
			["Plumeline"] = "Style ",
			["Silvallié"] = "Type : ",
			["Morpeko"] = "Mode ",
			["Famignol"] = "Famille de ",
			["Tapatoès"] = "Plumage ",
		}
		
		-- Pokémon avec beaucoup de formes et un pattern utilisable
		local other_patterns = {
			["Pikachu"] = function()
				if (forme == "Partenaire") then return { mw.text.trim(forme), "Pikachu Partenaire" }
				elseif (string.match(forme, "^Casquette ")) then return { forme, "Pikachu" }
				elseif (string.match(forme, "^Halloween ")) then return { "Chapeau d'Halloween", "Pikachu" }
				elseif (string.match(forme, "^Fêtes ")) then return { "Chapeau rouge", "Pikachu" }
				else return { "Pikachu " .. forme, "Pikachu " .. forme } -- Les Cosplayeurs
				end
			end,
			["Couafarel"] = function()
				if (forme == "Sauvage") then return { "Forme Sauvage", "Couafarel" }
				else return { "Coupe " .. forme, "Couafarel" }
				end
			end,
			["Météno"] = function()
				if (forme == "Météore") then return { "Forme Météore", "Météno" }
				else return { "Noyau " .. forme, "Météno" }
				end
			end }
					
		
		-- Toutes les autres formes où le nom d'affichage n'est pas juste "Forme <forme>"
		local other_forms = {
			["Tauros"] = {
				["Paldea Combative"] = { "Forme de Paldea<br>Race Combative", "Tauros de Paldea" },
				["Paldea Flamboyante"] = { "Forme de Paldea<br>Race Flamboyante", "Tauros de Paldea" },
				["Paldea Aquatique"] = { "Forme de Paldea<br>Race Aquatique", "Tauros de Paldea" }
			},
			["Darumacho"] = {
				["Transe"] = { "Mode Transe", "Darumacho" },
				["Galar Transe"] = { "Forme de Galar<br>Mode Transe", "Darumacho de Galar" }
			},
			["Kyurem"] = {
				["Blanc"] = { "Kyurem Blanc", "Kyurem Blanc" },
				["Noir"] = { "Kyurem Noir", "Kyurem Noir" }
			},
			["Necrozma"] = {
				["Crinière du Couchant"] = { "Crinière du Couchant", "Necrozma Crinière du Couchant" },
				["Ailes de l'Aurore"] = { "Ailes de l'Aurore", "Necrozma Ailes de l'Aurore" },
				["Ultra"] = { "Ultra-Necrozma", "Ultra-Necrozma" }
			},
			["Shifours"] = {
				["Poing Final"] = { "Style Poing Final", "Shifours" },
				["Mille Poings"] = { "Style Mille Poings", "Shifours" },
				["Gigamax Poing Final"] = { "Gigamax<br>Style Poing Final", "Shifours-Gigamax" },
				["Gigamax Mille Poings"] = { "Gigamax<br>Style Mille Poings", "Shifours-Gigamax" }
			},
			["Koraidon"] = {
				["Finale"] = { "Forme Finale", "Koraidon" },
				["Course"] = { "Forme de Course", "Koraidon" },
				["Nage"] = { "Forme de Nage", "Koraidon" },
				["Vol"] = { "Forme de Vol", "Koraidon" }
			},
			["Miraidon"] = {
				["Ultime"] = { "Mode Ultime", "Miraidon" },
				["Terrestre"] = { "Mode Terrestre", "Miraidon" },
				["Aquatique"] = { "Mode Aquatique", "Miraidon" },
				["Aérien"] = { "Mode Aérien", "Miraidon" }
			},
			["Ogerpon"] = {
				["Turquoise"] = { "Masque Turquoise", "Ogerpon" },
				["Puits"] = { "Masque du Puits", "Ogerpon" },
				["Fourneau"] = { "Masque du Fourneau", "Ogerpon" },
				["Pierre"] = { "Masque de la Pierre", "Ogerpon" }
			}
		}
			
		if common_forms[forme] then
			nom = common_forms[forme][1]
			lien = poke .. common_forms[forme][2]
			
		elseif (forme == "Méga") then
			nom = "Méga-".. poke
			lien = "Méga-" .. poke
			
		elseif (forme == "Primo") then
			nom = "Primo-" .. poke
			lien = "Primo-" .. poke
			
		
		elseif (forme == "Méga X") then
			nom = "Méga-".. poke .. " X"
			lien = "Méga-" .. poke .. " X"
			
		elseif (forme == "Méga Y") then
			nom = "Méga-".. poke .. " Y"
			lien = "Méga-" .. poke .. " Y"
			
		elseif poke_short_forms[poke] then
			nom = mw.text.trim(forme)
			
		elseif poke_prefix_forms[poke] then
			nom = poke_prefix_forms[poke] .. forme
			
		elseif (poke == "Motisma" or poke == "Hoopa") then
			nom = poke .. " " .. forme
			
		elseif other_patterns[poke] then
			f = other_patterns[poke]
			local r = f()
			nom = r[1]
			lien = r[2]
			
		elseif (other_forms[poke] and other_forms[poke][forme]) then
			local r = other_forms[poke][forme]
			nom = r[1]
			lien = r[2]
			
		else -- Toutes les formes où le nom d'affichage est juste "Forme <forme>" sans redirection
			nom = "Forme " .. forme
			lien = poke
		end
	end
		
	-- Gestion des sous pages pour jeux spécifiques
	if (jeu ~= "") then
		local games_with_pages = {
			["PDMRB"] = "Pokémon Donjon Mystère",
			["PDMTOC"] = "Pokémon Donjon Mystère",
			["PDMTO"] = "Pokémon Donjon Mystère",
			["PDMC"] = "Pokémon Donjon Mystère",
			["PDMPI"] = "Pokémon Donjon Mystère",
			["PMDM"] = "Pokémon Donjon Mystère",
			["PDMDX"] = "Pokémon Donjon Mystère"
		}
		
		if (games_with_pages[jeu]) then
			lien = poke .. "/" .. games_with_pages[jeu]
		end
	end
	
	-- Gestion des formes séxuées
	if (sexe == "♀") then nom = "Femelle" end
	if (sexe == "♂") then nom = "Mâle" end
	
	-- Si "nom" ou "lien" ont été indiqués, on overwrite les valeurs
	if (temp_nom ~= "") then nom = temp_nom end
	if (temp_lien ~= "") then lien = temp_lien end
	
	-- Ajouts d'espaces pour la valeur de retour
	if (forme ~= "") then forme = " " .. forme end
	if (sexe ~= "") then sexe = " " .. sexe end
	if (jeu ~= "") then jeu = " " .. jeu end
	
	-- Retour
	if (mode == "miniature") then
		if (nom ~= "") then nom = " (" .. nom .. ")" end
		return "[[Fichier:Miniature " .. num .. forme .. sexe .. jeu .. ".png|link=" .. lien .. "|alt=" .. poke .. nom .. "|" .. poke .. nom .. "|class=miniature" .. jeu .. "]]" .. sup
	else
		if (nom ~= "") then nom = "<br><span style='font-style: italic; font-size: 90%;'>" .. nom .. "</span>" end
		return "<span style='white-space: nowrap;' class='miniat-poke'>" .. num .. " [[Fichier:Miniature " .. num .. forme .. sexe .. jeu .. ".png|link=" .. lien .. "|alt=|class=miniature" .. jeu .. "]] [[" .. lien .. "|" .. poke .. "]]" .. sup .. "</span>" .. nom
	end
end


function separate_thousands(amount)
	local formatted = amount
	while true do
		formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1 %2')
		if (k==0) then
			break
		end
	end
	return formatted
end

function p.testListe(frame)
	local jeu = frame.args["jeu"]
	local pokemon = frame.args[1]
	local titre = (frame.args["titre"] or "Pokémon")
	local tableauType = (frame.args["type"] or "")
	
	if pokemon ~= nil then pokemon = mw.text.split(pokemon, "\n") else pokemon = {} end

	local resultat = {}
	table.insert(resultat, '<table class="tableaustandard ' .. tableauType .. ' capacité-liste"><tr><th colspan="4">'.. titre ..'</th></tr><tr>')
	
	local i = 1
	local j = 1
	while pokemon[i] do
		if mw.text.trim(pokemon[i]) ~= "" then
			if string.match(pokemon[i], "^Section ") then
				pokemon[i] = string.gsub( pokemon[i], "Section ", "" )
				table.insert(resultat, '</tr><tr>')
				table.insert(resultat, '<th colspan="4">'.. pokemon[i] ..'</th></tr><tr>')
				j = 1
			else
				if jeu then pokemon[i] = pokemon[i] .. 'jeu(' .. jeu .. ')' end
				table.insert(resultat, '<td style="vertical-align:top; min-width:25%">')
				table.insert(resultat, ressources.infosPokemon(pokemon[i]))
				table.insert(resultat, '</td>')
				if j == 4 then
					j = 1
					table.insert(resultat, '</tr><tr>')
				else
					j = j + 1
				end
			end
		end
		i = i + 1
	end
	
	table.insert(resultat, '</tr></table>')
	return table.concat(resultat, '')
end

function p.testMiniature(frame)
	local jeu = frame.args["jeu"]
	local pokemon = frame.args[1]
	local titre = (frame.args["titre"] or "Pokémon")
	local tableauType = (frame.args["type"] or "")
	
	if pokemon ~= nil then pokemon = mw.text.split(pokemon, "\n") else pokemon = {} end

	local resultat = {}
	table.insert(resultat, '<table class="tableaustandard ' .. tableauType .. ' centre"><tr><th>'.. titre ..'</th></tr><tr><td>')
	
	local i = 1
	while pokemon[i] do
		if mw.text.trim(pokemon[i]) ~= "" then
			if string.match(pokemon[i], "^Section ") then
				pokemon[i] = string.gsub( pokemon[i], "Section ", "" )
				table.insert(resultat, '</tr><tr>')
				table.insert(resultat, '<th colspan="4">'.. pokemon[i] ..'</th></tr><tr><td>')
			else
				if jeu then pokemon[i] = pokemon[i] .. 'jeu(' .. jeu .. ')' end
				table.insert(resultat, ressources.infosPokemon(pokemon[i], "miniature"))
			end
		end
		i = i + 1
	end
	
	table.insert(resultat, '</td></tr></table>')
	return table.concat(resultat, '')
end

function p.donnees(frame)
	local donnees = frame.args[1]
	local lignes = {}
	if donnees ~= nil then lignes = mw.text.split(donnees, "\n") end
	
	images_rangement = {
		["RB"] = "[[Fichier:Vide.png|32px]]",
		["J"] = "[[Fichier:Vide.png|32px]]",
		["OA"] = "[[Fichier:Sprite XXX OA.png|32px]]",
		["C"] = "[[Fichier:Sprite XXX OA.png|32px]]",
		["RS"] = "[[Fichier:Sprite Sac (XXX) ♂ RS.png|32px]]",
		["RFVF"] = "[[Fichier:Sprite Sac (XXX) ♂ RFVF.png|32px]]",
		["E"] = "[[Fichier:Sprite Sac (XXX) ♂ E.png|32px]]",
		["DP"] = "[[Fichier:Miniature Poche XXX (sélectionnée) DP.png|32px]]",
		["Pt"] = "[[Fichier:Miniature Poche XXX (sélectionnée) Pt.png|32px]]",
		["HGSS"] = "[[Fichier:Miniature Poche XXX (sélectionnée) HGSS.png]]",
		["NB"] = "[[Fichier:Sprite Sac (XXX, transition) ♂ NB.png|32px]]",
		["N2B2"] = "[[Fichier:Sprite Sac (XXX, transition) ♂ N2B2.png|32px]]",
		["XY"] = "[[Fichier:Miniature Poche XXX (sélectionnée) XY.png]]",
		["ROSA"] = "[[Fichier:Miniature Poche XXX (sélectionnée) ROSA.png]]",
		["SL"] = '<div style="width:32px; text-align:center; display:inline-block">[[Fichier:Miniature Poche XXX SL.png]]</div>',
		["USUL"] = '<div style="width:32px; text-align:center; display:inline-block">[[Fichier:Miniature Poche XXX USUL.png]]</div>',
		["LGPE"] = "[[Fichier:Miniature XXX LGPE.png]]",
		["EB"] = "[[Fichier:Miniature Poche XXX (sélectionnée) EB.png|class=imagenoire|32px]]",
		["DEPS"] = "[[Fichier:Miniature Poche XXX (sélectionnée) DEPS.png|32px]]",
		["LPA"] = "[[Fichier:Miniature Sacoche LPA.png|32px]]",
		["EV"] = "[[Fichier:Miniature Poche XXX (sélectionnée) EV.png|32px]]",
		["LPZA"] = "[[Fichier:Miniature Poche XXX LPZA.png|class=imagenoire|32px]]",
	}
	
	function afficher_monnaie(monnaie, jeu)
		local d = {
			["P"] = frame:expandTemplate({ title = 'P'}),
			["Poké"] = frame:expandTemplate({ title = 'Monnaie PDM', args = { ["jeu"] = jeu }}),
			["Méga-Fragment"] = frame:expandTemplate({ title = "Objet", args = { "Méga-Fragment", ["jeu"] = jeu, ["nom"] = "non" }}),
			["Méga-Fragments"] = frame:expandTemplate({ title = "Objet", args = { "Méga-Fragment", ["jeu"] = jeu, ["nom"] = "non" }})
		}
		if d[monnaie]
		then return d[monnaie]
		else return monnaie
		end
	end
	
	local corps_result = {}
	local has_notes = false
	local donnees_dict = {}

	local i = 1
	while lignes[i] ~= nil do
		local ligne = lignes[i]
		local ligne_split = mw.text.split(ligne, " / ")
		
		for j = 3, 5 do
			if ligne_split[j] == nil or ligne_split[j] == "-"
			then ligne_split[j] = "—"
			end
		end
		
		donnees_dict[i] = {
			["jeu"] = ligne_split[1],
			["rangement"] = ligne_split[2],
			["achat"] = ligne_split[3],
			["vente"] = ligne_split[4],
			["note"] = ligne_split[5]
		}
		
		i = i + 1
	end
	
	i = 1
	while lignes[i] ~= nil do
		local jeu = donnees_dict[i].jeu
		local rangement = donnees_dict[i].rangement
		local achat = donnees_dict[i].achat
		local vente = donnees_dict[i].vente
		local note = donnees_dict[i].note
		
		if jeu ~= ""
		then
			precedent_exists = donnees_dict[i-1] ~= nil and donnees_dict[i-1].jeu ~= ""
			
			table.insert(corps_result, "<tr><td>" .. frame:expandTemplate({ title = 'Abréviation', args = { jeu } }) .. "</td>")
			
			if not rangement
			then rangement = "—"
			else
				if jeu == "OA" or jeu == "C"
				then rangement = "Poche " .. rangement
				end
				
				if images_rangement[jeu]
				then rangement = images_rangement[jeu]:gsub("XXX", rangement) .. " " .. rangement
				end
			end
			table.insert(corps_result, '<td style="white-space:nowrap; text-align:left">' .. rangement .. '</td>')
			
			achat_texte = "—"
			local rowspan = 1
			if not(precedent_exists and achat == donnees_dict[i-1].achat)
			then
				while donnees_dict[i + rowspan] and achat == donnees_dict[i + rowspan].achat do
					rowspan = rowspan + 1
				end
				
				if achat
				then
					achats = mw.text.split(achat, ", ")
					achat_texte = ""
					local j = 1
					while achats[j] do
						achat_j = achats[j]
						local precision_achat = ""
						local parenthese_pos = achat_j:find(" %(")
						if parenthese_pos
						then precision_achat = achat_j:sub(parenthese_pos):gsub(" %(", " <small>(") .. "</small>"
							achat_j = achat_j:sub(0, parenthese_pos - 1)
						end
						
						espace_pos = achat_j:find(" ")
						local unite_achat = ""
						if espace_pos
						then unite_achat = achat_j:sub(espace_pos + 1) -- + 1 pour enlever l'espace
							unite_achat = " " .. afficher_monnaie(unite_achat, jeu)
							achat_j = achat_j:sub(0, espace_pos)
						end
						
						if achat_j == "-"
						then achat_j = "—"
						else achat_j = separate_thousands(achat_j)
						end
						
						if achat_texte ~= "" then achat_texte = achat_texte .. "<br>" end
						achat_texte = achat_texte .. achat_j .. unite_achat .. precision_achat
						
						j = j + 1
					end
				end
				table.insert(corps_result, '<td rowspan="' .. rowspan .. '" style="white-space:nowrap">' .. achat_texte .. "</td>")
			end
			
			vente_texte = "—"
			rowspan = 1
			if not(precedent_exists and vente == donnees_dict[i-1].vente)
			then 
				while donnees_dict[i + rowspan] and vente == donnees_dict[i + rowspan].vente do
					rowspan = rowspan + 1
				end
				
				if vente
				then
					ventes = mw.text.split(vente, ", ")
					vente_texte = ""
					local j = 1
					while ventes[j] do
						vente_j = ventes[j]
						local precision_vente = ""
						local parenthese_pos = vente_j:find(" %(")
						if parenthese_pos
						then precision_vente = vente_j:sub(parenthese_pos):gsub(" %(", " <small>(") .. "</small>"
							vente_j = vente_j:sub(0, parenthese_pos - 1)
						end
						
						mw.log(vente_j)
						
						espace_pos = vente_j:find(" ")
						local unite_vente = ""
						if espace_pos
						then unite_vente = vente_j:sub(espace_pos + 1) -- + 1 pour enlever l'espace
							
						mw.log(unite_vente)
							unite_vente = " " .. afficher_monnaie(unite_vente, jeu)
							vente_j = vente_j:sub(0, espace_pos)
						end
						
						mw.log(vente_j)
						
						if vente_j == "-"
						then vente_j = "—"
						else vente_j = separate_thousands(vente_j)
						end
						
						if vente_texte ~= "" then vente_texte = vente_texte .. "<br>" end
						vente_texte = vente_texte .. vente_j .. unite_vente .. precision_vente
						
						j = j + 1
					end
				end
				table.insert(corps_result, '<td rowspan="' .. rowspan .. '" style="white-space:nowrap">' .. vente_texte .. "</td>")
			end
			
			rowspan = 1
			if not(precedent_exists and note == donnees_dict[i-1].note)
			then
				while donnees_dict[i + rowspan] and note == donnees_dict[i + rowspan].note do
					rowspan = rowspan + 1
				end
				
				if note
				then has_notes = true
				else note = "—"
				end
				
				table.insert(corps_result, '<td rowspan="' .. rowspan .. '">' .. note .. "</td>")
			end
			table.insert(corps_result, "</tr>")
		end
		
		i = i + 1
	end

	local result = {}
	local corps = table.concat(corps_result, "")
	
	table.insert(result, '<table class="tableaustandard centre">')
	table.insert(result, '<tr><th rowspan="2">Jeu</th><th rowspan="2">Rangement</th><th colspan="2">Prix</th>')
	if has_notes
	then table.insert(result, '<th rowspan="2">Notes</th>')
	else corps = corps:gsub('<td rowspan="%d">—</td></tr>', '</tr') -- on enlève la colonne Notes
	end
	
	table.insert(result, '</tr><tr><th>Achat</th><th>Vente</th></tr>')

	table.insert(result, corps)
	table.insert(result, "</table>")
	
	return table.concat(result, "")
end

return p