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

De Wiki Gla
Ir para navegação Ir para pesquisar
m
m
 
(15 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
-- Módulo:Changelog — renderiza UMA linha do changelog
local p = {}
local p = {}


local function N(s) return s and mw.text.trim(tostring(s)) or '' end
local function N(s) return s and mw.text.trim(tostring(s)) or '' end
local function has(s) return N(s) ~= '' end
local function has(s) return N(s) ~= '' end
local function param(args, ...)
 
   for i = 1, select('#', ...) do
local function normalize_url(s)
    local k = select(i, ...)
   s = N(s)
    if has(args[k]) then return N(args[k]) end
  if s == '' then return '' end
   end
  s = s:gsub('[\r\n\t]', '') -- tira CR/LF/TAB
   return ''
   s = s:gsub('%s+', '')      -- tira espaços internos
   return s
end
end


-- {{#invoke:Changelog|item|title=...|description=...|date=...|link=...|icon=...|color=#FCE5CD}}
function p.item(frame)
function p.item(frame)
  -- aceita ser chamado tanto direto quanto por predef
   local parent = frame:getParent()
   local parent = frame:getParent()
   local args = parent and parent.args or frame.args
   local a = (parent and parent.args) or frame.args or {}
 
  local title = param(args, 'title','titulo','título')
  local link  = param(args, 'link','url')
  local date  = param(args, 'date','data')
  local desc  = param(args, 'description','desc','descricao','descrição')
  local icon  = param(args, 'icon','icone','ícone','image')
  local color = param(args, 'color','cor')


   local item = mw.html.create('div')
   local title = N(a.title)
    :addClass('notice-item')
  local link  = normalize_url(a.link)
    :css('display','flex')
  local date  = N(a.date)
    :css('align-items','flex-start')
  local desc  = N(a.description)
    :css('background','#fff')
  local icon  = N(a.icon)
    :css('border','1px solid #ddd')
  local color = N(a.color)
    :css('border-radius','6px')
    :css('margin-bottom','10px')
    :css('padding','8px 10px')
    :css('box-sizing','border-box')
    :css('border-left','5px solid var(--notice-color, #f5b700)')


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


   local content = item:tag('div'):addClass('notice-content'):css('flex','1')
  -- Í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 has(title) then
     if is_url then
    local ttl
       overlay_icon_wikitext = string.format('<img src="%s" alt="%s" class="notice-icon notice-icon--overlay" />', icon, title)
     if has(link) then
      inline_icon_wikitext  = string.format('<img src="%s" alt="%s" class="notice-icon notice-icon--inline" />',  icon, title)
       ttl = content:tag('a')
    elseif is_prefixed then
        :addClass('notice-title')
      overlay_icon_wikitext = string.format('[[%s|alt=%s|class=notice-icon notice-icon--overlay|link=]]', icon, title)
        :attr('href', link)
      inline_icon_wikitext  = string.format('[[%s|alt=%s|class=notice-icon notice-icon--inline|link=]]', icon, title)
        :attr('target','_blank')
        :css('text-decoration','none')
     else
     else
       ttl = content:tag('span'):addClass('notice-title')
       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
    ttl:css('display','block')
      :css('font-size','1.3em')
      :css('font-weight','bold')
      :css('color','#333')
      :css('margin','0')
      :wikitext(title)
   end
   end


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


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


   if has(icon) then
  -- guarda o link sem exibir texto
     item:tag('img')
   if has(link) then
       :addClass('notice-icon')
     content:tag('span')
      :attr('src', icon)
       :addClass('notice-link')
      :attr('alt', title or '')
       :css('display', 'none')
       :css('object-fit','contain')
       :attr('data-url', link)
       :css('flex-shrink','0')
   end
   end
  if overlay_icon_wikitext then item:wikitext(overlay_icon_wikitext) end


   return tostring(item)
   return tostring(item)

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