MokaByte 89 - 8bre 2004 
Mathador
La notazione matematica in Java
di
Valentino Santucci

Uno dei problemi decennali del web è senz'altro la mancanza di un modo semplice per inserire notazioni matematiche nei nostri siti internet. Un problema da non sottovalutare in ambito scientifico ed educativo. L'HTML, pur essendo stato pensato dagli scienziati per gli scienziati, non permette questo. Per risolvere tale problema è stato introdotto il MathML. Tuttavia, essendo il MathML, un formato ancora giovane, non esistono ancora tutti quei strumenti software quali editor e viewer che si rendono indispensabili in questo nuovo scenario.


Il MathML
Introduciamo innanzitutto il MathML [1], ovvero il formato di default che Mathador utilizza per esportare le notazioni matematiche editate.
MathML, sta per Mathematical Markup Language, è stato rilasciato dal W3C [2], ovvero l'organismo che emana standard a livello mondiale per quel che riguarda il web ed ha come obiettivo far si che i testi matematici possano essere trasmessi, ricevuti ed elaborati sul web, come l'HTML ha reso possibile questa funzionalità per i testi.
Il MathML è un linguaggio derivato dall'XML ed offre due tipi di marcatura:

  • La marcatura di presentazione, che ricalca la struttura bidimensionale orientata visivamente della notazione matematica.
  • La marcatura di contenuto, che ha come intenzione la codifica esplicita della struttura matematica sottostante di un'espressione.

Tuttavia, la marcatura di presentazione (grazie alla sua semplicità) è quella maggiormente diffusa ed a questa ci riferiremo nel proseguo quando si parlerà di MathML.


Figura 1
- Esempio di codifica MathML

Mathador
Mathador è un'API open source per lo sviluppo di software focalizzato sulla notazione matematica. Inoltre, insieme a tale API, è fornito un editor WYSIWYG ed un viewer di notazioni matematiche; l'editor WYSIWYG è un'applet java costruita con l'obiettivo principale di fornire un tool di authoring matematico per un generico sistema di e-learning, ma che, tuttavia, può essere utilizzato in vari altri modi.
L'editor, inoltre, consente di salvare la notazione in MathML o come una classica immagine PNG o JPEG.


Figura 2
- Screen Shoot di Mathador in azione

 

