我在WordPress上安装了Dewplayer插件,在文章中可以通过以下代码嵌入mp3:
[Dewplayer:mp3-url] |
同时我设置首页显示文章摘要,则嵌入mp3的文章的摘要显示不正常。我为该文章添加人工摘要,并且在人工摘要中不嵌入mp3,效果依然诡异。这就不得不查看一下WordPress首页的显示原理了,在首页上通过浏览器查看源代码,发现该文章摘要处的结构如下:
1 2 3 4 | <!-- Post --> Summary |
也就是说,首页仍把每篇文章的全文列出,并将其注释掉,其后再接上人工摘要。因此一般情况下,只有人工摘要才会显示出来。然而当嵌入mp3时,这部分代码被解释成了:
1 2 3 | <!-- Dewplayer Begin--> Dewplayer Code <!-- Dewplayer End--> |
合起来看:
1 2 3 4 5 6 7 8 | <!-- Post <!-- Dewplayer Begin--> Dewplayer Code <!-- Dewplayer End--> Post --> Summary |
Html的注释是不支持嵌套的,所以不可预料的错误就发生了。修改WorePress首页摘要显示的方式显然不是很容易的事情,将Dewplayer代码前后的注释去除则毫不费力:
$ grep -r "Dewplayer Begin" * |
发现在dewplayer.php文件中存在以下语句:
1 2 3 | $dewp_tag = '<!-- Dewplayer Begin-->'; ... $dewp_tag .= '<!-- Dewplayer End-->'; |
把这两个作为解释语的注释去掉,问题果然就消失了。
1 2 3 | $dewp_tag = ''; ... $dewp_tag .= ''; |
但是这样做牺牲了代码的可读性。回到最熟悉的C语言,要解决上述问题,在C99标准下,因为支持了单行注释,可以采用如下的代码结构:
1 2 3 4 5 6 7 8 9 | // C99 /* Post // Dewplayer Begin Dewplayer Code // Dewplayer End Post */ Summary |
然而,ANSI C标准并未支持单行注释,虽然大多数编译器支持,但毕竟非标准的使用不具有良好的可移植性。多行注释同样不支持嵌套。如果坚持不想牺牲代码可读性的话,就想到了注释对于代码的作用:解释和说明一段代码。并非屏蔽一段代码!因此以上的做法,用多行注释屏蔽代码,本就是一个歪着。正确的做法依赖于条件编译:
1 2 3 4 5 6 7 8 9 | /* ANSI C */ #if 0 Post /* Dewplayer Begin */ Dewplayer Code /* Dewplayer End */ Post #endif Summary |
在现代编辑器下,比如我所用的VIM,以上代码中由条件编译移除的部分,会全部高亮为注释的颜色。这样来看,通过预处理命令的条件编译,即使在ANSI C标准下,C语言的注释依然是这般的优雅。至于在C99标准下,以及C++下,有了单行注释,则就更为自由了。而Html的注释,也是否会出现更为优雅的方式呢?