Skip to content

Complementar as validações para os elementos <disp-formula> e <inline-formula> #1079

@Rossi-Luciano

Description

@Rossi-Luciano

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:mrow>
  </mml:math>
</disp-formula>

Invalido - tex-math sem mml:math (regra 11, WARNING):

<disp-formula id="e10">
  <label>(1)</label>
  <tex-math id="tx1">\[ E = mc^2 \]</tex-math>
</disp-formula>

Testes esperados

Adicionar em tests/sps/validation/test_formula.py. Os testes existentes servem de referencia de estrutura e estilo.

Cobertura minima por nova regra: 1 caso valido com response == "OK" e 1 caso invalido com response == nivel_esperado.

Casos de borda obrigatorios:

  • validate_mml_math_id retorna None quando formula nao tem mml:math
  • validate_mml_math_id_prefix retorna None quando mml_math_id e None
  • validate_mathml_recommendation retorna None quando nao ha nenhuma codificacao

Criterios de aceite

  • Regras P0 implementadas e testadas
  • Regras P1 implementadas e testadas
  • Formula.data inclui mml_math_id
  • formula_rules.json atualizado com os novos parametros
  • Todos os testes passando: python -m unittest tests.sps.validation.test_formula -v
  • Nenhum teste existente quebrado
  • Internacionalizacao aplicada em todas as mensagens novas

Referencias


Labels: enhancement validation SPS-1.10 accessibility

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