پودمان:فرتور

از ویکی‌پدیا، دانشنامهٔ آزاد
توضیحات پودمان[ایجاد] [پاکسازی]
-- Ce module permet de générer une image, en nettoyant les paramètres pour éviter d'avoir des erreurs de Lint : [[Special:LintErrors/bogus-image-options]].

local p = {}

local function trim( texte )
	if type( texte ) == 'string' then
		texte = texte:gsub( '^%s*(%S?.-)%s*$', '%1' )
		if texte ~= '' then
			return texte
		end
	end
	return nil
end

-- Retire toutes catégories, liens internes, externes et balises html pour ne garder que le texte brut.
local function nettoyageAlt( texte )
	if type( texte ) == 'string' and texte:match( '[%[<\n]' )  then
			local function texteDuLien( l, t )
				return ( t ~= '' and t ) or l
			end
			texte = texte
			-- nettoyage des catégories
				:gsub( '%[%[[%s_]*رده[%s_]*:.-%]%]', '' )
				:gsub( '%[%[[%s_]*[Cc]ategory[%s_]*:.-%]%]', '' )
			-- nettoyage des fichiers
				:gsub( '%[%پرونده:[^%[%]]+%]%]', '' )
				:gsub( '%[%[[Ff]ile:[^%[%]]+%]%]', '' )
				:gsub( '%[%[[Ii]mage:[^%[%]]+%]%]', '' )
			-- nettoyage des liens internes
				:gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', texteDuLien )
			-- nettoyage des liens externes
				:gsub( '%[https?://[^%[%] ]* *([^%]]+)%]', '%1' )
				:gsub( '%[//[^%[%] ]* *([^%]]+)%]', '%1' )
			-- nettoyage des listes
				:gsub( '\n[*#][^\n]+', '')
				:gsub( '<li.-</li>', '' )
			-- nettoyage des balises html
				:gsub( '%b<>', '' )
			-- nettoyage des retour ligne
				:gsub( '\n', ' ' )
	end
	return trim( texte )
end

local function valide( valeur, liste )
	for i, v in ipairs( liste ) do
		if valeur == v then
			return valeur
		end
	end
	return nil
end

-- Génère l'appel au ficher image.
-- Si le paramètre image (nom du fichier) est vide, la fonction ne retourne rien
function p.image( rawArgs )
	local argsList = { 'image', 'format', 'upright', 'taille', 'border', 'légende', 'alt', 'link', 'page', 'class', 'lang', 'align', 'valign' }
	local args = {}
	for _, v in ipairs( argsList ) do
		args[ v ] = trim( rawArgs[ v ] )
	end
	if not args.image then
		return
	end
	
	-- analyse du nom de fichier
	local image = args.image
		:gsub( '%[%[[%s_]*رده[%s_]*:.-%]%]', '' )
		:gsub( '%[%[[%s_]*[Cc]ategory[%s_]*:.-%]%]', '' )
		:gsub( '%[%[پرونده:([^|%[%]]+).+', '%1' )
		:gsub( '%[%[[Ii]mage:([^|%[%]]+).+', '%1' )
		:gsub( '%[%[[Ff]ile:([^|%[%]]+).+', '%1' )
	
	-- analyse de la légende
	local legende = args[ 'légende' ] and args[ 'légende' ]
		:gsub( '%[%[[%s_]*[Cc]atégorie[%s_]*:.-%]%]', '' )
		:gsub( '%[%[[%s_]*[Cc]ategory[%s_]*:.-%]%]', '' )
	
	-- analyse de la taille
	local taille = args.taille and args.taille:gsub( '%s', '' ):gsub( '(%d)$', '%1px' )
	if taille and not ( taille:match '%d+x?%d*px' or taille:match 'x%d+px' ) then
		taille = nil
	end
	
	-- analyse de l'alternative
	local alt = nettoyageAlt( args.alt )
	
	-- génération du lien
	local wiki = { image }
	table.insert( wiki, valide( args.format, { 'thumbnail', 'frameless', 'frame', 'بی‌قاب', 'قاب', 'بندانگشتی', } ) )
	table.insert( wiki, args.border and 'border' )
	table.insert( wiki, taille )
	if tonumber( args.upright )
		and not taille
		and valide(args.format, { 'thumbnail', 'بندانگشتی', 'frameless', 'بی‌قاب', } )
	then
		table.insert( wiki, 'upright=' .. args.upright )
	end
	table.insert( wiki, valide( args.align, { 'left', 'right', 'center', 'none', 'چپ', 'رایت', 'وسط' } ) )
	table.insert( wiki, valide( args.valign, { 'top', 'text-top', 'super', 'baseline', 'sub', 'middle', 'text-bottom', 'bottom', 'بالا', 'متن-بالا', 'زبر', 'زیر', 'میانه', 'متن-پایین', 'پایین', } ) )
	table.insert( wiki, alt and 'alt=' .. alt )
	table.insert( wiki, args.link and 'link=' .. args.link )
	table.insert( wiki, args.page and 'page=' .. args.page )
	table.insert( wiki, args.class and 'class=' .. args.class )
	if args.lang and image:sub( -4 ):lower() == '.svg' then
		table.insert( wiki, 'lang=' .. args.lang )
	end
	table.insert( wiki, legende )
	
	return '[[پرونده:' .. table.concat( wiki, '|' ) .. ']]'
end


function p.infoboxV2( frame )
	local args = frame.args
	
	if args.alt == '' then
		args.alt = 'تصویر نمایانگر جستار ' .. mw.title.getCurrentTitle().text 
	end
	
	local taille = args.taille:gsub( '%D', '' )
	taille = tonumber( taille ) or 280
	if taille > 280 then
		taille = 280
	end
	args.taille = taille .. 'px'
	
	-- pareil que le format par défaut, parce qu'une taille en px est spécifiée,
	-- mais n'agrandit pas l'image si elle est plus petite que cette taille
	args.format = 'frameless'
	
	return p.image( args )
end


return p