2006年7月13日,想弄一个类似Wikipedia上文章目录的功能,希望能参考Wikipedia的格式,只要用"==title=="这样就可以自动生成标题,并在文章的开头根据这些标题自动生成目录。写了一点代码,但是没有完成,能力有限啊。2007年1月10日,也就是半个月前,在鼓捣我的Projects页面的时候,偶然发现了Table of Contents Generator
插件,可以为文章自动生成一个目录,方便浏览者查阅。这个功能不错,有点类似Word的目录域功能,只要在合适的地方添加一个目录域,这个地方就会显示当前文档的目录,而且当你修改文档的时候目录也会自动更新。
看了一下这个插件的源代码,不是很满意,于是就重新写了一个,用于我的Projects页面。Scott Yang用的堆栈,我觉得不太好,就用了一个数组模拟堆栈,写出来的代码也短一些。Scott还考虑了对分页文章的处理,我没写过分页文章,而且现在很多喜欢分页文章的人都用了Coolcode.cn的AJAX分页插件,两个插件兼容性上也会有一些问题,所以分页功能我就不予考虑了。再在大的函数开头建几个类变量的引用,这样整个程序小了很多。
给目录上方上面加了一个标题“Table of Contents”,这样就和Wikipedia里的目录很象了。Wikipedia里的文章目录标题旁边有一个链接,点击它可以隐藏或显示目录内容。我懒得弄那个链接了,直接通过JavaScript代码控制当点击标题时隐藏或显示下面的TOC框。参考了WordPress Codex里这个页面的JavaScript代码,弄好了点击隐藏TOC功能。JavaScript代码很简单,但有一个问题是:当隐藏TOC内容后,因为标题“Table of Contents”比目录部分窄很多,所以整个TOC块的会突然变窄,有点难看。Wikipedia里没对这个情况进行处理,点隐藏就突然变窄,点显示又突然变宽。而WordPress Codex里则使用固定宽度的TOC框,固定宽度在目录里有比较长的标题的情况下比较好。查了一些CSS方面的资料,使用JavaScript在隐藏的时候把TOC框的clientWidth值赋给toctitle.style.width。这样在Firefox下没有问题,IE里却还是不行。用JavaScript的alert()函数查看TOC框的clientWidth值,发现是0。在网上逛了很久,都说没有办法。最终,只有用offsetWidth这个属性。offsetWidth和clientWidth的区别是,前者包括border的宽度,而后者不包括。最终写出了比较完美的代码,在IE6 SP2、Firefox 1.5.0.6、Opera 9.10下均测试通过。
还有锚的问题。Scott的插件里用标题生成锚,WordPress Codex里用标题URL encode后去除百分号生成锚。这样做有一个好处就是,当增加标题的时候,锚地址不会变,因为锚地址只和标题文字有关,和顺序无关。缺点是,中文标题生成的锚地址会很长。我用的是序号的方法,这样做的好处是当修改标题时锚地址仍然不变,而且在中文环境下锚地址也会短些。总之,两种方式各有所长吧。
前几天忙于WordPress 2.0.7和WordPress 2.1,今天抽了点时间又看了下这个插件。插件在文章页面显示没有问题,但是在feed里出了问题。查了很久,将近3个小时,看代码看得我快崩溃了,最后才发现类的对象只建立一次,它是被重复使用的。把初始化变量移到函数里,问题就解决了,可以release了。
请移步到“Yskin's Table of Contents Generator”主页下载软件并查看更多信息。
第三级的字太小了一点啊
就是第二行“python资料”
FF1.5.0.9
...咋会被你发现这个页面的。
我还在测试呢,H5的部分当然小了,我又没弄H5的CSS,只是多弄几层,好测试TOC插件是否正常。
呵呵,真是不错!
您好,遇到一些问题想请教。希望可以得到您的帮助。
我也使用了K2配合trueblue style,自己不懂css、php。在css里面一边试试一边看看弄成了现在这个样子(http://laroea.cn)。但是还是有两处不正常。
一处是 首页 “显示前一页” 的字体太小了,一处是显示文章一开始的:“X条留言,属于什么分类” 字体太小了。
试过看您blog的css文件,似乎调用了您自己编写的core.css,但是在下载页面的时候下不到这个文件。
希望可以帮忙告诉我如何修改css文件。谢谢!
我升级到2.1了,等你中文包了。
我发现你这个管理员回复某评论,很好。xiaoming.info,你看它这个更好玩儿。
首先,我不知道你用的哪个版本的K2。现在的K2即使是最新release版K2 0.95都有bug,而且再往前的版本对WordPress 2.1的支持也不好,所以你最好升级到K2 nightly的最新版本。
其次,True Blue 1.3.4版对新版K2支持的已经不够好了,所以作者另做了一个True Blue 1.3.4_svn版,如果你不是使用古老的K2 0.9.1,那么请升级到这个svn版。
我用True Blue时做了些调整,把它原来的CSS代码移动到core.css文件里,这样我在custom.css文件里写的CSS代码就可以轻松覆盖它的代码。可以参考一下我的custom.css,里面写了一些注释。
如果你装了Firefox,那么用它的DOM查看器可以很方便地调CSS。用Adblock Plus查看页面调用的CSS文件也很方便。
您好,感谢您的帮助。昨天留言的时候还是用的27日发布的K2 Night,今天已经有新版本了(31日版本)。
试用了您写的css文件,问题已经完美解决了。万分感谢。
谢谢yskin,已经运用成功,这个插件很不错
yskin 大哥,借鉴了你的css文件后,我的blog也和你的一样漂亮了,并自己做了一些调整,但是我想请教以下,在评论中的评论如何实现啊?
就是2楼那种效果,我仔细看了一下你的blog,发现有的访客也可以这样评论,望指教!
嗯,看了你的网站,也看了一下你调整的部分。
分级评论,那是我自己弄的,修改了K2模板的comments.php文件,而分级则是自己通过直接修改数据库实现的。唉,没懒懒喵的水平,写不出K2下的thread comment插件。
貌似弄起来比较麻烦啊
我想问下,我发现我装了这个插件之后,我再启动其他插件都会出现下面的提示,应该怎样解决呢?(以下的提示原文)
Warning: Cannot modify header information - headers already sent by (output started at /www/mycyberway.com/1/1/5/1150/htdocs/wp-content/plugins/yskin-toc.php:114) in /www/mycyberway.com/1/1/5/1150/htdocs/wp-includes/pluggable.php on line 390
我想问下,我发现我装了这个插件之后,我再启动其他插件都会出现下面的提示,应该怎样解决呢?(以下是提示原文)
Warning: Cannot modify header information - headers already sent by (output started at /www/mycyberway.com/1/1/5/1150/htdocs/wp-content/plugins/yskin-toc.php:114) in /www/mycyberway.com/1/1/5/1150/htdocs/wp-includes/pluggable.php on line 390