chromium阅读模式实现

  实际上chromium是没有实现阅读模式的,但是阅读模式确实是移动浏览器比较实用的一个功能,特别对于喜欢在线浏览小说的人来说,一个良好的阅读模式可以提供极佳的阅读体验。所以实现阅读模式是非常必要的,但是想实现一个良好的阅读模式还算难度较大的。

   其实实现方式是很容易理解的,就是玩弄当前的DOM树,一番折腾之后得出三个字符串:一是标题,二是内容,三是下一页或者上一页的URL。然后把这三个字符串交给browser去按照你想要的方式来显示。但是直接操作当前的DOM树肯定是不合适的,那么可以用document->body()->cloneElementWithChildren(true)来复制body节点及其子树。在什么位置进行操作呢?WebViewImpl类是比较合适的,既能方便的操作webcore中的对象又能容易与renderviewimpl联系。

    那么实现的难点就是如何制定规则来得到我们想要的字符串。有的规则是很显而易见的,比如去除肯定无用的节点:

1. 所有script节点

2. 所有display:none或者visibility:hidden的节点

3. 不包含实际内容或者内容没有什么意义的节点,比如一些表单节点,img节点等,如果你认为不适合作为阅读模式的呈现对象(阅读模式明显是为了展现大段文字),都可以统统去掉。

    还有非常多的规则不太容易制定,比如<a>标签节点。对于导航类的网站包含较多<a>节点,但明显不应该有阅读模式。对于某些新闻页面,也有大量关键字是<a>节点,但它们都是内容的一部分,明显需要有阅读模式。对于某些标识上一页,下一页的链接,我们还要单独把它们取出来。而且注意的是,并不是页面中有名字为“下一页”的链接,那它就真正是下一页的链接。这些都是非常头疼的问题,需要考虑全面。

    这些规则的制定就是仁者见仁智者见智了,每个规则都不可能做到完美。

    阅读模式的实现是非常体现功力的一个功能,既要对页面结构有非常深刻的了解,以制定合理的规则,又要对DOM树的操作非常娴熟。

    

你可能感兴趣的:(chromium阅读模式实现)