Zaphod - Ein mehrbenutzerfähiger Texteditor

Max Maischein

Frankfurt.pm

Motivation

  • PerlMonks

  • irc

  • PasteBot

  • Kollaboration

Prior Art / Vorgänger

Hydra / SubEthaEdit

  • nur für OSX

  • mittlerweile Bezahlsoftware

  • keine Plug-Ins für vi oder Emacs

Eigene Lösung

Lösungsansatz Perl+JavaScript+HTML

JavaScript Client

  • JavaScript "überall" verfügbar

  • HTML als Displaysprache "gut genug"

  • Editorkomponente selbst programmierbar

  • Normale Editorkomponenten haben nur eine Selektion und einen Cursor

  • Cool

Kurze Vorführung

Multiuserbetrieb

Struktur des Perl Backends

Protokoll

Das Protokoll überträgt Tripel

 1:  (offset,"alter Text","neuer Text")
 1:  0123456789012345678
 2:  Per aspera ad astra

Protokoll (Einfügen)

Das Protokoll überträgt Tripel

 1:  (offset,"alter Text","neuer Text")
 1:  0123456789012345678
 2:  Per aspera ad astra

Einfügen: (3,"","l"):

 1:  01234567890123456789
 2:  Perl aspera ad astra

Protokoll (Löschen)

Das Protokoll überträgt Tripel

 1:  (offset,"alter Text","neuer Text")
 1:  01234567890123456789
 2:  Perl aspera ad astra

Löschen: (5,"aspera ",""):

 1:  0123456789012
 2:  Perl ad astra

Protokoll (Ersetzen)

Das Protokoll überträgt Tripel

 1:  (offset,"alter Text","neuer Text")
 1:  0123456789012
 2:  Perl ad astra

Ersetzen: (4," ad astra","workshop"):

 1:  0123456789012
 2:  Perlworkshop

Protokoll (Undo)

Das Protokoll überträgt Tripel

 1:  (offset,"alter Text","neuer Text")
 1:  0123456789012
 2:  Perlworkshop

Undo: (4,"workshop"," ad astra"):

 1:  0123456789012
 2:  Perl ad astra

Vorteile der Tripel

Vorteile der Tripeldarstellung:

  • Undo/Redo

  • Leichte Verteilbarkeit

  • Simpel zu implementieren:

  • Perl: substr($ofs,$alt,$neu)

  • JavaScript: string.substring(ofs,alt,neu)

Nachteile der Tripeldarstellung

Tripel sind nicht deskriptiv:

  • "Grosse" Aufgaben werden in kleine Schritte gebrochen

  • Suchen / Ersetzen

  • Zeile duplizieren

  • Keine Transaktionen im Protokoll

Protokoll im Multiuserbetrieb

 1:  0123456789012345678901
 2:  Deutsher Pearlworkshop
 1:  Sender   Position   alt    neu
 2:  ---------------------------------
 3:  A->Z     5          ""     "c"
 4:  Z->A     accepted
 5:  B->Z     11         "a"    ""
 6:  Z->B     accepted
 7:           5          ""     "c"
 8:  A->Z     ()
 9:  Z->A     12         "a"    ""

B's Cursorposition muss jetzt 12 sein!

Dokumentenimplementation

Dokument pufferbasiert, nicht zeilenbasiert

 1:  $document = "Zeile1\nZeile2\n...Letzte Zeile";

statt der naiven Implementation

 1:  @document = (
 2:      'Zeile1',
 3:      'Zeile2',
 4:      ...
 5:      'Letzte Zeile'
 6:  )

Dokumentenimplementation: Vorteile / Nachteile

Vorteile

  • Leicht in Perl und JavaScript zu implementieren

  • Newlines sind kein Problem

Nachteile

  • Speicherintensiv

  • Zeilencache für Zeilenanfänge nötig

  • Darstellung als HTML benötigt Umformatierung

User-API von Zaphod

User Management

  • connect_client

  • new_user für den Namen des Users

  • disconnect_client

Dokumenten-API von Zaphod

Dokumente

  • users

  • document

  • set_name

  • actions

Ideen

"Bots" für den Editor:

 1:    Parsen auf "XXX"
 2:    Parsen auf "TODO"
 3:    Testläufe für die Datei im Hintergrund
 4:    Perl::Critic zur Annotation des Quellcodes

Danke

http://zaphod.datenzoo.de/ (v0.02, alt und optisch noch weniger ansprechend)

http://corion.net/perl-dev/

Fragen?