Wiki DC Comics
Wiki DC Comics
3 636
páginas

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

-- Começo Módulo esqueleto. Tudo constrói fora disto.
local Infobox = {}

----------------------------
-- Bibliotecas de funções --
----------------------------

-- significa High Frequency
local HF = require("Module:ComicsHF")
--Parâmetros de invocação de Parses, abrange espaços em branco e remove espaços em branco
local getArgs = require('Dev:Arguments').getArgs
-- Funções para criar listas do Wikitext
local L = require("Dev:List")

-- Uma vez que isso só deve ser avaliado uma vez por visualização de página, agora é global
_G.vars = { Pagename = mw.title.getCurrentTitle().text }

---------------------
-- Funções locais --
---------------------
local function invokeInt(funcName)
  -- Este invólucro permite a invocação de artigos e modelos
  -- das funções internas do Lua.
	return function (frame)
		local args = getArgs(frame, { trim = true, removeBlanks = true })
		return Infobox[funcName](args, vars)
	end
end

----------------------
-- Funções públicas --
----------------------

function Infobox.CategoriesFromKeywords( fieldValue, valid, exceptions, vars )
  local output = ""
  -- O campo não está em branco
  if fieldValue ~= nil then
    --Pegue um par válido e use-o
    for validKey, validValue in pairs(valid) do
        -- Se você encontrar o validKey no campo, olhar mais de perto
        if string.find( string.lower(fieldValue), validKey ) ~= nil then
            --Verifique se existem exceções para o validKey
            if type(exceptions[validKey]) ~= "table" then
                -- Não há exceções
                -- Apenas categorizar usando este validKey
                -- e passar para a próxima validKey
                for valueKey, valueCategoryName in ipairs( validValue ) do
                    output = output .. HF.CategoryLink(
                        valueCategoryName,
                        vars.Pagename,
                        ""
                    )
                end
            end
        end
    end
  end
  return output
end

-- Chamadas _sanitizeInput de um modelo
function Infobox.sanitize(frame)
		local args = getArgs(frame, { trim = true, removeBlanks = true })
		return Infobox._sanitizeInput(args[1])
end

-- Limpa as entradas desleixadas em algo mais útil
-- Isso reduz a necessidade de executar um bot e fazer com que os usuários mudem os hábitos
function Infobox._sanitizeInput( input )
    --definir "saída" de "entrada" e manipular "saída"
    local output = input
    
    -- Não há mais quebras de linha
    output = string.gsub( output, '([,;])<br>%s*.', '%1 ' )
    -- Onde há apenas uma quebra de linha e sem delimitador, deve haver um delimitador.
    output = string.gsub( output, '<br>%s*.', '; ' )
    -- Coloque referências em que pertençam (antes de um delimitador)
    output = string.gsub( output, '([,;])(["]?){{([rR])|([^}]*)}} ', '%2{{%3|%4}}%1 ' )
    return output
end

function Infobox._cloakCommas( input )
    local output = input
    --troque temporariamente essas vírgulas interiores para obscurecer o símbolo "§"
    output = string.gsub( output, 
        '%(([^,)]*),([^,)]*)%)',
        '(%1§%2)'
    )
    -- Faça o mesmo para modelos
    output = string.gsub( output,
        '{{([%w%s]*)|([^}]*),([^}]*)}}',
        '{{%1|%2§%3}}' )
    -- Faça o mesmo para Links e Categorias
--        itemstring = string.gsub( itemstring, 
--            '%[%[([^,)]*),([^,)]*)|[([^,)]*),([^,)]*)%]%]',
--            '[[%1§%2|%3§%4]]'
--        )
    return output
end

-- Chama _hlist de um modelo
Infobox.hlist = invokeInt('_hlist')

