大概一个月前我在河洛论坛有人发帖指责E书作者做书只顾精美,不重实用。E书中没有书签功能,也不能保存阅读设置。当时就想把我自己用的书签模板修改一下发出来,结果拖延症犯了,一拖就是一个月,还好玛雅人不靠谱,否则这帖子就永远发不出来了。
这个帖子可能比较长,请各位E书作者有些耐心。另外,此模板为HP模板,不适用于软景。仍然在使用软景的E书作者,使用软景生成的html文件,实现书签功能非常简单,原因下面会介绍。
我所做的书签模板,是在一个叫做“绿色卷抽”的HP模板的基础上修改的,原模板作者是谁并不知道。这个模板我用了很多年了,原因是这个模板的底色是绿色的,而绿色比较护眼,在我收集的一些绿色的模板中,只有这个模板个人觉得比较顺眼,所以一直在使用它。后来将它改成了可以保存书签的模板。
下面开始正题:
一、前言
首先跟各位E书作者介绍书签模板的原理。
很早以前,不知道是哪位E书前辈曾经发过一个HP的书签模板,具体作者是谁,已经忘记。该模板是利用URL来传递书签参数,而非像普通的HP模板,在frame里面利用parent变量来传递,并且利用Cookie来保存阅读设置。这个模板只适用于EPExpress打包生成的电子书,在CHM中无法保存阅读设置。而且此模板只能在XP下起作用,在WIN7下,无法保存书签。也就是说,在WIN7下利用URL传递参数保存书签的方式,在EXE电子书中无法使用。
要在WIN7下使电子书中实现书签功能,首先要知道以下两个问题:
1、在WIN7下,CHM电子书实际上是用IE7的内核来渲染的,不会使用高版本的IE8或者IE9。在XP中,如果用户没有升级IE至7.0,那么CHM会使用IE6内核来渲染,升级以后会使用IE7的内核渲染,但是,用户升级到8.0后,CHM仍然是使用IE7的内核,不会使用IE8。不相信的朋友,可以制作一个含有IE9特效的网页,再打包成CHM电子书,看看IE9的特效是否失效。同样,EPExpress打包的EXE电子书使用内核的规律跟CHM也是一样,即在WIN7下也使用IE7来渲染。之前提到的HP书签模板,我看到有人说不支持WIN7、IE8,这种说法是有问题的,因为WIN7下,CHM是使用IE7来渲染的。
2、不管在哪个版本的WINDOWS中,CHM都无法储存Cookie,而EPExpress打包的电子书却可以。所以上面提到的模板,在CHM电子书中虽然可以保存书签,但是不能保存阅读设置。
好了,介绍完毕,现在开始介绍我的模板。
二、CHM电子书书签模板
由于CHM不能储存Cookie,所以在CHM中,书签和阅读设置都将用URL来传递。通过CHM的收藏夹功能,将URL和参数保存下来。由于常用的HP模板都有iframe框架,无法得到页面真实的url,并且HP分章阅读页面时通过JS脚本调用txt文件来实现的,仅有一个URL,所以普通的HP模板是无法保存书签的。而软景生成的html文件,每章都有一个独立的URL,可以直接使用CHM的书签功能。
用来打包电子书的软件可以用htm2chm,其他只要能实现CHM收藏夹功能的CHM制作软件,都可以用来打包,譬如:EasyCHM。大家经常使用的HugeCHM,则没有该功能。
文本的排版和HP的使用在这里不再赘述,教程很多。各位可将“绿色卷轴(CHM书签版)”放入HP的template目录下,也可以直接放入HP生成的E书文件夹下,自己手动修改模板中的书名、作者和制作人等内容。
完成后,请将目录下的start.htm和js目录下的chapter.js两个文件删除,并且将page.js中pages数组后面的函数全部删除,然后将以下代码复制进去,保存:- function loadurl(url,num,arr)
- {
- var jud;
- if (num == undefined || num == -1)
- {
- jud=true;
- url="index.htm";
- for(i=1;i<7;i++)
- {
- if(arr[i]!=0)
- if(jud) {url=url+"#"+paraName[i]+"="+arr[i]; jud=false;}
- else url=url+"&"+paraName[i]+"="+arr[i];
- }
- document.location=url;
- }
- else
- {
- url=url+"#"+paraName[0]+"="+num;
- for(i=1;i<7;i++)
- {
- if(arr[i]!=0)
- {url=url+"&"+paraName[i]+"="+arr[i];}
- }
- document.location = url;
- }
- }
- function loadchaurl(url,num,arr)
- {
- var jud;
- if (num == undefined || num == -1)
- {
- jud=true;
- url="index.htm";
- for(i=1;i<7;i++)
- {
- if(arr[i]!=0)
- if(jud) {url=url+"#"+paraName[i]+"="+arr[i]; jud=false;}
- else url=url+"&"+paraName[i]+"="+arr[i];
- }
- document.location=url;
- }
- else
- {
- url=url+"#"+paraName[0]+"="+num;
- for(i=1;i<7;i++)
- {
- if(paraValue[i]!=0)
- url=url+"&"+paraName[i]+"="+arr[i];
- }
- document.location = url;
- document.location.reload();
- }
- }
- function loadtxt(i){
- document.write('<script language="JavaScript" src="../txt/'+pages[i][0]+'.txt"></script>');
- }
复制代码 完成后,使用htm2chm打包。在htm2chm的编译器中,选择index目录下的index.htm作为主页,改好标题。下一步是至关重要的一步:
点击“预设”后面“文件夹锤子”标志:
在弹出的“预设编辑器”中,“默认标签”下拉框中,选择“收藏夹”,并将下面的“收藏夹”打上勾,目录、索引这些由于没有制作,所以不打勾。其他的设置,可以学我的,也可以自己设置:
OK,点“确定”后,在编译器中点“开始”,电子书就做好了。更改阅读设置后,点击页面中的“保存设置”按钮,阅读设置才能保存。想保存书签的时候,只要点击左上角的“显示”,然后点击“添加”,就可以保存书签了,阅读设置也会保存。
缺点:1、同页面不能跳转。就是说,如果你保存了一个分章阅读页面的书签,那么在章节阅读页面,点击书签是没有用的,必须先转到其他页面,譬如目录页面,再点书签。这是CHM电子书收藏夹自己的问题,无法克服。
2、在收藏夹中保存的书签名是URL,并不是章节名称或分卷名称,不够直观,也不够美观。事实上这个问题是可以解决的,只是需要制作目录和索引文件。制作有点麻烦,而且制作好后,用htm2chm,仍然不会显示章节名称;farhtml则对中文目录和索引支持不好,显示乱码……我尝试了至少5种软件,都不能得到显示章节名称的电子书,最后用一种比较复杂方法才做好。有兴趣的朋友可以单独联系我。如果只需要功能,不考虑美观,大家就用上面的方法吧。我会提供一个可以显示章节名称的电子书,给大家下载参考。各位E书作者也可以用其他的软件试一试,如果可以很好的做出收藏夹中显示章节名称而不显示URL电子书,也请联系我,或者发帖分享给大家。
可显示章节名称的电子书截图:
三、EPE电子书书签模板
我个人不喜欢EXE的电子书,如果我发书的论坛不强制要求EXE格式,我几乎从来不做EXE的电子书。原因是现在用EPE打包的电子书,功能上和CHM几乎没有区别,只不过多了个图标和logo,反编译也不方便,还容易感染病毒。这个适用于EPE或者其他可生成能储存Cookie的电子书的模板,是我临时做的,有什么bug请联系我。
EPE的模板相对简单,HP输出后,删除js目录下的chapter.js,然后将page.js中pages数组用后面的内容删除,将以下代码复制进去:- function loadurl(url,num)
- {
- if (num == undefined)
- {
- parent.document.title = '{书名} - 作者:{作者}';
- document.location = url;
- }
- else
- {
- parent.txt = num;
- if (num == -1)
- {
- parent.document.title = '{书名} - 作者:{作者} - 制作:{制作}';
- document.location = "index.htm";
- }
- else
- {
- if (url == 'chapter.htm') parent.document.title = pages[parent.txt][1];
- else parent.document.title = pages[parent.txt][3] + " [分卷阅读]";
- document.location = url;
- }
- }
- }
- function loadtxt(i)
- {
- document.write('<script language="JavaScript" src="../txt/'+pages[i][0]+'.txt"></script>');
- }
- function setCookies(cookieName,cookieValue,expirehours)
- {
- var today=new Date();
- var expire=new Date();
- expire.setTime(today.getTime()+3600000*356*24);
- document.cookie=cookieName+'='+escape(cookieValue)+';expires='+expire.toGMTString();
- }
- function ReadCookies(cookieName)
- {
- var theCookie=''+document.cookie;
- var ind=theCookie.indexOf(cookieName);
- if(ind==-1||cookieName=='')return'';
- var ind1=theCookie.indexOf(';',ind);
- if(ind1==-1)ind1=theCookie.length;
- return unescape(theCookie.substring(ind+cookieName.length+1,ind1));
- }
复制代码 然后用EPE按照普通的HP模板打包即可。在首页有一个“读取书签”按钮,点击以后,就会跳转到分章阅读或者分卷阅读页面,如果之前没有保存过书签,则会提示“没有保存的书签”。然后在分章和分卷阅读页面的顶部,都有一个“保存书签”的按钮,点一下,就可以保存书签了。在分章、分卷和全文阅读页面的顶部,有一个“保存设置”的按钮,点一下,可以保存设置,很简单。 缺点:无法保存多个书签,这个问题其实可以解决,但是目前我实在没有兴趣修改EXE电子书的模板,我几乎用不到,有兴趣的可以自己去改改,或者等我有兴趣的时候吧。
这两个模板可能还存在一些我未发现的bug,发现的朋友可以告诉我,我会更新的。chm版的多余的代码可能比较多,也不够简洁,有时间我会改改,前提是我的拖延症不要又爆发。。。。。看了一下,那个说E书华而不实的帖子是12月11号发的,今天1月11,正好拖了一个月。。。
示例的电子书是猫腻的《间客》,文本来自于易水西风。 |