Módulo:Changelog
Ir para navegação
Ir para pesquisar
A documentação para este módulo pode ser criada em Módulo:Changelog/doc
-- Módulo:Changelog — gera HTML do changelog a partir de itemN_* params
local p = {}
local function getArgs(frame)
-- pega args do parent quando chamado via predef
local parent = frame:getParent()
return parent and parent.args or frame.args
end
local function isNonEmpty(s)
return s and tostring(s):match("%S")
end
function p.render(frame)
local args = getArgs(frame)
local root = mw.html.create('div')
root:addClass('widget-changelog')
-- permite customizar altura máxima via parâmetro (ex.: max_height=320px)
if isNonEmpty(args.max_height) then
root:css('max-height', args.max_height)
-- padding-right opcional
if isNonEmpty(args.padding_right) then
root:css('padding-right', args.padding_right)
else
root:css('padding-right', '5px')
end
else
root:css('padding-right', isNonEmpty(args.padding_right) and args.padding_right or '5px')
end
root:css('overflow-y', 'auto')
root:css('box-sizing', 'border-box')
local i = 1
local any = false
while true do
local title = args['item'..i..'_title']
local link = args['item'..i..'_link']
local date = args['item'..i..'_date']
local desc = args['item'..i..'_desc']
local color = args['item'..i..'_color'] -- ex: #FCE5CD
local icon = args['item'..i..'_icon'] -- URL opcional
if not (isNonEmpty(title) or isNonEmpty(desc) or isNonEmpty(link)) then
-- se não tem título/desc/link, checa se ainda existe próximo antes de encerrar
if not (args['item'..(i+1)..'_title'] or args['item'..(i+1)..'_desc'] or args['item'..(i+1)..'_link']) then
break
end
end
any = true
local item = root:tag('div'):addClass('notice-item')
item:css('display', 'flex')
item:css('align-items', 'flex-start')
item:css('background', '#fff')
item:css('border', '1px solid #ddd')
item:css('border-radius', '6px')
item:css('margin-bottom', '10px')
item:css('padding', '8px 10px')
item:css('box-sizing', 'border-box')
item:css('border-left', '5px solid var(--notice-color, #f5b700)')
if isNonEmpty(color) then
item:css('--notice-color', color)
end
local content = item:tag('div'):addClass('notice-content')
content:css('flex', '1')
if isNonEmpty(title) then
local a = content:tag('a')
:addClass('notice-title')
:attr('target', '_blank')
if isNonEmpty(link) then a:attr('href', link) end
a:css('display', 'block')
a:css('font-size', '1.3em')
a:css('font-weight', 'bold')
a:css('color', '#333')
a:css('text-decoration', 'none')
a:css('margin', '0')
a:wikitext(title)
end
if isNonEmpty(date) then
content:tag('div')
:addClass('notice-date')
:css('font-size', '0.9em')
:css('color', '#888')
:css('margin', '-5px 0')
:wikitext(date)
end
if isNonEmpty(desc) then
content:tag('p')
:addClass('notice-desc')
:css('color', '#555')
:css('line-height', '1.3')
:css('margin', '0')
:wikitext(desc)
end
if isNonEmpty(icon) then
item:tag('img')
:addClass('notice-icon')
:attr('src', icon)
:css('object-fit', 'contain')
:css('flex-shrink', '0')
-- sem width/height fixos: respeita o asset do jeito que você já usa
end
i = i + 1
end
if not any then
-- fallback minimalista
root:tag('div')
:css('color', '#666')
:wikitext('Sem atualizações no momento.')
end
return tostring(root)
end
return p