最新消息:20210917 已从crifan.com换到crifan.org

【已解决】给Docbook生成的静态HTML页面添加统计访问次数的代码

Docbook crifan 3055浏览 0评论

【问题】

想要给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>

因为小于号必须改为&lt;。

而如果把小于号改为&lt;的话,变成:

<xsl:param name="html.append">&lt;script type="text/javascript" src="statistic_page_view.js"&gt;&lt;/script&gt;</xsl:param>

结果生成的html中,却只是在</html>后面添加了字符串:

&lt;script type="text/javascript" src="statistic_page_view.js"&gt;&lt;/script&gt;

而不是所期望的,插入的是:

<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页面最后显示页面访问统计信息。

转载请注明:在路上 » 【已解决】给Docbook生成的静态HTML页面添加统计访问次数的代码

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
92 queries in 0.192 seconds, using 23.39MB memory