Skip to content

Criar validações para o elemento <sec> #1109

@Rossi-Luciano

Description

@Rossi-Luciano

Objetivo

Implementar validações para o elemento <sec> conforme a especificação SPS 1.10, aumentando a conformidade de X% para 70% (7 de 10 regras).

Nota: Algumas validações para <sec> podem já estar parcialmente implementadas no repositório. Este Issue visa reavaliar, complementar e garantir cobertura completa das regras SPS 1.10.


Contexto

O elemento <sec> representa seções de texto do documento. Para acessibilidade, cada seção deve obrigatoriamente conter <title>. Seções de primeiro nível que correspondem a tipos específicos (métodos, resultados, etc.) devem ter o atributo @sec-type. Alguns tipos de documentos requerem obrigatoriamente seção de disponibilidade de dados (@sec-type="data-availability"). Validações corretas garantem acessibilidade, presença de elementos obrigatórios, e conformidade com requisitos de tipos de documentos.

Conformidade atual: X de 10 regras implementadas (X%)
Meta após implementação: 7 de 10 regras (70%)


Documentação SPS

Referência oficial: https://docs.google.com/document/d/1GTv4Inc2LS_AXY-ToHT3HmO66UT0VAHWJNOIqzBNSgA/edit?tab=t.0#heading=h.sec

Regras principais conforme SPS 1.10:

  1. Ocorrência:

    • <sec> pode aparecer zero ou mais vezes em: <abstract>, <app>, <back>, <bio>, <body>, <boxed-text>, <sec>, <trans-abstract>
  2. Elemento obrigatório (Acessibilidade):

    • <title> é mandatório em <sec> para criar títulos acessíveis
  3. Atributo @sec-type:

    • Obrigatório apenas para seções de primeiro nível que correspondem aos valores da lista
    • Caso haja seção de primeiro nível diferente, o atributo não deve ser inserido
  4. Valores permitidos para @sec-type:

    • cases - Relatos/casos/estudos de caso
    • conclusions - Conclusões/considerações finais/comentários
    • data-availability - Declaração de Disponibilidade de Dados
    • discussion - Discussões/interpretações
    • intro - Introdução/sinopse
    • materials - Materiais
    • methods - Metodologias/métodos/procedimentos
    • results - Resultados/descobertas
    • subjects - Participantes/Pacientes
    • supplementary-material - Material suplementar/material adicional
    • transcript - Transcrição de vídeo ou áudio
  5. Seções combinadas:

    • Quando título é composto por mais de um item, usar pipe | como separador
    • Exemplo: materials|methods
    • Exceção: supplementary-material, transcript e data-availability não podem ser combinados
  6. @sec-type="data-availability" obrigatório:

    • Mandatório para tipos de documentos: data-article, brief-report, case-report, rapid-communication, research-article, review-article
    • Deve também ter @specific-use
  7. @sec-type="transcript" exige @id:

    • Seções de transcrição devem ter atributo @id obrigatório
  8. Estrutura:

    • Título (<title>) seguido de um ou mais parágrafos (<p>)

Regras a Implementar

P0 – Críticas (implementar obrigatoriamente)

# Regra Nível Descrição
1 Validar presença de <title> CRITICAL O elemento <title> é mandatório em <sec> (requisito de acessibilidade)
2 Validar valores permitidos de @sec-type ERROR Quando presente, @sec-type deve ter valor da lista permitida
3 Validar presença de @id em transcript ERROR Seção com @sec-type="transcript" deve ter atributo @id
4 Validar presença de data-availability em documentos indexáveis ERROR Documentos indexáveis (research-article, case-report, etc.) devem ter seção @sec-type="data-availability"

P1 – Importantes (implementar se possível)

