Skip to content

fix: campo CITE AS seleciona nota de rodapé errada e quebra espaçamento sem volume - #1350

Open
Rossi-Luciano wants to merge 1 commit into
scieloorg:masterfrom
Rossi-Luciano:fix/pdf-cite-as-wrong-footnote-selection
Open

fix: campo CITE AS seleciona nota de rodapé errada e quebra espaçamento sem volume#1350
Rossi-Luciano wants to merge 1 commit into
scieloorg:masterfrom
Rossi-Luciano:fix/pdf-cite-as-wrong-footnote-selection

Conversation

@Rossi-Luciano

@Rossi-Luciano Rossi-Luciano commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

O que esse PR faz?

Corrige a issue #1349: o campo CITE AS do rodapé da página 1 tinha dois problemas.

extract_cite_as_part_one pegava a primeira <fn fn-type="other"> do documento, sem checar o <label>. fn-type="other" é uma categoria genérica do JATS usada para qualquer tipo de nota (institucional, declaração de uso de IA, códigos JEL, política de plágio, registro ZooBank), então o CITE AS - que deveria ser uma citação bibliográfica - imprimia conteúdo errado em 7 de 26 artigos do corpus de teste, incluindo um caso (a29.xml) em que a nota correta existia no mesmo fn-group mas não era a primeira.

docx_cite_as_pipe montava cite_as_part_two como f'{volume}: {location}' sem checar se volume existia, deixando um : solto quando o XML não tem <volume> (ex: "Cadernos Pagu : e236720.").

Onde a revisão poderia começar?

packtools/sps/formats/pdf/pipeline/xml.py, função extract_cite_as_part_one, e packtools/sps/formats/pdf/pipeline/docx.py, novo helper _format_cite_as_part_two e seu uso em docx_cite_as_pipe.

Como este poderia ser testado manualmente?

  1. Gerar o PDF de a11.xml do corpus de teste, cuja primeira <fn fn-type="other"> é uma nota institucional.
  2. Antes: CITE AS: Trabalho realizado na Universidade Federal de Pernambuco - UFPE - Recife (PE), Brasil.Audiology - Communication Research 28: e2725.
  3. Depois: CITE AS: Audiology - Communication Research 28: e2725.
  4. Gerar o PDF de a18.xml (sem <volume>).
  5. Antes: CITE AS: Cadernos Pagu : e236720. Depois: CITE AS: Cadernos Pagu e236720.
  6. pytest tests/sps/formats/pdf/pipeline/test_xml.py tests/sps/formats/pdf/pipeline/test_docx.py cobre os dois casos com 6 testes de regressão novos.

Algum cenário de contexto que queira dar?

Achado revisando o PR #1326: o @pitangainnovare notou o espaçamento quebrado sem volume no CITE AS e sugeriu abrir uma issue separada, já que "o problema não é só esse". Investigando a fundo, a causa maior é a seleção da nota errada (fn-type="other" sendo tratado como sinônimo de "nota de citação", o que não é garantido pelo JATS).

Validado contra as 26 amostras do corpus de teste: 6 casos que vazavam conteúdo errado (a10, a11, a12, a20, a24, a28) agora retornam vazio corretamente; a29 passou a capturar a nota real de citação em vez de uma URL do ZooBank; os 3 casos que já funcionavam (a8, a17, a30) continuam corretos e ganharam texto completo (antes truncado por usar .text em vez de itertext).

Screenshots

a11.xml (nota institucional sendo usada como citação):

a11_cite_as_comparison

a18.xml (sem volume, espaçamento quebrado):

a18_cite_as_comparison

Quais são os tickets relevantes?

Issue #1349

Referências

Comentário original do @pitangainnovare: #1326 (review)


Segurança da informação (NSI.04)

Seção obrigatória. Marque as opções aplicáveis e justifique quando necessário. Referência: NSI.04 - Norma de Desenvolvimento Seguro.

Este PR manipula dados sensíveis ou pessoais (LGPD)?

  • Sim — descreva os controles de proteção aplicados (criptografia, mascaramento, anonimização, etc.):
  • Não

Este PR altera autenticação, autorização, controle de acesso ou gerenciamento de sessão?

  • Sim — descreva o que mudou e por quê:
  • Não

