Módulo:Busca

Permanently protected module
Origem: Wikipédia, a enciclopédia livre.
Documentação do módulo[ver] [editar] [histórico] [purgar]

Descrição

Faz busca no código wiki de uma página, contando as correspondências ou as utilizando pra gerar uma lista com uma determinada formatação.

Uso

contar: conta as correspondências para uma busca no código fonte de uma página.

{{#invoke:busca|contar|nome da página|Lua pattern}}

formatar: conta as correspondências para uma busca no código fonte de uma página.

{{#invoke:busca|formatar|nome da página|Lua pattern|Lua pattern de substituição}}
{{#invoke:busca|formatar|nome da página|Lua pattern|Lua pattern de substituição|limite=máximo}}

testar: testa se existe uma correspondência no código fonte da página, retornando "Sim" ou "Não" ou a respectiva resposta predefinida.

{{#invoke:busca|testar|nome da página|Lua pattern}}
{{#invoke:busca|testar|nome da página|Lua pattern|sim=texto para o sim|não=texto para o não}}

Lua patterns

Lua patterns são similares às expressões regulares, mas com algumas diferenças:

  • Não tem o "|" (ou).
  • Não tem o "{x,y}" (quantificador finito).
  • Não tem o "\b" (limítrofe de palavra).
  • Não tem "(?...)" (grupos especiais).
  • O "?" (opcional) não funciona em grupos, apenas em caracteres.
  • O caractere de escape é "%", e não "\".
  • O "-" é equivalente ao "*?" (repete o caractere o mínimo possível), e "+?" é escrito por exemplo como "aa-" ("a+?" em regex).

Essas são as diferenças mais notáveis, para mais detalhes veja mw:Extension:Scribunto/Lua reference manual#Patterns.


Limitações específicas dos módulos no MediaWiki:

  • Todas quebras de linha e todos espaços no começo e fim dos argumentos são contados como parte do pattern.
  • É preciso utilizar {{!}} e {{=}} para escapar "|" e "=", da mesma forma que é feito dentro de um #switch.
  • Os módulos são processados depois das predefinições e Parser Functions, devido a isso não é possível fazer um #ifexpr ou outra condição que dependa do resultado de um módulo, e as predefinições retornadas por módulos não são expandidas.
    • Obs: o contrário funciona normalmente, ou seja, predefinições e Parser Functions podem ser usados para gerar os argumentos passados para os módulos.

Exemplos

Contar quantas linhas de tabela tem o Tabela de conversão de unidades:

{{#invoke:busca|contar|Tabela de conversão de unidades|
{{!}}%-}}

resulta em: 78


Lista as seções do artigo Lua (linguagem de programação) e as primeiras palavras de cada seção:

{{#invoke:busca|formatar|Lua (linguagem de programação)|
{{=}}{{=}} *([^{{=}}]-) *{{=}}{{=}}
(%S+ %S+ %S+ %S+ %S+ %S+ %S+)|
* '''%1:''' %2...}}

resulta em:

  • História: Lua foi criada em 1993 por [[Roberto...
  • Características: Lua é normalmente descrita como uma linguagem...
  • A Linguagem: Esta seção descreve o vocabulário, aspectos sintáticos...
  • Sintaxe e exemplos: O Programa Olá Mundo pode ser escrito...
  • Tabelas: As tabelas são as estruturas de dados...
  • Projetos que utilizam Lua: Em 2013, a Wikimedia Foundation começou a...
  • Bibliografia: * {{citar livro|autor=Ierusalimschy, Roberto; Figueiredo, Luiz Henrique...

m ={}

function m.formatar(frame)
  local texto = mw.title.new(frame.args[1]):getContent()
  local pattern = frame.args[2]
  pattern = string.gsub(pattern, '\\n', '\n')
  local format = frame.args[3]
  local limite = frame.args['limite'] and tonumber(frame.args['limite']) or nil
  texto = mw.ustring.gsub(texto, pattern, function (...)
      local r
      for i,v in ipairs(arg) do
        if v ~= '' then
          r = string.gsub(r or format, '%%'..i, frame.args['se'..i] or arg[i])
        else
          r = string.gsub(r or format, '%%'..i, frame.args['não'..i] or '')
        end
      end
      return '<~~' .. r .. '~~>'
    end, limite)
  texto = string.gsub(string.gsub(texto, '~~>.-^?<~~', ''), '.-<~~(.-)~~>.*', '%1')
  return texto
end

function m.contar(frame)
  local texto = mw.title.new(frame.args[1]):getContent()
  local pattern = frame.args[2]
  pattern = string.gsub(pattern, '\\n', '\n')
  local gen = mw.ustring.gmatch(texto, pattern)
  local count = 0
  for i in gen do
    count = count + 1
  end
  return count
end

function m.testar(frame)
  local texto = mw.title.new(frame.args[1]):getContent()
  local pattern = frame.args[2]
  pattern = string.gsub(pattern, '\\n', '\n')
  if frame.args['início'] then
    local init = mw.ustring.find(texto, frame.args['início'])
    if not init then
      return frame.args['não'] or 'Não'
    end
  end
  if mw.ustring.find(texto, pattern, init or 1) then
    return frame.args['sim'] or 'Sim'
  else
    return frame.args['não'] or 'Não'
  end
end

return m