Add Operational Transformation for the Draft.js Editor, experimentation #1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Voici une implémentation d'Operational Transformation basé sur Draft.
Il y a deux fichiers pour réaliser l'OT:
diffContentStateText
qui ne fait qu'une OT textuelle, avecjsdiff
diffContentStateStyle
qui est juste le début de la génération de l'OT avec Text, Styles et Entities, j'y reviens à la fin ( piste Proposition 2, Proposition 1 étant celle à tester en premier )Inclus dans ce code
EditorInput
démontrant comment mettre en place Draft.js avec Redux, le debounce est ici pour conserver une UX performante ( 500ms est élevé mais la sérialisation du state partransit
est très consommateur, je n'ai pas creusé encore pour l'améliorer)EditorLogger
qui est un composant non graphique permettant de logger les modifications apporter à l'éditeurAction
etReducer
pour redux qui facilite l'application de l'OT est les futures évolutionsRichUtils
pour modifier le style du textediffContentStateText
pour valider son bon fonctionnementAméliorations possibles:
transit
et ce qui impacte autant les perfsRéférences:
Voici deux pistes pour réaliser l'OT avec des attributes comme le style ou les entities:
Proposition 1: Composition d'une OT textuelle et d'une OT sur les attributs
previousContentState
etcontentState
previousContentState
previousContentState
etcontentState
Proposition 2: Introduire une structure de donnée pour faire un diff dessus
Réflexion
Pour suivre le model de Draft.js qui est puissant, il faut une structure de données solide embarquant
Block
,CharacterList
,Style
,Entities
. Alors, il est facile et performant de réaliser une génération d'OT complète et évolutive. Celle-ci pourra ensuite être converti dans le format d'OT choisi pour le transport entre clients.Cheers mate 🍻