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 comosim
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. Seauto= 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 comodot
(⧼dot-separator⧽
),pipe
(|
),comma
(,
) outpt-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 
(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
Por favor inclua as categorias à subpágina /doc. Subpáginas deste módulo.
-- 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 )
}