Mudanças entre as edições de "Módulo:Changelog"

De Wiki Gla
Ir para navegação Ir para pesquisar
(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...')
 
m
 
(17 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
-- Módulo:Changelog — gera HTML do changelog a partir de itemN_* params
local p = {}
local p = {}


local function getArgs(frame)
local function N(s) return s and mw.text.trim(tostring(s)) or '' end
  -- pega args do parent quando chamado via predef
local function has(s) return N(s) ~= '' end
  local parent = frame:getParent()
  return parent and parent.args or frame.args
end


local function isNonEmpty(s)
local function normalize_url(s)
   return s and tostring(s):match("%S")
   s = N(s)
  if s == '' then return '' end
  s = s:gsub('[\r\n\t]', '') -- tira CR/LF/TAB
  s = s:gsub('%s+', '')     -- tira espaços internos
  return s
end
end


function p.render(frame)
-- {{#invoke:Changelog|item|title=...|description=...|date=...|link=...|icon=...|color=#FCE5CD}}
   local args = getArgs(frame)
function p.item(frame)
   local root = mw.html.create('div')
   local parent = frame:getParent()
  root:addClass('widget-changelog')
   local a = (parent and parent.args) or frame.args or {}


   -- permite customizar altura máxima via parâmetro (ex.: max_height=320px)
   local title = N(a.title)
   if isNonEmpty(args.max_height) then
   local link  = normalize_url(a.link)
    root:css('max-height', args.max_height)
  local date  = N(a.date)
    -- padding-right opcional
  local desc  = N(a.description)
    if isNonEmpty(args.padding_right) then
  local icon  = N(a.icon)
      root:css('padding-right', args.padding_right)
   local color = N(a.color)
    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 item = mw.html.create('div'):addClass('notice-item')
   local any = false
   if has(color) then item:css('--notice-color', color) end


   while true do
   -- Ícones sem link
    local title = args['item'..i..'_title']
  local overlay_icon_wikitext, inline_icon_wikitext
     local link  = args['item'..i..'_link']
  if has(icon) then
     local date  = args['item'..i..'_date']
     local lower = icon:lower()
    local desc  = args['item'..i..'_desc']
     local is_url = lower:find('://', 1, true) ~= nil
     local color = args['item'..i..'_color'] -- ex: #FCE5CD
     local is_prefixed = lower:match('^file:') or lower:match('^image:')
    local icon  = args['item'..i..'_icon']  -- URL opcional


     if not (isNonEmpty(title) or isNonEmpty(desc) or isNonEmpty(link)) then
     if is_url then
       -- se não tem título/desc/link, checa se ainda existe próximo antes de encerrar
      overlay_icon_wikitext = string.format('<img src="%s" alt="%s" class="notice-icon notice-icon--overlay" />', icon, title)
       if not (args['item'..(i+1)..'_title'] or args['item'..(i+1)..'_desc'] or args['item'..(i+1)..'_link']) then
      inline_icon_wikitext  = string.format('<img src="%s" alt="%s" class="notice-icon notice-icon--inline" />',  icon, title)
        break
    elseif is_prefixed then
      end
       overlay_icon_wikitext = string.format('[[%s|alt=%s|class=notice-icon notice-icon--overlay|link=]]', icon, title)
       inline_icon_wikitext  = string.format('[[%s|alt=%s|class=notice-icon notice-icon--inline|link=]]',  icon, title)
    else
      overlay_icon_wikitext = string.format('[[File:%s|alt=%s|class=notice-icon notice-icon--overlay|link=]]', icon, title)
      inline_icon_wikitext  = string.format('[[File:%s|alt=%s|class=notice-icon notice-icon--inline|link=]]',  icon, title)
     end
     end
  end


    any = true
  local content = item:tag('div'):addClass('notice-content'):css('flex', '1')
    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')
  -- header
     content:css('flex', '1')
  if has(title) or has(date) then
     local header = content:tag('div'):addClass('notice-header')
    local left  = header:tag('div'):addClass('notice-header-left')
     local right  = header:tag('div'):addClass('notice-header-right')


     if isNonEmpty(title) then
     if inline_icon_wikitext then left:wikitext(inline_icon_wikitext) end
      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
     if has(title) then
       content:tag('div')
       local holder = left:tag('span'):addClass('notice-title')
        :addClass('notice-date')
      holder:tag('span'):addClass('notice-title-text'):wikitext(title)
        :css('font-size', '0.9em')
        :css('color', '#888')
        :css('margin', '-5px 0')
        :wikitext(date)
     end
     end


     if isNonEmpty(desc) then
     if has(date) then
       content:tag('p')
       right:tag('span'):addClass('notice-date'):wikitext(date)
        :addClass('notice-desc')
        :css('color', '#555')
        :css('line-height', '1.3')
        :css('margin', '0')
        :wikitext(desc)
     end
     end
  end


    if isNonEmpty(icon) then
  if has(desc) then
      item:tag('img')
    content:tag('p'):addClass('notice-desc'):wikitext(desc)
        :addClass('notice-icon')
  end
        :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
  -- guarda o link sem exibir texto
  if has(link) then
     content:tag('span')
      :addClass('notice-link')
      :css('display', 'none')
      :attr('data-url', link)
   end
   end


   if not any then
   if overlay_icon_wikitext then item:wikitext(overlay_icon_wikitext) end
    -- fallback minimalista
    root:tag('div')
      :css('color', '#666')
      :wikitext('Sem atualizações no momento.')
  end


   return tostring(root)
   return tostring(item)
end
end


return p
return p

Edição atual tal como às 14h25min de 10 de setembro de 2025

A documentação para este módulo pode ser criada em Módulo:Changelog/doc

local p = {}

local function N(s) return s and mw.text.trim(tostring(s)) or '' end
local function has(s) return N(s) ~= '' end

local function normalize_url(s)
  s = N(s)
  if s == '' then return '' end
  s = s:gsub('[\r\n\t]', '') -- tira CR/LF/TAB
  s = s:gsub('%s+', '')      -- tira espaços internos
  return s
end

-- {{#invoke:Changelog|item|title=...|description=...|date=...|link=...|icon=...|color=#FCE5CD}}
function p.item(frame)
  local parent = frame:getParent()
  local a = (parent and parent.args) or frame.args or {}

  local title = N(a.title)
  local link  = normalize_url(a.link)
  local date  = N(a.date)
  local desc  = N(a.description)
  local icon  = N(a.icon)
  local color = N(a.color)

  local item = mw.html.create('div'):addClass('notice-item')
  if has(color) then item:css('--notice-color', color) end

  -- Ícones sem link
  local overlay_icon_wikitext, inline_icon_wikitext
  if has(icon) then
    local lower = icon:lower()
    local is_url = lower:find('://', 1, true) ~= nil
    local is_prefixed = lower:match('^file:') or lower:match('^image:')

    if is_url then
      overlay_icon_wikitext = string.format('<img src="%s" alt="%s" class="notice-icon notice-icon--overlay" />', icon, title)
      inline_icon_wikitext  = string.format('<img src="%s" alt="%s" class="notice-icon notice-icon--inline" />',  icon, title)
    elseif is_prefixed then
      overlay_icon_wikitext = string.format('[[%s|alt=%s|class=notice-icon notice-icon--overlay|link=]]', icon, title)
      inline_icon_wikitext  = string.format('[[%s|alt=%s|class=notice-icon notice-icon--inline|link=]]',  icon, title)
    else
      overlay_icon_wikitext = string.format('[[File:%s|alt=%s|class=notice-icon notice-icon--overlay|link=]]', icon, title)
      inline_icon_wikitext  = string.format('[[File:%s|alt=%s|class=notice-icon notice-icon--inline|link=]]',  icon, title)
    end
  end

  local content = item:tag('div'):addClass('notice-content'):css('flex', '1')

  -- header
  if has(title) or has(date) then
    local header = content:tag('div'):addClass('notice-header')
    local left   = header:tag('div'):addClass('notice-header-left')
    local right  = header:tag('div'):addClass('notice-header-right')

    if inline_icon_wikitext then left:wikitext(inline_icon_wikitext) end

    if has(title) then
      local holder = left:tag('span'):addClass('notice-title')
      holder:tag('span'):addClass('notice-title-text'):wikitext(title)
    end

    if has(date) then
      right:tag('span'):addClass('notice-date'):wikitext(date)
    end
  end

  if has(desc) then
    content:tag('p'):addClass('notice-desc'):wikitext(desc)
  end

  -- guarda o link sem exibir texto
  if has(link) then
    content:tag('span')
      :addClass('notice-link')
      :css('display', 'none')
      :attr('data-url', link)
  end

  if overlay_icon_wikitext then item:wikitext(overlay_icon_wikitext) end

  return tostring(item)
end

return p