-- Função interna para criar listas horizontais
function Infobox._hlist( args )
    -- ** Determine valores para a função ** --
    -- Delimitador é o separador entre itens. Padrão para {{{1|;}}} 
    local delimiter  = args['delimiter'] or args[1] or ';'
    -- A seqüência de texto simples a ser alterada para uma lista.
    -- Se não houver {{{2}}}, então é o único argumento sem nome.
    local itemstring = args['value'] or args[2] or args[1] or nil
    if not args[2] then delimiter = args['delimiter'] or args[1] or ';' end
    
    itemstring = Infobox._sanitizeInput( itemstring )
    
    -- Recorte baseado em comprimento opcional.
    local trim       = args['trim'] or args[3] or false
    
    if delimiter == ',' and 
     ( string.match( itemstring, '%(([^,)]*),([^,)]*)%)') or
     string.match( itemstring, '{{([%w%s]*)|([^}]*),([^}]*)}}')
     )
     -- Se os itens estiverem separados por vírgulas e
     -- há vírgulas entre parênteses
     -- Como "Mansão Wayne (Gotham City, Gotham City)",
     then
         itemstring = Infobox._cloakCommas( itemstring )
    end
    
    if mw.ustring.match(itemstring, ';' ) and 
     not mw.ustring.match(itemstring, '(.*);(.*);' ) and
     delimiter == ',' 
     -- se há apenas um ponto e vírgula e o delimitador é ','
     -- então, não importa o que seja, o que quer que seja antes do ponto-e-vírgula está na "frente"
     then
        local primary   = mw.ustring.match(itemstring, '(.*);' )
        local secondary = mw.ustring.match(itemstring, ';(.*)' )
        
        --Separar os itens individuais por delimitador
        -- e colocá-los em uma tabela (ou array)
        local items1      = HF.explode( delimiter, primary )
        local items2      = HF.explode( delimiter, secondary )

        -- Pegue os itens nas tabelas de volta
        -- e reproduzi-los como listas horizontais e com marcadores
        local list1       = L.makeList( 'horizontal', items1 )
        local list2       = L.makeList( 'horizontal', items2 )
        
        -- Crie o wrapper de conteúdo para trás
        local morebox = mw.html.create('div')
            :addClass('expansion-tag')
            :addClass('mw-collapsible')
            :addClass('mw-collapsed')
            :attr('data-expandtext', morelabel)
            :attr('data-collapsetext', lesslabel)
            :wikitext(list2):allDone()
        -- Saída de tudo
        -- Se mudarmos os símbolos antes, os mudaremos agora
        return mw.ustring.gsub( list1 .. tostring(morebox), '§', ',' )
    elseif type(trim)   == 'number' and
     mw.ustring.len( itemstring ) > trim 
     -- Se houver um valor para aparar
     -- e a entrada é maior do que o limite dado
     then
        -- quebre a corda inicial no pré-limite (frente)
        -- e cadeias pós-limite (de volta) strings
        local primary   = string.sub( input, 1, trim )
        local secondary = string.sub( input, trim )
        local shiftatbreak = ''
        -- Faça uma pausa natural no delimitador antes do limiar
        -- e mova o restante para a volta da string
        primary, shiftatbreak = mw.ustring.match(
            primary,
            '(.*)'..delimiter..'(.*)$'
        )
        secondary = shiftatbreak .. secondary
        
        --Separar os itens individuais por delimitador
        -- e colocá-los em uma tabela (ou array)
        local items1      = HF.explode( delimiter, primary )
        local items2      = HF.explode( delimiter, secondary )
        
        -- Se mudarmos os símbolos antes, os mudaremos agora
        for i, v in ipairs( items1 ) do
            v = mw.ustring.gsub( v, '§', ',' )
        end
        for i, v in ipairs( items2 ) do
            v = mw.string.gsub( v, '§', ',' )
        end

        --Pegue os itens nas mesas frontal e tabelas
        -- e reproduzi-los como listas horizontais e com marcadores
        local list1       = L.makeList( 'horizontal', items1 )
        local list2       = L.makeList( 'horizontal', items2 )
        
        -- Crie o wrapper de conteúdo HTML para trás
        local morebox = mw.html.create('div')
            :addClass('expansion-tag')
            :addClass('mw-collapsible')
            :addClass('mw-collapsed')
            :attr('data-expandtext', morelabel)
            :attr('data-collapsetext', lesslabel)
            :wikitext(list2):allDone()
        -- Saída de tudo
        -- Se mudarmos os símbolos antes, os mudaremos agora
        return string.gsub( list1 .. tostring(morebox), '§', ',' )
     else
        --Se não há trim, ou está tudo abaixo do limiar
        -- Separar os itens individuais por delimitador
        -- e colocá-los em uma tabela (ou array)
        local items      = HF.explode( delimiter, itemstring )
        
        -- Pegue os itens na tabela
        -- e reproduzi-los como uma lista horizontal com marcadores
        local list       = L.makeList( 'horizontal', items )
        
        -- Saída da lista
        -- Se mudarmos os símbolos antes, os mudaremos agora
        return string.gsub( list, '§', ',' )
    end
end

-- Retorne o esqueleto do Módulo.
return Infobox