Módulo:AutRules

De Wikincat
Ir para navegação Ir para pesquisar

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

local p = {}

function p.Rules(frame)
  -- Define o alvo das regras
  local target = frame:getParent().args[1] or frame.args[1]
  if target == "" or target == nil then
    target = mw.uri.decode(frame:callParserFunction("#urlget", "fullpagename"))
  end
  if target == "" or target == nil then
    target = mw.title.getCurrentTitle().prefixedText
  end
  -- Semantic Scribunto foi carregado?
  if not mw.smw then
    return "mw.smw module not found"
  end
  -- Define variáveis básicas
  local info, a, b
  local infos = {}
  -- Funções básicas
  local function ucfirst(str)
    return (str:gsub("^%l", string.upper))
  end
  -- Record status
  local recordStatus =
      frame:expandTemplate {
        title = "Field data string",
        args = { "000", "5", "1", property = "Leader", fullpagename = target }
      } or false
  if recordStatus == "n" then
    a = "Segundo o Líder, este é um registro <b>novo</b> (não um alterado ou revisado, expandido, excluído, etc.)"
    info = string.format("* %s.", a)
    table.insert(infos, info)
  elseif recordStatus == "c" then
    a = "Segundo o Líder, este é um registro <b>alterado ou revisado</b> (não um novo, expandido, excluído, etc.)"
    info = string.format("* %s.", a)
    table.insert(infos, info)
  elseif recordStatus == "a" or recordStatus == "d" then
    a = "Segundo o Líder, este é um registro <b>expandido</b> ou <b>excluído</b> (não novo)"
    info = string.format("* %s.", a)
    table.insert(infos, info)
  end
  -- Encoding level
  local encodingLevel =
      frame:expandTemplate {
        title = "Field data string",
        args = { "000", "17", "1", property = "Leader", fullpagename = target }
      } or false
  if encodingLevel == "n" then
    a = "Segundo o Líder, este registro de autoridade está <b>completo</b>"
    info = string.format("* %s.", a)
    table.insert(infos, info)
  elseif encodingLevel == "o" then
    a = "Segundo o Líder, este registro de autoridade está <b>incompleto</b>"
    info = string.format("* %s.", a)
    table.insert(infos, info)
  end
  -- Explica a sintaxe '(Biblioteca)NúmeroDeControle'
  local f001 =
      frame:expandTemplate {
        title = "Field data string",
        args = { "001", "0", "", property = "Control field data", fullpagename = target } or ""
      }
  local f003 =
      frame:expandTemplate {
        title = "Field data string",
        args = { "003", "0", "", property = "Control field data", fullpagename = target } or ""
      }
  a = "Internamente, este registro é identificado pelo código"
  b = "para sistemas externos, o código é"
  info = string.format('* %s "%s"; %s "(%s)%s".', a, f001, b, f003, f001)
  table.insert(infos, info)
  -- Campo 005
  local creationDate =
      mw.smw.ask("[[" .. target .. "]]|?Creation date#-F[l, d \\d\\e F \\d\\e Y]|headers=hide|mainlabel=-") or ""
  if type(creationDate) == "table" then
    for _, row in pairs(creationDate) do
      for _, data in pairs(row) do
        creationDate = data
      end
    end
  end
  local modificationDate =
      mw.smw.ask("[[" .. target .. "]]|?Modification date#-F[l, d \\d\\e F \\d\\e Y]|headers=hide|mainlabel=-") or ""
  if type(modificationDate) == "table" then
    for _, row in pairs(modificationDate) do
      for _, data in pairs(row) do
        modificationDate = data
      end
    end
  end
  a = "O registro foi criado em:"
  b = "Sua última transação foi em:"
  info = string.format("* %s %s. %s %s.", a, creationDate, b, modificationDate)
  table.insert(infos, info)

  local accessPointPresence =
      frame:callParserFunction {
        name = "#ask:[[" ..
            target ..
            "#100||" ..
            target .. "#110||" .. target .. "#111||" .. target .. "#130||" .. target .. "#150||" .. target .. "#151]]",
        args = { "?Field data", format = "count", mainlabel = "-" }
      } or 0
  accessPointPresence = tonumber(accessPointPresence) or 0

  -- Testa (conta) se existe mais de um ponto de acesso principal
  local f100existance = frame:expandTemplate { title = "Exist", args = { "100", target } } or ""
  if accessPointPresence > 1 or f100existance == "multiple" then
    a = "Foi registrado <b>mais de um ponto de acesso principal</b>. Isso não é permitido"
    info = string.format('* <strong class="error">%s.</strong>', a)
    table.insert(infos, info)
  end
  local f100 =
      mw.text.trim(
        frame:expandTemplate { title = "Field data string", args = { "100", "0", "0", fullpagename = target } } or ""
      )
  if f100 ~= "" then
    info = "A autoridade é do tipo <b>pessoa</b>"
    if f100:sub(1, 1) == "0" then
      a = "e a entrada começa pelo seu <b>primeiro nome</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f100:sub(1, 1) == "1" then
      a = "e a entrada começa pelo seu <b>sobrenome</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f100:sub(1, 1) == "3" then
      a = "e a entrada começa pelo seu <b>nome de família</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f100:sub(1, 1) == "#" then
      a = "o primeiro indicador não foi preenchido"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    else
      a = "o primeiro indicador foi preenchido incorretamente"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    end
    if f100:sub(2, 2) ~= "#" then
      a = "O segundo indicador do campo 100 foi preenchido, porém, ele não deve ser preenchido"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
    -- Testa se existe ', ' no subcampo $a (Nome, Sobrenome)
    local f100a = frame:expandTemplate { title = "Select", args = { "100", "a", target } } or ""
    if f100a ~= "" then
      if not string.match(f100a, ".-,.") then
        a = "Em pontos de acesso, o nome pessoal deve ser invertido (Nome, Sobrenome). Verifique o campo 100"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
      if string.match(f100a, "[a-zÀ-ü],[A-ZÀ-ü]") then
        a = "Falta espaço após a vírgula. Verifique o campo 100"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
    end
    local f100q = frame:expandTemplate { title = "Select", args = { "100", "q", target } } or ""
    if f100q ~= "" then
      if not string.match(f100q, "^%(") then
        a = "O subcampo $q do campo 100 necessita parênteses"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
    end
    local f100d = frame:expandTemplate { title = "Select", args = { "100", "d", target } } or ""
    if f100d ~= "" then
      if string.match(f100, "%$d %d%d%d%d$") then
        a = "O subcampo $d do campo 100 necessita hífen"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
      if not string.match(f100, ",%s?%$d") then
        a = "Inclua uma vírgula antes do subcampo $d do campo 100"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
    end
  end
  -- Testa se existe um ponto de acesso principal 110
  local f110 =
      mw.text.trim(
        frame:expandTemplate { title = "Field data string", args = { "110", "0", "0", fullpagename = target } } or ""
      )
  if f110 ~= "" then
    info = "A autoridade é do tipo <b>entidade coletiva</b>"
    if f110:sub(1, 1) == "0" then
      a = "e a entrada começa por um <b>nome invertido</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f110:sub(1, 1) == "1" then
      a = "e a entrada começa por um <b>nome de jurisdição</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f110:sub(1, 1) == "2" then
      a = "e a entrada começa por um <b>nome em ordem direta</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f110:sub(1, 1) == "#" then
      a = "o primeiro indicador não foi preenchido"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    else
      a = "o primeiro indicador foi preenchido incorretamente"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    end
    if f110:sub(2, 2) ~= "#" then
      a = "O segundo indicador do campo 110 foi preenchido, porém, ele não deve ser preenchido"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
    local f110b = frame:expandTemplate { title = "Select", args = { "110", "b", target } } or ""
    if f110b ~= "" then
      if not string.match(f110, ".%s?%$b") then
        a = "Inclua um ponto antes do subcampo $b do campo 110"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
    end
  end
  -- Testa se existe um ponto de acesso principal 111
  local f111 =
      mw.text.trim(frame:expandTemplate { title = "Field data string", args = { "111", "0", "0", fullpagename = target } }) or
      ""
  if f111 ~= "" then
    info = "A autoridade é do tipo <b>evento</b>"
    if f111:sub(1, 1) == "0" then
      a = "e a entrada começa por um <b>nome invertido</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f111:sub(1, 1) == "1" then
      a = "e a entrada começa por um <b>nome de jurisdição</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f111:sub(1, 1) == "2" then
      a = "e a entrada começa por um <b>nome em ordem direta</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f111:sub(1, 1) == "#" then
      a = "o primeiro indicador não foi preenchido"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    else
      a = "o primeiro indicador foi preenchido incorretamente"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    end
    if f111:sub(2, 2) ~= "#" then
      a = "O segundo indicador do campo 111 foi preenchido, porém, ele não deve ser preenchido"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
  end
  -- Testa se existe um ponto de acesso principal 130
  local f130 =
      mw.text.trim(frame:expandTemplate { title = "Field data string", args = { "130", "0", "0", fullpagename = target } }) or
      ""
  if f130 ~= "" then
    info = "A autoridade é do tipo <b>título uniforme</b>"
    if f130:sub(1, 1) ~= "#" then
      a = "o primeiro indicador não deve ser preenchido"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    end
    if f130:sub(2, 2) == "#" then
      a = "Está faltando o segundo indicador do campo 130"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    else
      local f130a = frame:expandTemplate { title = "Select", args = { "130", "a", target } } or ""
      a = ucfirst(f130a:sub(tonumber(f130:sub(2, 2)) or 0))
      info = string.format('* %s, ele será alfabetado como "<b>%s</b>".', info, a)
      table.insert(infos, info)
    end
  end
  local f150 =
      mw.text.trim(frame:expandTemplate { title = "Field data string", args = { "150", "0", "0", fullpagename = target } }) or
      ""
  if f150 ~= "" then
    if f150:sub(1, 1) ~= "#" then
      a = "O primeiro indicador do campo 150 foi preenchido, porém, ele não deve ser preenchido"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
    if f150:sub(2, 2) ~= "#" then
      a = "O segundo indicador do campo 150 foi preenchido, porém, ele não deve ser preenchido"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
  end
  local f400 =
      mw.text.trim(
        frame:expandTemplate { title = "Field data string", args = { "400", "0", "0", fullpagename = target } } or ""
      )
  if f400 ~= "" then
    info = "A remissiva Ver é do tipo <b>pessoa</b>"
    if f400:sub(1, 1) == "0" then
      a = "e a entrada começa pelo seu <b>primeiro nome</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f400:sub(1, 1) == "1" then
      a = "e a entrada começa pelo seu <b>sobrenome</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f400:sub(1, 1) == "3" then
      a = "e a entrada começa pelo seu <b>nome de família</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f400:sub(1, 1) == "#" then
      a = "o primeiro indicador não foi preenchido"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    else
      a = "o primeiro indicador foi preenchido incorretamente"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    end
    if f400:sub(2, 2) ~= "#" then
      a = "O segundo indicador do campo 400 foi preenchido, porém, ele não deve ser preenchido"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
    -- Testa se existe ', ' no subcampo $a (Nome, Sobrenome)
    local f400a = frame:expandTemplate { title = "Select", args = { "400", "a", target } } or ""
    if f400a ~= "" then
      if not string.match(f400a, ".-,.") then
        a = "Em pontos de acesso, o nome pessoal deve ser invertido (Nome, Sobrenome). Verifique o campo 400"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
      if string.match(f400a, "[a-zÀ-ü],[A-ZÀ-ü]") then
        a = "Falta espaço após a vírgula. Verifique o campo 400"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
    end
    local f400q = frame:expandTemplate { title = "Select", args = { "400", "q", target } } or ""
    if f400q ~= "" then
      if not string.match(f400q, "^%(") then
        a = "O subcampo $q do campo 400 necessita parênteses"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
    end
    local f400d = frame:expandTemplate { title = "Select", args = { "400", "d", target } } or ""
    if f400d ~= "" then
      if string.match(f400, "%$d %d%d%d%d$") then
        a = "O subcampo $d do campo 400 necessita hífen"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
      if not string.match(f400, ",%s?%$d") then
        a = "Inclua uma vírgula antes do subcampo $d do campo 400"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
    end
  end
  -- Testa se existe um ponto de acesso principal 110
  local f410 =
      mw.text.trim(
        frame:expandTemplate { title = "Field data string", args = { "410", "0", "0", fullpagename = target } } or ""
      )
  if f410 ~= "" then
    info = "A remissiva Ver é do tipo <b>entidade coletiva</b>"
    if f410:sub(1, 1) == "0" then
      a = "e a entrada começa por um <b>nome invertido</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f410:sub(1, 1) == "1" then
      a = "e a entrada começa por um <b>nome de jurisdição</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f410:sub(1, 1) == "2" then
      a = "e a entrada começa por um <b>nome em ordem direta</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f410:sub(1, 1) == "#" then
      a = "o primeiro indicador não foi preenchido"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    else
      a = "o primeiro indicador foi preenchido incorretamente"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    end
    if f410:sub(2, 2) ~= "#" then
      a = "O segundo indicador do campo 410 foi preenchido, porém, ele não deve ser preenchido"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
    local f410b = frame:expandTemplate { title = "Select", args = { "410", "b", target } } or ""
    if f410b ~= "" then
      if not string.match(f410, ".%s?%$b") then
        a = "Inclua um ponto antes do subcampo $b do campo 410"
        info = string.format('* <strong class="error">%s.</strong>', a)
        table.insert(infos, info)
      end
    end
  end
  -- Testa se existe um ponto de acesso principal 111
  local f411 =
      mw.text.trim(frame:expandTemplate { title = "Field data string", args = { "411", "0", "0", fullpagename = target } }) or
      ""
  if f411 ~= "" then
    info = "A remissiva Ver é do tipo <b>evento</b>"
    if f411:sub(1, 1) == "0" then
      a = "e a entrada começa por um <b>nome invertido</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f411:sub(1, 1) == "1" then
      a = "e a entrada começa por um <b>nome de jurisdição</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f411:sub(1, 1) == "2" then
      a = "e a entrada começa por um <b>nome em ordem direta</b>"
      info = string.format("* %s %s.", info, a)
      table.insert(infos, info)
    elseif f411:sub(1, 1) == "#" then
      a = "o primeiro indicador não foi preenchido"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    else
      a = "o primeiro indicador foi preenchido incorretamente"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    end
    if f411:sub(2, 2) ~= "#" then
      a = "O segundo indicador do campo 411 foi preenchido, porém, ele não deve ser preenchido"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
  end
  -- Testa se existe um ponto de acesso principal 130
  local f430 =
      mw.text.trim(frame:expandTemplate { title = "Field data string", args = { "430", "0", "0", fullpagename = target } }) or
      ""
  if f430 ~= "" then
    info = "A remissiva Ver é do tipo <b>título uniforme</b>"
    if f430:sub(1, 1) ~= "#" then
      a = "o primeiro indicador não deve ser preenchido"
      info = string.format('* %s, porém, <strong class="error">%s.</strong>', info, a)
      table.insert(infos, info)
    end
    if f430:sub(2, 2) == "#" then
      a = "Está faltando o segundo indicador do campo 430"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    else
      local f430a = frame:expandTemplate { title = "Select", args = { "430", "a", target } } or ""
      a = ucfirst(f430a:sub(tonumber(f430:sub(2, 2)) or 0))
      info = string.format('* %s, ele será alfabetado como "<b>%s</b>".', info, a)
      table.insert(infos, info)
    end
  end
  local f450 =
      mw.text.trim(frame:expandTemplate { title = "Field data string", args = { "450", "0", "0", fullpagename = target } }) or
      ""
  if f450 ~= "" then
    if f450:sub(1, 1) ~= "#" or f450:sub(2, 2) ~= "#" then
      a = "Os indicadores do campo 450 não devem ser preenchidos"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
  end
  local f643 =
      mw.text.trim(frame:expandTemplate { title = "Field data string", args = { "643", "0", "0", fullpagename = target } }) or
      ""
  if f643 ~= "" then
    if f643:sub(1, 1) ~= "#" or f643:sub(2, 2) ~= "#" then
      a = "Os indicadores do campo 643 não devem ser preenchidos"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
  end
  local f670 =
      mw.text.trim(frame:expandTemplate { title = "Field data string", args = { "670", "0", "0", fullpagename = target } }) or
      ""
  if f670 ~= "" then
    if f670:sub(1, 1) ~= "#" or f670:sub(2, 2) ~= "#" then
      a = "Os indicadores do campo 670 não devem ser preenchidos"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
  end
  local f675 =
      mw.text.trim(frame:expandTemplate { title = "Field data string", args = { "675", "0", "0", fullpagename = target } }) or
      ""
  if f675 ~= "" then
    if f675:sub(1, 1) ~= "#" or f675:sub(2, 2) ~= "#" then
      a = "Os indicadores do campo 675 não devem ser preenchidos"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
  end
  local f856 =
      mw.text.trim(frame:expandTemplate { title = "Field data string", args = { "856", "0", "0", fullpagename = target } }) or
      ""
  if f856 ~= "" then
    if f856:sub(1, 1) ~= "4" then
      a = 'O primeiro indicador do campo 856 precisa ter o valor "4"'
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
    if f856:sub(2, 2) ~= "#" then
      a = "O segundo indicador do campo 856 foi preenchido, porém, ele não deve ser preenchido"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
    if string.match(f856, "%$a%s") then
      a = "Normalmente, o subcampo utilizado no 856 é o $u, não o $a"
      info = string.format('* <strong class="error">%s.</strong>', a)
      table.insert(infos, info)
    end
  end
  -- Testa por inteiro o registro de modo a acusar: "," ou o "." precedido de espaço; designadores de subcampos errados
  local isoRecord =
      frame:callParserFunction {
        name = "#ask:[[-Has subobject::" .. target .. "]][[Field data::+]]",
        args = {
          "?Field data",
          format = "plainlist",
          link = "none",
          headers = "hide",
          mainlabel = "-",
          outro = "",
          sep = "",
          valuesep = "",
          propsep = ""
        }
      } or ""
  if string.match(isoRecord, "%s[.,][^.]") then
    a = "Pontos finais ou vírgulas nunca devem ser precedidos por um espaço"
    info = string.format('* <strong class="error">%s.</strong>', a)
    table.insert(infos, info)
  end
  if string.match(isoRecord, "%$[A-Z]") then
    a = "Não são permitidos designadores de subcampos com letras maiúsculas"
    info = string.format('* <strong class="error">%s.</strong>', a)
    table.insert(infos, info)
  end

  return table.concat(infos, "\n")
end

return p