18

Le FAQ del protocollo Google Wave affermano che [HTML] "non ha proprietà desiderabili" e che "HTML rende OT (Operational Transforms) difficile se non impossibile" [1]. Perché è così? Quali problemi sorgono se HTML viene trattato semplicemente come testo semplice e quindi applicato OT?La trasformazione operativa funziona su documenti strutturati come HTML se viene semplicemente trattata come testo normale?

  1. http://www.waveprotocol.org/faq#TOC-What-s-the-XML-schema-for-waves-Why

risposta

5

Non ho una risposta completa, ma io sono interessato a vedere più lavoro fatto per rendere esistenti open source librerie di trasformazione operative lavorano con il testo ricco, quindi mi contribuire ciò Lo so.

L'importante differenza tra HTML e lo schema Wave sembra essere il modo in cui viene formattata la formattazione del testo: una gerarchia di tag nidificati per le annotazioni HTML rispetto a quelle fuori banda (nel footer del documento) con intervalli per Wave XML . Le annotazioni fuori banda sono probabilmente un modo più naturale per contrassegnare la formattazione del testo poiché consentono di sovrapporre i formati (non annidati). Esso permette qualcosa di simile (in pseudo-markup), che non sarebbe XML valido usando la rappresentazione nidificato:

(b) This is bold (i) while this range is both bold and italic (/b) and this last bit is just italic (/i)

correlate, qui è la relevant issue nel progetto ShareJS. Forse possono implementare il supporto del testo avanzato adottando parte dello schema Wave XML.

+1

+1 per la [discussione ShareJS] (https://github.com/josephg/ShareJS/issues/1)! – mb21

16

Presumo qui comprendi le basi di OT. Il principale problema nel fare OT su HTML come testo semplice è quello di unire tag html. Come semplice esempio, dire che abbiamo avuto un documento come segue:

Hello world 

Alice decide allora che il mondo dovrebbe essere in grassetto:

Hello <b>world</b> 

Questo può essere rappresentato con un'operazione di doppio inserto in OT, schematicamente :

Edit A: Keep 6 : Insert "<b>" : Keep 5 : Insert "</b>" 

Se Bob ha deciso che 'mondo' dovrebbe essere in corsivo prima di vedere di modifica di Alice, aggiungeva l'operazione

Edit B: Keep 6 : Insert "<i>" : Keep 5 : Insert "</i>" 

Se il server ha ricevuto la modifica di Bob dopo quella di Alice, sarebbe necessario trasformare B contro A per diventare B '.

Le istruzioni Keep sono invariate tramite la trasformazione, ma Inserisci "" trasformato su Inserisci "" può diventare Keep 3: Insert "" o Insert "": Keep 3. Generalmente il server verrà configurato per inserire la modifica successiva dopo la prima modifica.

Edit B': Keep 6 : Keep 3 : Insert "<i>" : Keep 5 : Keep 3 : Insert "</i>" 

Qui il problema diventa ovvio. L'applicazione di A allora B' alla stringa originale dà l'html non valido:

Hello <b><i>world</b></i> 

Teoricamente questo potrebbe essere risolto variando inserti pre e post, ma questo sarebbe ottenere peloso per gli esempi più complessi, potenzialmente coinvolge una scansione documento completo per ogni trasformazione

Come notato nell'altra risposta, questo pasticcio può essere evitato usando annotazioni fuori banda + testo normale.Un altro approccio che ho visto solo finora in pubblicazioni accademiche è quello di trattare la struttura XML come un albero con le operazioni di OT per il nodo aggiunta, l'eliminazione, ad esempio:

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.100.74

+1

Immagino che il problema fondamentale qui sia che con inserimenti simultanei, il risultato finale può sempre essere semanticamente scorretto, ma con il caso di XML/HTML, il risultato finale può essere sintatticamente errato. L'uso delle annotazioni non fa nulla per alleviare l'incoerenza semantica, ma assicura che la trasformazione produrrà XML/HTML valido e come tale può sempre essere ben rappresentato. Grazie. – Nakedible

+0

Assolutamente giusto – jazmit

1

ci sono approaches in OT che supportano SGML (superset di XML), ma non ci sono implementazioni. Pertanto, non è impossibile! Però, sono d'accordo, OT non è l'approccio migliore per abilitare XML. Questo perché OT è stato progettato per strutture dati lineari. Ma HTML/XML è molto più complesso: ha attributi ed è costruito come un albero. Il fatto che sia un albero è risolvibile, ma gli attributi - che sono realizzati come un array associativo ordinato - non sono supportati da OT. Semplicemente perché gli array associativi non sono supportati da OT (al momento). L'approccio sopra in realtà raccomanda di trattare gli attributi come una stringa: E.g. "id = 'myid' value = 'mystuff'" Ma puoi facilmente interrompere l'intera sintassi della tua 'attributes-string', quando un utente elimina tutti gli attributi, e un altro inserisce un "carattere direttamente dopo" mystuff ". . potrebbe risolvere in qualche tag div che assomiglia a questo <div ">, che non è la sintassi valida

Forse questo ti interessa:

CEFX è un progetto che mira a supportare XML - è morto a mia conoscenza, ma che utilizza. un approccio OT Per qualche motivo non è possibile modificare gli elementi xml solo stringa.

L'SDK Drive di Google supporta strutture di dati simili a grafi, ma è proprietario e nobile sai come funziona

Sto sviluppando un framework che supporta strutture di dati arbitrarie. Attualmente sono supportati testo, JSON, XML e HTML. Ha un approccio diverso: verificarlo: Yatta!

BTW: Ciò che il protocollo Wave e Eric Drechsel descritto è noto come Annotazioni in OT. È comunemente sfruttato per supportare il rich text.

Problemi correlati