Módulo:Lista de arquivos

Documentação do módulo[ver] [editar] [histórico] [purgar]

Descrição

Este módulo pode ser aplicado em páginas de discussão ou em arquivos de discussão, retornando todos os arquivos numerados daquela página ou de suas páginas parentes. Por padrão, o módulo usa o padrão Discussão:PAGENAME/Arquivo 1, com um A capital, um espaço antes do número e sem zeros à esquerda. O módulo não deve ser substituído – dessa forma, a lista de links irá se atualizar sempre que um novo arquivo numerado é adicionado.

O módulo pode ser usado com a {{Arquivo-índice}} para produzir uma caixa de links de arquivos numerados sem entrar com todos eles manualmente. Para isso, use {{arquivo-índice|auto=sim}}.

Uso

Principal

A função principal. Retorna uma lista de links de arquivos.

{{#invoke:Lista de arquivos|principal
| raiz             = 
| links            = 
| nobr             = 
| prefixo          = 
| prefixo_esp      = 
| link_prefixo     = 
| link_prefixo_esp = 
| sep              = 
| linha_sep        = 
| inicio           = 
| max              = 
| auto             =
}}
Cont

A função de contagem. Retorna o número do arquivo mais recente.

{{#invoke:Lista de arquivos|cont
| raiz            = 
| prefixo         = 
| prefixo_esp     = 
}}

Parâmetros

Os parâmetros válidos são:

  • raiz = <raiz> - usar isso para especificar uma raiz diferente daquele padrão da predefinição.
  • links = # - o número de links a serem exibidos por linha. O padrão é 10.
  • nobr = sim - se definido como sim remove todas as quebras de linha. Este parâmetro não pode ser usado em conjunto com |links=.
  • prefixo = <prefixo> - um prefixo personalizado para os arquivos, sem o número. O padrão é "Arquivo".
  • prefixo_esp = sim - adiciona um espaço entre o prefixo e o número do arquivo para prefixos especificados com |prefixo=.
  • link_prefixo = <link_prefixo> - um prefixo personalizado para os links de exibição, sem o número. O padrão é em branco. Se auto= longo está ativado, use "nenhum" para tê-lo em branco.
  • prefixo_esp = sim - adiciona um espaço entre o link do prefixo e o número do arquivo para prefixos especificados com |link_prefixo=.
  • sep = <sep> - o separador para links de arquivos. O valor padrão é o separador de vírgula para o idioma definido nas suas preferências: ", ". Pode ser definido como dot ( · ), pipe ( | ), comma (, ) ou tpt-languages (⧼tpt-languages-separator⧽),em seguida, ele usa que separador como especificado para o idioma padrão. Se qualquer outro valor for iserido, esse valor é usado como ele é. Se este módulo é chamado com #invoke, espaços em branco são rejeitados, mas se chamado a partir de outro módulo, em seguida, o espaço em branco é preservado. Isto permite a outros módulos para usar este módulo para criar wikitables, etc. Se chamado com #invoke, o problema de espaço em branco pode ser contornado usando &#32; (para espaços) e <br /> (para novas linhas).
  • linha_sep = <linha_sep> - o separador para as linhas de links de arquivos. Os possíveis valores de entrada são os mesmos que para o parâmetro |sep=, e o texto separador padrão é <br />. A frequência com que o valor é exibido depende do valor de |links=.
  • inicio = # - o número de arquivo para começar a listar os arquivos. Este deve ser menor que o maior número do arquivo, ou de |max= se for especificado.
  • max = # -o maior número de arquivo para a lista. Isso substitui a detecção automática de números de páginas do arquivo.
  • auto = longo - é mostrado como uma tabela. Muda o valor padrão de links para 3 e ligação prefixo para 'Arquivo '.

Ver também

-- Processar um argumento numérico para ter certeza que é um positivo
-- inteiro.
local function processNumArg( num )
    if num then
        num = tonumber( num )
        if type( num ) == 'number' then
            num = math.floor( num )
            if num >= 0 then
                return num
            end
        end
    end
    return nil
end

-- Verifica se existe uma página, passando por pcall
local function checkPageExists( title )
    if not title then
        error('Nenhum título passou em checkArchiveExists', 2)
    end
    local noError, titleObject = pcall(mw.title.new, title)
    if not noError then
        -- Se está acima do limite da função, então assumimos
        -- que a página não existe.
        return false
    else
        if titleObject then
            return titleObject.exists
        else
            return false -- Retornará falso se for dado um título ruim.
        end
    end
end

-- Checa cada Arquivo n para ver se ele existe, e retorna o
-- o número do primeiro Arquivo que não existe. É
-- necessário fazer isso em lotes, porque cada checagem é uma
-- função longa e nós queremos evitar fazer demasiadas
-- deles de modo a não exceder o limite de função.
local function checkArchives( prefixo, n, inicio )
    local i = inicio
    local exists = true
    while exists do
        exists = checkPageExists( prefixo .. tostring( i ) )
        if exists then
            i = i + n
        end
    end
    return i
