Módulo:Assinatura
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