質問

HTML ファイルをレンダリングするために、ポータブル デバイス用の Linux プログラムを C++ で作成しています。

問題は、デバイスの RAM が制限されているため、大きなファイルを (実際のソフトウェアで) 開くことができないことです。

解決策の 1 つは、ファイルの一部を動的にロード/アンロードすることですが、それを実装する方法がわかりません。

スクロール機能は必須であり、可能であればスムーズなエクスペリエンスを実現します

このような状況に対する最善のアプローチは何ですか?アルゴリズム、参考になるオープンソース プロジェクト、または私がやろうとしていることをサポートするライブラリ (Webkit?) を提案してください。

編集:私は電子ブック リーダーを作成しているので、必要なのは純粋な HTML レンダリングだけで、JavaScript や CSS は必要ありません。

役に立ちましたか?

解決

完全にロードせずにツリー ドキュメント (HTML など) を参照できるようにするには、ドキュメントが実際のツリーであるなど、いくつかの仮定を行う必要があります。したがって、近くのタグをわざわざチェックする必要はありません。いずれにせよ、Close タグは人間が消費するように設計されており、コンピュータは満足するでしょう。 <> あまりにも。

最初のステップは、文書の最初の部分が文書の最初の部分によって表されると想定することです。これはトートロジーのように聞こえますが、「最新の」HTML や確かに JS では、これは技術的には当てはまりません。それでも、HTML の任意の行が任意のピクセルに影響を与える可能性がある場合、ページを部分的に読み込むことはできません。

したがって、HTML ファイルの位置と画面上のページの間に単純な関係がある場合、次のステップは、各ページの最後に解析状態を定義することです。これには、おそらく (必ずではありませんが) 段落の終わりに単一のファイル オフセットが含まれます。開いたタグのスタックもこの状態の一部です。

ページングを容易にするために、これまでに遭遇した各ページに対してこの「ページ境界」状態を維持するのが賢明です。これにより、ページを簡単に戻すことができます。

これで、新しいページをレンダリングするときに、前のページ境界状態が初期レンダリング状態になります。HTML を読み取って、単一ページがオーバーフローするまで要素ごとにレンダリングするだけです。次に、少し遡って新しいページ境界状態を決定します。

スムーズ スクロールとは、基本的に、隣接する 2 つのページをレンダリングし、最初のページの x% と 2 番目のページの 100-x% を表示することです。このビットを実装すると、各ページをレンダリングするときに段落を終了するのが賢明になる可能性があります。これにより、ページの長さは若干異なりますが、段落の分割に対処する必要がなくなり、ページの境界状態が少し小さくなります。

他のヒント

ディロ は、私が知る限り最も軽量な Linux Web ブラウザーです。

編集:それ (またはそのレンダリング コンポーネント) がニーズを満たさない場合は、Wikipedia のリストと比較を見つけるとよいでしょう。 レイアウトエンジン 役立つように。

編集2: HTML ファイルの一部を動的にロードおよびアンロードするのは難しいのではないかと思います。たとえば、ファイルのランダムに選択されたチャンクがタグの途中にないことをどうやって知ることができるでしょうか?おそらく SAX などを使用してファイルを解析して中間表現にし、中間表現の個別のチャンクを永続ストレージに保存して、大量の RAM を消費しないようにする必要があります。あるいは、SAX でファイルを解析して RAM に収まるものをすべて一度に表示し、ユーザーがスクロールしすぎるたびにそれを再解析することもできます。(スタイルシートと Javascript はこのアプローチを台無しにしてしまいます。私だったら、そんな難しいことをするよりも、単純なマークアップ言語か、ある種のリッチ テキスト ビューアを見つけようとします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top