Editor rückgängig wiederherstellen effizient lösen
Henry
- javascript
Hallo,
das Forum hier hat ja glücklicherweise eine Wiederherstellungsoption für das zuletzt geschriebene. So was in der Art habe ich auch probiert, nur gefällt mir mein Lösungsweg noch nicht so ganz.
Ich speichere einfach alles im Textfeld bei jeder noch so kleinen Eingabe komplett ab. Bedeutet dadurch ewig langen Text, bei dem vielleicht nur 2 Wörter geändert sind hat dann (Anzahl Buchstaben/Leerzeichen/etc.)*gespeicherte Versionen = viel Ballast.
Meine Vorstellung war jetzt ob ich das anders angehen kann. Irgendeine Möglichkeit nur die Differenz zu speichern und auch so wieder herzustellen. Einzige Lösung die mir im Moment dazu einfällt, wäre jede Stelle im Dokument Positionsbestimmung zu betreiben und Änderungen nur dort einsetzen. Denke aber, ohne es versucht zu haben, zu aufwendig und zu unflexibel.
Hier gibts doch die Versionsansicht bei den Posts, wie ist das gelöst (falls nicht serverseitig), wäre da vielleicht ein Ansatz für mich zu finden?
Nachtrag: Ich meine natürlich eine Rückgängigoption für viele Schritte nicht nur die letzte Aktion, falls das missverständlich gewesen ist.
Gruss
Henry
Hallo
das Forum hier hat ja glücklicherweise eine Wiederherstellungsoption für das zuletzt geschriebene. So was in der Art habe ich auch probiert, nur gefällt mir mein Lösungsweg noch nicht so ganz.
Ich speichere einfach alles im Textfeld bei jeder noch so kleinen Eingabe komplett ab. Bedeutet dadurch ewig langen Text, bei dem vielleicht nur 2 Wörter geändert sind hat dann (Anzahl Buchstaben/Leerzeichen/etc.)*gespeicherte Versionen = viel Ballast.
Die Argumentation verstehe ich nicht. Du willst einen Text zwischenspeichern und beschwerst dich über den Umfang des Texts? Der Text ist doch jeweils nur einmal in seinem gegenwärtig abgespeicherten Zustand da oder speicherst du alle Versionen?
Meine Vorstellung war jetzt ob ich das anders angehen kann. Irgendeine Möglichkeit nur die Differenz zu speichern und auch so wieder herzustellen. Einzige Lösung die mir im Moment dazu einfällt, wäre jede Stelle im Dokument Positionsbestimmung zu betreiben und Änderungen nur dort einsetzen. Denke aber, ohne es versucht zu haben, zu aufwendig und zu unflexibel.
Hier gibts doch die Versionsansicht bei den Posts, wie ist das gelöst (falls nicht serverseitig), wäre da vielleicht ein Ansatz für mich zu finden?
Soweit ich weiß, ist die Versionsansicht serverseitig gelöst. Sie zeigt ja auch nur Versionen der Postings an, die tatsächlich serverseitig gespeichert wurden und nicht Zwischenstände bei der Erstellung von Postings (die ihrerseits im LocalStorage des Browsers landen).
Nachtrag: Ich meine natürlich eine Rückgängigoption für viele Schritte nicht nur die letzte Aktion, falls das missverständlich gewesen ist.
Ah ja. Also doch jeden Zustand im Entstehungsprozess eines Textes.
Tschö, Auge
Nun, wenn Du meinst, dass das Speichern der gesamten Texte zu viel des Guten ist, dann speichere jeweils den Startzustand, die Änderungen zwischen den Versionen. Die letzte Version hast Du in der Textaerea...
https://developer.aliyun.com/mirror/npm/package/diff-match-patch
Hallo Raketenwilli,
Nun, wenn Du meinst, dass das Speichern der gesamten Texte zu viel des Guten ist, dann speichere jeweils den Startzustand, die Änderungen zwischen den Versionen. Die letzte Version hast Du in der Textaerea...
das wäre ja auch meine Wunschvorstellung. Die frage bleibt aber wie bekomme ich dann die Änderungsschnipsel wieder da zurück wo sie hingehören.
https://developer.aliyun.com/mirror/npm/package/diff-match-patch
Ein interessanter Link. Sah auf den ersten Blick zu komplziert aus, vor allem weil auch wieder dieses ganze GitHub Gedönse, aber glücklicherweise ein paar ausführbare Demos dabei, die doch die Einfachheit zeigten. Nicht schlecht, einzig das Problem bleibt, die Zwischenspeicherung wieder einzuspielen. Schau ich mir aber noch genauer an.
Gruss
Henry
Hallo Henry,
das interessanteste an dem Link ist der Link darin, auf https://github.com/google/diff-match-patch
Dort findest Du im JavaScript Ordner eine .js Datei, und nicht das ganze NPM Geraffel drumherum. Wenn NPM in deinen Toolstack passt, okay, andernfalls nimm lieber direkt die Quelle.
Rolf
das wäre ja auch meine Wunschvorstellung. Die frage bleibt aber wie bekomme ich dann die Änderungsschnipsel wieder da zurück wo sie hingehören.
zu diff
gehört patch
.
Mit diff
bekommt man die Änderungen an einer Datei:
Die Datei v1 enthalte:
Oma
Opa
Papa
Die Datei v2 enthalte:
Oma
Mama
Papa
Opa
Ich lege die Differenz-Datei an:
diff v1 v2 > v1_to_v2.patch
v1_to_v2.diff enthält jetzt (Hier werden ein paar Zeilenumbrüche zu viel dargestellt...)
2c2
< Opa
---
> Mama
3a4
> Opa
Ich stelle die zweite Version aus der ersten und dem Patch neu her:
patch -o v2.neu v1 v1_to_v2.patch
v2.neu enthält jetzt:
Oma
Mama
Papa
Opa
Das entspricht dem Original. Ich könnte also die Datei v2 löschen, weil ich diese Datei jederzeit wieder herstellen kann.
Das Javascript-Zeug macht das ebenso - nur eben mit dem Inhalt von Variablen.
Du musst halt den Vorgang so oft wie nötig wiederholen.
Hallo Henry,
Christian macht für die Wiederherstellung genau das: den Inhalt der Textarea in den localStorage legen. Aber immer nur den aktuellen Stand. Niemand schreibt hier Romane in einen Beitrag (der Text ist auch limitiert; wenn die Farbgebung des Zeichenzählers oben die Wahrheit sagt, muss die Länge eines Texts unter 0x3000 liegen, also maximal 12287 Zeichen).
Einen String dieser Länge in den localStorage zu kopieren ist gar nichts.
Die letzten 5 Versionen eines solchen Strings in den localStorage zu schreiben ist ebenfalls gar nichts.
Anders sieht es aus, wenn ich ein Forum mit vielen tausend Beiträgen habe und die Beiträge versionieren möchte. Das ist dann auch eine andere Aufgabenstellung mit anderen Anforderungen an Datenvolumen, Permanenz der Speicherung und Verarbeitungsdauer, und dafür wird sicherlich ein diff-Tool zum Einsatz kommen. Vielleicht sogar ein Kompressionstool, entweder selbst aufgerufen oder als interne Funktion der DB.
Wieder anders sieht es in einer Textverarbeitung aus. Da kann ein Dokument schnell mal viele MB groß sein, und man möchte möglicherweise 1000 UNDO-Schritte speichern. Oder einfach alle, seit dem Öffnen des Dokuments, bis der RAM voll ist. Da kann man keine vollständigen Snapshots machen, es ist auch nicht sinnvoll. Die meisten Änderungen in einer Textverarbeitung sind ja sehr lokal und bestehen zumeist aus der Eingabe eines einzigen Zeichens. In solchen Fällen speichert die Textverarbeitung nur kurze Infos darüber, was sie am Text geändert hat, und zwar nicht per stumpfem DIFF, sondern unter Ausnutzung ihres Wissens darüber, was sie gerade getan hat. Jede Operation, die in der Textverarbeitung ausgeführt wird, weiß was sie tut, und weiß, wie das rückgängig zu machen ist. Man kann also pro Änderung eine passende und kompakte Undo-Information auf den Undo-Stack legen. Dafür eine passende Datenstruktur zu finden ist gar nicht so einfach, in dieser struct muss mit jedem Bit gegeizt werden, denn wenn ich 10.000 Zeichen schreibe, möchte ich ja nicht 200.000 Bytes Undo-Informationen mit mir herumschleppen. Ich brauche also eine Variantenstruktur mit variabler Größe, damit der Großteil der Undo-Infos mit einigen wenigen Bytes auskommt. Wird dann ein Undo-Schritt durchgeführt, weiß die Textverarbeitung ebenfalls, was sie gerade tut, und kann auch dafür eine Undo-Information erstellen und auf den Redo-Stack schieben.
Rolf
Hallo Rolf,
Christian macht für die Wiederherstellung genau das: den Inhalt der Textarea in den localStorage legen. Aber immer nur den aktuellen Stand.
genau, das dachte ich mir.
Einen String dieser Länge in den localStorage zu kopieren ist gar nichts.
stimmt auch 10,100..300.. nur irgendwann summiert sich das natürlich
Die letzten 5 Versionen eines solchen Strings in den localStorage zu schreiben ist ebenfalls gar nichts.
yep.
..., und dafür wird sicherlich ein diff-Tool zum Einsatz kommen.
also kaum nur mit JS zu lösen(?|!).
Wieder anders sieht es in einer Textverarbeitung aus. Da kann ein Dokument schnell mal viele MB groß sein, und man möchte möglicherweise 1000 UNDO-Schritte speichern.
Das ist der Grundgedanke. Erklärt aber auch warum viele Onlineeditoren wie w3schools und ja sogar Software wie IrfanView(obwohl eigentlich nicht bei so einem beliebten Programm) auf Multibackwardforward-Optionen verzichten.
Na ja, danke euch für die Infos.
Ich behelfe mir jetzt erst mal so, dass ich die Anzahl der Schritte begrenze, funktioniert auch ganz gut bisher. Habe nur noch eine Überlegung, viele Sachen die Copy&Paste sind, sind zum Glück ja ein einziger Schrit, während jeder einzelne Tastaturklick ein Redosave auslöst. Daher frage ich mich jetzt ob ich was basteln könnte wie oninput_save_only_after_20_clicks() ohne dass es sich mit grösseren Textabschitten ins Gehege kommt.. hmmm… ich spinne den Gedanken mal weiter…
Gruss
Henry