Módulo:Assinatura

Permanently protected module
Origem: Wikipédia, a enciclopédia livre.
Documentação do módulo[ver] [editar] [histórico] [purgar]

Descrição

Este módulo possui um método chamado "assinar" que recebe dois parâmetros: nome do usuário e data, em qualquer ordem, e retorna os mesmos dados no formato:

Nome do usuário (discussão • contrib) Data e hora (UTC)

Caso o fuso horário não seja informado, a sigla (UTC) é automaticamente adicionada à data.

Uso

  • Nome primeiro: {{#invoke:Assinatura|assinar|Usuário de Teste|12h21min de 24 de agosto de 2014 (UTC)}}

Usuário de Teste (discussão • contrib) 12h21min de 24 de agosto de 2014 (UTC)

  • Data primeiro: {{#invoke:Assinatura|assinar|12h21min de 24 de agosto de 2014 (UTC)|Usuário de Teste}}

Usuário de Teste (discussão • contrib) 12h21min de 24 de agosto de 2014 (UTC)

  • Nome primeiro (sem fuso horário): {{#invoke:Assinatura|assinar|Usuário de Teste|12h21min de 24 de agosto de 2014}}

Usuário de Teste (discussão • contrib) 12h21min de 24 de agosto de 2014 (UTC)

  • Data primeiro (sem fuso horário): {{#invoke:Assinatura|assinar|12h21min de 24 de agosto de 2014|Usuário de Teste}}

Usuário de Teste (discussão • contrib) 12h21min de 24 de agosto de 2014 (UTC)

  • Somente nome: {{#invoke:Assinatura|assinar|Usuário de Teste}}

Usuário de Teste (discussão • contrib) (data/hora não informada)

  • Somente data: {{#invoke:Assinatura|assinar|12h21min de 24 de agosto de 2014 (UTC)}}

Usuário não informado, 12h21min de 24 de agosto de 2014 (UTC)

  • Somente data (sem fuso horário): {{#invoke:Assinatura|assinar|12h21min de 24 de agosto de 2014}}

Usuário não informado, 12h21min de 24 de agosto de 2014 (UTC)

  • Sem nome ou data: {{#invoke:Assinatura|assinar}}

Usuário não informado (data/hora não informada)

-- Autor: Usuário:Diego_Queiroz

local p = {}

-- Constantes
local usuario_omitido = "''Usuário não informado''"
local data_omitida = "''(data/hora não informada)''"

function p.assinar(frame)
	-- Parâmetros:
	--  * nome de usuario
	--  * data
	-- Retorno
	--  Analisa qual dos dois parâmetros passados é a data e
	--  sempre retorna a string:
	--    Usuário (discussão • contrib) data
	
	local param1 = frame.args[1]
	local param2 = frame.args[2]
	
	local data = ""
	local usuario = ""
	local separador = " "
	
	-- caso um dos parâmetros não seja fornecido, faz com que as variáveis
	-- contenham "nil"
	if not param1 or string.find(param1,"{{{[0-9]+}}}") then
		param1 = nil
	end
	if not param2 or string.find(param2,"{{{[0-9]+}}}") then
		param2 = nil
	end
	
	if param1 and valida_data(param1) then
		-- verifica se o primeiro parâmetro é a data
		data = param1 or ""
		usuario = param2 or ""
	else
		-- caso não passe no teste, assume que
		-- o segundo parâmetro é a data
		usuario = param1 or ""
		data = param2 or ""
	end
	if usuario == "" then
		usuario = usuario_omitido
		separador = ", "
	else
		usuario = formatanome(usuario)
	end
	if data == "" then
		data = data_omitida
		separador = " "
	else
		data = formatadata(data)
	end
	
	return usuario .. separador .. data
end

function formatanome(nomeusuario)
	-- Wikifica o nome do usuário
	local wikitxt = "[[Usuário:%s|%s]] ([[Usuário Discussão:%s|discussão]]" ..
					" • [[Especial:Contribuições/%s|contrib]])"
	
	return string.format(wikitxt,nomeusuario,nomeusuario,nomeusuario,nomeusuario)
end

function formatadata(data)
	-- Insere UTC na data se nenhum outro fuso for informado
	if not string.find(data,"%(.*%)") then
		data = data .. " (UTC)"
	end
	return data
end

function valida_data(data)
	-- Detecta se o argumento passado com parâmetro é data ou não
	-- Retorna True se sim, False caso contrário
	
	--[[
		formatos de data disponiveis em Preferências > Aparência
			21:15, agosto 21, 2014
		 	21h15min de 21 de agosto de 2014
		 	21:15, 2014 agosto 21
	 	 	2014-08-21T21:15:46
 	]]--

	local patterns = {
		"%d+[%p%s°]+%a-[%p%s]*(%a+)[%p%s]+%a-[%p%s]*%d+",
			-- matches: 0000[ aa] (aaaaaa)[ aa] 0000
		"(%a+)[%p%s]+%a*[%p%s]*%d+[%p%s°]+%a*[%p%s]*%d+",
			-- matches: (aaaaaa)[ aa] 00[ aa] 0000
		"%d%d%d%d%-([0-1]%d)%-[0-3]%d",
			-- matches: 0000-(00)-00
	}

	for _, pattern in pairs(patterns) do
		ret, _, mes = string.find(data,pattern)
		if ret and valida_mes(mes) then
			return true
		end
	end
	
	return false
end

function valida_mes(mes)
	-- Verifica se o mês é um mês válido
	frame = mw.getCurrentFrame()
	
	mes = string.lower(mes)
			  
	for num = 1, 12 do
		-- recupera o nome do mês por extenso através da tag #time
		-- ela depende do idioma em uso pelo usuário
		mesvalido = frame:callParserFunction( '#time', 'F', num .. "/1" )
		mesvalido = string.lower(mesvalido)
		
		if mes == string.format("%.2d",num) or mes == mesvalido then
			return true
		end
	end
	return false
end

return p