end

-- Retorna o maior número do Arquivo, utilizando checkArchives()
-- e iniciando em intervalos de 1000. Isto deve levar-nos a
-- mmáximo de 500.000 arquivos possíveis antes ir para a
-- o limite da função
local function getBiggestArchiveNum( prefixo, max )
    -- Retorna o valor para max se for especificado.
    max = processNumArg( max )
    if max then
        return max
    end
    
    -- Caso contrário, detecta o maior número do Arquivo.
    local check1000 = checkArchives( prefixo, 1000, 1 )
    if check1000 == 1 then
        return 0 -- Retorna 0 se nenhum Arquivo fr encontrado.
    end
    local check200 = checkArchives( prefixo, 200, check1000 - 1000 )
    local check50 = checkArchives( prefixo, 50, check200 - 200 )
    local check10 = checkArchives( prefixo, 10, check50 - 50 )
    local check1 = checkArchives( prefixo, 1, check10 - 10 )
    -- check1 é a primeira página que não existe, por isso queremos
    -- subtrai-lo por um para encontrar o maior arquivo existente.
    return check1 - 1
end

-- Retorna o link do prefixo do Arquivo (o título das páginas de Arquivos
-- menos o número).
local function getPrefixo( raiz, prefixo, prefixoEsp )
    local ret = raiz or mw.title.getCurrentTitle().prefixedText
    ret = ret .. '/'
    if prefixo then
        ret = ret .. prefixo
        if prefixoEsp == 'sim' then
            ret = ret .. ' '
        end
    else
        ret = ret .. 'Arquivo '
    end
    return ret
end

-- Retorna o número de arquivos para colocar em uma linha. Definido como
-- math.huge se não deve haver quebras de linha.
local function getLineNum( links, nobr, isLongo )
    local linksToNum = tonumber( links )
    local lineNum
    if nobr == 'sim' or (links and not linksToNum) then
        lineNum = math.huge
    -- Se links é um número, é processado. Os valores negativos e expressões
    -- como links=8/2 vamos ignorar para simplificar.
    elseif type(linksToNum) == 'number' and linksToNum >= 0 then
        lineNum = math.floor( linksToNum )
        if lineNum == 0 then
            lineNum = math.huge
        end
    else
    	if isLongo==true then
    		lineNum = 3 -- Padrão de 3 links no longo
    	else
        	lineNum = 10 -- Padrão de 10 no curto
        end
    end
    return lineNum
end

-- Obtém o prefixo para colocar antes dos links de arquivos.
local function getLinkPrefixo( prefixo, esp, isLongo )
    -- Retorna o link do prefixo.
    local ret = ''
    if isLongo==true then 
    	if type(prefixo) == 'string' then
    		if prefixo == 'nenhum' then -- 'nenhum' substitui o prefixo vazio
    			ret = ''
    		 else
    		 	ret = prefixo
    		 	if esp == 'sim' then
    		 		ret = ret .. ' '
    		 	end
		 	end
	 	else
	 		ret = 'Arquivo '
		end
	else --Tipo não é longo
		if type(prefixo) == 'string' then
        	ret = prefixo
        	if esp == 'sim' then
        	    ret = ret .. ' '
        	end
    	end
    end
    return ret
end

-- Retorna o número para começar a listar os arquivos.
local function getInicio( inicio )
    inicio = processNumArg( inicio )
    if inicio then
        return inicio
    else
        return 1
    end
end

-- Processa o parâmetro separador.
local function getSeparator( sep )
    if sep and type(sep) == 'string' then
        if sep == 'dot' 
            or sep =='pipe'
            or sep == 'comma'
            or sep == 'tpt-languages' then
            return mw.message.new( sep .. '-separator' ):plain()
        else
            return sep
        end
    else
        return nil
    end
end