Este PR introduz, atualiza ou remove dependências de terceiros?

  • Sim — as novas dependências foram verificadas no SBOM/Trivy sem vulnerabilidades críticas/altas em aberto?
    • Verificado e aprovado
    • Pendente / vulnerabilidade aceita com justificativa:
  • Não

Este PR foi validado pelo pipeline de segurança (SonarQube / Trivy)?

  • Sim — link do job:
  • Não aplicável a este PR (justifique): mudança pontual de extração/formatação de texto, sem alteração de infraestrutura, dependências ou pipeline.

Este PR concatena, monta ou executa comandos SQL, HTML ou JavaScript a partir de entrada externa?

  • Sim — confirme que há sanitização/parametrização (prepared statements, escaping, etc.):
  • Não

Este PR expõe novos endpoints, telas ou serviços?

  • Sim — HTTPS obrigatório está garantido e o acesso segue o princípio de menor privilégio?
  • Não

Algum segredo, senha, chave ou token está sendo adicionado ao código-fonte?

  • Não, nenhum segredo foi commitado
  • Sim (bloquear merge e corrigir antes de prosseguir)

…to sem volume

extract_cite_as_part_one pegava a primeira <fn fn-type="other"> do
documento, sem checar o <label>. fn-type="other" e uma categoria
generica do JATS usada para qualquer tipo de nota (institucional,
declaracao de uso de IA, codigos JEL, politica de plagio, registro
ZooBank), entao o campo CITE AS do PDF - que deveria ser uma citacao
bibliografica - imprimia conteudo errado em 7 de 26 artigos do corpus
de teste, incluindo um caso (a29.xml) em que a nota correta existia no
mesmo fn-group mas nao era a primeira.

Passa a percorrer todas as <fn fn-type="other"> do documento e so usa
a que tiver label (ou, na ausencia dele, inicio do texto do <p>)
sinalizando citacao ("Como citar:", "CITE AS:", "How to cite this
article"); nada e retornado quando nenhuma nota corresponde. Tambem
troca part_one.text por extracao de texto completa (itertext), que
antes cortava a citacao no primeiro elemento filho (ex: um DOI dentro
de <ext-link> logo apos o texto).

Corrige tambem docx_cite_as_pipe: cite_as_part_two montava
"{volume}: {location}" sem checar se volume existia, deixando um ':'
solto quando o XML nao tem <volume> (ex: "Cadernos Pagu : e236720.").
Extrai _format_cite_as_part_two, que omite o segmento de volume e seu
separador nesse caso.

Issue: scieloorg#1349
@Rossi-Luciano Rossi-Luciano added the PDF generator Funcionalidade de geração de PDF label Sep 9, 2026

@pitangainnovare pitangainnovare left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A correção resolve a seleção da primeira fn-type="other", mas o resultado ainda não produz uma referência bibliográfica cientificamente correta.

Quando existe uma nota editorial de “Como citar”, ela já contém a referência completa e deve ser usada integralmente, sem acrescentar novamente periódico, volume e localização. No estado atual, casos como a8 e a29 ficam duplicados ou concatenados sem espaço; em a3, o resultado começa com CITE AS: Como citar:.

Quando a nota não existe, como em a7 e a28, os PDFs originais mostram que o comportamento esperado não é deixar o campo vazio nem gerar apenas Periódico volume: localização. Deve ser construída uma referência completa a partir dos metadados — autores, ano, título, periódico, volume/número, páginas ou e-location e DOI — segundo um formato explicitamente definido.

Também considero frágil identificar a nota apenas por 'cit' in signal.lower(), pois isso admite falsos positivos e pode ignorar uma citação cujo label seja genérico, mas cujo p comece com “Como citar”.

Solicito ajustar o PR e a issue #1349 para definir e testar estes dois caminhos:

  1. nota editorial explícita: utilizar a citação completa uma única vez;
  2. ausência da nota: gerar uma referência bibliográfica completa e determinística a partir dos metadados.

Os testes devem validar o texto final do DOCX, incluindo pelo menos a3, a7, a8, a28 e a29, e não apenas extrator e renderer isoladamente.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

PDF generator Funcionalidade de geração de PDF

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants