2016-04-05 13 views
0

Wir entwickeln Epub-Reader-Bibliothek. Unsere Benutzer können ihre Lesungen (über die Server-API) auf allen Geräten synchronisieren (Webbrowser, Android SDK App, iOS App usw.). Und wir sollten Synchronisation von Benutzer Notizen, Angebote, Positionen lesen, Lesezeichen unterstützen. Wir unterstützen auch Textgrößenänderungen. Und wir verwenden CSS-Spalten für die Buchpaginierung.Was ist der beste Weg, um Benutzerelemente in Epub (HTML) Reader-Apps (Android SDK, iOS, Web usw.) zu serialisieren

Jetzt für die Serialisierung versuchen wir Timdown/rangy Bibliothek (TextRange-Modul) zu verwenden: https://github.com/timdown/rangy/wiki/Text-Range-Module, um Textpositionen relativ zu Buch Kapitel (HTML-Körper) zu bestimmen.

Aber wir beachten Sie:

  • js Funktionen wie selectCharacters (Node containerNode, Anzahl start, Anzahl endIndex) arbeitet sehr langsam
  • Text-Position Mismatch nach Textgröße zu ändern

Wir sind darüber nachzudenken, die gleichen Funktionen zu verwenden, aber relativ zum nächsten dom-Element (p). Aber in diesem Fall müssen wir dom Elemente jedes Mal in einer universellen Weise für alle Clients identifizieren.

Was ist der beste Weg zu serialisieren - User-Elemente in unserem Fall zu deserialisieren?

Natürlich ist es unsere Arbeit und so unsere Probleme, aber wir werden sehr dankbar sein für Ihren Rat!

Antwort

0

Die einzige "IDPF-gesegnete" Möglichkeit, die aktuelle Leseposition zu verfolgen, besteht darin, das EPUB CFI (siehe http://www.idpf.org/epub/linking/cfi/epub-cfi.html) des ersten sichtbaren Elements im aktuellen Ansichtsfenster zu speichern.

In ähnlicher Weise für Highlights, Anmerkungen, Lesezeichen.

Wenn Sie das DOM des ursprünglichen EPUB-Assets (z. B. XHTML-Datei) vor der Übergabe an den Renderer (z. B. ein WebView) bearbeiten, sollten Sie die Zuordnung zwischen dem ursprünglichen und dem geänderten DOM verfolgen , um CFIs konsistent anzuwenden.

Das Readium JS-Projekt verfügt über ein Javascript-Modul für den Umgang mit CFIs, die Sie möglicherweise nützlich finden: https://github.com/readium/readium-cfi-js