-- Gera a lista de links de Arquivos. glargs.max deve ser zero (para
-- sem arquivos) ou um valor inteiro positivo.
local function generateLinks( glargs )
    if type( glargs ) ~= 'table' or not glargs.max or not glargs.prefixo then
        error('argumentos insuficientes passados para generateLinks', 2)
    end
    -- Se não houver arquivos ainda, retorna uma mensagem e um
    -- link para criar o Arquivo um
    if glargs.max == 0 then
    	if glargs.isLongo == true then
    		glargs.max = 1 -- Um link vermelho de Arquivo é mostrado no formato Longo
    	else -- Erro e link para criar um arquivo é mostrado no formato curto
        	return 'sem arquivos ainda ([[' .. glargs.prefixo .. '1|criar]])' 
        end
    end
    -- Retorna um erro em html se o número de inicio é maior que o 
    -- número máximo.
    local inicio = glargs.inicio or 1
    if inicio > glargs.max then
        return '<span class="error">Valor de inicio "' 
            .. tostring( inicio ) 
            .. '" é maior do que o número do Arquivo mais recente "' 
            .. tostring( glargs.max ) 
            .. '".</span>'
    end
    local linkPrefixo = glargs.linkPrefixo or ''
        local lineNum = glargs.lineNum or 10
    local sep = '' -- O valor separador de Longo é um elemento de cécula, na versão cruta é ', '
    local linhaSep = '' -- Quabra de linha padrão de Longo são elementos de linha, na versão curta é '\n'
    if glargs.isLongo==true then 
    	sep = glargs.sep or ''
    	sep = sep .. '</td><td>'
    	linhaSep = glargs.linhaSep or ''
		linhaSep = linhaSep .. '</td></tr><tr><td>'
    else
    	sep = glargs.sep or mw.message.new( 'comma-separator' ):plain()
    	linhaSep = glargs.linhaSep or '<br />'
    end
    -- Gera os links dos Arquivos.
    local lineCounter = 1 -- O contador para ver se precisamos de uma quebra de linha ou não.
    local ret = {} -- Uma tabela contendo os valores para serem devolvidos.
    if glargs.isLongo == true then --Versão Longo é uma tabela
    	table.insert(ret, "<table style=\"width: 100%; padding: 0px; text-align: center; background-color: transparent;\"><tr><td>")
    end
    for archiveNum = inicio, glargs.max do
        local link = mw.ustring.format(
            '[[%s%d|%s%d]]',
            glargs.prefixo, archiveNum, linkPrefixo, archiveNum
        )
        table.insert( ret, link )
        -- Se nós não precisamos de uma nova linha é poduzida uma vírgula. Nós não precisamos
        -- de uma vírgula depois do último arquivo. 
        if lineCounter < lineNum and archiveNum < glargs.max then
            table.insert( ret, sep )
            lineCounter = lineCounter + 1
        -- Produz novas linhas se nencessário. Nós não precisamos de uma nova linha após
        -- o último link.
        elseif lineCounter >= lineNum and archiveNum < glargs.max then
            table.insert( ret, linhaSep )
            lineCounter = 1
        end
    end
    if glargs.isLongo == true then --Versão Longo é uma tabela
    	table.insert(ret, "</td></tr></table>")
    end
    return table.concat( ret )
end

-- Determinar se o formato deve ser longo
local function findFormType( auto )
	if auto == nil or auto == '' then
		return false
	elseif auto == 'longo' then
			return true
	else
		return false
	end
end

-- Obteém os dados de arquivo e passando para generateLinks().
local function _principal( args )
	local isLongo = findFormType( args.auto )
    local prefixo = getPrefixo( args.raiz, args.prefixo, args.prefixoesp )
    local max = getBiggestArchiveNum( prefixo, args.max )
    local lineNum = getLineNum( args.links, args.nobr, isLongo )
    local linkPrefixo = getLinkPrefixo( args.linkprefixo, args.linkprefixoesp, isLongo )
    local inicio = getInicio( args.inicio )
    local sep = getSeparator( args.sep )
    local linhaSep = getSeparator( args.linhasep )
    local glargs = {
        inicio = inicio,
        max = max,
        prefixo = prefixo,
        linkPrefixo = linkPrefixo,
        isLongo = isLongo,
        sep = sep,
        lineNum = lineNum,
        linhaSep = linhaSep
    }
    return generateLinks( glargs )
end

-- A função de mensagens para fazer getBiggestArchiveNum() disponível a partir de
-- #invoke.
local function _cont( args )
    local prefixo = getPrefixo( args.raiz, args.prefixo, args.prefixoesp )
    local archiveMax = getBiggestArchiveNum( prefixo )
    return archiveMax
end

function makeWrapper( func )
    return function( frame )
        -- Se chamado a partir de #invoke, retorna os args de #invoke
        -- se existem, ou então se os argumentos passados para os quadros
        -- parentes. Caso contrário, assume os argumentos estão sendo passados diretamente
        -- a partir de outro módulo ou a partir do console de depuração.
        local origArgs
        if frame == mw.getCurrentFrame() then
            origArgs = frame:getParent().args
            for k, v in pairs( frame.args ) do
                origArgs = frame.args
                break
            end
        else
            origArgs = frame
        end
        
        -- Ignorar valores de parâmetros em branco, exceto "links",
        -- que funciona de forma diferente dependendo se se trata de
        -- de branco ou ausente.
        local args = {}
        for k, v in pairs( origArgs ) do
            if k == 'links' or v ~= '' then
                args[k] = v
            end
        end
        
        return func( args )
    end
end

return {
    principal = makeWrapper( _principal ),
    cont = makeWrapper( _cont )
}