Frage

Ich erstelle ein Linux-Programm in C ++ für ein tragbares Gerät, um HTML-Dateien zu machen.

Das Problem ist, dass das Gerät in RAM beschränkt ist, was es unmöglich macht große Dateien zu öffnen (mit aktueller Software).

Eine Lösung ist dynamisch Teile der Datei zu laden / entladen, aber ich bin nicht sicher, wie das implementieren.

Die Fähigkeit des Scrollens ist ein Muss, mit einer glatten Erfahrung, wenn möglich

Ich möchte von Ihnen hören, was der beste Ansatz für eine solche Situation? Sie können einen Algorithmus vorschlagen, ein Open-Source-Projekt einen Blick auf, oder eine Bibliothek zu nehmen, die das unterstützen, was ich versuche zu tun (Webkit?).

EDIT: Ich schreibe einen E-Book-Reader, so brauche ich nur reines HTML-Rendering, kein Javascript, kein CSS, ...

War es hilfreich?

Lösung

Um in der Lage sein, einen Baum Dokument zu durchsuchen (wie HTML) ohne voll lädt, werden Sie ein paar Annahmen getroffen werden müssen - wie das Dokument ein tatsächlicher Baum zu sein. Also, nicht die Mühe schließen Tags zu überprüfen. Tags schließen für den menschlichen Verzehr ohnehin ausgelegt sind, Computer zu mit <> glücklich sein würde.

Der erste Schritt ist anzunehmen, dass der erste Teil des Dokuments durch den ersten Teil des Dokuments dargestellt. Das klingt wie eine Tautologie, aber mit „modernen“ HTML und sicherlich JS dies technisch nicht mehr wahr. wenn eine Zeile HTML noch, jedes Pixel beeinflussen kann, können Sie einfach nicht teilweise eine Seite laden.

Also, wenn es eine einfache Beziehung zwischen der Position ist die die HTML-Datei und Seiten auf dem Bildschirm, ist der nächste Schritt des Parse-Zustand am Ende jeder Seite zu definieren. Dies wird dann umfasst eine einzelne Datei-Offset, wahrscheinlich (aber nicht notwendigerweise) am Ende eines Absatzes. Teil dieses Zustandes auch ein Stapel von Open-Tags.

Paging einfacher zu machen, ist es klug, für jede Seite dieses „Seitengrenze“ Zustand zu halten, die Sie bisher erlebt habe. Dies macht Paging zurück einfach.

Nun, wenn eine neue Seite, der vorherige Seite Grenzzustand Rendering werden Sie den anfänglichen Wiedergabezustand. Sie einfach HTML lesen und Element für Element machen, bis Sie eine einzelne Seite überlaufen. Sie dann ein wenig zurückverfolgen und den neuen Seitengrenzzustand bestimmen.

Glatte Scrollen ist im Allgemeinen eine Sache von zwei benachbarten Seiten Rendern und x% des ersten und des 100-x% der zweiten zeigt. Sobald Sie diese Bit implementiert haben, kann es klug sein, einen Absatz zu beenden, wenn jede Seite zu machen. Dies gibt Ihnen etwas andere Seite Längen, aber Sie müssen nicht mit gebrochenen Absätzen befassen, und das wiederum macht die Seitengrenze Zustand etwas kleiner.

Andere Tipps

Dillo ist das leichteste Gewicht Linux Web-Browser, die ich kenne.

Bearbeiten : //en.wikipedia: Wenn es (oder seine Rendering-Komponente) nicht Ihren Bedürfnissen entsprechen, dann könnten Sie Wikipedias Liste und den Vergleich von Layout Motoren hilfreich sein.

Edit 2: Ich vermute, dass dynamischen Laden und Entladen von Teilen einer HTML-Datei schwierig sein würde; zum Beispiel, wie würden Sie weiß, dass ein zufällig ausgewähltes Stück der Datei nicht in der Mitte eines Tages ist? Sie würden wahrscheinlich so etwas wie SAX verwenden, haben Sie die Datei in eine Zwischendarstellung zu analysieren, diskreten Blöcken der Zwischendarstellung zu persistenten Speicher sparend, so dass sie nicht zu viel RAM in Anspruch nehmen. Oder Sie könnten die Datei mit SAX parsen zu zeigen, was auf einmal im RAM paßt dann wieder analysiert es, wenn der Benutzer scrollt zu weit. (Stylesheets und Javascript würde diesen Ansatz ruinieren, einige einfache HTML könnte auch.) Wenn es nach mir ginge, würde ich versuchen, eine einfache Markup-Sprache oder irgendeine Art von Rich-Text-Viewer zu finden anstatt all diese Schwierigkeiten gehen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top