【问题】
想要给docbook生成的html中,添加相应的代码,实现统计页面访问次数的功能。
此处有两点要做的:
一是找到合适的方法或代码,用于统计页面访问次数。
二是找到合适的方法,将此统计代码添加到docbook生成的html中。
【解决过程】
1.关于问题1,现在已经找到了相应的代码了,参考:
HTML的静态网页中添加一段统计网页访问量的JAVA Script代码
然后拷贝其代码后,然后去Beautify JavaScript or HTML去格式化一下,得到如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <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中的写法是:
1 | <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配置文件中,写上:
1 | < xsl:param name = "html.append" >< script type = "text/javascript" src = "statistic_page_view.js" ></ script ></ xsl:param > |
因为小于号必须改为<。
而如果把小于号改为<的话,变成:
1 | < xsl:param name = "html.append" ><script type="text/javascript" src="statistic_page_view.js"></script></ xsl:param > |
结果生成的html中,却只是在</html>后面添加了字符串:
1 | <script type= "text/javascript" src= "statistic_page_view.js" ></script> |
而不是所期望的,插入的是:
1 | <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源码中,添加:
1 | <? dbhtml-include href = "../../../config/docbook-xsl-ns-1.77.0/html/js/statistic_page_view.js" ?> |
结果出现错误:
1 2 3 4 | ../../.. /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>头的:
1 | <? dbhtml-include href = "../../../config/docbook-xsl-ns-1.77.0/html/js/statistic_page_view_withHeader.js" ?> |
结果又出现别的问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 | ../../.. /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来实现:
1 | 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中的:
1 | <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文件还是要放在对应的位置的,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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页面最后显示页面访问统计信息。