-
<div>
-
<ul>
-
<li> lalalalala </li>
-
<li><strong><a href="http://www.google.com"> Google
-
</a>
-
</strong>
-
</li>
-
</ul>
-
</div>
评论过滤链
哎……这两天基本没怎么看书,自从决定要添加评论审核到 Chito,便一发不可收拾,兴趣完全转移到了这个上面来
。
评论过滤一直以来都没有一个完美的解决方案,即便是强大的 Akismet,对付某些中文评论仍显得有些无力,但是如果可以综合几种办法,效果还是不错的。而且有的时候,我们也想过滤或替换正常评论中的某些关键字,让评论们看上去更加水产……
于是过滤链的想法就顺理成章的产生了,每个评论过滤插件作为链上的一环,检测通过的话直接交给下一环,有问题的话标记为 spam 或者直接丢弃
。
在过滤链设置中还可以调整顺序,或者移除某个过滤插件~

这样的话,验证码也可以作为一个环节,加入或移出过滤链中。
每个环节可以有不同的错误消息,反馈到评论表单的上方:


比原来弹出一个 js 对话框的体验要好多了~ 
Safari CSS Hack
那个 ;# 貌似已经不能用了,从这里查到,现在可以用这个:
-
@media screen and (-webkit-min-device-pixel-ratio:0) {
-
/* Safari 3.0 and Opera 9 rules here */
-
}
中间的 CSS 规则只会在 Safari 3.0 和 Opera 9 以上的浏览器上生效
。
评论过滤和审核
评论过滤审核的机制已经是 Blog 系统必备的一部分,在 Chito 1.0.6 中准备加入进来。
虽然验证码对于垃圾评论很有效,但是缺点也是显而易见的,一来对用户来说却相当的不友好,二来验证码图片的生成很消耗资源,三来验证码只能防止机器,无法过滤真人发送的不良评论。
所以,1.0.6 中评论验证码将从核心中移除,将评论过滤的任务交给评论过滤插件,将通不过审核的评论关到小黑屋
。

后台中也把评论相关内容拿出来单独作为一个分类。
健怡可乐的热量好低
健怡可乐瓶子上面写每 100ml 热量平均为 0.8kJ,一直对这个数字没概念,以为不过是热量稍低一点的可乐罢了。
今天买了瓶普通的百事可乐,瓶子上面写的是每 100ml 热量为 175kJ,那么 175/0.8 就是……218……天
也就是说,单从热量上来算,喝两百多瓶健怡可乐才赶上一瓶普通的可乐
。
那么是不是普通可乐的热量太高了呢,正好桌上有一包麦片,袋子上写每 100g 热量 > 1300kJ,就算 100g 麦片冲一杯,喝一杯麦片的的热量就是 1300kJ,一瓶健怡可乐 600ml,就是 6x0.8=4.8kJ,那么 1300/4.8 是……270……汗
喝一杯麦片等于 270 瓶健怡可乐
。
看来健怡可乐确实挺“健怡”的。
嗯嗯,以后就喝它了,虽然据传有某些副作用……
return false 在 IE 下失效了?
link_to 有个 method 属性,经常拿来配合 confirm 属性做删除链接:
其实就是在链接的 onclick 中创建了一个临时表单,提交请求,最后 return false,这样链接本身就不会被触发:
不过发现,在 IE 下这个 return false 并没有效果,onclick 中的表单提交了,链接也触发了,以上面这个为例,点这个链接,会向 /admin/destroy/1234 发送两次请求,一次 post 一次 get
。
那么为什么原来没有发现这个问题呢,因为 Rails 生成的控制器代码中都会有这么一句:
verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :list }
所以第二次错误的 get 请求就会被转到 list 方法上去,但是即使通过 post 删除成功后,大多数情况也会转到 list 上去,看起来是一样的汗,实际上被转了两次。
问题就在于 IE 忽略了 return false,google 了下,好像碰到这个问题的人不是很多汗,难道是我 rp 问题…… 最后搜到了这个:
onclick="return false;" don't work in IE
看来有人在 CakePHP 的 AjaxHelper 中也发现了这个问题,解决的方法就是在 return false 前面加上一句:
这样问题就解决了,不过 Rails 链接的 onclick 都是自动生成的,要怎么改呢。
再次拜 Ruby 强大的 OpenClass 所赐:
-
module ActionView
-
module Helpers
-
module UrlHelper
-
private
-
def convert_options_to_javascript!(html_options, url = '')
-
...
-
when confirm && popup
-
"... ;event.returnValue = false; return false;"
-
when confirm && method
-
"... ;event.returnValue = false; return false;"
-
...
-
when method
-
"... event.returnValue = false;return false;"
-
when popup
-
... + 'event.returnValue = false;return false;'
-
...
-
end
-
end
-
end
找到 conver_options_to_javascript 这个方法,copy 过来,再添加上高亮部分的代码即可。直接覆盖核心的 private 方法,这种事情干起来真爽……
Firefox 好心办坏事
Chito 现在发表评论有个小问题,就是如果不用评论编辑器的话,那么发出去的评论都没有断行,这是因为没有把评论中的回车转换成 <br/> 的缘故,这次决定解决这个问题。
那么,就要区分一下用编辑器和没用编辑器所发表的评论,把没用的用 simple_format 加一下格式就可以了。
所以就在表单里加个了 hidden 字段,初始化为 "plain",编辑器载入的时候,把这个字段设置成 "html",这样就可以知道用没用编辑器了。
不过,测试的时候却出了问题,开始可以正确断行,但是只要用编辑器发一条评论,接下来的就又无法断行了。
debug 发现,即使编辑器关闭,那个 hidden 提交上来的字段也是 html。
百思不得其解,以为是我程序的问题,折腾了俩小时,还是找不到原因。
结果用 IE 试了下,没问题,郁闷了……难道是 prototype 库太旧了? 又去更新 prototype,还是没用……
最后终于发现,是 Firefox 的问题……
Firefox 会缓存表单中输入的值,刷新网页也不会变,这确实不错,
不过 Firefox 连 hidden 字段都缓存了,
即便这个值是 js 设置的……![]()
解决办法,貌似只有再用 js 设置回来……![]()
Chito 1.0.6 in progress

