-
Notifications
You must be signed in to change notification settings - Fork 24
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:
- Adicionar a propriedade
mml_math_idempacktools/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-
Incluir
"mml_math_id": self.mml_math_idno dict retornado porFormula.data. -
Implementar
validate_mml_math_id()emDispFormulaValidationeInlineFormulaValidation, retornandoNonequandomml_mathforNone.
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_idretornaNonequando formula nao temmml:mathvalidate_mml_math_id_prefixretornaNonequandomml_math_ideNonevalidate_mathml_recommendationretornaNonequando nao ha nenhuma codificacao
Criterios de aceite
- Regras P0 implementadas e testadas
- Regras P1 implementadas e testadas
-
Formula.dataincluimml_math_id -
formula_rules.jsonatualizado 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
- SPS 1.10 - disp-formula
- SPS 1.10 - inline-formula
- MathML 3.0 - W3C
- JATS - disp-formula
- JATS - inline-formula
Labels: enhancement validation SPS-1.10 accessibility