# Regra Nível Descrição
5 Validar formato de seções combinadas WARNING Seções combinadas devem usar pipe `
6 Validar que transcript, supplementary-material e data-availability não são combinados WARNING Tipos especiais não devem aparecer em seções combinadas (sem pipe)
7 Validar presença de conteúdo WARNING Seção deve conter pelo menos um parágrafo <p> após <title>

P2 – Futuras (fora do escopo deste Issue)

# Regra Motivo de exclusão
8 Validar que @sec-type só é usado em seções de primeiro nível Média complexidade - requer análise de hierarquia de elementos
9 Validar presença de @specific-use quando @sec-type="data-availability" Baixa prioridade - validação específica de data-availability
10 Validar ordem lógica de seções (intro, methods, results, discussion, conclusions) Baixa prioridade - ordem é recomendação, não regra rígida

Arquivos a Criar/Modificar

Avaliar existentes (podem ter validações parciais):

  • packtools/sps/models/sec.py ou similar – Verificar se modelo existe
  • packtools/sps/validation/sec.py – Verificar validações existentes
  • packtools/sps/validation/rules/sec_rules.json ou similar – Verificar configuração

Criar (se não existirem):

  • packtools/sps/models/sec.py – Modelo de extração de dados
  • packtools/sps/validation/sec.py – Validações
  • packtools/sps/validation/rules/sec_rules.json – Configuração de níveis de erro
  • tests/sps/validation/test_sec.py – Testes unitários

Referenciar (implementações similares):

  • packtools/sps/validation/article_and_subarticles.py – Validação condicional por article-type
  • packtools/sps/validation/utils.py – Funções auxiliares (build_response)

Exemplos de XML

XML Válido (deve passar sem erros):

<!-- Exemplo 1: Seção simples de métodos -->
<body>
    <sec sec-type="methods">
        <title>Métodos de Pesquisa</title>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent ornare magna a enim dapibus.</p>
    </sec>
</body>

<!-- Exemplo 2: Seção combinada (materiais e métodos) -->
<body>
    <sec sec-type="materials|methods">
        <title>Materials and Methods</title>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </sec>
</body>

<!-- Exemplo 3: Seção de material suplementar -->
<body>
    <sec sec-type="supplementary-material" id="sec1">
        <title>Supplementary Materials</title>
        <supplementary-material id="suppl1">
            <label>Supplementary material 1</label>
            <caption>
                <title>Video 1</title>
            </caption>
            <media mimetype="video" mime-subtype="mp4" xlink:href="video.mp4"/>
        </supplementary-material>
    </sec>
</body>

<!-- Exemplo 4: Seção de transcrição com @id -->
<body>
    <sec sec-type="transcript" id="TR1">
        <title>Interview with Gabriel and Denise</title>
        <p>Nam convallis dolor sed ligula mollis vulputate.</p>
        <speech>
            <speaker>Gabriel</speaker>
            <p>Etiam ac arcu at nunc lacinia fermentum.</p>
        </speech>
        <speech>
            <speaker>Denise</speaker>
            <p>Pellentesque at bibendum nibh.</p>
        </speech>
    </sec>
</body>

<!-- Exemplo 5: Seção de disponibilidade de dados -->
<body>
    <sec sec-type="data-availability" id="sec-data" specific-use="data-available-on-request">
        <title>Data Availability Statement</title>
        <p>The data that support the findings of this study are available on request from the corresponding author.</p>
    </sec>
</body>

<!-- Exemplo 6: Seção com subseção -->
<body>
    <sec sec-type="methods">
        <title>Methodology</title>
        <sec>
            <title>Methodology in Science</title>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
        </sec>
    </sec>
</body>

<!-- Exemplo 7: Seção sem @sec-type (título livre) -->
<body>
    <sec>
        <title>Biologia Marinha</title>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </sec>
</body>

<!-- Exemplo 8: Todas as seções principais de um artigo -->
<article article-type="research-article">
    <front>
        <!-- metadados -->
    </front>
    <body>
        <sec sec-type="intro">
            <title>Introduction</title>
            <p>Introduction content.</p>
        </sec>
        <sec sec-type="materials|methods">
            <title>Materials and Methods</title>
            <p>Methods content.</p>
        </sec>
        <sec sec-type="results">
            <title>Results</title>
            <p>Results content.</p>
        </sec>
        <sec sec-type="discussion">
            <title>Discussion</title>
            <p>Discussion content.</p>
        </sec>
        <sec sec-type="conclusions">
            <title>Conclusions</title>
            <p>Conclusions content.</p>
        </sec>
        <sec sec-type="data-availability" specific-use="data-available-on-request">
            <title>Data Availability</title>
            <p>Data available on request.</p>
        </sec>
    </body>
</article>

<!-- Exemplo 9: Seção de casos -->
<body>
    <sec sec-type="cases">
        <title>Case Studies</title>
        <p>Case description.</p>
    </sec>
</body>

<!-- Exemplo 10: Seção de participantes -->
<body>
    <sec sec-type="subjects">
        <title>Participants</title>
        <p>Participant information.</p>
    </sec>
</body>

XML Inválido – Caso 1: Sem <title> (CRITICAL)

<body>
    <sec sec-type="methods">
        <p>Lorem ipsum dolor sit amet.</p>
    </sec>
</body>

Erro esperado: Elemento <title> é mandatório em <sec> (requisito de acessibilidade)

XML Inválido – Caso 2: <title> vazio (CRITICAL)

<body>
    <sec sec-type="methods">
        <title></title>
        <p>Lorem ipsum dolor sit amet.</p>
    </sec>
</body>

Erro esperado: Elemento <title> não pode estar vazio

XML Inválido – Caso 3: <title> apenas espaços (CRITICAL)

<body>
    <sec sec-type="methods">
        <title>   </title>
        <p>Lorem ipsum dolor sit amet.</p>
    </sec>
</body>

Erro esperado: Elemento <title> não pode conter apenas espaços

XML Inválido – Caso 4: @sec-type com valor inválido (ERROR)

<body>
    <sec sec-type="methodology">
        <title>Methodology</title>
        <p>Lorem ipsum dolor sit amet.</p>
    </sec>
</body>

Erro esperado: Valor "methodology" não está na lista de valores permitidos para @sec-type. Use methods para metodologias.

XML Inválido – Caso 5: @sec-type="transcript" sem @id (ERROR)

<body>
    <sec sec-type="transcript">
        <title>Interview</title>
        <p>Interview content.</p>
    </sec>
</body>

Erro esperado: Seção com @sec-type="transcript" deve ter atributo @id

XML Inválido – Caso 6: research-article sem data-availability (ERROR)

<article article-type="research-article">
    <front>
        <!-- metadados -->
    </front>
    <body>
        <sec sec-type="intro">
            <title>Introduction</title>
            <p>Content.</p>
        </sec>
        <sec sec-type="methods">
            <title>Methods</title>
            <p>Content.</p>
        </sec>
        <!-- falta sec sec-type="data-availability" -->
    </body>
</article>

Erro esperado: Artigo com @article-type="research-article" deve conter seção @sec-type="data-availability" (Critério SciELO Brasil)

XML Inválido – Caso 7: Seção combinada com formato incorreto (WARNING)

<body>
    <sec sec-type="materials methods">
        <title>Materials and Methods</title>
        <p>Content.</p>
    </sec>
</body>

Erro esperado: (WARNING) Seções combinadas devem usar pipe | como separador. Use materials|methods ao invés de materials methods

XML Inválido – Caso 8: transcript combinado (WARNING)

<body>
    <sec sec-type="transcript|discussion" id="TR1">
        <title>Interview Discussion</title>
        <p>Content.</p>
    </sec>
</body>

Erro esperado: (WARNING) @sec-type="transcript" não deve ser combinado com outros tipos (sem pipe)

XML Inválido – Caso 9: data-availability combinado (WARNING)

<body>
    <sec sec-type="data-availability|supplementary-material">
        <title>Data and Materials</title>
        <p>Content.</p>
    </sec>
</body>

Erro esperado: (WARNING) @sec-type="data-availability" não deve ser combinado com outros tipos (sem pipe)

XML Inválido – Caso 10: Seção vazia (sem conteúdo) (WARNING)

<body>
    <sec sec-type="methods">
        <title>Methods</title>
    </sec>
</body>

Erro esperado: (WARNING) Seção deve conter pelo menos um parágrafo <p> ou outro conteúdo após <title>

XML Inválido – Caso 11: @sec-type vazio (ERROR)

<body>
    <sec sec-type="">
        <title>Title</title>
        <p>Content.</p>
    </sec>
</body>

Erro esperado: Atributo @sec-type não pode estar vazio

XML Inválido – Caso 12: @sec-type com uppercase (ERROR)

<body>
    <sec sec-type="Methods">
        <title>Methods</title>
        <p>Content.</p>
    </sec>
</body>

Erro esperado: Valor de @sec-type deve estar em minúsculas. Use methods ao invés de Methods

XML Inválido – Caso 13: case-report sem data-availability (ERROR)

<article article-type="case-report">
    <front>
        <!-- metadados -->
    </front>
    <body>
        <sec sec-type="intro">
            <title>Introduction</title>
            <p>Content.</p>
        </sec>
        <!-- falta data-availability -->
    </body>
</article>

Erro esperado: Artigo com @article-type="case-report" deve conter seção @sec-type="data-availability"

XML Inválido – Caso 14: Combinação com três tipos (WARNING)

<body>
    <sec sec-type="materials|methods|results">
        <title>Materials, Methods and Results</title>
        <p>Content.</p>
    </sec>
</body>

Erro esperado: (WARNING) Seções combinadas normalmente usam apenas dois tipos. Verifique se materials|methods|results é apropriado.

XML Inválido – Caso 15: @id vazio em transcript (ERROR)

<body>
    <sec sec-type="transcript" id="">
        <title>Interview</title>
        <p>Content.</p>
    </sec>
</body>

Erro esperado: Atributo @id não pode estar vazio em seção @sec-type="transcript"


Padrão de Implementação

Diretrizes Gerais:

  1. Seguir padrões existentes no repositório:

    • Consultar implementações similares como article_and_subarticles.py (validação condicional)
    • Usar estrutura de classes já estabelecida no packtools
    • IMPORTANTE: Verificar se já existem validações parciais para <sec> e integrá-las ou complementá-las
  2. Internacionalização (i18n):

    • OBRIGATÓRIO: Todas as mensagens devem suportar internacionalização
    • Usar advice_text e advice_params em build_response()
    • Consultar conversas anteriores sobre implementação de i18n no packtools
    • Referência: validações em article_contribs.py que já implementam i18n completo
  3. Validações condicionais:

    • Validações que dependem de contexto devem retornar None quando não aplicável
    • Exemplo: validação de data-availability só se aplica para tipos específicos de artigos
    • Exemplo: validação de @id só se aplica quando @sec-type="transcript"
    • Usar filter_results() nos testes para remover None
  4. Uso de build_response():

    • Sempre usar parent=self.data (dict completo, nunca string)
    • Campo response deve conter: "OK", "WARNING", "ERROR", "CRITICAL"
    • Sempre fornecer advice_text e advice_params para i18n
  5. Modelo de dados:

    • Criar propriedade que retorna lista de dicionários (um para cada <sec>)
    • Cada dict deve conter: sec_type, has_title, title_text, id, has_content, level, parent, parent_id, parent_lang
  6. Lista de valores permitidos:

    • Criar constante: SEC_TYPES = ["cases", "conclusions", "data-availability", "discussion", "intro", "materials", "methods", "results", "subjects", "supplementary-material", "transcript"]
    • Tipos que não podem ser combinados: ["transcript", "supplementary-material", "data-availability"]
  7. Detecção de article-type:

    • Tipos que requerem data-availability: ["data-article", "brief-report", "case-report", "rapid-communication", "research-article", "review-article"]
    • Usar XPath ou navegação DOM para acessar elemento raiz <article>
  8. Validação de seções combinadas:

    • Detectar presença de pipe | no valor de @sec-type
    • Validar que cada parte da combinação é um valor válido
    • Alertar se tipos especiais aparecem combinados
  9. Detecção de nível de seção:

    • Seção de primeiro nível: <body>/<sec>, <back>/<sec>, etc.
    • Subseção: <sec>/<sec>
    • Validação de @sec-type normalmente só se aplica a primeiro nível
  10. Validação de conteúdo:

    • Verificar presença de pelo menos um elemento após <title>
    • Elementos aceitos: <p>, <sec>, <supplementary-material>, etc.

Testes Esperados

Casos de teste obrigatórios:

Presença de <title>:

  • <sec> com <title> (OK)
  • <sec> sem <title> (CRITICAL)
  • <title> vazio (CRITICAL)
  • <title> apenas espaços (CRITICAL)
  • <title> com conteúdo válido (OK)

Valores de @sec-type:

  • Sem @sec-type (OK - opcional)
  • Todos os valores permitidos (OK para cada um)
  • cases (OK)
  • conclusions (OK)
  • data-availability (OK)
  • discussion (OK)
  • intro (OK)
  • materials (OK)
  • methods (OK)
  • results (OK)
  • subjects (OK)
  • supplementary-material (OK)
  • transcript (OK)
  • Valor inválido "methodology" (ERROR)
  • Valor inválido "introduction" (ERROR - use intro)
  • Valor inválido "conclusion" (ERROR - use conclusions)
  • Uppercase "Methods" (ERROR)

Seções combinadas:

  • materials|methods (OK)
  • results|discussion (OK)
  • materials|methods|results (WARNING - três tipos)
  • materials methods (WARNING - falta pipe)
  • materials-methods (ERROR - usar pipe não hífen)

Tipos não combináveis:

  • transcript sozinho (OK)
  • transcript|discussion (WARNING - não combinar)
  • data-availability sozinho (OK)
  • data-availability|methods (WARNING - não combinar)
  • supplementary-material sozinho (OK)
  • supplementary-material|results (WARNING - não combinar)

Atributo @id em transcript:

  • transcript com @id (OK)
  • transcript sem @id (ERROR)
  • transcript com @id vazio (ERROR)
  • Outros tipos sem @id (OK - opcional)

data-availability obrigatório:

  • research-article com data-availability (OK)
  • research-article sem data-availability (ERROR)
  • case-report com data-availability (OK)
  • case-report sem data-availability (ERROR)
  • brief-report sem data-availability (ERROR)
  • rapid-communication sem data-availability (ERROR)
  • data-article sem data-availability (ERROR)
  • review-article sem data-availability (ERROR)
  • editorial sem data-availability (OK - não requerido)
  • letter sem data-availability (OK - não requerido)

Presença de conteúdo:

  • <sec> com <title> e <p> (OK)
  • <sec> com <title> e subseção (OK)
  • <sec> com <title> e <supplementary-material> (OK)
  • <sec> apenas com <title> (WARNING - sem conteúdo)

Hierarquia:

  • Seção de primeiro nível (OK)
  • Subseção (OK)
  • Seção aninhada em três níveis (OK)

Casos de borda:

  • <sec> vazio completo (CRITICAL - falta title)
  • Múltiplas seções (OK)
  • @sec-type vazio (ERROR)
  • @sec-type apenas espaços (ERROR)
  • Seção em diferentes contextos (body, back, abstract) (OK)

Total esperado: ~60 testes unitários

Estrutura de testes:

  • Usar filter_results() para remover None dos resultados
  • Asserções devem usar campo response (não is_valid)
  • Testes devem ser autocontidos e descritivos
  • Agrupar testes por categoria (title, sec-type, combinadas, data-availability, conteúdo)

Critérios de Aceite

O PR será aceito quando:

  • Verificação de validações existentes: Código existente para <sec> foi analisado e integrado ou substituído adequadamente
  • Todas as regras P0 implementadas (4 validações CRITICAL/ERROR)
  • Todas as regras P1 implementadas (3 validações WARNING)
  • Testes unitários passando com cobertura mínima de ~60 casos
  • Nenhum teste existente quebrado
  • Arquivo sec_rules.json criado com todos os níveis de erro
  • Internacionalização completa em todas as mensagens (i18n obrigatório)
  • Código seguindo padrões do packtools (build_response, filter_results, validações condicionais)
  • Modelo de dados criado com extração adequada de todas as seções
  • Validação condicional de data-availability por article-type funcionando
  • Validação de valores permitidos de @sec-type funcionando
  • Validação de @id obrigatório em transcript funcionando
  • Validação de seções combinadas funcionando
  • Validação de tipos não combináveis funcionando
  • Documentação inline clara (docstrings)

Referências

Documentação SPS:

Padrões JATS:

Acessibilidade:

Referências internas packtools:

  • Internacionalização: Consultar conversas anteriores sobre implementação de i18n
  • Implementações similares: article_and_subarticles.py (validação condicional por article-type)
  • Funções auxiliares: utils.py (build_response)

Labels Sugeridas

enhancement validation SPS-1.10 accessibility scielo-brasil


Impacto Esperado

Antes:

  • Conformidade SPS 1.10 para <sec>: X% (verificar validações existentes)
  • <title> pode estar ausente (problema de acessibilidade)
  • Valores incorretos de @sec-type podem passar
  • Seção data-availability pode estar ausente em documentos que a requerem
  • @id pode estar ausente em transcrições
  • Seções combinadas podem ter formato incorreto
  • Tipos especiais podem ser combinados inadequadamente

Depois:

  • Conformidade SPS 1.10 para <sec>: 70% (7 de 10 regras)
  • Validação CRITICAL de <title> obrigatório (acessibilidade)
  • Validação ERROR de valores permitidos de @sec-type
  • Validação ERROR de presença de data-availability em documentos indexáveis
  • Validação ERROR de @id obrigatório em transcrições
  • Validação WARNING de formato de seções combinadas
  • Validação WARNING de tipos não combináveis
  • ~60 testes unitários garantindo qualidade
  • Internacionalização completa (PT/EN/ES)

Benefícios:

  • Garante acessibilidade com títulos obrigatórios em seções
  • Melhora conformidade com Critérios SciELO Brasil (data-availability)
  • Detecta valores incorretos de @sec-type antes da publicação
  • Assegura identificação adequada de transcrições (com @id)
  • Promove estruturação correta de seções combinadas
  • Facilita navegação e compreensão do documento
  • Melhora experiência para usuários com tecnologias assistivas
  • Garante presença de declaração de disponibilidade de dados
  • Facilita processamento automatizado de seções
  • Facilita manutenção e depuração de XMLs

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions