Módulo:Changelog

De Wiki Gla
Revisão de 18h15min de 2 de setembro de 2025 por Gurren1 (discussão | contribs) (Criou página com '-- 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 loc...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
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