Skip to content

Adiciona validação de recomendação MathML para acessibilidade em fórmulas#1081

Draft
Copilot wants to merge 4 commits intomasterfrom
copilot/add-validations-for-formulas
Draft

Adiciona validação de recomendação MathML para acessibilidade em fórmulas#1081
Copilot wants to merge 4 commits intomasterfrom
copilot/add-validations-for-formulas

Conversation

Copy link
Contributor

Copilot AI commented Feb 12, 2026

O que esse PR faz?

Implementa validate_mathml_recommendation para <disp-formula> e <inline-formula>, completando a conformidade com SPS 1.10. Das 6 regras listadas no issue, 5 já estavam implementadas. Este PR adiciona a última: emitir WARNING quando fórmulas contêm apenas <tex-math> sem <mml:math>, recomendando MathML para acessibilidade com leitores de tela.

Comportamento:

  • Retorna None se não há codificação (evita duplicar erros)
  • Retorna None se mml:math existe (válido)
  • Retorna WARNING se apenas tex-math existe
# Exemplo de XML que gera WARNING
<disp-formula id="e1">
    <label>(1)</label>
    <tex-math>\[ E = mc^2 \]</tex-math>
</disp-formula>

# Válido - não gera WARNING
<disp-formula id="e1">
    <label>(1)</label>
    <mml:math id="m1">...</mml:math>
</disp-formula>

Onde a revisão poderia começar?

packtools/sps/validation/formula.py linhas 295-333 e 658-696 (método validate_mathml_recommendation em ambas as classes de validação).

Como este poderia ser testado manualmente?

python -m unittest tests.sps.validation.test_formula.ArticleFormulaValidationTest -v

Todos os 21 testes devem passar (15 existentes + 6 novos).

Algum cenário de contexto que queira dar?

A duplicação de código entre DispFormulaValidation e InlineFormulaValidation é intencional e segue o padrão existente do codebase onde ambas as classes duplicam implementações de todos os métodos de validação.

Quais são tickets relevantes?

Issue sobre complementação das validações de elementos de fórmula.

Referências

Original prompt

This section details on the original issue you should resolve

<issue_title>Complementar as validações para os elementos e </issue_title>
<issue_description>## Objetivo

Implementar validações faltantes para <disp-formula> e <inline-formula> conforme SPS 1.10, elevando a conformidade de 50% para 100% (6 de 12 regras implementadas atualmente).


Conformidade atual

Regra Elemento Nivel Status
validate_id disp-formula CRITICAL Implementada
validate_label disp-formula WARNING Implementada
validate_codification disp-formula CRITICAL Implementada
validate_alternatives disp-formula CRITICAL Implementada
validate_codification inline-formula CRITICAL Implementada
validate_alternatives inline-formula CRITICAL Implementada
validate_id inline-formula CRITICAL Ausente
validate_mml_math_id ambos ERROR Ausente
validate_id_prefix ambos WARNING Ausente
validate_mml_math_id_prefix ambos WARNING Ausente
validate_mathml_recommendation ambos WARNING Ausente
posicionamento apos primeira chamada disp-formula WARNING Fora do escopo

Regras a implementar

P0 - Criticas

Regra 7: validate_id em InlineFormulaValidation

InlineFormulaValidation.validate() nao chama validate_id. O metodo precisa ser adicionado seguindo o mesmo padrao ja implementado em DispFormulaValidation.validate_id(). O campo id ja esta disponivel em self.data.

Regra 8: validate_mml_math_id em ambas as classes

<mml:math> deve ter @id obrigatorio (SPS 1.10). O model Formula nao expoe esse atributo. E necessario:

  1. Adicionar a propriedade mml_math_id em packtools/sps/models/formula.py:
@property
def mml_math_id(self):
    namespace = "{http://www.w3.org/1998/Math/MathML}"
    el = self.element.find(f".//{namespace}math")
    return el.get("id") if el is not None else None
  1. Incluir "mml_math_id": self.mml_math_id no dict retornado por Formula.data.

  2. Implementar validate_mml_math_id() em DispFormulaValidation e InlineFormulaValidation, retornando None quando mml_math for None.


P1 - Importantes

Regra 9: validate_id_prefix

O @id de <disp-formula> e <inline-formula> deve iniciar com o prefixo "e". Validar com str.startswith("e"). Nivel: WARNING.

Regra 10: validate_mml_math_id_prefix

O @id de <mml:math> deve iniciar com o prefixo "m". Depende da regra 8. Retornar None quando mml_math_id for None. Nivel: WARNING.

Regra 11: validate_mathml_recommendation

Quando a formula contem tex_math e nao contem mml_math, emitir aviso recomendando MathML por acessibilidade. Retornar None quando nao houver nenhuma codificacao. Nivel: WARNING.


P2 - Fora do escopo

Regra Motivo
Posicionamento de <disp-formula> apos a primeira chamada no texto Requer rastreamento de <xref> por ordem de aparecimento e logica condicional para excluir <app-group> e <supplementary-material>. Alta complexidade, baixo volume de erros.

Arquivos

Acao Arquivo
Modificar packtools/sps/models/formula.py
Modificar packtools/sps/validation/formula.py
Modificar tests/sps/validation/test_formula.py
Criar/atualizar packtools/sps/validation/rules/formula_rules.json

Novos parametros de rules

Adicionar ao formula_rules.json e ao get_default_params de cada classe como fallback:

id_error_level                 -> "CRITICAL"  (inline-formula)
mml_math_id_error_level        -> "ERROR"      (ambos)
id_prefix_error_level          -> "WARNING"    (ambos)
mml_math_id_prefix_error_level -> "WARNING"    (ambos)
mathml_error_level             -> "WARNING"    (ambos)

Exemplos de XML

Valido - disp-formula completa:

<disp-formula id="e1">
  <label>(1)</label>
  <mml:math id="m1" display="block">
    <mml:mrow>
      <mml:mi>x</mml:mi><mml:mo>=</mml:mo><mml:mn>2</mml:mn>
    </mml:mrow>
  </mml:math>
</disp-formula>

Valido - inline-formula com id:

<inline-formula id="e3">
  <mml:math id="m3" display="inline">
    <mml:msup><mml:mi>x</mml:mi><mml:mn>2</mml:mn></mml:msup>
  </mml:math>
</inline-formula>

Invalido - inline-formula sem @id (regra 7, CRITICAL):

<inline-formula>
  <mml:math id="m3">
    <mml:msup><mml:mi>x</mml:mi><mml:mn>2</mml:mn></mml:msup>
  </mml:math>
</inline-formula>

Invalido - mml:math sem @id (regra 8, ERROR):

<disp-formula id="e1">
  <label>(1)</label>
  <mml:math display="block">
    <mml:mrow><mml:mi>x</mml:mi></mml:mrow>
  </mml:math>
</disp-formula>

Invalido - @id com prefixo incorreto (regras 9 e 10, WARNING):

<disp-formula id="eq1">
  <label>(1)</label>
  <mml:math id="math1">
    <mml:mrow><mml:mi>x</mml:mi></mml...

</details>



<!-- START COPILOT CODING AGENT SUFFIX -->

- Fixes scieloorg/packtools#1079

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for you](https://github.com/scieloorg/packtools/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 3 commits February 12, 2026 11:46
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copilot AI changed the title [WIP] Implement missing validations for disp-formula and inline-formula Adiciona validação de recomendação MathML para acessibilidade em fórmulas Feb 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants