Module:Data

local p = {} local mesDados = mw.loadData( 'Module:Mês/dados' ) local h = require("Module:HF") local getArgs = require('Dev:Arguments').getArgs local language = mw.language.new('pt-br') local nomes_do_mes = mesDados[1] local numeros_do_mes = mesDados[2] local dias_em_mes = {31,28,31,30,31,30,31,31,30,31,30,31}

-- retornar o nome completo do mês function p.get_nome_do_mes(frame) local args = getArgs(frame) local nome = args[1] local output = nil if not h.isempty(nome) then nome = mw.text.trim(nome) nome = string.gsub(nome, '^0', '') output = nomes_do_mes[ string.lower(nome) ] end

return output end

-- número do retorno do mês function p.get_numero_do_mes(frame) local args = getArgs(frame) local numero = args[1] local output = nil if not h.isempty(numero) then numero = mw.text.trim(numero) numero = string.gsub(numero, '^0', '') output = numeros_do_mes[ string.lower(numero) ] end

return output end

--pega uma data e formata-a de acordo com a sintaxe - https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions##time function p.lua_conversor_de_data(s_data, s_formato) local ano = nil local mes = nil local dia = nil local i = 0 local j = 0 local output = '' s_formato = s_formato or 'Ymd' if h.isempty(s_data) or s_data == 'now' then output = language:formatDate(s_formato) else dia, mes, ano = string.match(s_data, '(.+) de (.+) de (%d%d%d%d)') if mes == nil then dia, mes, ano = string.match(s_data, '(.+)%/(.+)%/(%d%d%d%d)') end if dia ~= nil and mes ~= nil and ano ~= nil then mes = p.get_numero_do_mes({mes}) if #dia == 1 then dia = '0'..dia end if s_formato == 'Ymd' then output = ano..mes..dia elseif s_formato == 'Ym' then output = ano..mes elseif s_formato == 'j "de" F "de" Y'							then dia = string.gsub(dia, '^0', '') mes = p.get_nome_do_mes({mes}) output = dia..' de '..mes..' de '..ano else output = language:formatDate(s_formato, dia..' '..mes..' '..ano) end else output = language:formatDate(s_formato, s_data) end end

return output end

--compara duas datas. Retorne "verdadeiro" se a 1ª data for anterior à 2ª data e "falso" caso contrário. function p.lua_comparacao_de_data(data1, data2) local output data1 = p.lua_conversor_de_data(data1, 'Ymd') if tonumber( string.sub(data1, 1, 4) ) < 2020 and (  h.isempty(data2) 				or data2 == 'now' 				or tonumber( string.sub(p.lua_conversor_de_data(data2, 'Ymd'), 1, 4) ) >= 2020			) then output = true else data2 = p.lua_conversor_de_data(data2 or 'now', 'Ymd') --Se a 2ª data for omitida, a data atual será usada para comparação. output = data1<=data2 end return output end

--returns era based on ano function p.get_era(frame) local args = getArgs(frame) local ano = tonumber(args[1]) local key = args[2] or '' local output = ''

if not h.isempty(ano) then if not h.isempty(key) then key = ' '..key end if ano<1955 then output = 'Era de Ouro'..key end if ano>=1955 and ano<1970 then output = 'Era de Prata'..key end if ano>=1970 and ano<1983 then output = 'Era de Bronze'..key end if ano>=1983 and ano<1992 then output = 'Era de Cobre'..key end if ano>=1992 then output = 'Era Moderna'..key end end return output end

function p.lua_get_categoria_de_publicacao(ano, mes, dia) local link = '' local category = '' local text = ''

if not h.isempty(ano) then mes = p.get_nome_do_mes({mes}) if mes ~= nil then if h.isempty(dia) then dia = '' else dia = dia..' de ' end category = ano..', '..mes link = h.LinkToCategory(category, dia..mes)..' de '..h.LinkToCategory(ano, ano) text = mes..' de '..ano else category = ano link = h.LinkToCategory(ano, ano) text = ano end end return link, category, text end

