0

我正在用 C++ 为便携式设备创建一个 linux 程序,以呈现 html 文件。

问题是该设备的 RAM 有限,因此无法打开大文件(使用实际软件)。

一种解决方案是动态加载/卸载文件的一部分,但我不确定如何实现。

滚动的能力是必须的,如果可能的话有流畅的体验

我想听听您对这种情况的最佳方法是什么?你可以建议一个算法,一个开源项目来看看,或者一个支持我正在尝试做的事情的库(webkit?)。

编辑: 我正在写一个电子书阅读器,所以我只需要纯 html 渲染,没有 javascript,没有 CSS,......

4

2 回答 2

1

为了能够在不完全加载的情况下浏览树文档(如 HTML),您必须做出一些假设——比如文档是实际的树。所以,不要费心检查关闭标签。无论如何,关闭标签是为人类消费而设计的,计算机也会很高兴<>

第一步是假设文档的第一部分由文档的第一部分表示。这听起来像是一个重言式,但对于“现代”HTML 和当然 JS,这在技术上不再正确。尽管如此,如果任何 HTML 行可以影响任何像素,您根本无法部分加载页面。

因此,如果 HTML 文件的位置和屏幕上的页面之间存在简单的关系,那么下一步就是在每个页面的末尾定义解析状态。然后这将包括单个文件偏移量,可能(但不一定)在段落的末尾。此状态的一部分还有一堆打开的标签。

为了使分页更容易,为您迄今为止遇到的每个页面保留这种“页面边界”状态是明智的。这使得回页变得容易。

现在,在渲染新页面时,之前的页面边界状态将为您提供初始渲染状态。您只需读取 HTML 并逐个元素地呈现它,直到溢出单个页面。然后您回溯一点并确定新的页面边界状态。

平滑滚动基本上是渲染两个相邻页面并显示第一个页面的 x% 和第二个页面的 100-x% 的问题。一旦你实现了这一点,在渲染每一页时完成一个段落可能会变得很聪明。这将使您的页面长度略有不同,但您不必处理损坏的段落,这反过来会使您的页面边界状态更小。

于 2009-06-08T08:38:16.613 回答
0

Dillo是我所知道的最轻量级的 Linux 网络浏览器。

编辑:如果它(或其渲染组件)不能满足您的需求,那么您可能会发现 Wikipedia 的布局引擎列表和比较会有所帮助。

编辑 2:我怀疑动态加载和卸载 HTML 文件的某些部分会很棘手;例如,你怎么知道随机选择的文件块不在标签的中间?您可能必须使用 SAX 之类的东西将文件解析为中间表示,将中间表示的离散块保存到持久存储中,这样它们就不会占用太多 RAM。或者,您可以使用 SAX 解析文件以立即显示适合 RAM 的内容,然后在用户滚动太多时重新解析它。(样式表和 Javascript 会破坏这种方法;一些纯 HTML 也可能。)如果是我,我会尝试找到一种简单的标记语言或某种富文本查看器,而不是遇到所有这些困难。

于 2009-06-06T16:57:49.930 回答