Architettura del sistema
Mathador è stato implementato seguendo il pattern Model View Controller. Ciò si è reso necessario perché tale pattern rappresenta la tecnica di riferimento per la costruzione di software focalizzati sull'interfaccia grafica (e non solo).
Senza soffermarci più di tanto su tale pattern (già ampiamente illustrato in Mokabyte) passiamo direttamente al modello utilizzato per la rappresentazione interna di una generica espressione matematica (questa non è nient'altro che la parte model del pattern MVC).


Figura 3
- Il Box Model

Come si vede dalla figura 3, una notazione può essere vista come un insieme di box (scatole) opportunamente annidate e contenenti segni grafici disposti secondo dei ben definiti schemi di disposizione. Inoltre, sempre dalla figura 3, si può facilmente vedere come tale struttura a box sia facilmente rappresentabile con una struttura dati ad albero; infatti ogni box ha un solo padre, ma può avere varie box figlie. Questo modello è stato definito Box Model.
Tutto ciò è facilmente codificabile in java. Si è scelto di creare una classe astratta che rappresenti una generica box (BBox) dalla quale deriveranno tutte le varie classi che rappresenteranno altri schemi di disposizione (FractionBBox, SqrtBBox, …).
I metodi principali della classe BBox (e quindi di tutte le altre box) sono i seguenti:

//Aggiunge una box figlia
void addChildren(BBox box)

//Rimuove una box figlia
void removeChildren(BBox box)

//Restituisce una box figlia
BBox getChildrenAt(int pos)

//Setta la box padre
void setParent(BBox box)

//Restituisce la box padre
BBox getParent()

Oltre ai metodi per la gestione della gerarchia della struttura ad albero, esistono anche metodi per settare le varie proprietà (color, bgcolor, fontFamily, scriptLevel, …) di cui gode una box. Tali proprietà, in genere, sono ereditabili, ovvero se viene settata una proprietà P, con un certo valore V, di una box B che appartiene ad un certo livello della struttura ad albero, allora anche le box discendenti da B (figlie, nipoti, …) dovranno settare la proprietà P al valore V. Ora vediamo un esempio di metodo setter che illustra come questo comportamento sia stato implementato nel codice di Mathador:

public void setFontFamily(String fontFamily) {
  String old = this.fontFamily;
  this.fontFamily = fontFamily;
  //notifica l'evento a tutti gli osservatori
  fireEvent( new BBoxEvent( FONTFAMILY_CHANGED, this, old, fontFamily ) );
  for (int i=0; i<getChildrensSize(); i++)
    getChildrenAt(i).setFontFamily(fontFamily);
}

Come si può vedere, il metodo setFontFamily (come tutti gli altri metodi setter di proprietà) oltre a permettere l'ereditarietà delle proprietà svolge anche un'attività di notifica dell'avvenuto cambiamento del valore della proprietà a tutti gli osservatori registrati presso tale oggetto (tale funzione è svolta internamente al metodo fireEvent richiamato in setFontFamily).
Proprio l'utilizzo di eventi, osservatori e oggetti osservabili (ovvero il pattern Observer Observable che non mi dilungherò a descrivere data la sua ampia documentazione rintracciabile per il web) ha permesso di collegare il Box Model alla parte view del pattern MVC, permettendo di avere sul video un'istantanea della struttura interna sempre aggiornata.
La parte view è stata realizzata usando vari componenti Swing e, tramite, un accurata gestione degli eventi generati dall'utente su questi (parte controller) è stato possibile implementare l'editing delle varie notazioni.

 

Parser e Serializer
Ovviamente il software oltre ad editare espressioni matematiche permette anche di salvarle su file e di riaprirle successivamente. Come già ampiamente introdotto la codifica usata per tali file è il MathML; comunque, si è cercato di realizzare un framework, indipendente dal formato, nel quale si possano creare strumenti per manipolare altre codifiche a piacere.
Il parser è il componente software che si occupa di trasformare una notazione (in MathML ad esempio) nella rappresentazione interna a box. Per rendere tale procedura indipendente dal formato di codifica si è scelto di fornire un'interfaccia Java che descrive le proprietà ed i metodi che un oggetto di tipo parser deve avere, cosicché ogni parser dovrà implementare tale interfaccia. Nel software è stato implementato soltanto il parser MathML, ma nessuno vieta di implementare un nuovo parser per altri tipi di formati.
Il metodo principale del parser è:

BBox parse(InputSource source)

Tale metodo, dato un sorgente, restituisce la radice dell'albero di BBox che rappresenta l'espressione matematica.
Il componente serializer, invece, effettua l'operazione inversa del parser, ovvero, data la radice dell'albero di box esso ne restituisce una stringa rappresentante la codifica in un particolare formato. Anche per il serializer si è adottato lo stesso schema di implementazione del parser, si è fornita un'interfaccia generale ed una sua implementazione per il MathML.
Il metodo principale di un serializer è:

String serialize(BBox formula)

Un serializer è stato implementato anche per la trasformazione della formula in immagine PNG o JPEG sfruttando l'API ImageIO di Java.
Non verrà qui discussa l'implementazione per il MathML di questi due componenti poiché è stata del tutto ripensata nella nuova versione di Mathador che sto scrivendo. Tuttavia è importante notare che possono essere scritti altri parser e/o serializer per nuovi formati (ad esempio il TeX [3]) senza intaccare o ricompilare il codice già esistente.

 

Integrabilità
La modularità utilizzata nello sviluppo e l'uso di Java come piattaforma hanno portanto un grosso riscontro in termini di integrabilità. Infatti Mahador è stato integrato con successo all'interno di Moodle [4], ovvero all'interno di uno dei più diffusi sistemi di e-learning open source.
Ciò è stato possibile grazie all'applet editor ed all'applet viewer che tramite tecnologia Live Connect [5] (ovvero grazie all'uso di semplice JavaScript) comunicavano con le pagine HTML e PHP di Moodle.
Ciò ha permesso di integrare Mathador all'interno del tool di editing online (un semplice editor HTML realizzato in JavaScript e DHTML) di Moodle ed ottenere un risultato molto simile alla più famosa accoppiata MS Word + Equation Editor [6].


Figura 4
- Integrazione con l'editor HTML di Moodle

 

Conclusioni
L'API ed il software in questione cercano di colmare la lacuna della mancanza di strumenti di authoring online per le notazioni matematiche; strumenti particolarmente appetibili per i vari sistemi di e-learning che utilizzano ancora obsoleti filtri TeX.
Il software è attualmente in fase di rivisitazione. In particolare il nuovo obiettivo principale è riscrivere la parte view in AWT, in modo da permettere l'utilizzo di Mathador anche da chi usa una vecchia virtual machine (come ad esempio quella della Microsoft).
Ulteriori informazioni su Mathador (compresi i sorgenti) sono disponibili al link http://www.dipmat.unipg.it/~milani/mathador.
Tutti coloro che fossero interessati allo sviluppo di Mathador 2 possono scrivermi un'email all'indirizzo valentinos81@virgilio.it.

 

Bibliografia
[1] Home Page del MathML, www.w3c.org/Math
[2] Home Page del W3C, www.w3c.org
[3] Introduzione al TeX, www.guit.sssup.it
[4] Home Page di Moodle, www.moodle.org
[5] Home Page della tecnologia Live Connect, www.mozilla.org/js/liveconnect/
[6] Home Page della Design Science (società che produce Equation Editor), www.dessci.com

Valentino Santucci è studente del corso di laurea specialistica in informatica all'Università degli Studi di Perugia.
Home Page: http://spazioinwind.libero.it/valentino_santucci
Email: valentinos81@virgilio.it


MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it