-- retorna informações sobre a data de lançamento function p.lua_get_data_de_lancamento_info(data_de_lancamento) local recente = false local semanadelancamento local text = '' local link = '' local ano = '' local mes = '' local dia = '' local sem_dia = '' local category = '' local output = '' if not h.isempty(data_de_lancamento) then output = p.lua_conversor_de_data(data_de_lancamento, 'j "de" F "de" Y') dia, mes, ano = string.match(output, '(%d-) de (.-) de (%d%d%d%d)') sem_dia = mes..' de '..ano link = p.lua_get_link_para_semana_de_lancamento(output) text = h.break_link(link, 1) recente = p.lua_is_lancado_recente(output) end

output = { date = output, semana = { text = text, link = link },		recente = recente, dia = dia, mes = mes, ano = ano, sem_dia = sem_dia }

return output end

-- retorna informações sobre a data de publicação function p.lua_get_informacao_da_data_de_publicacao(ano, mes, cancelado) --local published = true local numero_do_mes local nome_do_mes local categories = {} local link = '' local category = '' local classificardata = '' local output = '' numero_do_mes = p.get_numero_do_mes({mes}) or '01' nome_do_mes = p.get_nome_do_mes({mes}) or ''

if h.isempty(ano) then ano = '' end if ano ~= '' then classificardata = ano..numero_do_mes..'01' --publicado = p.lua_comparacao_de_data(classificardata) classificardata = ' '..classificardata link, category = p.lua_get_categoria_de_publicacao(ano, nome_do_mes) table.insert(categories, ano) table.insert(categories, category) table.insert(categories, p.get_era({ano})) elseif not h.isempty(cancelado) and not cancelado then table.insert(categories, 'Datas de quadrinhos necessárias') end output = { link = link, ano = ano, mes = nome_do_mes, classificardata = classificardata, --publicado = publicado, }	return output, categories end

--verifique se quadrinhos, episódios, filmes, etc. foram lançados/publicados recente function p.eRecente(frame) local args = getArgs(frame) local data_de_lancamento = args['datadelançamento'] local ano = args['ano'] local mes = args['mês'] local cancelado = args['cancelado'] or false local output = false

if not cancelado and (p.lua_is_publicado_recente(ano, mes) or p.lua_is_lancado_recente(data_de_lancamento)) then output = true end return output end

function p.lua_is_publicado_recente(ano, mes) local data_atual = p.lua_conversor_de_data local s	local data_de_publicacao local output = false if not h.isempty(ano) then mes = p.get_numero_do_mes({mes}) or '01' data_de_publicacao = ano..mes..'01' s = language:formatDate('Ym', '-2 meses')..'01' if data_de_publicacao>=s and data_de_publicacao<=data_atual then output = true end end

return output end

function p.lua_is_lancado_recente(data_de_lancamento) local hoje = p.lua_conversor_de_data('now', 'Ymd') local output = false if not h.isempty(data_de_lancamento) then data_de_lancamento = p.lua_conversor_de_data(data_de_lancamento, 'Ymd') if data_de_lancamento<=hoje and data_de_lancamento>=language:formatDate('Ymd', '-4 meses') then output = true end end

return output end

