我正在用C ++为便携式设备创建一个Linux程序,以便呈现html文件。
问题是设备内存有限,因此无法打开大文件(使用实际软件)。
一种解决方案是动态加载/卸载文件的一部分,但我不确定如何实现它。
滚动的能力是必须的,如果可能的话,可以获得流畅的体验
我想听听你这种情况的最佳方法是什么? 您可以建议一个算法,一个开源项目来查看,或者一个支持我正在尝试做的事情的库(webkit?)。
修改 我正在写一个电子书阅读器,所以我只需要纯HTML渲染,没有javascript,没有CSS,......
答案 0 :(得分:1)
为了能够在不完全加载的情况下浏览树文档(如HTML),您必须做出一些假设 - 比如文档是实际的树。所以,不要费心检查关闭标签。无论如何,关闭标签都是为人类消费而设计的,计算机也会对<>
感到满意。
第一步是假设文档的第一部分由文档的第一部分表示。这听起来像是一个重言式,但是使用“现代”HTML,当然JS在技术上已不再适用。尽管如此,如果任何HTML行影响任何像素,您根本无法部分加载页面。
因此,如果HTML文件的位置与屏幕上的页面之间存在简单的关系,则下一步是在每个页面的末尾定义解析状态。然后,这将包括单个文件偏移量,可能(但不一定)在段落的末尾。此状态的一部分是一堆打开的标签。
为了使分页更容易,为目前为止遇到的每个页面保持这种“页面边界”状态是明智的。这使得回传变得容易。
现在,在渲染新页面时,上一页边界状态将为您提供初始渲染状态。您只需读取HTML并逐个元素地呈现它,直到溢出单个页面。然后,您回溯一下并确定新的页边界状态。
平滑滚动基本上是渲染两个相邻页面并显示第一页的x%和第二页的100-x%。一旦你实现了这个位,在渲染每个页面时完成一个段落可能会变得很聪明。这将为您提供略有不同的页面长度,但您不必处理断开的段落,这反过来会使页面边界状态变小。
答案 1 :(得分:0)
Dillo是我所知道的最轻的Linux网络浏览器。
修改:如果它(或其渲染组件)无法满足您的需求,那么您可能会发现维基百科的layout engines列表和比较有用。
编辑2:我怀疑动态加载和卸载HTML文件的某些部分会很棘手;例如,你怎么知道随机选择的文件块不在标签的中间?您可能不得不使用类似SAX的东西将文件解析为中间表示,将中间表示的离散块保存到持久存储,以便它们不会占用太多RAM。或者您可以使用SAX解析文件以立即显示适合RAM的内容,然后在用户滚动太远时重新解析它。 (Stylesheets和Javascript会破坏这种方法;一些简单的HTML也可能。)如果是我,我会尝试找到一种简单的标记语言或某种富文本查看器,而不是去解决所有这些困难。