Módulo:Linha do tempo de jogos eletrônicos
Este módulo pode ter sua documentação deficiente. Por favor, documente-o ou melhore suas explicações caso o saiba usar ou tenha conhecimentos para tal. |
Este módulo está classificado como pré-alfa. Ele está incompleto, e pode ou não estar em desenvolvimento activo. Ele deve ser utilizado desde páginas do domínio artigos. Os módulos ficam em pre-alfa até o editor original (ou alguém que toma conta se ele for abandonado por algum tempo) está satisfeito com a estrutura básica. |
Ver também
editar
require('strict')
local p = {}
local function items(args, year, oldrange)
local itemList = {}
-- O primeiro loop é para encontrar o intervalo de anos mais baixo, se houver. Se o intervalo antigo for fornecido, o intervalo de anos também deverá ser maior que ele.
local range = 0;
if args[year .. '_to'] or args[year .. 'a_to'] or args[year .. '-'] or args[year .. 'a-'] then
local newrange = tonumber(args[year .. '_to'] or args[year .. 'a_to'] or args[year .. '-'] or args[year .. 'a-'])
if newrange and (oldrange == nil or newrange > oldrange) then
range = newrange;
end
end
for asciiletter = 98, 106 do -- 98 > b, 106 > j
if args[year .. string.char(asciiletter) .. '_to'] or args[year .. string.char(asciiletter) .. '-'] then
local newrange = tonumber(args[year .. string.char(asciiletter) .. '_to'] or args[year .. string.char(asciiletter) .. '-'])
if newrange and (oldrange == nil or newrange > oldrange) and (range == 0 or newrange < range) then
range = newrange;
end
end
end
-- Localizar itens, filtrados por intervalo, se disponível.
if args[year] or args[year .. 'a'] then
local thisrange = tonumber(args[year .. '_to'] or args[year .. 'a_to'] or args[year .. '-'] or args[year .. 'a-'])
if (range == 0 and thisrange == nil) or (thisrange and thisrange == range) then
table.insert(itemList, args[year] or args[year .. 'a'])
end
end
for asciiletter = 98, 106 do -- 98 > b, 106 > j
if args[year .. string.char(asciiletter)] then
local thisrange = tonumber(args[year .. string.char(asciiletter) .. '_to'] or args[year .. string.char(asciiletter) .. '-'])
if (range == 0 and thisrange == nil) or (thisrange and thisrange == range) then
table.insert(itemList, args[year .. string.char(asciiletter)])
end
end
end
return table.maxn(itemList), itemList, range
end
local function color(args, year, itemNum, to_range)
if args[year .. '_color'] or args[year .. '_cor'] then
return args[year .. '_color'] or args[year .. '_cor']
end
if to_range and (args[year .. '_to_' .. to_range .. '_color'] or args[year .. '-' .. to_range .. '_cor']) then
return args[year .. '_to_' .. to_range .. '_color'] or args[year .. '-' .. to_range .. '_cor']
end
for yearrange = 1, 10 do
if args['range' .. yearrange] and args['range' .. yearrange .. '_color'] or args['anos' .. yearrange] and args['anos' .. yearrange .. '_cor'] then
local _, _, beginyear, endyear = string.find( args['range' .. yearrange] or args['anos' .. yearrange], '^(%d%d%d%d)%D+(%d%d%d%d)$' )
local year = tonumber(year) or 9999 -- Para year == 'TBA'
beginyear = tonumber(beginyear) or 0
endyear = tonumber(endyear) or 9999
if year >= beginyear and year <= endyear then
local _, _, color1, color2 = string.find( args['range' .. yearrange .. '_color'] or args['anos' .. yearrange .. '_cor'], '^(%S*)%s*(%S*)$' )
color2 = string.find(color2, '^#?%w+$') and color2 or color1
return itemNum > 0 and color1 or color2
end
end
end
return itemNum > 0 and '#0BDA51' or '#228B22'
end
local function left(builder, args, year, itemNum, range)
builder = builder:tag('th')
:attr('scope', 'row')
:css('border-right', '1.4em solid ' .. color(args, year, itemNum, range))
if itemNum > 1 then
builder = builder:attr('rowspan', itemNum)
end
if year == 'TBA' then
builder:tag('abbr'):attr('title', 'A ser anunciado'):wikitext('ASA')
else
builder:wikitext(range ~= 0 and year .. '–' .. range or year)
end
end
local function right(builder, itemNum, itemList)
if itemNum == 0 then return end
if itemNum == 1 then
builder:tag('td')
:wikitext(itemList[1])
return
end
-- if itemNum >= 2
builder:tag('td')
:addClass('rt-first')
:wikitext(itemList[1])
for key = 2, itemNum - 1 do
builder = builder:tag('tr')
:tag('td')
:addClass('rt-next')
:wikitext(itemList[key])
end
builder = builder:tag('tr')
:tag('td')
:addClass('rt-last')
:wikitext(itemList[itemNum])
end
local function row(builder, args, year, emptyyear, lastyear, highrange)
local oldrange = nil
repeat
local itemNum, itemList, range = items(args, year, oldrange)
-- Agora, verifique se há um novo highrange e o capture. No entanto, precisamos saber qual era o highrange antes da atualização.
local oldhighrange = nil
if(range > 0 and (highrange == nil or range > highrange)) then
oldhighrange = (highrange or range)
highrange = range
end
oldhighrange = (oldhighrange or highrange)
-- Se compactarvazio estiver definido, verifique se há itens vazios, rastreie os anos vazios
-- e os intervalos altos e coloque um intervalo compactando quando o próximo ano for encontrado.
if (args.compressempty or args.compactarvazio) and oldrange == nil then
-- Se estivermos compactando e não houver itens, retorne este ano para rastreamento.
if #itemList < 1 then
return year, highrange
end
-- Se emptyyear é menor ou igual a highrange, precisamos fazer uns ajustes.
if(emptyyear and oldhighrange and emptyyear <= oldhighrange) then
-- Se o ano atual for highrange ou highrange+1, suprima totalmente a saída da linha vazia.
-- Se o ano atual for highrange+2 ou mais, ajuste emptyyear para ficar acima do highrange)
if(year <= (oldhighrange+1)) then
emptyyear = nil
elseif(year > (oldhighrange+1)) then
emptyyear = oldhighrange+1
end
end
-- Se tivermos itens, mas estivermos rastreando um ano vazio, a saída será uma linha de intervalo comprimida.
if emptyyear ~= nil then
builder = builder:tag('tr')
if year == 'TBA' then
left(builder, args, emptyyear, 0, lastyear)
else
if year-1 == emptyyear then
left(builder, args, emptyyear, 0, 0)
else
left(builder, args, emptyyear, 0, year-1)
end
end
end
end
-- Se for esse o caso, podemos sair. Isso significa que fizemos o looping mais de uma vez, mas não havia mais itens restantes.
if range == 0 and oldrange and #itemList < 1 then
break
end
builder = builder:tag('tr')
left(builder, args, year, itemNum, range)
right(builder, itemNum, itemList)
if range ~= 0 then
oldrange = range
end
until range == 0
return nil, highrange
end
function p._main(args)
-- O código principal do módulo vem aqui.
local currentyear = os.date('%Y')
local ret
local firstyear, lastyear
for k, v in pairs(args) do
if k == "ASA" then
args.TBA = args.ASA
elseif string.find(k, "ASA%l") then
local letter = string.match(k, "%l")
args["TBA"..letter] = args["ASA"..letter]
end
end
local TBA = items(args, 'TBA') > 0 and true or false
ret = mw.html.create( 'table' )
:addClass('release-timeline wikitable')
:addClass(((args.align or args.alinhar) == 'left' or (args.align or args.alinhar) == 'esquerda') and 'rt-left' or nil)
ret:tag('caption')
:wikitext((args.title or args.titulo or args['título'] or 'Linha do tempo de anos de lançamento') ..
((args.subtitle or args.legenda) and ('<div class="rt-subtitle">'..(args.subtitle or args.legenda)..'</div>') or ''))
if tonumber(args.first or args.primeiro) then
firstyear = tonumber(args.first or args.primeiro)
else
for i = 1, currentyear do
if items(args, i) > 0 then
firstyear = i
break
end
end
firstyear = firstyear or (currentyear + 3)
end
if tonumber(args.last or args.ultimo or args['último']) then
lastyear = tonumber(args.last or args.ultimo or args['último'])
else
for i = currentyear + 3, TBA and currentyear or firstyear, -1 do
if items(args, i) > 0 then
lastyear = i
break
end
end
lastyear = lastyear or (currentyear - 1)
end
local emptyyear = nil
local highrange = nil
for year = firstyear, lastyear do
local yearcheck, newhighrange = row(ret, args, year, emptyyear, lastyear, highrange)
if (emptyyear == nil and yearcheck ~= nil) or (emptyyear ~= nil and yearcheck == nil) then
emptyyear = yearcheck
end
highrange = newhighrange
end
if TBA then
row(ret, args, 'TBA')
end
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Módulo:Linha do tempo de jogos eletrônicos/styles.css'}
} .. tostring(ret)
end
function p.main(frame)
local args = require('Módulo:Arguments').getArgs(frame)
return p._main(args)
end
return p