function p.lua_is_episodio_lancado_recente(ano, mes, dia) local data_de_lancamento local hoje = p.lua_conversor_de_data('now', 'Ymd') local output = false if not h.isempty(ano) and not h.isempty(mes) and not h.isempty(dia) then mes = p.get_numero_do_mes({mes}) dia = string.rep( '0', 2-#tostring(dia) )..dia data_de_lancamento = ano..mes..dia if data_de_lancamento<=hoje and data_de_lancamento>=language:formatDate('Ymd', '-2 semanas') then output = true end end

return output end

--************************************************************************************************* -- funções para calcular manualmente o número da semana (com base na data) ou data (com base no número da semana)

-- retornar o número da semana e o ano a partir do formato "Semana SS, AAAA" function p.lua_get_numero_da_semana_e_ano_do_nome_da_semana(nome_da_semana) local numero_da_semana local ano numero_da_semana, ano = string.match(nome_da_semana, 'Semana (%d+) de (%d%d%d%d)') return tonumber(numero_da_semana), tonumber(ano) end

function p.lua_get_nome_da_semana_do_numero_da_semana_e_ano(numero_da_semana, ano) local output = '' if not h.isempty(numero_da_semana) and not h.isempty(ano) then if #tostring(numero_da_semana) == 1 then numero_da_semana = '0'..numero_da_semana end output = 'Semana '..numero_da_semana..' de '..ano end return output end

function p.lua_e_um_ano_bissexto(ano) local output = false if math.fmod( ano-1904, 4 ) == 0 then output = true end return output end

function p.lua_get_dia_de_ano(ano, mes, dia) local output = dia

for i = 1, mes-1 do		output = output + dias_em_mes[i] end

if p.lua_e_um_ano_bissexto(ano) and mes > 2 then output = output + 1 end

return output end

function p.lua_get_data_do_dia_de_ano(dia_de_ano, ano) local i = 1 local j	local ano_bissexto = p.lua_e_um_ano_bissexto(ano) local output

if dia_de_ano > 366 and ano_bissexto then dia_de_ano = dia_de_ano - 366 ano = ano + 1 elseif dia_de_ano > 365 and not ano_bissexto then dia_de_ano = dia_de_ano - 365 ano = ano + 1 elseif dia_de_ano < 0 then ano = ano - 1 ano_bissexto = p.lua_e_um_ano_bissexto(ano) if ano_bissexto then dia_de_ano = dia_de_ano + 366 else dia_de_ano = dia_de_ano + 365 end end if dia_de_ano == 0 then output = '31 de dezembro de '..ano-1 else output = dia_de_ano j = dias_em_mes[1]

while output > j do				output = output - j				i = i + 1 if i == 2 and ano_bissexto then j = 29 else j = dias_em_mes[i] end end

output = output..' de '..p.get_nome_do_mes({i})..' de '..ano end return output end

-- retorno dia da semana para janeiro 1 (1 = Segunda, 7 = Domingo, etc.) -- dia da semana repete-se a cada 28 anos function p.lua_get_dia_da_semana_de_janeiro_1(ano) local output = {5,7,1,2,3,5,6,7,1,3,4,5,6,1,2,3,4,6,7,1,2,4,5,6,7,2,3,4} local numero_do_ano = math.fmod( ano-1904, 28 ) + 1 return output[numero_do_ano] end

-- retornar no primeiro dia da primeira semana do ano. Se começou em dezembro do ano anterior, um número negativo é retornado (por exemplo, a primeira semana do ano de 2020 começou em 30 de dezembro de 2019, então a função retorna -2) function p.lua_get_primeiro_dia_da_primeira_semana_do_ano(ano) local primeiro_dia = p.lua_get_dia_da_semana_de_janeiro_1(ano) return math.fmod( 11-primeiro_dia, 7) - 3 end

function p.lua_get_dia_da_semana(ano, mes, dia) local primeiro_dia = p.lua_get_dia_da_semana_de_janeiro_1(ano) local dia_de_ano = p.lua_get_dia_de_ano(ano, mes, dia) local output

output = math.fmod(primeiro_dia + dia_de_ano - 1, 7 ) if output == 0 then output = 7 end return output end

function p.lua_get_numero_da_semana(ano, mes, dia) local dia_de_ano = p.lua_get_dia_de_ano(ano, mes, dia) local dia_da_semana = p.lua_get_dia_da_semana(ano, mes, dia) local numero_da_semana = math.floor( (dia_de_ano - dia_da_semana + 10) / 7 ) local output

if numero_da_semana == 0 then ano = ano - 1 numero_da_semana = p.lua_get_ultima_semana_de_ano2(ano) elseif numero_da_semana == 53 and p.lua_get_ultima_semana_de_ano2(ano) == 52 then ano = ano + 1 numero_da_semana = 1 end output = p.lua_get_nome_da_semana_do_numero_da_semana_e_ano(numero_da_semana, ano) return output end

-- data de retorno desta quarta-feira para o "ano" da semana function p.lua_get_data_do_numero_da_semana(numero_da_semana, ano) local primeiro_dia_da_primeira_semana local i = 1 local ano_bissexto local primeiro_dia local ultima_semana = p.lua_get_ultima_semana_de_ano2(ano) local mes local output

if numero_da_semana > ultima_semana then numero_da_semana = numero_da_semana - ultima_semana ano = ano + 1 end primeiro_dia_da_primeira_semana = p.lua_get_primeiro_dia_da_primeira_semana_do_ano(ano) ano_bissexto = p.lua_e_um_ano_bissexto(ano) primeiro_dia = p.lua_get_dia_da_semana_de_janeiro_1(ano)

output = primeiro_dia_da_primeira_semana + 7 * (numero_da_semana-1) + 3 output = p.lua_get_data_do_dia_de_ano(output, ano)

return output end

function p.lua_get_ultima_semana_de_ano(ano) local function numero_da_semana(y) local output = y + (y / 4) - (y / 100) + (y / 400) return math.floor( math.fmod(output, 7) ) end

if numero_da_semana(ano) == 4 or numero_da_semana(ano - 1) == 3 then return 53 else return 52 end end

function p.lua_get_ultima_semana_de_ano2(ano) local primeiro_dia = p.lua_get_dia_da_semana_de_janeiro_1(ano) local ultimo_dia = p.lua_get_dia_da_semana(ano, 12, 31) local ano_bissexto = p.lua_e_um_ano_bissexto(ano) if ( not ano_bissexto and (primeiro_dia == 4 or last_dia == 4) ) or ( ano_bissexto and (primeiro_dia == 3 or ultimo_dia == 5) ) then return 53 else return 52 end end --*************************************************************************************************

function p.lua_get_meses_anterior_proximo(numero_da_semana, ano) local mes_anterior local proximo_mes

if numero_da_semana == 1 then mes_anterior = p.lua_get_data_do_numero_da_semana(p.lua_get_ultima_semana_de_ano2(ano - 1), ano - 1) else mes_anterior = p.lua_get_data_do_numero_da_semana(numero_da_semana - 1, ano) end

if numero_da_semana == p.lua_get_ultima_semana_de_ano2(ano) then proximo_mes = p.lua_get_data_do_numero_da_semana(1, ano + 1) else proximo_mes = p.lua_get_data_do_numero_da_semana(numero_da_semana + 1, ano) end

return mes_anterior, proximo_mes end

function p.get_meses_anterior_proximo(frame) local design = require("Module:Design") local data_atual = p.lua_get_semana_de_lancamento_da_data_de_lancamento( p.lua_conversor_de_data ) local pagename = mw.title.getCurrentTitle.text local link local category = true local mes_anterior local proximo_mes local output = '' numero_da_semana, ano = p.lua_get_numero_da_semana_e_ano_do_nome_da_semana(pagename) if numero_da_semana == nil or ano == nil then numero_da_semana, ano = p.lua_get_numero_da_semana_e_ano_do_nome_da_semana(data_atual) category = false end mes_anterior, proximo_mes = p.lua_get_meses_anterior_proximo(numero_da_semana, ano) link = p.lua_get_semana_de_lancamento_da_data_de_lancamento(mes_anterior) mes_anterior = h.LinkToCategory(link, mes_anterior)

link = p.lua_get_semana_de_lancamento_da_data_de_lancamento(proximo_mes) proximo_mes = h.LinkToCategory(link, proximo_mes) pagename = p.lua_get_data_do_numero_da_semana(numero_da_semana, ano)

output = design.messagebox({ mes_anterior..' &mdash;  '..pagename..'  &mdash;  '..proximo_mes }) if category then category = p.lua_get_data_do_numero_da_semana(numero_da_semana, ano) category = string.gsub(category, ' %d+, ', ' de ') category = 'Quadrinhos lançados em '..category output = output..h.Category(category) end return output end

function p.lua_get_semana_de_lancamento_da_data_de_lancamento(data_de_lancamento) local ano local mes local dia local output = ''

if not h.isempty(data_de_lancamento) then data_de_lancamento = p.lua_conversor_de_data(data_de_lancamento, 'j "de" F "de" Y') dia, mes, ano = string.match(data_de_lancamento, '(%d-) de (.-) de (%d%d%d%d)') mes = tonumber( p.get_numero_do_mes({mes}) ) output = p.lua_get_numero_da_semana(ano, mes, dia) end return output end

-- usado em Predefinição:Semana de Lançamento function p.get_semana_de_lancamento_da_data_de_lancamento(frame) local args = getArgs(frame) local data_de_lancamento = args[1] local output if h.isempty(data_de_lancamento) then output = p.lua_get_semana_de_lancamento_da_data_de_lancamento( p.lua_conversor_de_data ) -- data atual else output = p.lua_get_semana_de_lancamento_da_data_de_lancamento(data_de_lancamento) end return output end

function p.lua_get_link_para_semana_de_lancamento(data_de_lancamento, numero_da_semana, ano) local mes local dia local output = '' if not h.isempty(data_de_lancamento) then data_de_lancamento = p.lua_conversor_de_data(data_de_lancamento, 'j "de" F "de" Y') numero_da_semana = p.lua_get_semana_de_lancamento_da_data_de_lancamento(data_de_lancamento) output = h.LinkToCategory(numero_da_semana, data_de_lancamento) elseif not h.isempty(numero_da_semana) and not h.isempty(ano) then data_de_lancamento = p.lua_get_data_do_numero_da_semana(numero_da_semana, ano) numero_da_semana = p.lua_get_nome_da_semana_do_numero_da_semana_e_ano(numero_da_semana, ano) output = h.LinkToCategory(numero_da_semana, data_de_lancamento) end return output end

function p.lua_get_categoria_de_semana_de_lancamento(data_de_lancamento) local semana local output = '' semana = p.lua_get_semana_de_lancamento_da_data_de_lancamento(data_de_lancamento) if semana ~= '' then output = h.Category(semana) end return output end

-- usado na Predefinição:Categoria de Mês function p.get_mes_proximo_e_anterior(frame) local pagename = mw.title.getCurrentTitle.text local ano local mes local numero_do_mes local proximo_mes local mes_anterior local design = require("Módulo:Design") local output = '' ano, mes = string.match(pagename, '(%d+), (.+)') if ano ~= nil and mes ~= nil then ano = tonumber(ano) numero_do_mes = tonumber( p.get_numero_do_mes({mes}) ) if numero_do_mes == 1 then mes_anterior = tostring(ano - 1)..', Dezembro' proximo_mes = tostring(ano)..', Fevereiro' elseif numero_do_mes == 12 then mes_anterior = tostring(ano)..', Novembro' proximo_mes = tostring(ano+1)..', Janeiro' else mes_anterior = tostring(ano)..', '..p.get_nome_do_mes({numero_do_mes-1}) proximo_mes = tostring(ano)..', '..p.get_nome_do_mes({numero_do_mes+1}) end mes_anterior = h.LinkToCategory(mes_anterior, mes_anterior) proximo_mes = h.LinkToCategory(proximo_mes, proximo_mes) output = design.messagebox({mes_anterior..' — '..pagename..' — '..proximo_mes}) output = output..h.Category(ano, ano..' '..p.get_numero_do_mes({mes})) end return output end

return p