0

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

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

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

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

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

編集: 私は電子ブックリーダーを書いているので、純粋なhtmlレンダリング、javascript、CSSなどは必要ありません...

4

2 に答える 2

1

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

最初のステップは、ドキュメントの最初の部分がドキュメントの最初の部分で表されていると想定することです。それはトートロジーのように聞こえますが、「最新の」HTMLと確かにJSでは、これは技術的にはもはや真実ではありません。それでも、HTMLの行がピクセルに影響を与える可能性がある場合は、ページを部分的にロードすることはできません。

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

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

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

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

于 2009-06-08T08:38:16.613 に答える
0

Dilloは、私が知っている中で最も軽量なLinuxWebブラウザーです。

編集:それ(またはそのレンダリングコンポーネント)がニーズを満たさない場合は、ウィキペディアのレイアウトエンジンのリストと比較が役立つ場合があります。

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

于 2009-06-06T16:57:49.930 に答える