是看到robbin的帖子提到这个插件,下载下来改了一下,使用感觉还不错
http://agilewebdevelopment.com/plugins/bbcodeizer
http://agtools.rubyforge.org/bbcodeizer/
BBCodeizer是用来将UBB代码转换为html的Rails插件,通常情况下,我们不喜欢客户能直接通过html编辑帖子或者发言,但是我们又不想局限于普通的text_area的输入框,总想着加点什么,譬如让用户可以调整字的大小,可以让用户插入图片,可以引用上面用户的言语,可以.....
那太好了,也许BBCodeizer就是你想要的插件之一
一:安装
在linux/unix下可以通过如下的方式安装
script/plugin install svn://rubyforge.org/var/svn/agtools/plugins/bbcodeizer
windows
ruby script/plugin install svn://rubyforge.org/var/svn/agtools/plugins/bbcodeizer
ok,一切都好了,下面可以开始使用了
二:使用
在view里面,我们只需要调用BBCodeizeHelper的bbcodeize即可
<%=bbcodeize 'http://www.google.com/intl/en_ALL/images/logo.gif'%>
我们查看 /vendor/plugins/bbcodeizer/lib/bbcodeize_helper.rb代码 发现其实就是调用
BBCodeizer.bbcodeize
require 'bbcodeizer'
module BBCodeizeHelper
# Parses all bbcode in +text+ and returns a new HTML-formatted string.
def bbcodeize(text)
BBCodeizer.bbcodeize(text)
end
end
在controller中,也可以之直接使用
render :text => BBCodeizer.bbcodeize 'http://www.google.com/intl/en_ALL/images/logo.gif'
三:改进
也许你觉得BBCodeizer输出不太符合你所想的,也许你觉得可用的格式太少,想增强他的功能,其实很简单
查看/vendor/plugins/bbcodeizer/lib/bbcodeizer.rb,目前他支持的格式都在这里,就这么简单。
#:nodoc:
Tags = {
:start_code => [ /\[code\]/i, '<pre>' ],
:end_code => [ /\[\/code\]/i, '</pre>' ],
:start_quote => [ /\[quote(?:=".*?")?\]/i, nil ],
:start_quote_with_cite => [ /\[quote="(.*?)"\]/i, '<blockquote><cite>\1 wrote:</cite><br />' ],
:start_quote_sans_cite => [ /\[quote\]/i, '<blockquote>' ],
:end_quote => [ /\[\/quote\]/i, '</blockquote>' ],
:bold => [ /\[b\](.+?)\[\/b\]/i, '<strong>\1</strong>' ],
:italic => [ /\[i\](.+?)\[\/i\]/i, '<em>\1</em>' ],
:underline => [ /\[u\](.+?)\[\/u\]/i, '<u>\1</u>' ],
:email_with_name => [ /\[email=(.+?)\](.+?)\[\/email\]/i, '<a href="mailto:\1">\2</a>' ],
:email_sans_name => [ /\[email\](.+?)\[\/email\]/i, '<a href="mailto:\1">\1</a>' ],
:url_with_title => [ /\[url=(.+?)\](.+?)\[\/url\]/i, '<a href="\1">\2</a>' ],
:url_sans_title => [ /\[url\](.+?)\[\/url\]/i, '<a href="\1">\1</a>' ],
:image => [ /\[img\](.+?)\[\/img\]/i, '<img src="\1" />' ],
:size => [ /\[size=(\d{1,2})\](.+?)\[\/size\]/i, '<span style="font-size: \1px">\2</span>' ],
:color => [ /\[color=([^;]+?)\](.+?)\[\/color\]/i, '<span style="color: \1">\2</span>' ]
}
你还想.... (有什么想法,大家讨论:))
四:增强
在BBCodeizer提及到的WhiteListHelper是个很不错的工具,去除掉不安全的代码。我们可以在helper中加上如下的代码
def cc(text)
white_list(simple_format(auto_link(bbcodeize(h(text)))))
end
在页面上调用
<%=cc '内容'%>
即可
注:auto_link 是自动的识别正文中的链接,譬如http,email
五:参考
目前BBCodeizer支持:
[u]text[/u]
生成
<u>text</u>
[b]text[/b]
生成
<strong>text</strong>
[i]text[/i]
生成
<em>text</em>
[img]http://example.com/image.gif[/img]
生成
<img src="http://example.com/image.gif" />
[[email protected]]Joe Example[/email]
[email][email protected][/email]
生成
<a href="mailto:[email protected]">Joe Example</a>
<a href="mailto:[email protected]">[email protected]</a>
bbcodeize(string)[\/code]
生成
<pre>bbcodeize(string)</pre>
[url=http://www.google.com]Google[/url]
[url]http://www.google.com[/url]
生成
<a href="http://www.google.com">Google</a>
<a href="http://www.google.com">http://www.google.com</a>
Shakespeare 写道
To be or not to be
引用
That is the question
生成
<blockquote><cite>Shakespeare wrote:</cite><br />To be or not to be</blockquote>
<blockquote>That is the question</blockquote>
[size=32]Big Text[/size]
生成
<span style="font-size: 32px">Big Text</span>
[color=red]Red Text[/color] [color=#ABCDEF]Alphabet-colored Text[/color]
生成
<span style="color: red">Red Text</span>
<span style="color: #ABCDEF">Alphabet Colored Text</span>