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
|