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