Saltar para o conteúdo

Módulo:Testes/Eduardo Augusto

Origem: Wikipédia, a enciclopédia livre.
-- Este módulo permite gerar uma imagem, limpando as configurações para evitar erros de Lint : [[Special:LintErrors/bogus-image-options]].

local p = {}

local mwTrim = mw.text.trim

local function trim( texto )
	if type( texto ) == 'string' and texto ~= '' then
		texto = mwTrim( texto )
		if texto ~= '' then
			return texto
		end
	end
	return nil
end

-- Remova todas as categorias, links internos, tags externas e html para manter apenas texto simples.
local function limpezaAlt( texto )
	if type( texto ) == 'string' and texto:match( '[%[<\n]' )  then
			local function textoDoLink( l, t )
				return ( t ~= '' and t ) or l
			end
			texto = texto
			-- limpeza das categorias
				:gsub( '%[%[[%s_]*[Cc]ategoria[%s_]*:.-%]%]', '' )
				:gsub( '%[%[[%s_]*[Cc]ategory[%s_]*:.-%]%]', '' )
			-- limpeza dos ficheiros
				:gsub( '%[%[[Ff]icheiro:[^%[%]]+%]%]', '' )
				:gsub( '%[%[[Ff]ile:[^%[%]]+%]%]', '' )
				:gsub( '%[%[[Ii]magem:[^%[%]]+%]%]', '' )
			-- limpeza das ligações internas
				:gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', textoDoLink )
			-- limpeza das ligações externas
				:gsub( '%[https?://[^%[%] ]* *([^%]]+)%]', '%1' )
				:gsub( '%[//[^%[%] ]* *([^%]]+)%]', '%1' )
			-- limpeza das listas
				:gsub( '\n[*#][^\n]+', '')
				:gsub( '<li.-</li>', '' )
			-- limpeza das balizas html
				:gsub( '%b<>', '' )
			-- limpeza dos retornos de linha
				:gsub( '\n', ' ' )
	end
	return trim( texto )
end

local function valida( valor, lista  )
	for i = 1, #lista do
		if valor == lista[ i ] then
			return valor
		end
	end
	return nil
end

-- Gere a chamada para o arquivo de imagem.
-- Se o parâmetro de imagem (nome do arquivo) estiver vazio, a função não retorna nada
function p.imagem( rawArgs )
	local argsList = { 'image', 'imagem', 'format', 'formato', 'upright', 'tamanho', 'border', 'borda', 'legenda', 'alt', 'link', 'page', 'página', 'class', 'classe', 'lang', 'língua', 'align', 'valign' }
	local args = {}
	for i = 1, #argsList do
		local argName = argsList[ i ]
		args[ argName ] = trim( rawArgs[ argName ] )
	end
	if not args.imagem then
		return
	end
	
	-- analisar o nome do ficheiro
	local imagem = args.imagem
		:gsub( '%[%[[%s_]*[Cc]ategoria[%s_]*:.-%]%]', '' )
		:gsub( '%[%[[%s_]*[Cc]ategory[%s_]*:.-%]%]', '' )
		:gsub( '%[%[[Ff]icheiro:([^|%[%]]+).+', '%1' )
		:gsub( '%[%[[Ii]magem:([^|%[%]]+).+', '%1' )
		:gsub( '%[%[[Ff]ile:([^|%[%]]+).+', '%1' )
	
	-- analisar a legenda
	local legende = args[ 'legenda' ] and args[ 'legenda' ]
		:gsub( '%[%[[%s_]*[Cc]ategoria[%s_]*:.-%]%]', '' )
		:gsub( '%[%[[%s_]*[Cc]ategory[%s_]*:.-%]%]', '' )
	
	-- analisar o tamanho
	local tamanho = args.tamanho and args.tamanho:gsub( '%s', '' ):gsub( '(%d)$', '%1px' )
	if tamanho and not ( tamanho:match '%d+x?%d*px' or tamanho:match 'x%d+px' ) then
		tamanho = nil
	end
	
	-- analisar texto alternativo
	local alt = limpezaAlt( args.alt )
	
	-- gerar o link
	local wiki = { imagem }
	table.insert( wiki, valida( args.formato, { 'thumb', 'frameless', 'frame', 'vinheta', 'semquadro', 'quadro', 'thumbnail', } ) )
	table.insert( wiki, args.borda and 'borda' )
	table.insert( wiki, tamanho )
	if tonumber( args.upright )
		and not tamanho
		and valida(args.formato, { 'thumb', 'vinheta', 'thumbnail', 'frameless', 'semquadro', } )
	then
		table.insert( wiki, 'upright=' .. args.upright )
	end
	table.insert( wiki, valida( args.align, { 'left', 'right', 'center', 'none', 'esquerda', 'direita', 'centro' } ) )
	table.insert( wiki, valida( args.valign, { 'top', 'text-top', 'super', 'baseline', 'sub', 'middle', 'text-bottom', 'bottom', 'topo', 'topo-texto', 'sup', 'base', 'meio', 'base-texto', 'base', } ) )
	table.insert( wiki, alt and 'alt=' .. alt )
	table.insert( wiki, args.link and 'link=' .. args.link )
	table.insert( wiki, args.page and 'página=' .. args.page )
	table.insert( wiki, args.classe and 'classe=' .. args.classe )
	if args.lang and imagem:sub( -4 ):lower() == '.svg' then
		table.insert( wiki, 'língua=' .. args.lang )
	end
	table.insert( wiki, legenda  )
	
	return '[[ficheiro:' .. table.concat( wiki, '|' ) .. ']]'
end


function p.infoboxV2( frame )
	local args = frame.args
	
	if args.alt == '' then
		args.alt = 'imagem ilustrativa de artigo ' .. mw.title.getCurrentTitle().text 
	end
	
	local tamanho = args.tamanho:gsub( '%D', '' )
	tamanho = tonumber( tamanho ) or 280
	if tamanho > 280 then
		tamanho = 280
	end
	args.tamanho = tamanho .. 'px'
	
	-- Igual ao formato padrão, porque um tamanho em px é especificado
	-- mas não amplia a imagem se ela for menor que este tamanho
	args.formato = 'frameless'
	
	return p.imagem( args )
end


return p