【问题】
想要给docbook生成的html中,添加相应的代码,实现统计页面访问次数的功能。
此处有两点要做的:
一是找到合适的方法或代码,用于统计页面访问次数。
二是找到合适的方法,将此统计代码添加到docbook生成的html中。
【解决过程】
1.关于问题1,现在已经找到了相应的代码了,参考:
HTML的静态网页中添加一段统计网页访问量的JAVA Script代码
然后拷贝其代码后,然后去Beautify JavaScript or HTML去格式化一下,得到如下代码:
<script language=JavaScript> <!-- var caution = false function setCookie(name, value, expires, path, domain, secure) { var curCookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires.toGMTString() : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : "") if(!caution || (name + "=" + escape(value)).length <= 4000) document.cookie = curCookie else if(confirm("Cookie exceeds 4KB and will be cut!")) document.cookie = curCookie } function getCookie(name) { var prefix = name + "=" var cookieStartIndex = document.cookie.indexOf(prefix) if(cookieStartIndex == -1) return null var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length) if(cookieEndIndex == -1) cookieEndIndex = document.cookie.length return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex)) } function deleteCookie(name, path, domain) { if(getCookie(name)) { document.cookie = name + "=" + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + "; expires=Thu, 01-Jan-70 00:00:01 GMT" } } function fixDate(date) { var base = new Date(0) var skew = base.getTime() if(skew > 0) date.setTime(date.getTime() - skew) } var now = new Date() fixDate(now) now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000) var visits = getCookie("counter") if(!visits) visits = 1 else visits = parseInt(visits) + 1 setCookie("counter", visits, now) document.write("您是第" + visits + "访问本网页的!") // --> </script>
然后将此段代码,插入到html中的<body>…</body>之前(<head>…</head>之后),然后对应的统计内容,可以出现在页面的最开始:
2. 然后经过折腾,如果把代码放到,<body>…</body>之后,</html>之前的话,可以实现统计信息显示在html页面末尾:
3.后来又想到,和html的css类型,更好的做法,肯定是内容与显示和动作分离,所以就又希望把此脚本通过包含文件的形式,去包含到html中。
然后先把上述js脚本内容存为statistic_page_view.js,放在和html页面同目录下,然后随便参考一下网上内容,然后得知将此js插入html中的写法是:
<script type="text/javascript" src="statistic_page_view.js"></script>
然后将此代码插入html的</body>后</html>之前,但是结果没能正确显示。
后来才从:使用外部 JavaScript得知:
注意:外部文件不能包含 <script> 标签。
所以,去把statistic_page_view.js中的:
<script language=JavaScript> 和 </script>去掉,然后就可以了,和前面的效果相同。
4.接下来,就是如何找个合适的方法,把此行代码,插入到html的</body>后</html>之前的位置,即可。
对于html中插入代码的为题,找到了一个html的xsl参数:html.append,但是经过测试,才发现,原来此参数是在</html>之外插入内容的,而不是我此处所希望的,在</html>之前插入内容。所以放弃此参数。
后来发现了,其实上述script代码,也是可以放在</html>之外,即html内容的最后的,此时也是可以正常的在html页面最后显示出统计信息的。
不过,此处还是没法用html.append,那是因为,没法在xsl配置文件中,写上:
<xsl:param name="html.append"><script type="text/javascript" src="statistic_page_view.js"></script></xsl:param>
因为小于号必须改为<。
而如果把小于号改为<的话,变成:
<xsl:param name="html.append"><script type="text/javascript" src="statistic_page_view.js"></script></xsl:param>
结果生成的html中,却只是在</html>后面添加了字符串:
<script type="text/javascript" src="statistic_page_view.js"></script>
而不是所期望的,插入的是:
<script type="text/javascript" src="statistic_page_view.js"></script>
能够实现真正插入js代码的功能。
所以,此法还是行不通,放弃。
5.而关于html插入(html)代码的话,倒是找到了官网的解释:Inserting external HTML code,只是没有关于如何插入javascript部分的解释。
6.后来找到一个和我遇到类似问题的帖子:
How to insert JavaScript near end of HTML without chunking?
然后参考Peter Desjardins说的,去参考:In the page content, 然后给我的docbook源码中,添加:
<?dbhtml-include href="../../../config/docbook-xsl-ns-1.77.0/html/js/statistic_page_view.js"?>
结果出现错误:
../../../config/docbook-xsl-ns-1.77.0/html/js/statistic_page_view.js:1: parser error : Start tag expected, '<' not found var caution = false ^ ERROR: dbhtml-include processing instruction href has no content.
然后换成了带<script>头的:
<?dbhtml-include href="../../../config/docbook-xsl-ns-1.77.0/html/js/statistic_page_view_withHeader.js"?>
结果又出现别的问题:
../../../config/docbook-xsl-ns-1.77.0/html/js/statistic_page_view_withHeader.js:1: parser error : AttValue: " or ' expected <script language=JavaScript> ^ ../../../config/docbook-xsl-ns-1.77.0/html/js/statistic_page_view_withHeader.js:1: parser error : attributes construct error <script language=JavaScript> ^ ../../../config/docbook-xsl-ns-1.77.0/html/js/statistic_page_view_withHeader.js:1: parser error : Couldn't find end of Start Tag script line 1 <script language=JavaScript> ^ ../../../config/docbook-xsl-ns-1.77.0/html/js/statistic_page_view_withHeader.js:1: parser error : Extra content at the end of the document <script language=JavaScript> ^ ERROR: dbhtml-include processing instruction href has no content.
很明显,是xml中没法去xinclude包含javascript文件。
所以,此方案行不通。
7.看来,实在不行,只能用我最开始所想到的那个办法了,那就是正常用docbook生成html后,然后用别的文本工具(或许是awk等),去插入这段js引用代码。
最后,还是通过cat来实现:
cat $(INSERT_JS_FILE_LOCAL) >> $(OUTPUT_FILE_HTML)
其中
INSERT_JS_FILE_LOCAL=$(JS_PATH_LOCAL)/insert_local_pageview_js.txt
OUTPUT_FILE_HTML = $(OUTPUT_DIR_HTML)/$(PROJECT_NAME).html
实现了,将insert_local_pageview_js.txt中的:
<script type="text/javascript" src="../../../../../config/docbook-xsl-ns-1.77.0/html/js/statistic_page_view.js"></script>
插入到docbook生成的html中了,这样,就不需要修改每个book的xml源代码了,只需要生成html后,用cat处理一下即可。
当然,对应的js文件还是要放在对应的位置的,内容如下:
var caution = false function setCookie(name, value, expires, path, domain, secure) { var curCookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires.toGMTString() : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : "") if(!caution || (name + "=" + escape(value)).length <= 4000) document.cookie = curCookie else if(confirm("Cookie exceeds 4KB and will be cut!")) document.cookie = curCookie } function getCookie(name) { var prefix = name + "=" var cookieStartIndex = document.cookie.indexOf(prefix) if(cookieStartIndex == -1) return null var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length) if(cookieEndIndex == -1) cookieEndIndex = document.cookie.length return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex)) } function deleteCookie(name, path, domain) { if(getCookie(name)) { document.cookie = name + "=" + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + "; expires=Thu, 01-Jan-70 00:00:01 GMT" } } function fixDate(date) { var base = new Date(0) var skew = base.getTime() if(skew > 0) date.setTime(date.getTime() - skew) } var now = new Date() fixDate(now) now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000) var visits = getCookie("counter") if(!visits) visits = 1 else visits = parseInt(visits) + 1 setCookie("counter", visits, now) document.write("您是第" + visits + "位访问本网页的!")
【总结】
想要实现将docbook生成的html中插入对应的js代码实现统计静态html页面访问次数,没有合适的xsl的参数可用,最后用cat工具,将相关的script引用js代码的内容插入到html最末尾,实现了html页面最后显示页面访问统计信息。