在 1.0.5 beta 中发现不少疏忽的的方,修正~ 还有一些地方仍可以再简化。
准备在 1.0.7 中把缓存加进来。
努力努力~ 
迁徙到 NetBeans 上去了
一直对 IDE 这类东西不感冒,估计是受原来 M$ 那个 Visual XXX 的影响,让我觉得很多细节都被 IDE 遮掩了,写程序写到最后就变成了一个只会摆弄 IDE 的工人。
所以自从来到 Linux 下,一直用 Vim 这个小巧但强大的编辑器来写东西,Chito 也是全部拿 Vim 完成,而且除了几个自动闭合 html 和括号的脚本,没有用其他任何插件。
这两天看到 NetBeans 6.1 发布的新闻,好评一片,再加上很多人都推荐用 NetBeans 来做 Rails 项目,就下了一个体验。
安装是标准的 Windows Installer 风格,一路 Next 就搞定了。然后启动,菜单选择直接导入一个现有的 Rails 项目,NetBeans 会自动构建项目类树,这样就可以自由在函数和文件间跳转,还有自动补全实例方法之类。
试用了一下,真爽~
不愧是两次获得 Jolt 最佳开发环境大奖的 IDE 。代码的显示方式很友好,Ruby 的一些闭包语法都可以自动完成,还整合了 WEBrick 和 SVN,菜单和工具栏里还有一大堆我看不懂的功能和设置。
虽然很诱人,不过还是不能使我有足够的理由迁徙到 NetBeans 上去。之所以一直黏着 Vim,是因为 Vim 有一套非常方便的快捷键,命令、编辑模式也非常合我的胃口,其实之前也看到过不少好用的编辑器,比如 Scribes、SciTE 之类,但最后都是因为无法沿用 Vim 的操作模式只好放弃了。
本以为 NetBeans 的命运也是如此,结果我搜到了这个东西:
这是啥,NetBeans Vim 编辑模式插件是也~
二话不说,下载、安装,重启 NetBeans …… 啊,我多年来的愿望终于实现了…… ![]()
这个 jVi 本来就是 a port of a major chunk of vim,所以自然包含了 Vim 几乎全部的快捷键和功能,像 :w 和 !command 这样的命令都支持,原来咋没发现这个好东西呢~
Vim 这个问题解决了,很自然就迁徙到了 NetBeans 上来~ 
自动闭合 html 标签简化版
Chito 现在用 Rubyful Soup 来解决 html 没有正确闭合的问题,其中的 BeautifulSoup 类的 prettify 方法非常强大,几乎可以修正 html 中的所有错误。
不过 Chito 只是拿来闭合标签,其他的功能完全用不到,Rubyful Soup 还要依赖 htmltools 这个库,为了个闭合标签就要多附带这么多库太不爽了,而且还有个 %nbsp 的 bug。
自己尝试写了个,close_html:
-
def close_html(html)
-
stream = html.scan( /<\s*[^>]+>/ ).map {|x| x[ /<\s*([^>^\s]*)[^>]*>/ , 1]}
-
stack = []
-
stream.each do |x|
-
if x =~ /^\//
-
stack.pop if x[1..-1] == stack.last
-
else
-
stack.push x
-
end
-
end
-
stack.reverse.each {|x| html << "</#{x}>\n"}
-
html
-
end
处理的方式罗嗦了一些,先把 html 文本中的标签提取出来,然后再去掉属性之类的,转换成一个 “标签流”,比如:
<div class="main><ul><li>test</li>
就转换成了:
["div","ul","li""/li"]
接着读取上面这个流,把开始标签压栈,遇到以 / 开头的结束标签,检查是否和栈顶的标签相匹配,匹配就弹出,走完标签流后,还留在栈里的标签就是需要闭合的标签了。
测试一下:
-
test_html = <<END
-
<div>
-
<ul>
-
<li> lalalalala </li>
-
<li><strong><a href="http://www.google.com"> Google
-
END
-
-
puts close_html(test_html)
输出:
效果不错,标签都正确闭合了~
这种方法还是有局限性的,因为只是个简单的栈操作,所以只适合修正那些正确的 html 被拦腰截断的情况,而不能修正类似 <h1></h2> 这样匹配错误的情况,<div><a></div> 这样中间格式错误的情况也不行,不过 Chito 的编辑器和 textile 都不会生成这些样子的 html,所以完全可以用这个小函数替代那个庞大的 Rubyful Soup 了~ 
Passenger 进了 Gentoo Portage
周五进的,今天才发现,Gentoo 动作真快 
Available versions: (~)1.0.1 {debug}
Homepage: http://modrails.com/
Description: Passenger (a.k.a. mod_rails) makes deployment of Ruby on Rails applications a breeze
