Il problema dell`overlapping nel change tracking dei

Transcript

Il problema dell`overlapping nel change tracking dei
Il problema dell'overlapping nel change tracking
dei documenti di testo in Open Document
Format e Oce Open XML
Alessio Rolni
10 marzo 2010
Sommario
Il problema dell'overlapping si può presentare quando, ad uno stesso
documento, vengono associate più gerarchie distinte.
Ad esempio, nel-
la gestione del change tracking di editor di documenti: qualsiasi editor
prevede la possibilità di identicare ogni modica eettuata da ogni singolo autore, ed eettuare operazioni su di essa (ad esempio validarla,
rigettarla, etc..).
Ad un singolo contenuto (il documento), viene quindi
aggiunta una nuova gerarchia (le informazioni di change tracking), che si
sovrappone all'esistente e si interseca con essa.
L'overlapping nei formati documentali è un problema noto, e nel passato è sempre stato gestito con tecniche ad hoc, facenti leva sul particolare
formato dei dati di ogni singola applicazione.
Nel caso in cui i dati siano rappresentati in XML il problema assume
proporzioni importanti.
La gestione delle gerarchie multiple non è una
caratteristica prevista dall'XML, che necessita di un'organizzazione dei
dati strutturata ad albero. E stiamo assistendo in questi anni all'introduzione di formati XML in una moltitudine di ambiti applicativi che prima facevano uso di formati ad hoc.
Questo perchè l'XML è facilmente
gestibile ed elaborabile con una moltitudine di strumenti, ed uno stesso
documento può essere fruito in diversi ambiti (ad esempio redatto con un
word processor, pubblicato su un sito web e letto online da un browser su
un palmare).
L'introduzione di gerarchie in overlap all'interno di un le XML può
generare diversi problemi (ad esempio l'XML può non essere più ben
formato) e sono state studiate diverse tecniche per risolverli.
Questo documento si propone di denire cos'è l'overlapping, di elencare
le diverse tecniche conosciute per gestire l'overlapping in documenti XML,
focalizzandosi sull'ambito del change tracking. Verranno introdotti brevemente i formati di dati Open Document Format (Openoce.org) e Oce
Open XML (Microsoft Oce 2007) con particolare enfasi sui meccanismi
del change tracking.
Verranno presentati degli esempi di overlapping in formato OpenOfce.org e Microsoft Oce 2007.
1
Indice
1 Introduzione
4
2 Tecniche per la gestione dell'overlapping
5
2.1
Gerarchie sacre e profane
2.2
Linee Guida TEI . . . . . . . . . . . . . . . . . . . . . . . .
6
2.3
Gli approcci al problema . . . . . . . . . . . . . . . . . . . .
6
2.3.1
Milestones . . . . . . . . . . . . . . . . . . . . . . . .
6
2.3.2
Flattened
8
2.3.3
Fragmentation
2.3.4
Twin documents
2.3.5
2.4
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
5
. . . . . . . . . . . . . . . . . . . . .
9
. . . . . . . . . . . . . . . . . . . .
11
Stand-o markup . . . . . . . . . . . . . . . . . . . .
13
Vantaggi e svantaggi di ogni approccio . . . . . . . . . . . .
15
3 Il change tracking e l'overlapping - considerazioni generali 18
4 Il formato dati del change tracking in ODF (Open Document Format)
20
4.1
Cenni sulla struttura dei documenti Open Document Format 20
4.2
La lista delle modiche . . . . . . . . . . . . . . . . . . . . .
23
4.3
Tipologie di modiche
. . . . . . . . . . . . . . . . . . . . .
23
. . . . . . . . . . . . . . . . . . . . . . .
24
4.4
4.3.1
Inserimenti
4.3.2
Cancellazioni
4.3.3
Cambiamenti di formato . . . . . . . . . . . . . . . .
26
Le metainformazioni del change tracking . . . . . . . . . . .
26
. . . . . . . . . . . . . . . . . . . . . .
25
5 Il formato dati del change tracking in OOXML (Oce
Open XML - Microsoft)
28
5.1
Cenni sulla struttura dei documenti OOXML
5.2
Le annotazioni
5.3
. . . . . . . .
28
. . . . . . . . . . . . . . . . . . . . . . . . .
29
5.2.1
Annotazioni Inline
5.2.2
Annotazioni Cross Structure
. . . . . . . . . . . . . . . . . . .
5.2.3
Annotazioni di proprietà . . . . . . . . . . . . . . . .
31
il supporto al change tracking e le tipologie di modica . . .
32
. . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
30
30
5.3.1
Inserimento di un run
5.3.2
Cancellazione di un run
. . . . . . . . . . . . . . . .
33
5.3.3
Spostamento di un run . . . . . . . . . . . . . . . . .
34
5.3.4
Modica di attributi/proprietà di un run (run properties) . . . . . . . . . . . . . . . . . . . . . . . . . .
33
35
5.3.5
Inserimento di un paragrafo
. . . . . . . . . . . . .
36
5.3.6
Cancellazione di un paragrafo . . . . . . . . . . . . .
37
5.3.7
Spostamento di un paragrafo
37
5.3.8
Modica di attributi/proprietà del paragrafo
5.3.9
Inserimento di una cella di tabella
. . . . . . . . . . . . .
5.3.10 Cancellazione di una cella di tabella
. . . .
39
. . . . . . . . . .
40
. . . . . . . . .
41
. . . . . . . . . . . . . . . . . . . . .
42
5.3.12 Inserimento di una riga di tabella . . . . . . . . . . .
43
5.3.11 Unione di celle
5.3.13 Cancellazione di una riga di tabella . . . . . . . . . .
44
5.3.14 Inserimento di XML custom . . . . . . . . . . . . . .
44
2
5.3.15 Cancellazione di XML custom . . . . . . . . . . . . .
45
5.3.16 Spostamento di XML custom . . . . . . . . . . . . .
46
5.3.17 Altre operazioni
47
. . . . . . . . . . . . . . . . . . . .
6 Alcuni esempi in Open Document Format
48
6.1
Inserimento . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
6.2
Cancellazione . . . . . . . . . . . . . . . . . . . . . . . . . .
49
6.3
Complichiamo un po' le cose: la cancellazione dentro l'inserimento
6.3.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
Problema (bug?)
50
nella cancellazione con lo stesso
utente . . . . . . . . . . . . . . . . . . . . . . . . . .
7 Alcuni esempi in OOXML
51
53
7.1
Inserimento . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2
Cancellazione . . . . . . . . . . . . . . . . . . . . . . . . . .
54
7.3
Cancellazione da parte di altri utenti . . . . . . . . . . . . .
55
7.4
Inserimento di paragrafo . . . . . . . . . . . . . . . . . . . .
56
7.5
Spostamento di paragrafo vuoto . . . . . . . . . . . . . . . .
57
7.6
Spostamento di un run . . . . . . . . . . . . . . . . . . . . .
57
Riferimenti bibliograci
53
59
3
1 Introduzione
In generale, si parla di overlapping quando esiste una situazione nella quale, ad
un unico contenuto, si vogliono associare più gerarchie, ovvero, in XML/SGML,
quando si rende necessario applicare più elementi di markup sullo stesso contenuto, e questi elementi sono indipendenti l'uno dall'altro [8].
Focalizzandoci sull'XML, questo è un problema di espressività del linguaggio: i
singoli elementi del documento devono essere organizzati gerarchicamente in un
unico albero, ed ogni frammento del documento deve essere contenuto in uno ed
un solo elemento XML. Ogni elemento XML deve essere contenuto in uno ed un
solo elemento padre, il quale deve essere contenuto in uno ed un solo elemento
padre a sua volta, così no al raggiungimento dell'elemento radice.
Questi
vincoli hanno più a che fare con la facilità di elaborazione dell'XML che non
con le caratteristiche e gli scopi dei linguaggi di markup in generale [10]. Infatti
esistono numerosi casi nei quali un singolo frammento di documento deve essere
associato a descrittori di markup dierenti e gerarchicamente incompatibili. E'
uno scenario comune nella bioinformatica, nella linguistica, nel change tracking,
etc...
In letteratura il problema è noto da tempo, e sono numerosi gli studi per gestire
documenti con gerarchie in sovrapposizione.
Alcune risposte possono essere
trovate nell'SGML stesso, con un opportuno tag (CONCUR) che non è stato però implementato nell'XML, oppure facendo uso di modelli dierenti, sia
astratti (GODDAG), che linguaggi di markup alternativi (LMNL) all'XML.
Possiamo riconoscere diverse tipologie di overlapping:
•
Overlapping classico : quando due frammenti di uno stesso documento,
annotati con due identicatori generali dierenti, si sovrappongono.
•
Self overlapping : quando due componenti della stessa struttura, con lo
stesso nome, si sovrappongono.
Questo può essere il caso, ad esempio,
di due revisioni su due regioni di testo che si sovrappongono.
Le re-
visioni apparterranno alla stessa struttura (la struttura delle revisioni,
appunto). Si avranno quindi elementi dello stesso tipo con gli stessi nomi che si sovrapongono.
Se si implementassero questi casi forzando un
rilassamento delle restrizioni di buona formattazione dell'XML, sarebbe
impossibile determinare i commenti in maniera univoca, ad esempio [7]:
<comment>John <comment>likes</comment> Mary</comment>
•
Elementi virtuali : si tratta di elementi usati per denire elementi il cui
contenuto è un riordinamento di materiale presente altrove nel documento.
Sono anche usati per denire elementi il cui contenuto non è una regione
di testo continuo. In questo caso sono chiamati elementi discontinui.
4
•
Contenimento/Dominanza: la dominanza è la relazione tra parti del documento, dove una domina l'altra se è un'antenata nella struttura del doc-
è una relazione che identica quale parte del documento ingloba sicamente un'altra parte, senza relazione gerarchica tra le
parti. Ancora più semplicemente, una parte a contiene un'altra parte b se a
contiene tutti i caratteri del contenuto di b.
umento. Il contenimento
2 Tecniche per la gestione dell'overlapping
Nei primi lavori sul problema degli overlap, uno dei metodi per la loro gestione
era semplicemente l'ignorare le regole di annidamento dei tag dell'SGML/XML,
creando dei documenti che non potevano essere validati, perchè malformati, e
per i quali non poteva essere scritto alcun DTD, rendendo impossibile la loro
elaborazione per mezzo degli strumenti XML.
Successivamente sono state identicate diverse tecniche.
Vediamo di seguito
alcuni concetti importanti e le principali sul dominio dei documenti XML.
2.1 Gerarchie sacre e profane
In documenti aventi più di una gerarchia è utile fare distinzione tra i nodi (tag
di markup) condivisi tra tutte le gerarchie (cosiddetti sacri) ed i nodi specici
di una determinata gerarchia (profani).
Esemplicando, se avessimo a che fare con un documento HTML con più gerarchie, i tag <HTML> e <BODY>, necessari alla corretta formattazione del
documento per ogni gerarchia, sarebbero nodi sacri.
I nodi specici di ogni
altra gerarchia sarebbero profani.
Possiamo quindi denire sacra la gerarchia composta dai nodi sacri.
Di
contro, profana è ogni gerarchia composta dai propri nodi profani.
Si può notare che non possono esservi problemi di overlapping all'interno del
markup sacro, nè all'interno delle singole gerarchie profane, nè all'interno dell'unione della gerarchia sacra con una gerarchia profana.
Invece, possono esservi problemi di overlap in caso di unione tra la gerarchia
sacra e più di una gerarchia profana nello stesso documento.
5
2.2 Linee Guida TEI
TEI (Text Encoding Initiative) è un consorzio che sviluppa e mantiene uno standard per la rappresentazione di testi in formato digitale. Pubblica un insieme di
linee guida che specicano metodi di codica per testi che debbano essere letti
da macchine. I maggiori campi di applicazione si possono trovare nell'ambito
delle scienze sociali, della linguistica e negli studi umanistici in genere.
Nella versione P5 delle Linee Guida per la codica e lo scambio di testi elettronici, il capitolo 20 riguarda la codica in XML di strutture non gerarchiche
[4].
I metodi descritti dalle linee guida possono riassumersi in:
•
uso di elementi vuoti per delimitare i margini delle strutture in overlapping
(milestones);
•
suddivisione degli elementi in overlapping in segmenti che si innestino
adeguatamente, ma che possano comunque essere ricostruiti nel loro contesto gerarchico (fragmentation/segmentation)
•
codiche ridondanti dell'informazione in forme multiple (twin documents)
•
la possibilità di fare aermazioni su un determinato testo puntando ad
esso, invece di includere tag XML al suo interno (stand-o markup)
2.3 Gli approcci al problema
2.3.1
Milestones
L'approccio Milestones rappresenta una gerarchia primaria in XML standard,
delimitando i tag di inizio e di ne delle gerarchie secondarie utilizzando elementi
vuoti [10].
L'idea alla base è che, tra le varie gerarchie che competono implicitamente in
una struttura in overlap, una sia scelta come gerarchia dominante. L'inzio e la
ne di quelli che avrebbero dovuto essere gli elementi delle altre gerarchie sono
rappresentati utilizzando elementi vuoti [7].
L'inserimento di elementi vuoti evita che le caratteristiche del testo che cadono
al di fuori della gerarchia principale invalidino il documento, identicandone
l'inizio e la ne per le successive elaborazioni.
6
In alcuni casi, può essere necessario introdurre elementi vuoti sia per il tag di
inizio degli elementi appartenenti a gerarchie secondarie, che per quello di ne .
Le linee guida TEI, che descrivono la tecnica, chiamano milestones gli elementi
vuoti.
Questa tecnica è particolarmente conveniente da adottare nelle applicazioni di
data capture e, più in generale, in contesti di semplice scansione sequenziale dei
documenti [7].
Inoltre, vi è dierenza tra l'elaborazione/validazione in XML
della gerarchia principale, che è evidente, e quella delle gerarchie secondarie,
che devono prima essere decodicate.
Utilizzando le milestones, l'elemento rappresentato con questo approccio si appiattisce nell'albero XML, ed è necessario utilizzare del software specico per il
suo riconoscimento e la ricostruzione della sua struttura.
Per vedere l'appiattimento dovuto all'utilizzo delle milestones, utilizziamo
l'esempio in [10] creando un piccolo albero XML:
<TEI>
...
<l>
<sp>
<speaker>Tibère</speaker>
Poursuivez...
</sp>
<sp>
<speaker>Agrippine</speaker>
Quoi, Seigneur?
</sp>
<sp clix:role=start-range clix:sID=sp1 />
<speaker>Tibère</speaker>
Le propos détestable
</l>
<l>
où je vous ai surprise.
<sp clix:role=end-range clix:eID=sp1 />
<sp clix:role=start-range clix:sID=sp2 />
<speaker>Agrippine</speaker>
A ! Ce propos damnable
</l>
<l>
d'une si grande horreur tous mes sens travailla
<sp clix:role=end-range clix:eID=sp2 />
</l>
...
</TEI>
Un semplice albero potrebbe essere:
7
Dove, all'interno dei rettangoli rossi, è evidente l'appiattimento degli elementi
espressi con milestones.
Inoltre, nessun elemento XML rappresenta esplicitamente il materiale delle gerarchie secondarie. L'elaborazione con strumenti XML, quindi, aumenta di complessità, in quanto le gerarchie secondarie non sono rappresentate uniformemente da nodi nell'albero del documento. Esse devono essere necessariamente
ricostruite con software ad hoc.
2.3.2
Flattened
L'approccio attened esprime ogni elemento del documento tramite milestones,
sia la gerarchia principale che le gerarchie secondarie, indipendentemente dal
fatto che gli elementi siano in overlap tra loro oppure no.
Con questa tecnica vengono sicuramente risolti tutti gli overlap.
Tuttavia l'approccio Flattened condivide con le Milestones i problemi di appiattimento dell'albero XML, magnicati dal fatto che l'appiattimento si riscontra
non solo sugli elementi eettivamente in overlap, ma sull'intero documento; la
dicoltà nel riconoscimento e nell'elaborazione delle gerarchie, anche in questo
caso applicabile a tutte le gerarchie, non solo a quelle in overlap. In più saltano
le gerarchie di dominanza, che devono essere ricostruite con software specico.
Esempio (sempre da [10]):
8
<clix:clix>
<TEI clix:role="start-range" clix:sID="tei01" />
<teiHeader clix:role="start-range" clix:sID="h01" />
...
<teiHeader clix:role=end-range" clix:eID="h01" />
<text clix:role="start-range" clix:sID="t01" />
<body clix:role="start-range" clix:sID="b01" />
<l clix:role="start-range" clix:sID="l01" />
<sp clix:role="start-range" clix:sID="sp01" />
<speaker clix:role="start-range" clix:sID="spk01" />
Tibère
<speaker clix:role="end-range" clix:eID="spk01" />
Poursuivez ...
<sp clix:role="end-range" clix:eID="sp01" />
<sp clix:role="start-range" clix:sID="sp02" />
<speaker clix:role="start-range" clix:sID="spk02" />
Agrippine
<speaker clix:role="end-range" clix:eID="spk02" />
Quoi, Seigneur?
<sp clix:role="end-range" clix:sID="sp02" />
<sp clix:role="start-range" clix:sID="sp1" />
<speaker clix:role="start-range" clix:sID="spk03" />
Tibère
<speaker clix:role="end-range" clix:eID="spk03" />
Le propos détestable
<l clix:role="end-range" clix:eID="l01" />
<l clix:role="start-range" clix:sID="l02" />
où je vous ai surprise .
<sp clix:role="end-range" clix:eID="sp1" />
<sp clix:role="start-range" clix:sID="sp2" />
<speaker clix:role="start-range" clix:sID="spk04" />
Agrippine
<speaker clix:role="end-range" clix:eID="spk04" />
Ah! Ce propos damnable
<l clix:role="end-range" clix:eID="l02" />
<l clix:role="start-range" clix:sID="l03" />
d'une si grande horreur tous mes sens travailla
<sp clix:role="end-range" clix:eID="sp2" />
<l clix:role="end-range" clix:eID="l03" />
<body clix:role="end-range" clix:eID="b01" />
<text clix:role="end-range" clix:eID="t01" />
<TEI clix:role="end-range" clix:eID="tei01" />
</clix:clix >
2.3.3
Fragmentation
Quando un elemento che appartiene ad un vocabolario secondario si sovrappone
ad elementi appartenenti al vocabolario primario, è spezzato in tanti piccoli
frammenti quanti sono necessari a risolvere la sovrapposizione.
Come per l'approccio milestones, viene scelta una gerarchia dominante.
Gli
elementi delle altre gerarchie sono rappresentati normalmente, sempre che si
inseriscano correttamente all'interno della gerarchia dominante. Se un elemento
subordinato si estende oltre i propri limiti sovrapponendosi ad un elemento
della gerarchia dominante, l'elemento subordinato è spezzato in tanti frammenti
quanti sono necessari per far sì che ogni frammento sia correttamente annnidato
agli elementi della gerarchia dominante.
9
Vengono utilizzate opportune convenzioni sintattiche per distinguere tra elementi parziali e non parziali e per riconoscere i frammenti di uno stesso elemento,
come ad esempio attributi specici.
Per combinare gli elementi facilitando la costruzione delle gerarchie secondarie
si possono introdurre meccanismi di concatenazione (virtual join ), utilizzando
appositi attributi prev e next.
Altri approcci più semplici permettono di suddividere il testo in parti con i valori
I (iniziale), M (medio), F (nale), utilizzando l'attributo prev. Questo metodo,
però, può necessitare di elaborazioni con software specico per stabilire quali
elementi delle singole parti debbano essere combinati con quali e soprattutto
in quale ordine, cosa che il parser XML non può assicurare.
Ciò che invece
è identicato correttamente dal parser è l'annidamento e la correttezza delle
aperture/chiusure dei tag della gerarchia principale e delle gerarchie secondarie,
e questo, secondo Spielberg-McQueen e Huitfeld ([7]), rende la Fragmentation
preferibile alle Milestones.
Mutuando l'esempio di fragmentation da [10]:
<TEI>
...
<l>
<sp>
<speaker>Tibère</speaker>
Poursuivez ...
</sp>
<sp>
<speaker>Agrippine</speaker>
Quoi , Seigneur ?
</sp>
<sp xml:id="sp1.1" next="sp1.2">
<speaker>Tibère</speaker>
Le propos détestable
</sp>
</l>
<l>
<sp xml:id="sp1.2">
où je vous ai surprise .
</sp>
<sp xml:id="sp2.1" next="sp2.2">
<speaker>Agrippine</speaker>
Ah ! Ce propos damnable
</sp>
</l>
<l>
<sp xml:id="sp2.2">
d'une si grande horreur tous mes sens travailla
</sp>
</l>
...
</TEI>
Un problema di questo approccio è che, molto spesso, la codica avrà un numero
di elementi maggiore di quelli che eettivamente si intende rappresentare. Ciò
è molto evidente nell'esempio in [4]:
10
il brano originale:
<l>Scorn not the sonnet; critic, you have frowned,</l>
<l>Mindless of its just honours; with this key</l>
<l>Shakespeare unlocked his heart; the melody</l>
<l>Of this small lute gave ease to Petrarch's wound.</l>
Espresso con fragmentation :
<l>
<seg
<seg
</l>
<l>
<seg
<seg
</l>
<l>
<seg
<seg
</l>
<l>
<seg
</l>
n="sentence1">Scorn not the sonnet;</seg>
n="sentence2">critic, you have frowned,</seg>
n="sentence2">Mindless of its just honours;</seg>
n="sentence3">with this key</seg>
n="sentence3">Shakespeare unlocked his heart;</seg>
n="sentence4">the melody</seg>
n="sentence4">Of this small lute gave ease to Petrarch's wound.</seg>
dove ci sono ben 7 istanze dell'elemento seg (segmento) rappresentante i versi,
e solo 4 versi di fatto esistenti.
L'esempio precedente permette anche di rilevare un secondo problema:
da
un punto di vista semantico si nota che pochissime sentence possono essere
riconosciute come frasi dal punto di vista linguistico.
La combinazione dei due problemi, in particolare, può rendere particolarmente
dicile l'analisi automatica del testo. Un sistema automatico che volesse contare
le frasi della poesia dell'esempio precedente, potrebbe restituire un risultato non
corretto.
2.3.4
Twin documents
Nell'approccio Twin Documents ogni gerarchia è un documento XML distinto,
con la propria struttura ad albero.
Concettualmente questo è il metodo più
semplice per risolvere gerarchie in overlap.
Non è necessario scegliere alcuna gerarchia principale, e non sono necessari strumenti particolari per esaminare separatamente ogni gerarchia. Le informazioni
sono rappresentate esplicitamente nei dati, ed i singoli documenti possono essere
elaborati senza grossi sforzi con strumenti XML.
11
I problemi di questo approccio vanno ricercati nel fatto che è necessario mantenere copie multiple dello stesso contenuto testuale (ciò può portare ad inconsistenze), e manca la possibilità di descrivere relazioni tra le gerarchie.
Inoltre, trovando in ogni documento markup profani diversi su markup sacri
comuni, potrebbe essere impossibile stabilire un ordine tra i tag profani appartenenti a due gerarchie diverse, nel caso volessimo unire due documenti in
uno solo.
Esempio (sempre da [10]):
<TEI> <! -- verse vocabulary -- >
<teiHeader> ... </teiHeader>
<text>
<body>
<l>
<speaker>Tibère</speaker>
Poursuivez ...
<speaker>Agrippine</speaker>
Quoi, Seigneur ?
<speaker>Tibère</speaker>
Le propos détestable
</l>
<l>
où je vous ai surprise .
<speaker>Agrippine</speaker>
Ah! Ce propos damnable
</l>
<l>
d'une si grande horreur tous mes sens travailla
</l>
</body>
</text>
</TEI>
<TEI> <! -- performance vocabulary -- >
<teiHeader> ... </teiHeader>
<text>
<body>
<sp>
<speaker>Tibère</speaker>
Poursuivez ...
</sp>
<sp>
<speaker> Agrippine </speaker>
Quoi, Seigneur?
</sp>
<sp>
<speaker>Tibère</speaker>
Le propos détestable où je vous ai surprise .
</sp>
<sp>
<speaker> Agrippine </speaker>
Ah! Ce propos damnable d'une si grande horreur tous mes sens travailla
</sp>
</body>
</text>
</TEI>
12
2.3.5
Stand-o markup
Lo Stand-o Markup è una tecnica che associa ad un documento sorgente uno o
più documenti esterni, ognuno con il proprio markup. Questi documenti esterni
puntano a porzioni del documento sorgente.
In altre parole, viene eettuata
una separazione tra il testo e gli elementi usati per descriverlo, i quali non
contengono nessuna parte del testo della gerarchia principale, ma includono
semplicemente dei riferimenti.
Le linee guida TEI raccomandano l'utilizzo di
meccanismi XInclude/XPointer deniti nel W3C, oppure semplici puntatori.
Secondo gli standard adottati attualmente, i documenti esterni possono essere
inseriti in apposite sezioni all'interno dello stesso le del documento principale.
Ecco un esempio.
Dato questo documento sorgente:
<root>
<speaker xml:id="spk01">Tibère</speaker>
Poursuivez ...
<speaker xml:id="spk02">Agrippine</speaker>
Quoi, Seigneur ?
<speaker xml:id="spk03">Tibère</speaker>
Le propos détestable
où je vous ai surprise .
<speaker xml:id="spk04">Agrippine</speaker>
Ah ! Ce propos damnable
d'une si grande horreur tous mes sens travailla
</root>
Questi potrebbero essere documenti esterni:
<TEI> <!-- verse vocabulary -->
...
<l>
<xinclude href="source.xml" xpointer="xpath1(id('spk01'))"/>
<xinclude href="source.xml" xpointer="string-range(xpath1(id('spk01')),0,13)"/>
<xinclude href="source.xml" xpointer="xpath1(id('spk02'))"/>
<xinclude href="source.xml" xpointer="string-range(xpath1(id('spk02')),0,15)"/>
<xinclude href="source.xml" xpointer="xpath1(id('spk03'))"/>
<xinclude href="source.xml" xpointer="string-range(xpath1(id('spk03')),0 ,19)"/>
</l>
<l>
<xinclude href="source.xml" xpointer="string-range(xpath1(id('spk03')),20,23)"/>
<xinclude href="source.xml" xpointer="xpath1(id('spk04'))"/>
<xinclude href="source.xml" xpointer="string-range(xpath1(id('spk04')),0,23)"/>
</l>
<l>
<xinclude href ="source.xml" xpointer="string-range(xpath1(id('spk04')),24,47)"/>
</l>
...
</TEI>
<TEI> <!-- performance vocabulary -->
...
<sp>
<xinclude href="source.xml" xpointer="xpath1(id('spk01'))"/>
13
<xinclude href="source.xml" xpointer="string-range(xpath1(id('spk03')),0,13)"/>
</sp>
<sp>
<xinclude href="source.xml" xpointer="xpath1(id('spk02'))"/>
<xinclude href="source.xml" xpointer="string-range(xpath1(id('spk02')),0,15)"/>
</sp>
<sp>
<xinclude href="source.xml" xpointer="xpath1(xpath1(id('spk03'))"/>
<xinclude href="source.xml" xpointer="string-range(xpath1(id('spk03'))),0,42)"/>
</sp>
<sp>
<xinclude href="source.xml" xpointer="xpath1(id('spk04'))"/>
<xinclude href="source.xml" xpointer="string-range(xpath1(id('spk04')),0,70) "/>
</sp>
...
</TEI>
Questo approccio è utile quando si ha a che fare con testi che non permettono
l'inserimento di tag addizionali, oppure testi soggetti all'applicazione di numerose gerarchie secondarie incompatibili tra loro. Altri scenari di applicazione
possono essere singoli schemi che necessitino di risolvere ambiguità gerarchiche
multiple, rendendo impossibile applicare una sola gerarchia secondaria.
Applicando lo stand-o markup è possibile annotare un documento in sola lettura; è possibile distribuire i le di annotazione senza distribuire il testo sorgente; elementi discontinui possono essere combinati in una annotazione singola;
soggetti dierenti possono produrre indipendentemente annotazioni dierenti;
dierenti le di annotazione possono contenere dierenti livelli di informazione.
Inoltre l'approccio è elegante.
Tra gli svantaggi possiamo rilevare il fatto che nuove annotazioni possono richiedere
interpretazioni (ed elaborazioni) nuove e disgiunte da quelle già costruite per le
precedenti annotazioni. Anche se tutte le informazioni delle gerarchie fossero incluse, l'informazione sarebbe comunque dicile da elaborare utilizzando i metodi generici XML. Secondo Spielberg-McQueen e Huitfeld [7], inoltre, l'approccio stand-o non permette agevolmente di vericare se il markup eettivamente
rispetti i vincoli espressi in un DTD.
14
2.4 Vantaggi e svantaggi di ogni approccio
Sia Spielberg-McQueen e Huitfeld, in [7], che le linee guida TEI, in [4] che
Jeni Tennison, in [13], puntualizzano i vantaggi e gli svantaggi di ogni tecnica.
Proviamo a rappresentare, in forma matriciale, un compendio delle osservazioni:
Approccio
Vantaggi
Svantaggi
Milestones
è facile identicare la
viene favorita una
gerarchia principale
gerarchia a discapito delle
altre
è facile elaborare la
è dicile identicare il
gerarchia principale con
contenuto delle gerarchie
strumenti XML
in overlap
è dicile elaborare le
gerarchie in overlap con
strumenti XML
Flattened
relativa facilità di
è dicile identicare il
applicazione dell'
contenuto delle gerarchie
approccio per la
risoluzione
dell'overlapping
nessuna gerarchia è
possibili problemi nelle
predominante rispetto
relazioni di dominanza,
alle altre
da ricostruire
è dicile elaborare le
gerarchie con strumenti
standard XML
è dicile editare le
gerarchie senza strumenti
costruiti ad hoc
Fragmentation
è facile identicare la
viene favorita una
gerarchia principale
gerarchia a discapito delle
altre
è facile elaborare la
possibili problemi nelle
gerarchia principale con
relazioni di contenimento
strumenti XML
è facile validare il
può portare ad elementi
documento
fortemente discontinui
l'elaborazione del
contenuto delle gerarchie
in overlap può non essere
agevole
15
Approccio
Vantaggi
Svantaggi
inadatto all'elaborazione
di documenti con requisiti
di ordinamento
particolari
Twin Documents
tutte le gerarchie sono
il contenuto si ripete in
facilmente identicabili
ogni documento
è dicile allineare le
strutture
è dicile eettuare analisi
incrociate tra le strutture
è dicile editare le
gerarchie senza strumenti
costruiti ad hoc
Stand-o Markup
nessuna gerarchia è
è dicile identicare le
predominante
gerarchie
permette di eettuare
è dicile elaborare le
markup su documenti in
gerarchie con strumenti
read-only
standard XML
le gerarchie secondarie
è dicile editare le
possono essere prodotte
gerarchie senza strumenti
da soggetti diversi in
costruiti ad hoc
tempi diversi
le gerarchie secondarie,
è dicile validare le
essendo disgiunte,
gerarchie con DTD
possono essere distribuite
indipendentemente dal
documento sorgente
maggiore espressività ed
eleganza
Si possono quindi identicare quattro aspetti importanti che devono essere
necessariamente presi in considerazione nella scelta del tipo di approccio da
utilizzare per risolvere il problema dell'overlap in XML:
1. La facilità con cui l'approccio scelto permette di rappresentare tipi dierenti di overlap o di eettuare compiti specializzati. La scelta di utilizzare
una tecnica a discapito di un'altra dipende fortemente dal tipo di overlap
da gestire. Ad esempio la possibilità di gestire self-overlapping, che manca
nell'approccio Twin Documents, a meno di aver a che fare con un numero
variabile di documenti che aumenta in ragione di quanto self-overlap è
presente. Se si ha a che fare con elementi discontinui, invece, la Fragmen-
tation è naturalmente il metodo migliore. Lo Stand-o Markup, dal canto
16
suo, permette di eettuare annotazioni su documenti scritti da altri senza
necessariamente avere permessi di scrittura su di essi.
2. La capacità di generare documenti facilmente modicabili (editabili). Sicuramente gli approcci Milestones e Fragmentation permettono di generare le con una modicabilità (anche manuale) paragonabile all'XML. Gli
approcci Stand-o Markup e Twin Documents, invece, richiedono strumenti di editing specici sia per la gestione del markup che per la modica dei
contenuti.
3. L'applicabilità di strumenti standard XML per l'elaborazione dei documenti. Ad esempio, è molto più facile elaborare con XLST dei documenti
in formato Milestones o Fragmented piuttosto che avere a che fare con un
approccio Twin Documents, Stand-o Markup o Flattened. In questi casi
è utile adarsi ad un processo di conversione del documento in un formato
più adatto (alcuni meccanismi di traduzione sono descritti in [10]). Un altro esempio è la validazione dei le con DTD, che nell'approccio Stand-o
Markup è particolarmente disagevole.
4. Alcuni approcci livellano le gerarchie, rendendo impossibile capire se ve
ne sia una predominante rispetto alle altre, ma questo potrebbe non essere desiderabile, ad esempio nel caso di gestione del change tracking: è
chiaro che esiste una gerarchia principale (il contenuto) e gerarchie secondarie (i commenti e le revisioni), e questo rende gli approcci Milestones e
Fragmentation i più adatti.
In ultima analisi, non sembra esserci un approccio migliore degli altri per i
documenti XML. La scelta della tecnica da utilizzare è fortemente condizionata
dal tipo di overlap e dal tipo di documento da gestire.
Questo è anche riportato nelle linee guida TEI [4]:
al momento non sembra
ancora esistere una soluzione al problema che racchiuda in sè semplicità formale,
capacità nel rappresentare tutte le strutture possibili, facilità nella validazione
formale e/o automatica.
Al più è possibile mediare tra vantaggi e svantaggi
delle soluzioni conosciute.
17
3 Il change tracking e l'overlapping - considerazioni generali
La gestione del change tracking può essere denita come tutto quell'insieme di
tecniche che gestiscono le modiche apportate su un determinato documento da
soggetti diversi in tempi diversi. Questo include il supporto alla creazione e visualizzazione delle modiche, alla possibilità di accettarle, correggerle, scartarle,
ed alla possibilità di inserire commenti.
Generalmente, una modica può essere:
•
un inserimento, quando si aggiunge del contenuto ad un testo esistente o
alla sua struttura/formato
•
una cancellazione, quando si toglie contenuto o formattazione.
In caso
di cancellazione, è opportuno un meccanismo che memorizzi cosa è stato
cancellato.
Le operazioni di revisione (accettazione o scarto delle modiche) necessitano
di un strato di meta-informazioni che associno l'operazione di modica ad un
determinato soggetto. Per semplicità tralasceremo le problematiche di autenticazione/autorizzazione, che esulano dallo scopo di questa trattazione.
L'aggiunta di commenti è un'operazione dierente.
Il word processor li deve
visualizzare in una forma speciale, e, generalmente, sono trattati come entità
separate dal resto del testo (anche se collegate ad esso). Necessitano anch'esse
di uno strato di meta-informazioni per, ad esempio, l'identicazione dell'autore.
Scenari più complessi possono comprendere uno strato di supporto al change
tracking anche per quanto riguarda i commenti, e possibilità di visualizzare lo
stato del documento in un determinato istante di tempo, rendendo necessario
introdurre un meccanismo di ordinamento coerente di tutti gli elementi, tramite
contatori e/o timestamp.
Le speciche Open Oce Document Format e Oce Open XML non si limitano a descrivere i meccanismi di change tracking per i documenti word, ma
esplorano il problema anche per i fogli di calcolo e di presentazione.
Nella presente trattazione, per semplicità, verrà dato risalto principalmente ai
documenti word.
Dal punto di vista dell'overlapping, anche alla luce del capitolo precedente, sulla
problematica del change tracking possiamo fare le seguenti considerazioni:
18
•
è presente una gerarchia principale (il testo da modicare)
•
sono presenti una o più gerarchie secondarie (le modiche, i commenti/annotazioni, le autorizzazioni)
•
i pezzi di testo all'interno delle gerarchie potrebbero godere di proprietà
di ordinamento
•
la necessità di avere strumenti ad hoc per l'editazione dei documenti creati
è naturalmente soddisfatta dai word-processor stessi
In merito all'ultimo punto, potrebbero esserci (e, allo stato attuale, eettivamente ci sono) dei problemi per quanto riguarda l'editazione di documenti XML
scritti con un word processor da parte di un altro word processor. Sebbene siano
già stati implementati meccanismi di traduzione da un formato all'altro, il problema della loro correttezza e completezza e senz'altro da approfondire, ma esula
lo scopo del presente documento.
19
4 Il formato dati del change tracking in ODF
(Open Document Format)
I meccanismi di change tracking del formato Open Document Format sono
descritti nello standard ODF da OASIS (Organization for the Advancement
of Structured Information Standards). OASIS è un consorzio no-prot per lo
sviluppo, la convergenza e l'adozione di standard aperti per la società mondiale
dell'informazione.
Il documento relativo allo standard adottato da OpenOce.org e da altre suite
oce è descritto nella specica Open Document Format for Oce Applications (OpenDocument) v1.1, approvata nel febbraio 2007. La sezione 4.6 della
specica descrive come debbano essere rappresentate le modiche ai documenti.
L'XML-Schema usato per descrivere la specica è espresso in linguaggio Relax
NG [12].
4.1 Cenni sulla struttura dei documenti Open Document
Format
Nella specica Open Document Format, ogni componente della struttura è rappresentato da un elemento ed i suoi attributi. La struttura di un documento si
applica a tutti i tipi di documento previsti: non vi è dierenza tra un documento
di testo, un foglio di calcolo od un disegno, tranne che nel contenuto.
Gli elementi principali sono i seguenti:
•
Document Root (uno o più di uno)
•
Metadati
•
Body Element
•
Congurazioni
•
Script
•
Dichiarazioni dei font utilizzati
•
Stili e layout
I Document Root sono gli elementi principali di un documento in formato Open
Document.
Possono esservi due modalità di rappresentazione di un documento:
20
•
unico le XML
•
insieme di diversi sottodocumenti all'interno di un package, ognuno dei
quali memorizza parte del documento completo.
Ogni sottodocumento
rappresenta un particolare aspetto del documento.
<oce:document>
Nel primo caso, il documento ha un unico root element (
);
diversamente sono presenti più Root Element, uno per ogni sottodocumento
(<oce:document-content> per il contenuto, <oce:document-styles> per gli
stili utilizzati - se diversi da quelli standard, <oce:document-meta> per le
metainformazioni del documento, <oce:document-settings> per le congurazioni speciche dell'applicazione).
I Metadati sono le informazioni generali sul documento, come ad esempio l'autore o la data e l'ora dell'ultimo salvataggio.
Sono contenuti in un apposita
Document Root.
Il Body Element contiene un elemento per indicare il tipo di contenuto del
documento. Nella specica sono modellati i seguenti contenuti:
•
documenti di testo
•
documenti di disegno
•
documenti di presentazione
•
fogli di calcolo
•
graci
•
immagini
Per lo scopo della presente trattazione, ci focalizzeremo sul formato dei
documenti di testo. Questo è lo schema del contenuto all'interno del Body
Element per i documenti di testo:
<define name="office-body-content" combine="choice">
<element name="office:text">
<ref name="office-text-attlist"/>
<ref name="office-text-content-prelude"/>
<zeroOrMore>
<ref name="office-text-content-main"/>
</zeroOrMore>
<ref name="office-text-content-epilogue"/>
</element>
</define>
21
Il contenuto di un documento di testo può consistere di una sequenza di paragra, tabelle, indici, nestre di testo, sezioni di testo ed elementi graci. In più,
un documento di testo può contenere moduli, informazioni di change tracking e
dichiarazioni di variabili.
Alcuni di questi dati (change tracking, dati relativi ai moduli, dichiarazione di
variabili) sono contenuti all'interno di un elemento chiamato Prelude:
<define name="office-text-content-prelude">
<ref name="office-forms"/>
<ref name="text-tracked-changes"/>
<ref name="text-decls"/>
<ref name="table-decls"/>
</define>
Il resto dei dati, ovvero la parte del documento vera e propria, può essere
trovata all'interno dell'elemento oce-text-content-main:
<define name="office-text-content-main">
<choice>
<zeroOrMore>
<ref name="text-content"/>
</zeroOrMore>
<group>
<ref name="text-page-sequence"/>
<zeroOrMore>
<choice>
<ref name="draw-a"/>
<ref name="shape"/>
</choice>
</zeroOrMore>
</group>
</choice>
</define>
Verichiamo il contenuto dell'elemento text-content, perchè ricorrerà più volte
nel corso della trattazione:
<define name="text-content">
<choice>
<ref name="text-h"/>
<ref name="text-p"/>
<ref name="text-list"/>
<ref name="text-numbered-paragraph"/>
<ref name="table-table"/>
<ref name="draw-a"/>
<ref name="text-section"/>
<ref name="text-soft-page-break"/>
<ref name="text-table-of-content"/>
<ref name="text-illustration-index"/>
<ref name="text-table-index"/>
<ref name="text-object-index"/>
<ref name="text-user-index"/>
<ref name="text-alphabetical-index"/>
<ref name="text-bibliography"/>
<ref name="shape"/>
<ref name="change-marks"/>
</choice>
</define>
Possiamo notare che non è necessario che il testo all'interno di un documento
contenga un paragrafo.
22
4.2 La lista delle modiche
Tutti i cambiamenti ad un documento sono memorizzati in una lista, che
contiene un elemento per ogni modica apportata al documento. La lista è
coontenuta all'interno dell'elemento
<text:tracked-changes>
Se l'elemento è assente, il change tracking non è stato attivato per il documento.
Lo schema dell'elemento tracked-changes è il seguente
<define name="text-tracked-changes">
<optional>
<element name="text:tracked-changes">
<ref name="text-tracked-changes-attr"/>
<zeroOrMore>
<ref name="text-changed-region"/>
</zeroOrMore>
</element>
</optional>
</define>
All'interno dell'elemento possiamo avere una o più text-changed-region, ovvero
la lista dei cambiamenti apportati al testo:
<define name="text-changed-region">
<element name="text:changed-region">
<ref name="text-changed-region-attr"/>
<ref name="text-changed-region-content"/>
</element>
</define>
Ogni elemento ha un ID. In particolare, gli elementi che marcano l'inizio e la
ne di una regione usano l'ID per identicare la regione alla quale
appartengono:
<define name="text-changed-region-attr" combine="interleave">
<attribute name="text:id">
<ref name="ID"/>
</attribute>
</define>
4.3 Tipologie di modiche
Nella specica Open Document Format sono modellate 3 tipologie di modiche:
•
inserimenti
23
•
cancellazioni
•
modiche di formato
Queste tipologie vengono modellate all'interno del text-changed-region-content.
Vediamole una per una.
4.3.1
Inserimenti
Gli inserimenti di testo sono identicati dal tag <text:insertion>. Questo elemento contiene tutte le informazioni necessarie all'identicazione del contenuto
inserito.
Il contenuto inserito può rientrare in diverse casistiche. Può essere:
•
un semplice brano di testo all'interno di un paragrafo
•
un intero paragrafo
•
una tabella
Il contenuto inserito è parte del documento di testo ed è identicato, con la
tecnica dele milestones, da un elemento vuoto start ed un elemento vuoto end.
Ecco lo schema:
<define name="text-changed-region-content" combine="choice">
<element name="text:insertion">
<ref name="office-change-info"/>
</element>
</define>
L'esempio che segue è diviso in due parti: nella prima è presente il contenuto
della lista delle modiche, con tutte le metainformazioni; nella seconda parte,
separata dalla prima da una linea vuota, c'è la sezione del documento che è
interessata dalla modica:
<text:tracked-changes>
<text:changed-region text:id="c001">
<text:insertion>
<office:change-info>
<dc:creator>Michael Brauer</dc:creator>
<dc:date>1999-05-18T12:56:04</dc:date>
</office:change-info>
</text:insertion>
</text:changed-region>
</text:tracked-changes>
<text:p>
This is the original text<text:change-start text:change-id="c001"/>,
but this has been added<text:change-end text:change-id="c001"/>.
</text:p>
24
Nell'esempio possiamo notare le metainformazioni nella lista delle modiche (chi
ha apportato la modica - l'inserimento - ed il timestamp). Nel testo vediamo
gli elementi milestones che delimitano l'inizio e la ne dell'inserimento.
4.3.2
Cancellazioni
Le cancellazioni sono identicate dal tag <text:deletion>, che contiene il testo
cancellato. La posizione, all'interno del documento, del testo cancellato è identicata da un apposito elemento <text:change text:region-id=xxx />
Lo schema:
<define name="text-changed-region-content" combine="choice">
<element name="text:deletion">
<ref name="office-change-info"/>
<zeroOrMore>
<ref name="text-content"/>
</zeroOrMore>
</element>
</define>
Nell'esempio che segue è stata eettuata la cancellazione del testo , but this
has been deleted, che si trova nell'elemento <text:p>
<text:tracked-changes>
<text:changed-region text:id="c002">
<text:deletion>
<office:change-info>
<dc:creator>Michael Brauer</dc:creator>
<dc:date>1999-05-18T12:56:04</dc:date>
</office:change-info>
<text:p>, but this has been deleted</text:p>
</text:deletion>
</text:changed-region>
</text:tracked-changes>
<text:p>
This is the original text<text:change text:region-id="c002"/>.
</text:p>
Anche in questo caso possiamo notare le metainformazioni nella parte della
lista delle modiche.
Diversamente dall'inserimento, abbiamo anche il testo
cancellato, contenuto nei tag <text:p>.
Nella parte del testo, abbiamo una milestone che identica la posizione del testo
cancellato, con un riferimento (l'attributo region-id) che rimanda direttamente
al nodo relativo nella lista delle modiche.
Nel caso in cui il testo cancellato debba essere inserito nuovamente nel documento, esso verrà posizionato nel punto esatto della milestone di cancellazione.
25
Come viene sottolineato nella sezione 4.6.4 della specica [11], possiamo notare
che il testo cancellato presente nella sezione della lista delle modiche viene
incluso nei tag <text:p></text:p>, anche se, prima della modica, non faceva
parte di un paragrafo a sè stante. Questa è una regola dettata dalla specica.
Nel caso di reinserimento del testo cancellato, emergono tre scenari:
•
se la milestone di cancellazione si trova all'interno di un paragrafo, si
reintroduce il testo cancellato ignorando i tag di paragrafo aggiunti nella
lista delle modiche;
•
se la milestone di cancellazione si trova all'interndo di un header, ci si
comporta come nel caso precedente adattando opportunamente i tag di
ne allo specico header
•
in tutti gli altri casi si copia l'intero testo cancellato, compresi i tag di
paragrafo.
4.3.3
Cambiamenti di formato
I cambiamenti di formato sono tutte le modiche che possano essere apportate
agli attributi di formattazione. La regione dove questi cambiamenti avvengono
viene marcata da milestones di inizio e ne.
Diversamente dai casi precedenti, la specica non prevede la memorizzazione
dei dati di formato modicati all'interno della lista dei cambiamenti.
Ecco lo schema:
<define name="text-changed-region-content" combine="choice">
<element name="text:format-change">
<ref name="office-change-info"/>
</element>
</define>
4.4 Le metainformazioni del change tracking
Le metainformazioni del change tracking sono memorizzate all'interno dell'
elemento change-info.
Questo elemento contiene l'autore e la data di creazione di una determinata
modica catturata dai meccanismi di supporto al change tracking. Può anche
contenere commenti opzionali.
Ecco lo schema:
26
<define name="office-change-info">
<element name="office:change-info">
<ref name="dc-creator"/>
<ref name="dc-date"/>
<zeroOrMore>
<ref name="text-p"/>
</zeroOrMore>
</element>
</define>
L'autore e la data sono rispettivamente specicati all'interno di dc-creator e
dc-date. I commenti trovano posto all'interno di paragra.
27
5 Il formato dati del change tracking in OOXML
(Oce Open XML - Microsoft)
Il formato dei le OOXML è descritto nello Standard ECMA-376. Il formato
OOXML è diventato standard ISO (ISO/IEC DIS 29500) nel marzo del 2008.
La versione più recente dello standard, tecnicamente allineata con lo standard
ISO, è la seconda, del dicembre 2008.
La Ecma International è un'associazione di industrie dedicata alla standardizzazione dell'Informazione e dei sistemi di comunicazione.
5.1 Cenni sulla struttura dei documenti OOXML
Lo standard Oce Open XML denisce i formati dei documenti di word-processing,
dei fogli di calcolo e delle presentazioni. Ogni tipo di documento è specicato
attraverso un suo linguaggio di markup primario: WordprocessingML, SpreadsheetML o PresentationML. Ogni linguaggio può comunque incorporare parti
espresse in altri linguaggi primari, ed anche parti espresse in altri linguaggi.
Un documento espresso in linguaggio WordProcessingML è composto di un
insieme di piani (stories ), ognuno dei quali può essere [3]:
•
il documento principale (main document)
•
il glossario
•
un sottodocumento
•
un header
•
un footer
•
un commento
•
un frame
•
una casella di testo
•
una nota a piè di pagina
•
una nota nale
Ognuno di questi piani è generalmente inserito in un documento XML specico.
Tutti i documenti XML dei piani sono inseriti all'interno dello stesso pacchetto
compresso docx.
L'unico piano obbligatorio è il documento principale, sito nel le document.xml.
Gli elementi XML che tipicamente lo compongono sono:
28
•
•
document - l'elemento radice del documento principale
body - il corpo del documento, che può contenere diversi paragra ed una
sezione di proprietà
•
p - il paragrafo. Può contenere una o più run (r). Il run è un brano di testo
contiguo avente le stesse identiche proprietà, senza markup aggiuntivi. E'
generalmente espresso tramite dei range.
•
t - range di testo.
Contiene una quantità arbitraria di testo senza for-
mattazioni, interruzioni di linea, tabelle, immagini o altro materiale non
testuale. La formattazione del testo è ereditata dalle proprietà di run e di
paragrafo.
Sempre in [3]possiamo vedere la parte document di un documento minimale in
WordprocessingML, che ci dà un'idea iniziale di come appaiono i documenti in
OOXML:
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Hello, world.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
Possiamo vedere tutte le parti del documento:
l'elemento radice, il body, il
paragrafo, il run, che, al suo interno, ospita il range.
All'interno di un paragrafo, tutta la formattazione del paragrafo stesso è memorizzata nell'elemento pPr (paragraph properties).
Come i paragra, anche i run possono avere una formattazione specica, che è
specicata all'interno dell'elemento rPr (run properties).
5.2 Le annotazioni
Le annotazioni costituiscono la base della struttura di versionamento dei documenti OOXML. Il termine fa riferimento ai diversi tipi di markup supplementare che possono essere memorizzati attorno o all'interno di una regione di
testo all'interno di un documento (es.: commenti, revisioni, errori grammaticali,
autorizzazioni, etc..)
All'interno di un documento, le annotazioni sono memorizzate in uno dei seguenti metodi:
29
•
Inline
•
Cross Structure
•
Proprietà
5.2.1
Annotazioni Inline
Le annotazioni inline descrivono tutte le annotazioni che non richiedono particolari accorgimenti al ne di mantenere la buona formattazione dell'XML
risultante dall'output del word processor.
In questi casi, un singolo elemento XML deve incapsulare l'intero contenuto del
documento che si sta annotando.
Esempio:
<w:p>
<w:r>
<w:t xml:space="preserve">The quick brown fox jumps over the </w:t>
</w:r>
<w:del ... >
<w:r>
<w:delText>lazy</w:delText>
</w:r>
</w:del>
<w:ins ... >
<w:r>
<w:t>jet lagged</w:t>
</w:r>
</w:ins>
<w:r>
<w:t xml:space="preserve"> dog.</w:t>
</w:r>
</w:p>
L'esempio descrive il change tracking di una modica: la parola lazy viene
sostituita da jet lagged. Gli elementi del e ins sono completamente incapsulati
all'interno delle loro rispettive annotazioni inline (<w:del ...> e <w:ins ...>)
Questa tipologia di annotazioni fa uso di una versione semplicata dell'approccio fragmentation.
La semplicazione deriva dal fatto che non sono presen-
ti, per specica, situazioni nelle quali i segmenti debbano essere ulteriormente
frammentati per mantenere la buona formattazione dell'XML.
5.2.2
Annotazioni Cross Structure
Le annotazioni Cross structure descrivono la classe di annotazioni che si può
estendere su altre porzioni di markup. In questi casi, la regione dell'annotazione
30
è delimitata da due elementi: un elemento di partenza (start-element) ed un
elemento di ne (end-element).
Un esempio:
<w:p>nagy
<w:r>
<w:t>Example</w:t>
</w:r>
<w:bookmarkStart w:id="0" w:name="sampleBookmark" />
<w:r>
<w:t xml:space="preserve"> text.</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>Example</w:t>
</w:r>
<w:bookmarkEnd w:id="0" />
<w:r>
<w:t xml:space="preserve"> text.</w:t>
</w:r>
</w:p>
Nell'esempio viene assegnato un segnalibro che si estende dalla seconda parola
del primo paragrafo alla prima parola del secondo praragrafo. Gli elementi vuoti
bookmarkStart e bookmarkEnd identicano la parte interessata dal segnalibro.
L'attributo w:id identico specica che si tratta di due elementi correlati.
Si può facilmente notare come questa tipologia di annotazioni applichi approccio
milestones.
5.2.3
Annotazioni di proprietà
Le annotazioni di proprietà sono la classe di annotazioni che sono memorizzate
come proprietà di un oggetto.
In questi casi, la semantica dell'annotazione è
denita dalla proprietà, che può inuire sul contenuto e/o sulla formattazione.
Un esempio:
<w:p>
<w:r>
<w:rPr>
<w:b/>
<w:rPrChange ... >
<w:rPr/>
</w:rPrChange>
</w:rPr>
<w:t>Example</w:t>
</w:r>
<w:r>
<w:t xml:space="preserve"> text.</w:t>
</w:r>
</w:p>
31
In questo caso è stata modicata una proprietà dei caratteri della parola Example, che diventa scritta in grassetto.
L'elemento rPrChange contiene l'insieme delle proprietà di revisione applicate
precedentemente ed associate ad un particolare autore in un particolare momento. E' memorizzato come una proprietà sul run padre che è stato modicato.
5.3 il supporto al change tracking e le tipologie di modica
Nella specica OOXML, il supporto al change tracking viene descritto come
un meccansimo per memorizzare informazioni in merito all'evoluzione del documento.
Quando un'applicazione aggiunge delle revisioni ad un documento
WordprocessingML, vengono generalmente memorizzati:
•
lo stato corrente del documento
•
lo stato iniziale del documento
Una revisione consiste di due speciche tipologie di informazione:
•
il tipo di modica (specicato tramite il nome dell'elemento di revisione)
•
un identicatore unico
•
l'autore della revisione (opzionale)
•
la date e l'ora della revisione (opzionale)
I tipi di modica possono essere i seguenti:
•
inserimenti
•
cancellazioni
•
spostamenti
•
modiche di attributi/proprietà
Ognuna di queste tipologie di modica possono essere applicate ai seguenti
contesti:
•
run
32
•
paragra
•
caratteri matematici
•
righe di tabelle
•
celle di tabelle (anche l'operazione di merge)
•
markup XML personalizzato
5.3.1
Inserimento di un run
L'elemento ins racchiude al proprio interno ciò che è stato aggiunto a del testo
esistente durante un'operazione tracciata come revisione.
Consideriamo un paragrafo di testo al quale è stata aggiunta una parola:
<w:p>
<w:r>
<w:t>Some</w:t>
</w:r>
<w:ins w:id="0" w:author="Joe Smith" w:date="2006-03-31T12:50:00Z">
<w:r>
<w:t>text</w:t>
</w:r>
</w:ins>
</w:p>
Nell'esempio, alla parola Some è stata aggiunta la parola text. Il risultato
è un paragrafo unico nel quale sono presenti due run, il secondo dei quali è un
inserimento tracciato dal change tracking con l'elemento ins.
Questo elemento fa uso della tipologia di annotazione inline, applicando quindi
l'approccio fragmentation
5.3.2
Cancellazione di un run
L'elemento del racchiude al proprio interno la parte di testo che è stata cancellata durante una revisione.
Esempio:
<w:p>
<w:r>
<w:t>Some</w:t>
</w:r>
<w:del w:id="0" w:author="Joe Smith" w:date="2006-03-31T12:50:00Z">
<w:r>
<w:delText>text</w:delText>
</w:r>
</w:del>
</w:p>
33
In questo esempio la parola text è stata cancellata, ed in eetti abbiamo un
paragrafo che racchiude al proprio interno un run ed un elemento del, all'interno
del quale si trova il testo cancellato.
Anche in questo caso, l'annotazione applicata è inline, utilizzando l'approccio
fragmentation. Viene anche fatta una sostituzione del tag w:t trasformandolo
in w:delText.
5.3.3
Spostamento di un run
Il change tracking di operazioni di spostamento dà luogo ad uno scenario più
complesso dei precedenti.
Le informazioni di un'operazione di spostamento da memorizzare sono:
•
Un insieme di frammenti di contenuto che sono stati mossi
•
un contenitore (o bookmark) sorgente e uno di destinazione. Questi contenitori specicano che tutto il contenuto al loro interno etichettato come
sorgente/destinazione è parte di una singola operazione di spostamento.
Gli 'attributi name nei due contenitori collegano un gruppo destinazione
al corrispondente gruppo sorgente.
Entrano in gioco 6 elementi, ovvero due coppie di milestone (moveFromRangeStart, moveFromRangeEnd, moveToRangeStart, moveToRangeEnd) e due elementi (moveTo e moveFrom).
Le coppie di milestone moveFromRangeStart/moveFromRangeEnd e moveToRangeStart/moveToRangeEnd specicano l'inizio e la ne dei contenitori, rispettivamente sorgente e destinazione, i cui contenuti sono parte di una singola
operazione di spostamento. Essi sono i contenitori.
Gli elementi moveFrom e moveTo, invece, racchiudono l'insieme di frammenti
oggetto dello spostamento dalla locazione di partenza (moveFrom) alla locazione
di destinazione (moveTo). Essi sono ciò che racchiude i frammenti di contenuto.
Vediamo un esempio:
<w:p>
<w:moveToRangeStart w:id="0" ... w:name="move1" />
<w:moveTo w:id="1" ... >
<w:r>
<w:t>Some moved text.</w:t>
</w:r>
</w:moveTo>
<w:moveToRangeEnd w:id="0" />
34
<w:r>
<w:t xml:space="preserve">Some text.</w:t>
</w:r>
<w:moveFromRangeStart w:id="2" ... w:name="move1" />
<w:moveFrom w:id="3" ... >
<w:r>
<w:t>Some moved text.</w:t>
</w:r>
</w:moveFrom>
<w:moveFromRangeEnd w:id="2" />
</w:p>
In questo esempio il run Some moved text. è stato spostato dalla parte nale
del paragrafo a quella iniziale.
Possiamo vedere la coppia di milestone moveToRangeStart/moveToRangeEnd
che racchiude un elemento moveTo contenente il testo spostato.
Nella zona
centrale del paragrafo vi è il run con il testo rimasto inalterato, seguito dalla
coppia moveRangeStart/moveRangeEnd e dall'elemento moveFrom.
Possiamo notare che vi è ripetizione del testo spostato, sia nella locazione di
destinazione (attiva) che nella locazione di partenza. Ciò sicuramente facilita
la visualizzazione dello spostamento sull'editor, ma è comunque discutibile per
quanto riguarda eventuali problematiche di allineamento tra le due porzioni di
testo.
Le annotazioni utilizzate nello spostamento di un run e, come vedremo, in tutti
gli altri spostamenti, sono di tipo cross structure per i container, e di tipo
inline per gli elementi moveTo/moveFrom.
L'approccio applicato è misto:
milestone e fragmentation.
5.3.4
Modica di attributi/proprietà di un run (run properties)
L'elemento rPrChange indica i dettagli di una revisione ad un insieme di proprietà di un run (elemento rPr).
Questo elemento permette di memorizzare:
•
l'insieme completo delle proprietà originali prima della modica apportata
•
le metainformazioni della modica (quando e da chi è stata apportata).
Vediamo un esempio:
35
<w:rPr>
<w:b/>
<w:i/>
<w:rPrChange w:id="0" w:date="01-01-2006T12:00:00" w:author="John Doe">
<w:rPr>
<w:i/>
</w:rPr>
</w:rPrChange>
</w:rPr>
Nell'esempio, John Doe ha modicato in data 01/01/2006 lo stile del paragrafo
da corsivo (italic) a grassetto (bold).
L'annotazione utilizzata è di tipo proprietà e l'approccio è fragmentation.
5.3.5
Inserimento di un paragrafo
L'operazione di inserimento di un paragrafo in realtà indica non tanto l'inserimento di contenuto (che generalmente fa riferimento alla nozione di run ) quanto
l'inserimento dello specico tag di delimitazione di un paragrafo (p ).
Questa informazione è codicata all'interno delle proprietà di paragrafo (rPr )
per mezzo dell'elemento ins.
L'elemento ins indica che, durante un'operazione soggetta a change tracking, il
tag del paragrafo che lo contiene è stato inserito.
Vediamo un esempio:
<w:p>
<w:pPr>
<w:rPr>
<w:ins w:id="0" ... />
</w:rPr>
</w:pPr>
<w:r>
<w:t>This is paragraph one.</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>This is paragraph two.</w:t>
</w:r>
</w:p>
Lo scenario è il seguente: abbiamo un paragrafo che contiene le seguenti frasi:
This is paragraph one.This is paragraph two.
36
Decidiamo di suddividere il paragrafo in due paragra, il primo contenente la
prima frase, il secondo contenente la seconda.
Questa modica viene tracciata creando un nuovo paragrafo ed inserendo, nelle
sue proprietà, l'elemento ins.
In questo caso l'annotazione utilizzata è di tipo proprietà, e l'approccio è frag-
mentation.
5.3.6
Cancellazione di un paragrafo
Come nel caso dell'inserimento, la cancellazione di un paragrafo non ha a che
fare con la cancellazione del contenuto (azione regolata dalle operazioni sui run),
ma del tag di delimitazione del paragrafo stesso.
Partendo dall'esempio del paragrafo precedente (5.3.5), cancelliamo il
paragrafo appena inserito. l'XML della modica è il seguente:
<w:p>
<w:pPr>
<w:rPr>
<w:del w:id="0" ... />
</w:rPr>
</w:pPr>
<w:r>
<w:t>This is paragraph one.</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>This is paragraph two.</w:t>
</w:r>
</w:p>
Ovvero il primo paragrafo, nelle sue proprietà, contiene l'elemento del, che lo
marca come cancellato, pertanto deve essere considerato tale a tutti gli eetti.
Anche in questo caso viene utilizzata un'annotazione di proprietà con approccio
fragmentation.
5.3.7
Spostamento di un paragrafo
Il meccanismo di spostamento dei paragra è simile al meccanismo di spostamento dei run (cfr. 5.3.3).
Come per le precedenti operazioni sui paragra, l'operazione di spostamento
non ha a che fare con lo spostamento di contenuto, ma solo con lo spostamento
dei tag che identicano un paragrafo.
37
Vi sono 6 elementi che entrano in gioco, ed in questo caso sono quattro coppie di milestone:
i contenitori moveFromRangeStart/moveFromRangeEnd,
moveToRangeStart/moveToRangeEnd e gli elementi (questa volta vuoti) moveFrom/moveTo.
Gli elementi vuoti moveFrom e moveTo sono tali in quanto, per lo spostamento
dei paragra, fa fede l'elemento rPr, ovvero proprietà di run, contenuto all'interno di pPr, ovvero proprietà di paragrafo, che ci comunica che la marcatura
di paragrafo (facente parte del contenuto) è stata spostata altrove.
Vediamo un esempio:
<w:moveFromRangeStart w:id="0" w:name="aMove"/>
<w:p>
<w:pPr>
<w:rPr>
<w:moveFrom w:id="1" ... />
</w:rPr>
</w:pPr>
...
</w:p>
</w:moveFromRangeEnd w:id="0"/>
....
<w:moveToRangeStart w:id="0" w:name="aMove"/>
<w:p>
<w:pPr>
<w:rPr>
<w:moveTo w:id="1" ... />
</w:rPr>
</w:pPr>
...
</w:p>
</w:moveToRangeEnd w:id="0"/>
Nell'esempio un paragrafo è stato spostato in basso nel documento. Nelle paragraph properties (elemento pPr) è presente un elemento rPr (run properties)
che indica che il paragrafo è stato mosso.
Non viene fatta alcuna menzione del contenuto del paragrafo, in quanto lo
spostamento riguarda esclusivamente la nozione di paragrafo. Nulla vieta che il
contenuto possa essere aggiunto in un momento successivo allo spostamento.
Lo spostamento di paragrafo utilizza annotazioni cross structure (per i contenitori) e proprietà (per gli elementi moveFrom/moveTo).
38
5.3.8
Modica di attributi/proprietà del paragrafo
Analogamente alla modica delle proprietà dei run (cfr.
5.3.4), anche per le
modiche alle proprietà dei paragra esiste un elemento apposito, rPrChange,
che permette di memorizzare:
•
l'insieme completo delle proprietà di paragrafo applicate precedentemente
alla modica
•
le metainformazioni della modica
Vediamone un esempio:
<w:pPr>
<w:jc w:val="center"/>
<w:pPrChange w:id="0" w:date="01-01-2006T12:00:00" w:author="John Doe">
<w:pPr/>
</w:pPrChange>
</w:pPr>
L'elemento pPrChange indica che John Doe, in data 01/01/2006 alle ore 12:00,
ha modicato le proprietà di paragrafo inserendo un allineamento centrato.
Non essendo menzionata alcuna proprietà nell'elemento pPr all'interno del pPrChange, si può concludere che non vi fossero proprietà pre-esistenti.
Questo è un classico caso di annotazione di proprietà con approccio fragmenta-
tion.
39
5.3.9
Inserimento di una cella di tabella
Le operazioni di inserimento di celle all'interno di tabelle sono identicate dall'elemento cellIns.
Vediamo un esempio:
<w:tbl>
...
<w:tr>
<w:tc>
<w:r>
<w:t>One</w:t>
</w:r>
</w:tc>
<w:tc>
<w:r>
<w:t>Two</w:t>
</w:r>
</w:tc>
<w:tc>
<w:tcPr>
<w:cellIns w:id="0" ... />
</w:tcPr>
<w:r>
<w:t>New</w:t>
</w:r>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:r>
<w:t>Three</w:t>
</w:r>
</w:tc>
<w:tc>
<w:r>
<w:t>Four</w:t>
</w:r>
</w:tc>
<w:tc>
<w:tcPr>
<w:cellIns w:id="1" ... />
</w:tcPr>
<w:r>
<w:t>New</w:t>
</w:r>
</w:tc>
</w:tr>
</w:tbl>
Vengono inserite due celle: la Two e la Four. Il sistema di revisione inserisce
il tag cellIns all'interno delle proprietà di cella (elemento tcPr).
In questo caso l'annotazione è di proprietà con approccio fragmentation.
40
5.3.10
Cancellazione di una cella di tabella
La cancellazione di celle ti tabella è indicata dall'elemento cellDel:
<w:tbl>
...
<w:tr>
<w:tc>
<w:r>
<w:t>One</w:t>
</w:r>
</w:tc>
<w:tc>
<w:tcPr>
<w:cellDel w:id="0" ... />
</w:tcPr>
<w:r>
<w:t>Two</w:t>
</w:r>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:r>
<w:t>Three</w:t>
</w:r>
</w:tc>
<w:tc>
<w:tcPr>
<w:cellDel w:id="1" ... />
</w:tcPr>
<w:r>
<w:t>Four</w:t>
</w:r>
</w:tc>
</w:tr>
</w:tbl>
Nell'esempio la prima cella è stata cancellata. Si può notare l'elemento cellDel
all'interno delle proprietà di cella (tcPr).
Anche in questo caso l'annotazione utilizzata è di proprietà con approccio frag-
mentation.
41
5.3.11
Unione di celle
L'operazione di unione di celle in OOXML riguarda esclusivamente l'unione
verticale (celle all'interno di una stessa colonna).
In un contesto di change
tracking, l'unione di due celle viene indicata tramite l'elemento cellMerge nella
seconda (e ultima) cella interessata.
Vediamo un esempio:
<w:tbl>
...
<w:tr>
<w:tc>
<w:r>
<w:t>One</w:t>
</w:r>
</w:tc>
<w:tc>
<w:r>
<w:t>Two</w:t>
</w:r>
</w:tc>
</w:tr>
<w:tr>
<w:tc>
<w:r>
<w:t>Three</w:t>
</w:r>
</w:tc>
<w:tc>
<w:tcPr>
<w:cellMerge w:id="0" w:vMerge="cont"/>
</w:tcPr>
<w:r>
<w:t>Four</w:t>
</w:r>
</w:tc>
</w:tr>
</w:tbl>
La tabella descritta nell'esempio è formata da due righe e due colonne. Nella
prima riga abbiamo le celle One e Two; nella seconda riga trovano posto le
celle Three e Four. Le celle Two e Four sono unite con un'operazione di
unione. All'interno delle proprietà di cella (tcPr) della cella Four si può notare
l'elemento cellMerge.
Il tipo di annotazione utilizzata è proprietà, con approccio fragmentation.
42
5.3.12
Inserimento di una riga di tabella
L'inserimento di una riga di tabella viene indicato tramite l'elemento ins, esattamente come succede per i run e i paragra.
Come succede per i paragra, anche in questo caso l'informazione riguardante
il change tracking dell'inserimento di riga riguarda esclusivamente la nozione di
riga stessa. Non vengono interessati in alcun modo i contenuti della riga e le
eventuali celle all'interno di essa, che devono essere trattati indipendentemente.
Vediamo un esempio:
<w:tbl>
...
<w:tr>
<w:tc>
<w:p/>
</w:tc>
<w:tc>
<w:p/>
</w:tc>
</w:tr>
<w:tr>
<w:trPr>
<w:ins w:id="0" ... />
</w:trPr>
<w:tc>
<w:p/>
</w:tc>
<w:tc>
<w:p/>
</w:tc>
</w:tr>
</w:tbl>
Nell'esempio abbiamo una tabella, originariamente composta da una sola riga,
alla quale viene aggiunta un'ulteriore riga.
Possiamo notare l'elemento ins
all'interno delle proprietà di riga (trPr).
L'annotazione utilizzata è di tipo di proprietà, con approccio fragmentation.
43
5.3.13
Cancellazione di una riga di tabella
La cancellazione di riga di una tabella segue lo stesso schema visto per i paragra ed i run. L'operazione viene identicata con la presenza dell'elemento del
all'interno delle proprietà della riga interessata.
Come per i paragra, l'operazione di cancellazione non ha alcun impatto sugli elementi contenuti all'interno della riga stessa, che dovranno essere eventualmente
trattati con opportune revisioni indipendenti.
Vediamo un esempio:
<w:tbl>
...
<w:tr>
<w:tc>
<w:p/>
</w:tc>
<w:tc>
<w:p/>
</w:tc>
</w:tr>
<w:tr>
<w:trPr>
<w:del w:id="0" ... />
</w:trPr>
<w:tc>
<w:p/>
</w:tc>
<w:tc>
<w:p/>
</w:tc>
</w:tr>
</w:tbl>
Specularmente all'esempio del paragrafo precedente, qui abbiamo una tabella
originariamente composta da due righe, l'ultima delle quali viene cancellata. Si
può apprezzare la presenza dell'elemento del all'interno delle proprietà (trPr)
dell'ultima riga.
Anche in questo caso l'annotazione utilizzata è di proprietà, e l'approccio è
fragmentation
5.3.14
Inserimento di XML custom
Lo standard OOXML permette l'inserimento di frammenti di XML arbitrario,
cosiddetto customXML.
Nel documento, i frammenti di XML arbitrario inseriti durante il tracciamento
delle modiche sono memorizzati tra due milestone: customXmlInsRangeStart
e customXmlInsRangeEnd.
44
Entrambi gli elementi sono identicati tramite un opportuno identicatore, e
non possono esistere l'uno senza l'altro pena la non conformità del documento.
Vediamo un esempio:
<w:p>
<w:customXml ... >
<w:customXmlInsRangeStart w:id="0" />
<w:customXml ... >
<w:r>
<w:t>Text.</w:t>
</w:r>
</w:customXml>
<w:customXmlInsRangeEnd w:id="0" />
</w:customXml>
<w:r>
<w:t>More text.</w:t>
</w:r>
</w:p>
Nell'esempio è stato inserito un frammento aggiuntivo di XML arbitrario.
Si
possono facilmente vedere le milestone di inizio e ne della regione oggetto
dell'inserimento.
Attenzione: anche in questo caso, come per i paragra, la memorizzazione del
change tracking si applica solo all'XML personalizzato, e non al suo contenuto
(il testo Text.).
L'annotazine utilizzata è di tipo cross structure, e l'approccio è milestone.
5.3.15
Cancellazione di XML custom
La cancellazione di un frammento di XML custom segue grossomodo la falsariga dell'inserimento. Abbiamo due milestone che identicano il frammento
cancellato, ovvero customXmlDelRangeStart e customXmlDelRangeEnd.
Vediamo l'esempio:
<w:p>
<w:customXmlDelRangeStart w:id="0" w:author="Devan" />
<w:customXml ... >
<w:customXml ... >
<w:del ... >
<w:r>
<w:delText>Text.</w:delText>
</w:r>
</w:del>
</w:customXml>
<w:customXmlDelRangeEnd w:id="0" />
</w:customXml>
<w:r>
<w:t>More text.</w:t>
</w:r>
</w:p>
45
Nell'esempio possiamo apprezzare una doppia cancellazione:
quella degli el-
ementi XML custom (identicata dalle due milestone) e la cancellazione del
testo contenuto in essi, applicando la cancellazione del run (elementi w:del e
w:deltext).
Il tipo di annotazione utilizzato per la cancellazione di XML custom è cross
structure. L'approccio è pertanto milestone.
5.3.16
Spostamento di XML custom
Come per lo spostamento di run e paragra, anche per l'XML custom si applica
grossomodo lo stesso metodo. Abbiamo due coppie di milestone, ovvero i contenitori moveFromRangeStart/moveFromRangeEnd, moveToRangeStart/moveToRangeEnd.
Contrariamente allo spostamento di run e paragra, non esistono gli elementi
moveFrom e moveTo.
Nel caso dello spostamento di XML custom, i contenitori si chiamano, rispettivamente: customXmlMoveFromRangeStart, customXmlMoveFromRangeEnd,
customXmlMoveToRangeStart, customXmlMoveToRangeEnd.
Vediamo un esempio:
dalla situazione iniziale:
<w:body>
<w:p/>
<w:customXml ... >
<w:p/>
</w:customXml>
<w:p/>
</w:body>
vogliamo spostare il secondo paragrafo alla ne del documento. Ecco il
risultato:
<w:body>
<w:p/>
<w:moveFromRangeStart w:id="0" w:name="move1" w:displacedByCustomXml="next"
w:author="Luna"/>
<w:customXmlMoveFromRangeStart w:id="1"/>
<w:customXml ... >
<w:p/>
</w:customXml>
<w:customXmlMoveFromRangeEnd w:id="1"/>
<w:moveFromRangeEnd w:id="0" w:displacedByCustomXml="prev"/>
<w:p/>
<w:moveToRangeStart w:id="2" w:name="move1" w:displacedByCustomXml="next"/>
<w:customXmlMoveToRangeStart w:id="3"/>
<w:customXml ... >
<w:p/>
</w:customXml>
<w:customXmlMoveToRangeEnd w:id="3"/>
<w:moveFromRangeEnd w:id="2" w:displacedByCustomXml="prev"/>
</w:body>
46
Si può notare non solo la struttura per il movimento dell'XML personalizzato, ma anche quella per il movimento del paragrafo in esso contenuto (elementi
moveFromRangeStart/moveFromRangeEnd e moveToRangeStart/moveToRangeEnd).
Anche per lo spostamento di XML custom viene utilizzata l'annotazione di tipo
cross structure. L'approccio è milestone.
5.3.17
Altre operazioni
La stessa tecnica descritta nei punti 5.3.1 e 5.3.5, ovvero la presenza di un
elemento ins all'interno delle proprietà dell'oggetto (un run, un paragrafo) viene
applicata anche ad altri contesti, ovvero:
•
agli inserimenti di caratteri matematici (l'elemento ins è all'interno delle
proprietà di controllo - ctrlPr)
•
agli inserimenti delle proprietà di numerazione (l'elemento ins è all'interno
dell'elemento numPr)
Anche le cancellazioni seguono lo stesso principio di quanto già enunciato ai
paragra 5.3.2 e 5.3.6. Ritroviamo la presenza dell'elemento del all'interno delle
proprietà dell'elemento da cancellare nei seguenti contesti:
•
cancellazioni di caratteri matematici (elemento del all'interno delle proprietà di controllo - ctrlPr)
47
6 Alcuni esempi in Open Document Format
Ecco alcuni esempi in Open Document Format, con alcune considerazioni.
I documenti sono stati prodotti utilizzando Open Oce 3.1, scompattando
il le .odt risultante, e aprendo il le content.xml.
Verranno riportate solo
le parti signicative del le, ovvero il contenuto dell'elemento body depurato
dell'elemento
<text:sequence-decls>.
Il testo utilizzato negli esempi è tratto da Flatlandia di Edwin A. Abbott,
nell'edizione Adelphi, XII ristampa (2003), ISBN: 88-459-0982-4 [6, 1]
6.1 Inserimento
Eettuiamo un semplice inserimento di un testo.
Prendiamo come esempio il primo paragrafo del capitolo 4 (pagina 41). Esso
recita:
Se i nostri acuminati Triangoli della Classe Militare sono pericolosi, se ne può facilmente dedurre che le nostre Donne lo sono
ancora di più.
Creiamo ora un documento senza le parole della Classe Militare (lo spazio
iniziale non è un refuso), ed aggiungiamo successivamente il testo mancante.
Il contenuto del le content.xml del testo prima dell'inserimento è:
<office:body>
<office:text>
<text:tracked-changes text:track-changes="true"/>
<text:p text:style-name="Standard">Se i nostri acuminati Triangoli sono pericolosi,
se ne può facilmente dedurre che le nostre Donne lo sono ancora di più.</text:p>
</office:text>
</office:body>
Nell'XML della nostra situazione di partenza si può vedere l'elemento che segnala l'attivazione della gestione del change tracking (<text:tracked-changes text:track-
changes="true"/>). Si può notare l'assenza della lista delle modiche.
Vediamo ora il contenuto del le xml dopo l'inserimento:
48
<office:body>
<office:text>
<text:tracked-changes>
<text:changed-region text:id="ct161242016">
<text:insertion>
<office:change-info>
<dc:creator>Alessio </dc:creator>
<dc:date>2010-02-02T00:24:00</dc:date>
</office:change-info>
</text:insertion>
</text:changed-region>
</text:tracked-changes>
<text:p text:style-name="Standard">Se i nostri acuminati Triangoli
<text:change-start text:change-id="ct161242016"/> della Classe Militare
<text:change-end text:change-id="ct161242016"/> sono pericolosi, se ne può facilmente dedurre
che le nostre Donne lo sono ancora di più.
</text:p>
</office:text>
</office:body>
Possiamo facilmente notare la lista delle modiche (elemento <text:trackedchanges>) contenente un riferimento (id=ct161242016) ed un elemento con le
metainformazioni della modica. Nel testo abiamo due milestone che identicano l'inizio e la ne del brano di testo inserito.
6.2 Cancellazione
Partendo dall'esempio precedente, proviamo a cancellare la parola ancora.
<office:body>
<office:text>
<text:tracked-changes>
<text:changed-region text:id="ct142829072">
<text:insertion>
<office:change-info>
<dc:creator>Alessio </dc:creator>
<dc:date>2010-02-02T00:24:00</dc:date>
</office:change-info>
</text:insertion>
</text:changed-region>
<text:changed-region text:id="ct149665840">
<text:deletion>
<office:change-info>
<dc:creator>Alessio </dc:creator>
<dc:date>2010-02-02T22:57:00</dc:date>
</office:change-info>
<text:p text:style-name="Standard">ancora</text:p>
</text:deletion>
</text:changed-region>
</text:tracked-changes>
<text:p text:style-name="Standard">Se i nostri acuminati Triangoli
<text:change-start text:change-id="ct142829072"/>
della Classe Militare<text:change-end text:change-id="ct142829072"/> sono pericolosi,
se ne può facilmente dedurre
che le nostre Donne lo sono <text:change text:change-id="ct149665840"/><text:s/>di più.</text:p>
</office:text>
</office:body>
Come si può facilmente notare, alla lista delle modiche si è aggiunta la cancellazione, con la milestone che ne identica la posizione.
49
6.3 Complichiamo un po' le cose: la cancellazione dentro
l'inserimento
Proviamo ora a cancellare i caratteri Militare dalla regione dell'inserimento
iniziale.
Questa modica deve essere apportata da un utente diverso dal precedente,
altrimenti possono esserci dei problemi (cfr. sez. 6.3.1).
Utilizziamo perciò un nuovo utente (Rita).
Riassumiamo la successione delle modiche:
•
Alessio inserisce i caratteri della Classe Militare
•
Alessio cancella i caratteri ancora
•
Rita cancella i caratteri Militare Questo è il risultato nale:
<office:body>
<office:text>
<text:tracked-changes>
<text:changed-region text:id="ct154835096">
<text:insertion>
<office:change-info>
<dc:creator>Alessio </dc:creator>
<dc:date>2010-02-02T00:24:00</dc:date>
</office:change-info>
</text:insertion>
</text:changed-region>
<text:changed-region text:id="ct160968456">
<text:deletion>
<office:change-info>
<dc:creator>Rita </dc:creator>
<dc:date>2010-02-03T00:15:00</dc:date>
</office:change-info>
<text:p text:style-name="Standard">Militare</text:p>
</text:deletion>
<text:insertion>
<office:change-info office:chg-author="Alessio " office:chg-date-time="2010-02-02T00:24:00"/>
</text:insertion>
</text:changed-region>
<text:changed-region text:id="ct160880080">
<text:deletion>
<office:change-info>
<dc:creator>Rita </dc:creator>
<dc:date>2010-02-03T00:15:00</dc:date>
</office:change-info>
<text:p text:style-name="Standard">
<text:s/>
</text:p>
</text:deletion>
</text:changed-region>
<text:changed-region text:id="ct154835504">
50
<text:deletion>
<office:change-info>
<dc:creator>Alessio </dc:creator>
<dc:date>2010-02-02T22:57:00</dc:date>
</office:change-info>
<text:p text:style-name="Standard">ancora</text:p>
</text:deletion>
</text:changed-region>
</text:tracked-changes>
<text:p text:style-name="Standard">Se i nostri acuminati Triangoli
<text:change-start text:change-id="ct154835096"/>
della Classe <text:change-end text:change-id="ct154835096"/>
<text:change text:change-id="ct160968456"/>
<text:change text:change-id="ct160880080"/>sono pericolosi, se ne può facilmente dedurre
che le nostre Donne lo sono <text:change text:change-id="ct154835504"/><text:s/>di più.</text:p>
</office:text>
</office:body>
Il risultato non è molto dissimile da quanto atteso: nella lista delle modiche
abbiamo tutti gli elementi che ci aspettavamo di avere, e nel testo abbiamo le
rispettive milestone che richiamano le modiche.
La cancellazione dei caratteri Militare da parte dell'utente Rita ha creato due
modiche: una con la parola Militare e una con lo spazio dopo di essa.
Una modica importante rispetto a quanto ci si poteva attendere è che la milestone del primo inserimento nisce dopo i caratteri Classe, subito dopo seguita
dalla milestone dell'utima cancellazione. In realtà sarebbe stato più corretto un
annidamento delle milestone, in quanto il testo cancellato era precedentemente
contenuto all'interno dei tag di inizio e ne dell'inserimento.
6.3.1
Problema (bug?) nella cancellazione con lo stesso utente
Come vediamo, apportando la cancellazione dei caratteri Militare dalla
regione dell'inserimento iniziale con lo stesso utente, si crea un problema:
questa modica non viene memorizzata correttamente, apparendo
semplicemente come se si trattasse di una cancellazione di uno spazio
(<text:s/>). Questo comportamento si verica con il client OpenOce.org 3.1
per Linux:
<office:body>
<office:text>
<text:tracked-changes>
<text:changed-region text:id="ct150743592">
<text:insertion>
<office:change-info>
<dc:creator>Alessio </dc:creator>
<dc:date>2010-02-02T00:24:00</dc:date>
</office:change-info>
</text:insertion>
</text:changed-region>
<text:changed-region text:id="ct156476480">
<text:deletion>
<office:change-info>
51
<dc:creator>Alessio </dc:creator>
<dc:date>2010-02-02T23:19:00</dc:date>
</office:change-info>
<text:p text:style-name="Standard">
<text:s/>
</text:p>
</text:deletion>
</text:changed-region>
<text:changed-region text:id="ct150742880">
<text:deletion>
<office:change-info>
<dc:creator>Alessio </dc:creator>
<dc:date>2010-02-02T22:57:00</dc:date>
</office:change-info>
<text:p text:style-name="Standard">ancora</text:p>
</text:deletion>
</text:changed-region>
</text:tracked-changes>
<text:p text:style-name="Standard">Se i nostri acuminati Triangoli
<text:change-start text:change-id="ct150743592"/>
della Classe <text:change-end text:change-id="ct150743592"/><text:change text:change-id="ct156476480"/>
sono pericolosi, se ne può facilmente dedurre
che le nostre Donne lo sono <text:change text:change-id="ct150742880"/><text:s/>di più.</text:p>
</office:text>
</office:body>
Ripetendo l'esperimento con Open Oce 3.1 per Windows XP, il risultato è
ancora dierente:
<office:body>
<office:text>
<text:tracked-changes>
<text:changed-region text:id="ct145865616">
<text:insertion>
<office:change-info>
<dc:creator>Alessio Rolfini</dc:creator>
<dc:date>2010-02-02T23:50:00</dc:date>
</office:change-info>
</text:insertion>
</text:changed-region>
<text:changed-region text:id="ct144154576">
<text:deletion>
<office:change-info>
<dc:creator>Alessio Rolfini</dc:creator>
<dc:date>2010-02-02T23:51:00</dc:date>
</office:change-info>
<text:p text:style-name="Standard">ancora</text:p>
</text:deletion>
</text:changed-region>
</text:tracked-changes>
<text:p text:style-name="Standard">Se i nostri acuminati Triangoli
<text:change-start text:change-id="ct145865616"/>
della Classe<text:change-end text:change-id="ct145865616"/> sono pericolosi, se ne può facilmente dedurre
che le nostre Donne lo sono <text:change text:change-id="ct144154576"/><text:s/>di più.</text:p>
</office:text>
</office:body>
Come si può vericare, risultano due sole operazioni di modica: un inserimento
(testo: della Classe - senza Militare), ed una cancellazione (ancora). Non vi
è traccia della successiva cancellazione, nè risulta dai timestamp un'operazione
successiva alla seconda operazione.
52
7 Alcuni esempi in OOXML
Nei paragra che seguono verranno presentati alcuni signicativi (benchè semplici) esempi in OOXML.
Le tipologie arontate saranno simili a quelle del capitolo precedente.
I documenti sono stati prodotti con Microsoft Oce 2007 Professional, scompattando il le .docx risultante ed aprendo il le document.xml.
Come nel capitolo precedente, verranno riportate solo le parti signicative del
documento, che, nel caso dell'OOXML, è il contenuto dell'elemento <w:body>
epurato della parte relativa alle proprietà di sezione (w:sectPr).
Una caratteristica molto interessante che emerge dai test è l'assenza dei costrutti
di spostamento, sostituiti dalla sequenza cancellazione/inserimento. Da notare
che, a livello di interfaccia, lo spostamento è segnalato come tale nchè il documento non viene chiuso e riaperto, dopodichè viene segnalato come cancellazione
e inserimento.
Questo comportamento di Oce 2007 è molto signicativo, in quanto diminuisce
sensibilmente la complessità dei documenti prodotti, limitando di molto la
presenza di annotazioni di tipo cross structure.
7.1 Inserimento
Ripetiamo l'inserimento visto nel capitolo precedente. Creiamo un documento
contenente il seguente testo:
Se i nostri acuminati Triangoli sono pericolosi, se ne può facilmente
dedurre che le nostre Donne lo sono ancora di più.
Attiviamo il tracciamento delle revisioni, ed aggiungiamo il testo mancante,
ovvero: della Classe Militare.
Il documento iniziale è il seguente:
<w:body>
<w:p w:rsidR="00812D79" w:rsidRDefault="00935D88">
<w:r>
<w:t>Se i nostri acuminati triangoli sono pericolosi, se ne può facilmente dedurre che le nostre Donne lo sono anco
</w:r>
</w:p>
</w:body>
53
Si può notare il paragrafo, il run, ed il testo in esso contenuto.
Ora apportiamo la modica:
<w:body>
<w:p w:rsidR="00812D79" w:rsidRDefault="00935D88">
<w:r>
<w:t>Se i nostri acuminati triangoli</w:t>
</w:r>
<w:ins w:id="0" w:author="Alessio" w:date="2010-03-07T23:44:00Z">
<w:r w:rsidR="00185E09">
<w:t xml:space="preserve"> della Classe Militare</w:t>
</w:r>
</w:ins>
<w:r>
<w:t xml:space="preserve"> sono pericolosi, se ne può facilmente dedurre che le nostre Donne lo sono ancora di più.
</w:r>
</w:p>
</w:body>
Qui possiamo vedere il tag w:ins all'interno del paragrafo, che indica che in
data 07/03/2010 è stato inserito dall'autore Alessio un nuovo run contenente
il testo della Classe Militare. Il run successivo riporta semplicemente la parte
di testo seguente.
7.2 Cancellazione
Partendo dall'esempio precedente, dopo l'inserimento proviamo a cancellare la
parola ancora. Questo è il risultato:
<w:body>
<w:p w:rsidR="00812D79" w:rsidRDefault="00935D88">
<w:r>
<w:t>Se i nostri acuminati triangoli</w:t>
</w:r>
<w:ins w:id="0" w:author="Alessio" w:date="2010-03-07T23:44:00Z">
<w:r w:rsidR="00185E09">
<w:t xml:space="preserve"> della Classe Militare</w:t>
</w:r>
</w:ins>
<w:r>
<w:t xml:space="preserve"> sono pericolosi, se ne può facilmente dedurre che le nostre Donne lo sono </w:t>
</w:r>
<w:del w:id="1" w:author="Alessio" w:date="2010-03-07T23:55:00Z">
<w:r w:rsidDel="00EC42C4">
<w:delText>ancora</w:delText>
</w:r>
</w:del>
<w:r>
<w:t xml:space="preserve"> di più.</w:t>
</w:r>
</w:p>
</w:body>
Abbiamo sempre l'XML dell'inserimento precedente, ma, in aggiunta ad esso,
abbiamo un elemento di cancellazione w:del che contiene un run con il testo
cancellato. Segue la parte non toccata dalle modiche.
54
7.3 Cancellazione da parte di altri utenti
Introduciamo un livello di complessità aggiuntivo:
a partire dall'esempio del
paragrafo 7.1 proviamo a cancellare i caratteri Militare dalla regione dell'inserimento precedente.
Questa operazione verrà fatta con un nuovo utente
(Alice).
Vediamo i passi:
•
Alessio inserisce i caratteri della Classe Militare
•
Alessio cancella i caratteri ancora
•
Alice cancela i caratteri Militare Ecco l'XML risultante:
<w:body>
<w:p w:rsidR="00812D79" w:rsidRDefault="00935D88">
<w:r>
<w:t>Se i nostri acuminati triangoli</w:t>
</w:r>
<w:ins w:id="0" w:author="Alessio" w:date="2010-03-07T23:44:00Z">
<w:r w:rsidR="00185E09">
<w:t xml:space="preserve"> della Classe </w:t>
</w:r>
<w:del w:id="1" w:author="Alice" w:date="2010-03-08T00:04:00Z">
<w:r w:rsidR="00185E09" w:rsidDel="00CC0793">
<w:delText>Militare</w:delText>
</w:r>
</w:del>
</w:ins>
<w:r>
<w:t xml:space="preserve"> sono pericolosi, se ne può facilmente dedurre che le nostre Donne lo sono </w:t>
</w:r>
<w:del w:id="2" w:author="Alessio" w:date="2010-03-07T23:55:00Z">
<w:r w:rsidDel="00EC42C4">
<w:delText>ancora</w:delText>
</w:r>
</w:del>
<w:r>
<w:t xml:space="preserve"> di più.</w:t>
</w:r>
</w:p>
</w:body>
Qui non vi è nessuna sorpresa: all'interno dell'elemento w:ins viene inserito un
nuovo elemento w:del con la cancellazione di Alice.
Il resto del documento è
immutato.
Un'osservazione che può essere fatta è che il documento risulta leggermente più
snello e leggibile del suo omologo in ODT.
55
7.4 Inserimento di paragrafo
Testiamo ora l'inserimento di paragrafo.
Partendo dalla situazione iniziale del paragrafo 7.1, inseriamo due paragra
vuoti: uno in testa al documento, uno in coda.
Ecco il documento dopo l'operazione:
<w:body>
<w:p w:rsidR="00E50517" w:rsidRDefault="00E50517">
<w:pPr>
<w:rPr>
<w:ins w:id="0" w:author="Alice" w:date="2010-03-08T00:56:00Z"/>
</w:rPr>
</w:pPr>
</w:p>
<w:p w:rsidR="00812D79" w:rsidRDefault="00935D88">
<w:pPr>
<w:rPr>
<w:ins w:id="1" w:author="Alice" w:date="2010-03-08T00:56:00Z"/>
</w:rPr>
</w:pPr>
<w:r>
<w:t>Se i nostri acuminati triangoli sono pericolosi, se ne può facilmente dedurre che le nostre Donne lo sono anco
</w:r>
</w:p>
<w:p w:rsidR="00E50517" w:rsidRDefault="00E50517"/>
</w:body>
Il primo paragrafo è segnalato come inserito da Alice; il secondo paragrafo
dovrebbe essere immutato, ed in eetti il suo id corrisponde all'originale (id:
00812D79). Tuttavia viene segnalato anch'esso come inserito da Alice. E' poi
presente un paragrafo vuoto nale che ha l'id corrispondente al primo. Si tratta
sicuramente del segno di chiusura del paragrafo iniziale.
La rappresentazione nell'interfaccia ha questo schema:
•
il primo segno di paragrafo viene segnalato come inserimento, ed è in rosso.
Questo è corretto, infatti è un nuovo paragrafo.
•
il secondo segno di paragrafo è segnalato come pre-esistente, ed è in nero.
Questo è corretto, è il segno di paragrafo che precede il testo.
•
il terzo segno di paragrafo, subito dopo il testo, è segnalato come nuovo
inserimento, ed è in rosso
•
il quarto segno di paragrafo è segnalato come pre-esistente, quindi nero.
L'operazione di inserimento del secondo paragrafo dopo il testo, nell'interfaccia,
fa spostare il carattere speciale di paragrafo pre-esistente alla ne del documento, inserendo, tra esso ed il testo, un nuovo carattere di paragrafo rosso (quindi,
nuovo inserimento).
56
7.5 Spostamento di paragrafo vuoto
Veniamo ora agli spostamenti. Come anticipato precedentemente, le strutture di
spostamento della specica, con i loro container ed elementi moveFrom/moveTo,
sono sostituite dalla sequenza cancellazione/inserimento.
Proviamo ad eettuare lo spostamento del primo segno di paragrafo (vuoto)
dell'esempio precedente.
Ecco l'XML risultante:
<w:body>
<w:p w:rsidR="00812D79" w:rsidRDefault="00935D88">
<w:pPr>
<w:rPr>
<w:ins w:id="0" w:author="Alice" w:date="2010-03-08T00:56:00Z"/>
</w:rPr>
</w:pPr>
<w:r>
<w:t>Se i nostri acuminati triangoli sono pericolosi, se ne può facilmente dedurre che le nostre Donne lo sono anco
</w:r>
</w:p>
<w:p w:rsidR="00B5562F" w:rsidRDefault="00B5562F" w:rsidP="00B5562F">
<w:pPr>
<w:rPr>
<w:ins w:id="1" w:author="Alice" w:date="2010-03-08T00:58:00Z"/>
</w:rPr>
</w:pPr>
</w:p>
<w:p w:rsidR="00E50517" w:rsidRDefault="00E50517"/>
</w:body>
Il primo segno di paragrafo è stato cancellato.
Ci si aspetterebbe di trovarlo
inserito in fondo, tuttavia, trattandosi di un paragrafo vuoto, seguendo il comportamento dell'applicazione nel caso precedente, può essere dedotto il fatto che
il segno venga collassato nell'elemento di chiusura corrispondente, che si trova
alla ne del documento.
7.6 Spostamento di un run
Lo spostamento di un run non segue la specica, venendo tradotto in un'operazione di cancellazione/inserimento.
Proviamo a spostare la parola facilmente dalla metà circa del testo ad un
punto successivo.
Questo è il risultato:
57
<w:body>
<w:p w:rsidR="00812D79" w:rsidRDefault="00935D88">
<w:r>
<w:t xml:space="preserve">Se i nostri acuminati triangoli sono pericolosi, se ne può </w:t>
</w:r>
<w:del w:id="0" w:author="Alice" w:date="2010-03-08T00:50:00Z">
<w:r w:rsidDel="00D552C1">
<w:delText xml:space="preserve">facilmente </w:delText>
</w:r>
</w:del>
<w:r>
<w:t xml:space="preserve">dedurre che le nostre Donne lo sono </w:t>
</w:r>
<w:ins w:id="1" w:author="Alice" w:date="2010-03-08T00:50:00Z">
<w:r w:rsidR="00D552C1">
<w:t xml:space="preserve">facilmente </w:t>
</w:r>
</w:ins>
<w:r>
<w:t>ancora di più.</w:t>
</w:r>
</w:p>
</w:body>
E' presente una cancellazione (elemento w:del ) di caratteri facilmente ed un
inserimento degli stessi in un punto successivo (elemento w:ins ). Si può notare
che il codice del run spostato è identico in entrambe le operazioni (00D552C1),
e questo le mette in relazione, così come gli id progressivi (<w:del w:id=0 ...>
e <w:ins w:id=1...>).
58
Riferimenti bibliograci
[1] art. 70, legge 22 aprile 1941 n. 633 - legge sul diritto d'autore.
[2] Ecma international web site - www.ecma-international.org.
[3] Open xml white paper.
[4] Tei - text encoding initiative - p5: Guidelines for electronic text encoding and interchange - chapter 20 http://www.tei-c.org/release/doc/tei-p5doc/en/html/nh.html.
[5] Tei - text encoding initiative web site http://www.tei-c.org/index.xml,
2009.
[6] Edwin A. Abbott. Flatlandia. Adelphi edizioni, xii edition, 2003.
[7] Claus HuitFeldt C. M. Sperberg-McQueen. Goddag: A data structure for
overlapping hierarchies. Proc. of DDEP/PODDP, pages 139160, 2000.
[8] Angelo Di Iorio, Silvio Peroni, and Fabio Vitali. Taming wild overlaps in a
disciplined way with earmark. 2010.
[9] ECMA International.
Oce Open XML - Part 1:
Fundamentals And
Markup Language Reference, in Standard ECMA-376, Second Edition Oce Open XML File Format, second edition, December 2008.
[10] Paolo Marinelli, Fabio Vitali, and Stefano Zacchiroli. Towards the unication of formats for overlapping markup. New Rev. Hypermedia Multimedia,
14(1):5794, 2008.
[11] OASIS - Organization for the Advancement of Structured Information
Standards.
ument)
Open Document Format for Oce Applications (OpenDoc-
v1.1
http://docs.oasis-open.org/oce/v1.1/OS/OpenDocument-
v1.1-html/OpenDocument-v1.1.html, 1.1 edition, 2007.
[12] OASIS Committee.
RELAX NG Specication http://relaxng.org/spec-
20011203.html, 12 2001.
[13] Jeni Tennison. Representing overlap in xml. Article from Jeni's Musings
blog: http://www.jenitennison.com/blog/node/97, 2008.
59