cbot-bbcodeizer 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README +128 -0
- data/Rakefile +22 -0
- data/bbcodeizer.gemspec +23 -0
- data/init.rb +4 -0
- data/lib/bbcodeizer.rb +171 -0
- data/lib/bbcodeizer/version.rb +3 -0
- data/lib/bbcodeizer_helper.rb +8 -0
- data/rdoc/BBCodeizeHelper.html +182 -0
- data/rdoc/Bbcodeizer.html +146 -0
- data/rdoc/README.html +214 -0
- data/rdoc/created.rid +5 -0
- data/rdoc/images/brick.png +0 -0
- data/rdoc/images/brick_link.png +0 -0
- data/rdoc/images/bug.png +0 -0
- data/rdoc/images/bullet_black.png +0 -0
- data/rdoc/images/bullet_toggle_minus.png +0 -0
- data/rdoc/images/bullet_toggle_plus.png +0 -0
- data/rdoc/images/date.png +0 -0
- data/rdoc/images/find.png +0 -0
- data/rdoc/images/loadingAnimation.gif +0 -0
- data/rdoc/images/macFFBgHack.png +0 -0
- data/rdoc/images/package.png +0 -0
- data/rdoc/images/page_green.png +0 -0
- data/rdoc/images/page_white_text.png +0 -0
- data/rdoc/images/page_white_width.png +0 -0
- data/rdoc/images/plugin.png +0 -0
- data/rdoc/images/ruby.png +0 -0
- data/rdoc/images/tag_green.png +0 -0
- data/rdoc/images/wrench.png +0 -0
- data/rdoc/images/wrench_orange.png +0 -0
- data/rdoc/images/zoom.png +0 -0
- data/rdoc/index.html +60 -0
- data/rdoc/js/darkfish.js +116 -0
- data/rdoc/js/jquery.js +32 -0
- data/rdoc/js/quicksearch.js +114 -0
- data/rdoc/js/thickbox-compressed.js +10 -0
- data/rdoc/lib/bbcodeize_helper_rb.html +54 -0
- data/rdoc/lib/bbcodeizer/version_rb.html +52 -0
- data/rdoc/lib/bbcodeizer_helper_rb.html +54 -0
- data/rdoc/lib/bbcodeizer_rb.html +52 -0
- data/rdoc/rdoc.css +763 -0
- data/test/bbcodeizer_test.rb +145 -0
- metadata +125 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2006 Jonathan Dance / Agora Games
|
2
|
+
Copyright (c) 2006 Trevor Turk
|
3
|
+
Copyright (c) 2011 Luke Curley
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a
|
6
|
+
copy of this software and associated documentation files (the "Software"),
|
7
|
+
to deal in the Software without restriction, including without limitation
|
8
|
+
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
9
|
+
and/or sell copies of the Software, and to permit persons to whom the
|
10
|
+
Software is furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18
|
+
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21
|
+
DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
== BBCodeizer
|
2
|
+
|
3
|
+
BBCodeizer is a gem used to translate BBCode to HTML. The main interface
|
4
|
+
is provided through the helper method "bbcodeize." Use of it is as simple as
|
5
|
+
passing a string to bbcodeize:
|
6
|
+
|
7
|
+
<%= bbcodeize post.body %>
|
8
|
+
|
9
|
+
You can also invoke the BBCodeizer directly without the helper:
|
10
|
+
|
11
|
+
render :text => BBCodeizer.bbcodeize(post.body)
|
12
|
+
|
13
|
+
All settings are centralized so you can very quickly deactivate any tag or
|
14
|
+
modify the HTML that is generated. You can modify these settings by adding
|
15
|
+
lines to the end of your environment.rb. For example:
|
16
|
+
|
17
|
+
# deactivate [color], [size], and [code] tags
|
18
|
+
BBCodeizer.deactivate(:color, :size, :code)
|
19
|
+
|
20
|
+
# use <b> instead of <strong>
|
21
|
+
BBCodeizer.replace_using(:bold, '<b>\1</b>')
|
22
|
+
|
23
|
+
These changes should be considered one-time configuration, e.g. tags
|
24
|
+
cannot be deactivated then activated again.
|
25
|
+
|
26
|
+
== Warning
|
27
|
+
|
28
|
+
While BBCodeizer does some validation (see below), you should be aware it is
|
29
|
+
possible to create unsafe HTML in the wrong hands (for example, invoking
|
30
|
+
Javascript using the [url] tag). It is highly recommended you run the
|
31
|
+
resulting HTML through a sanity checker such as WhiteList:
|
32
|
+
|
33
|
+
http://svn.techno-weenie.net/projects/plugins/white_list/
|
34
|
+
|
35
|
+
Once installed, the following is a helper method that will produce nicely
|
36
|
+
formatted, safe HTML:
|
37
|
+
|
38
|
+
def format_text(text)
|
39
|
+
white_list(simple_format(auto_link(bbcodeize(h(text)))))
|
40
|
+
end
|
41
|
+
|
42
|
+
== Supported Tags
|
43
|
+
|
44
|
+
BBCodeizer currently supports the following tags. The default HTML expansion
|
45
|
+
is documented here.
|
46
|
+
|
47
|
+
[u]text[/u]
|
48
|
+
|
49
|
+
<u>text</u>
|
50
|
+
|
51
|
+
[b]text[/b]
|
52
|
+
|
53
|
+
<strong>text</strong>
|
54
|
+
|
55
|
+
[i]text[/i]
|
56
|
+
|
57
|
+
<em>text</em>
|
58
|
+
|
59
|
+
[img]http://example.com/image.gif[/img]
|
60
|
+
|
61
|
+
<img src="http://example.com/image.gif" />
|
62
|
+
|
63
|
+
[email=joe@example.com]Joe Example[/email]
|
64
|
+
|
65
|
+
<a href="mailto:joe@example.com">Joe Example</a>
|
66
|
+
|
67
|
+
[email]joe@example.com[/email]
|
68
|
+
|
69
|
+
<a href="mailto:joe@example.com">joe@example.com</a>
|
70
|
+
|
71
|
+
[code]bbcodeize(string)[/code]
|
72
|
+
|
73
|
+
<pre>bbcodeize(string)</pre>
|
74
|
+
|
75
|
+
[url=http://www.google.com]Google[/url]
|
76
|
+
|
77
|
+
<a href="http://www.google.com">Google</a>
|
78
|
+
|
79
|
+
[url]http://www.google.com[/url]
|
80
|
+
|
81
|
+
<a href="http://www.google.com">http://www.google.com</a>
|
82
|
+
|
83
|
+
[quote="Shakespeare"]To be or not to be[/quote]
|
84
|
+
|
85
|
+
<blockquote><cite>Shakespeare wrote:</cite><br />To be or not to
|
86
|
+
be</blockquote>
|
87
|
+
|
88
|
+
[quote]That is the question[/quote]
|
89
|
+
|
90
|
+
<blockquote>That is the question</blockquote>
|
91
|
+
|
92
|
+
[size=32]Big Text[/size]
|
93
|
+
|
94
|
+
<span style="font-size: 32px">Big Text</span>
|
95
|
+
|
96
|
+
[color=red]Red Text[/color] [color=#ABCDEF]Alphabet-colored Text[/color]
|
97
|
+
|
98
|
+
<span style="color: red">Red Text</span>
|
99
|
+
<span style="color: #ABCDEF">Alphabet Colored Text</span>
|
100
|
+
|
101
|
+
== Validation
|
102
|
+
|
103
|
+
BBCodeizer aims to produce HTML that will not break your site - all opening
|
104
|
+
tags must have a closing tag or they will not be replaced (unmatched tags are
|
105
|
+
left as-is). All [code] and [quote] tags are left entirely untouched if there
|
106
|
+
is any mismatch with either of these. All other tags will replace as many as
|
107
|
+
possible and leave the remaining unmatched tags as-is.
|
108
|
+
|
109
|
+
BBCodeizer attempts to produce XHTML-compliant markup, however, misuse of
|
110
|
+
nesting tags is not validated or corrected. For example:
|
111
|
+
|
112
|
+
[b]bold [u]bold + underline[/b] underline[/u]
|
113
|
+
|
114
|
+
Will produce the following HTML:
|
115
|
+
|
116
|
+
<strong>bold <u>bold + underline</strong> underline</u>
|
117
|
+
|
118
|
+
Colors in the [color] tag are not validated - any string can be used. Strings
|
119
|
+
containing semicolons are not allowed to prevent users from adding additional
|
120
|
+
style rules.
|
121
|
+
|
122
|
+
Sizes used in the [size] tag are validated - only 1 or 2 digit numbers are
|
123
|
+
accepted.
|
124
|
+
|
125
|
+
-----------------
|
126
|
+
Copyright (c) 2006 Jonathan Dance / Agora Games
|
127
|
+
Copyright (c) 2011 Luke Curley
|
128
|
+
Distributed under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Test the BBCodeizer plugin.'
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << 'lib'
|
11
|
+
t.pattern = 'test/**/*_test.rb'
|
12
|
+
t.verbose = true
|
13
|
+
end
|
14
|
+
|
15
|
+
desc 'Generate documentation for the BBCodeizer plugin.'
|
16
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
17
|
+
rdoc.rdoc_dir = 'rdoc'
|
18
|
+
rdoc.title = 'BBCodeizer'
|
19
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
20
|
+
rdoc.rdoc_files.include('README')
|
21
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
|
+
end
|
data/bbcodeizer.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "bbcodeizer/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "cbot-bbcodeizer"
|
7
|
+
s.version = Bbcodeizer::VERSION
|
8
|
+
s.authors = ["Jonathan Dance", "Luke Curley"]
|
9
|
+
s.email = ["jd+bbcodeizer@wuputah.com", "luke@box.net"]
|
10
|
+
s.homepage = "https://github.com/qpingu/bbcodeizer"
|
11
|
+
s.summary = %q{BBCodeizer is a simple gem that translates BBCode to HTML}
|
12
|
+
|
13
|
+
s.rubyforge_project = "bbcodeizer"
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
# specify any dependencies here; for example:
|
21
|
+
s.add_development_dependency "rake"
|
22
|
+
s.add_development_dependency "rdoc"
|
23
|
+
end
|
data/init.rb
ADDED
data/lib/bbcodeizer.rb
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
module BBCodeizer
|
2
|
+
class << self
|
3
|
+
|
4
|
+
#:nodoc:
|
5
|
+
Tags = {
|
6
|
+
:literal => [ /\[\[(.+?)\]\]/im, '[\1]' ],
|
7
|
+
:start_code => [ /\[code\](\r\n?)?/i, '<pre><code>' ],
|
8
|
+
:end_code => [ /(\r\n?)?\[\/code\]/i, '</code></pre>' ],
|
9
|
+
:start_list => [ /\[list\](\r\n?)?/i, '<ul>' ],
|
10
|
+
:start_li => [ /\[li\](\r\n?)?/i, '<li>' ],
|
11
|
+
:end_li => [ /(\r\n?)?\[\/li\](\r\n?)?/i, '</li>' ],
|
12
|
+
:end_list => [ /(\r\n?)?\[\/list\]/i, '</ul>' ],
|
13
|
+
:start_quote => [ /\[quote(?:=.*?)?\](\r\n?)?/i, '<blockquote>' ],
|
14
|
+
:start_quote_with_cite => [ /\[quote=(.*?)\](\r\n?)?/i, '<blockquote><p><cite>\1 wrote:</cite></p>' ],
|
15
|
+
:start_quote_sans_cite => [ /\[quote\](\r\n?)?/i, '<blockquote>' ],
|
16
|
+
:end_quote => [ /(\r\n?)?\[\/quote\]/i, '</blockquote>' ],
|
17
|
+
:bold => [ /\[b\](.+?)\[\/b\]/im, '<strong>\1</strong>' ],
|
18
|
+
:italic => [ /\[i\](.+?)\[\/i\]/im, '<em>\1</em>' ],
|
19
|
+
:underline => [ /\[u\](.+?)\[\/u\]/im, '<u>\1</u>' ],
|
20
|
+
:del => [ /\[del\](.+?)\[\/del\]/im, '<del>\1</del>' ],
|
21
|
+
:strike => [ /\[strike\](.+?)\[\/strike\]/im, '<del>\1</del>' ],
|
22
|
+
:email_with_name => [ /\[email=(.+?)\](.+?)\[\/email\]/i, '<a href="mailto:\1">\2</a>' ],
|
23
|
+
:email_sans_name => [ /\[email\](.+?)\[\/email\]/i, '<a href="mailto:\1">\1</a>' ],
|
24
|
+
:url_with_title => [ /\[url=(.+?)\](.+?)\[\/url\]/i, '<a href="\1" target="_blank">\2</a>' ],
|
25
|
+
:url_sans_title => [ /\[url\](.+?)\[\/url\]/i, '<a href="\1" target="_blank">\1</a>' ],
|
26
|
+
:image => [ /\[img\](.+?)\[\/img\]/i, '<img src="\1" alt="\1" />' ],
|
27
|
+
:size => [ /\[size=(\d{1,2})\](.+?)\[\/size\]/im, '<span style="font-size: \1px">\2</span>' ],
|
28
|
+
:color => [ /\[color=([^;]+?)\](.+?)\[\/color\]/im, '<span style="color: \1">\2</span>' ],
|
29
|
+
:youtube => [ /\[youtube\](.+?)youtube.com\/watch\?v=(.+?)\[\/youtube\]/i, '<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/\2?fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/\2?fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="350"></embed></object>' ],
|
30
|
+
:googlevid => [ /\[googlevid\](.+?)video.google.com\/videoplay\?docid=(.*?)\[\/googlevid\]/i, '<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=\2&hl=en"></embed>' ],
|
31
|
+
:flash => [ /\[flash\](.+?)\[\/flash\]/i, '<object width="100%" height="100%"><param name="movie" value="\1"></param><embed src="\1" type="application/x-shockwave-flash" width="100%" height="100%"></embed></object>' ],
|
32
|
+
:spoiler => [ /\[spoiler\](.+?)\[\/spoiler\]/im, '<a href="#" class="spoiler-link" onclick="$(\'_RANDOM_ID_\').toggle(); return false;">SPOILER</a><div id="_RANDOM_ID_" class="spoiler" style="display:none;">\1</div>' ],
|
33
|
+
:nsfw => [ /\[nsfw\](.+?)\[\/nsfw\]/im, '<a href="#" class="nsfw-link" onclick="$(\'_RANDOM_ID_\').toggle(); return false;">NSFW</a><div id="_RANDOM_ID_" class="nsfw" style="display:none;">\1</div>' ],
|
34
|
+
:hide => [ /\[hide=(.+?)\](.+?)\[\/hide\]/im, '<a href="#" class="hide-link" onclick="$(\'_RANDOM_ID_\').toggle(); return false;">\1</a><div id="_RANDOM_ID_" class="hide" style="display:none;">\2</div>' ],
|
35
|
+
:mp3 => [ /\[mp3\](.+?)\[\/mp3\]/i, '<script language="JavaScript" src="/javascripts/audio-player.js"></script><object type="application/x-shockwave-flash" data="/flash/player.swf" id="_RANDOM_ID_" height="24" width="290"><param name="movie" value="/flash/player.swf"><param name="FlashVars" value="playerID=_RANDOM_ID_&soundFile=\1"><param name="quality" value="high"><param name="menu" value="false"><param name="wmode" value="transparent"></object>' ],
|
36
|
+
:superdeluxe => [ /\[superdeluxe\](.+?)superdeluxe.com\/sd\/contentDetail.do\?id=(.+?)\[\/superdeluxe\]/i, '<object width="400" height="350"><param name="allowFullScreen" value="true" /><param name="movie" value="http://www.superdeluxe.com/static/swf/share_vidplayer.swf" /><param name="FlashVars" value="id=\2" /><embed src="http://www.superdeluxe.com/static/swf/share_vidplayer.swf" FlashVars="id=\2" type="application/x-shockwave-flash" width="400" height="350" allowFullScreen="true" ></embed></object>' ],
|
37
|
+
:comedycentral => [ /\[comedycentral\](.+?)comedycentral.com(.+?)?(.+?)=(.+?)\[\/comedycentral\]/i, '<embed FlashVars="config=http://www.comedycentral.com/motherload/xml/data_synd.jhtml?vid=\4%26myspace=false" src="http://www.comedycentral.com/motherload/syndicated_player/index.jhtml" quality="high" bgcolor="#006699" width="340" height="325" name="comedy_player" align="middle" allowScriptAccess="always" allownetworking="external" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>' ],
|
38
|
+
:revver => [ /\[revver\](.+?)revver.com\/video\/(.+?)\/(.+?)\[\/revver\]/i, '<embed type="application/x-shockwave-flash" src="http://flash.revver.com/player/1.0/player.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" scale="noScale" salign="TL" bgcolor="#000000" flashvars="mediaId=\2&affiliateId=0&allowFullScreen=true" allowfullscreen="true" height="392" width="480"></embed>' ],
|
39
|
+
:myspacetv => [ /\[myspacetv\](.+?)myspace(.+?)videoid=(.+?)\[\/myspacetv\]/i, '<embed src="http://lads.myspace.com/videos/vplayer.swf" flashvars="m=\3&v=2&type=video" type="application/x-shockwave-flash" width="430" height="346"></embed>' ],
|
40
|
+
:collegehumor => [ /\[collegehumor\](.+?)collegehumor.com\/video:(.+?)\[\/collegehumor\]/i, '<embed src="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=\2" quality="best" width="400" height="300" type="application/x-shockwave-flash"></embed>' ],
|
41
|
+
:hulu => [ /\[hulu\](.+?)\[\/hulu\]/i, '<object width="512" height="296"><param name="movie" value="http://www.hulu.com/embed/\1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.hulu.com/embed/\1" type="application/x-shockwave-flash" allowFullScreen="true" width="512" height="296"></embed></object>' ],
|
42
|
+
:metacafe => [ /\[metacafe\](.+?)metacafe.com\/watch\/(.+?)\/(.+?)\/\[\/metacafe\]/i, '<embed src="http://www.metacafe.com/fplayer/\2/\3.swf" width="400" height="345" wmode="transparent" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed>' ],
|
43
|
+
:yahoovid => [ /\[yahoovid\](.+?)video.yahoo.com\/watch\/(.+?)\/(.+?)\[\/yahoovid\]/i, '<object width="512" height="323"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.2" /><param name="allowFullScreen" value="true" /><param name="flashVars" value="id=\3&vid=\2&lang=en-us&intl=us&embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.2" type="application/x-shockwave-flash" width="512" height="323" allowFullScreen="true" flashVars="id=\3&vid=\2&lang=en-us&intl=us&embed=1" ></embed></object>' ],
|
44
|
+
:flickr => [ /\[flickr\](.+?)\/photos\/(.+?)\/(.+?)\[\/flickr\]/i, '<object type="application/x-shockwave-flash" width="400" height="300" data="http://www.flickr.com/apps/video/stewart.swf?v=1.162"><param name="flashvars" value="intl_lang=en-us&photo_id=\3&show_info_box=true"></param><param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=1.162"></param><param name="bgcolor" value="#000000"></param><param name="allowFullScreen" value="true"></param><embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=1.162" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&photo_id=\3&flickr_show_info_box=true" height="300" width="400"></embed></object>' ],
|
45
|
+
:gametrailers => [ /\[gametrailers\](.+?)gametrailers.com\/player\/(.+?)\.(.+?)\[\/gametrailers\]/i, '<object codebase="http://download.macromedia.com/pub/shockwave/ca...=8,0,0,0" id="gtembed" width="480" height="392"> <param name="allowScriptAccess" value="sameDomain" /> <param name="allowFullScreen" value="true" /> <param name="movie" value="http://www.gametrailers.com/remote_wrap.php?mid=\2"/> <param name="quality" value="high" /> <embed src="http://www.gametrailers.com/remote_wrap.php?mid=\2" swLiveConnect="true" name="gtembed" align="middle" allowScriptAccess="sameDomain" allowFullScreen="true" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="480" height="392"></embed> </object>' ], :slideshare => [ /\[slideshare id=(.+?)&(.+?)=(.+?)&(.+?)=(.+?)\]/i, '<object type="application/x-shockwave-flash" wmode="transparent" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=\1&doc=\3" width="\5" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=\1&doc=\3" /></object>' ],
|
46
|
+
:funnyordie => [ /\[funnyordie\](.+?)funnyordie.com\/videos\/([^\/]+)(.*)\[\/funnyordie\]/i, '<object width="464" height="388"><param name="movie" value="http://www2.funnyordie.com/public/flash/fodplayer.swf?6045" /><param name="flashvars" value="key=\2" /><param name="allowfullscreen" value="true" /><embed width="464" height="388" flashvars="key=\2" allowfullscreen="true" quality="high" src="http://www2.funnyordie.com/public/flash/fodplayer.swf?6045" type="application/x-shockwave-flash"></embed></object>' ],
|
47
|
+
:atomfilms => [ /\[atomfilms\](.+?)atomfilms.com\/film\/(.+?)\[\/atomfilms\]/i, '<embed src="http://www.atomfilms.com:80/a/autoplayer/shareEmbed.swf?keyword=\2" width="426" height="350"></embed>' ],
|
48
|
+
:current => [ /\[current\](.+?)current.com\/items\/(.+?)\/(.+?)\[\/current\]/i, '<object width="400" height="400"><param name="movie" value="http://current.com/e/\2/en_US"></param><param name="wmode" value="transparent"></param><param name="allowfullscreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://current.com/e/\2/en_US" type="application/x-shockwave-flash" width="400" height="400" wmode="transparent" allowfullscreen="true" allowscriptaccess="always"></embed></object>' ],
|
49
|
+
:vimeo => [ /\[vimeo\](.+?)vimeo.com\/(.+?)\[\/vimeo\]/i, '<object type="application/x-shockwave-flash" width="400" height="300" data="http://www.vimeo.com/moogaloop.swf?clip_id=\2&server=www.vimeo.com&fullscreen=1&show_title=1&show_byline=1&show_portrait=0&color="> <param name="quality" value="best" /> <param name="allowfullscreen" value="true" /> <param name="scale" value="showAll" /> <param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=\2&server=www.vimeo.com&fullscreen=1&show_title=1&show_byline=1&show_portrait=0&color=" /></object>' ],
|
50
|
+
:grooveshark => [ /\[grooveshark\](.+?)\[\/grooveshark\]/i, '<object width="250" height="40"> <param name="movie" value="http://listen.grooveshark.com/songWidget.swf"></param> <param name="wmode" value="window"></param> <param name="allowScriptAccess" value="always"></param> <param name="flashvars" value="hostname=cowbell.grooveshark.com&widgetID=\1&style=grass&p=0"></param> <embed src="http://listen.grooveshark.com/songWidget.swf" type="application/x-shockwave-flash" width="250" height="40" flashvars="hostname=cowbell.grooveshark.com&widgetID=\1&style=grass&p=0" allowScriptAccess="always" wmode="window"></embed></object>'],
|
51
|
+
:sup => [ /\[sup\](.+?)\[\/sup\]/im, '<sup>\1</sup>' ],
|
52
|
+
:sub => [ /\[sub\](.+?)\[\/sub\]/im, '<sub>\1</sub>' ],
|
53
|
+
:auto_link => [ /(\A|\s|>)((https?:\/\/|www\.)[^\s<]+)/, '\1<a href="\2" target="_blank">\2</a>' ],
|
54
|
+
}
|
55
|
+
|
56
|
+
# Tags in this list are invoked. To deactivate a particular tag, call BBCodeizer.deactivate.
|
57
|
+
# These names correspond to either names above or methods in this module.
|
58
|
+
# The ':literal' tag MUST be first for it to work correctly
|
59
|
+
TagList = [ :literal, :bold, :italic, :underline, :del, :strike, :email_with_name,
|
60
|
+
:email_sans_name, :image, :size, :color, :code, :quote, :youtube, :googlevid,
|
61
|
+
:flash, :spoiler, :nsfw, :hide, :mp3, :superdeluxe, :comedycentral, :revver,
|
62
|
+
:myspacetv, :collegehumor, :hulu, :metacafe, :yahoovid, :flickr, :gametrailers,
|
63
|
+
:slideshare, :funnyordie, :atomfilms, :vimeo, :li, :list, :current, :auto_link,
|
64
|
+
:url_with_title, :url_sans_title ]
|
65
|
+
|
66
|
+
TagGroups = { :video => [ :youtube, :googlevid, :flash, :superdeluxe, :comedycentral, :revver,
|
67
|
+
:myspacetv, :collegehumor, :hulu, :metacafe, :yahoovid, :gametrailers,
|
68
|
+
:funnyordie, :atomfilms, :vimeo ],
|
69
|
+
:image => [ :image, :flickr ] }
|
70
|
+
|
71
|
+
# Parses all bbcode in +text+ and returns a new HTML-formatted string.
|
72
|
+
def bbcodeize(text, options = Hash.new)
|
73
|
+
text = text.dup
|
74
|
+
|
75
|
+
disabled = Array.new
|
76
|
+
disabled += @deactivated if @deactivated
|
77
|
+
disabled += decode_tags(options[:disabled]) if options[:disabled]
|
78
|
+
|
79
|
+
(TagList - disabled).each do |tag|
|
80
|
+
if Tags.has_key?(tag)
|
81
|
+
apply_tag(text, tag)
|
82
|
+
else
|
83
|
+
self.send(tag, text)
|
84
|
+
end
|
85
|
+
# Replace the matching random ids for the following tags: spoiler, nsfw, mp3
|
86
|
+
@random_id = random_string
|
87
|
+
2.times { text = text.sub('_RANDOM_ID_', @random_id) }
|
88
|
+
end
|
89
|
+
text
|
90
|
+
end
|
91
|
+
|
92
|
+
# Configuration option to deactivate particular +tags+.
|
93
|
+
def deactivate(*tags)
|
94
|
+
@deactivated ||= Array.new
|
95
|
+
@deactivated += decode_tags(*tags)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Configuration option to reactivate particular +tags+.
|
99
|
+
def activate(*tags)
|
100
|
+
@deactivated ||= Array.new
|
101
|
+
@deactivated -= decode_tags(*tags)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Configuration option to change the replacement string used for a particular +tag+. The source
|
105
|
+
# code should be referenced to determine what an appropriate replacement +string+ would be.
|
106
|
+
def replace_using(tag, string)
|
107
|
+
Tags[tag][1] = string
|
108
|
+
end
|
109
|
+
|
110
|
+
private
|
111
|
+
|
112
|
+
def code(string)
|
113
|
+
# code tags must match, else don't do any replacing.
|
114
|
+
if string.scan(Tags[:start_code].first).size == string.scan(Tags[:end_code].first).size
|
115
|
+
apply_tags(string, :start_code, :end_code)
|
116
|
+
# strip out newlines from within the tags and replace them with '<br />', otherwise
|
117
|
+
# simple_format will simply append a '<br />' to the newlines, creating double spaces
|
118
|
+
string.gsub!(/#{Tags[:start_code].last}.+?#{Tags[:end_code].last}/im) { |s| s.gsub(/\r\n?/, '<br />') }
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def li(string)
|
123
|
+
# list tags must match, else don't do any replacing.
|
124
|
+
if string.scan(Tags[:start_li].first).size == string.scan(Tags[:end_li].first).size
|
125
|
+
apply_tags(string, :start_li, :end_li)
|
126
|
+
# strip out newlines from within the tags and replace them with '<br />', otherwise
|
127
|
+
# simple_format will simply append a '<br />' to the newlines, creating double spaces
|
128
|
+
string.gsub!(/#{Tags[:start_li].last}.+?#{Tags[:end_li].last}/im) { |s| s.gsub(/\r\n?/, '<br />') }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def list(string)
|
133
|
+
# list tags must match, else don't do any replacing.
|
134
|
+
if string.scan(Tags[:start_list].first).size == string.scan(Tags[:end_list].first).size
|
135
|
+
apply_tags(string, :start_list, :end_list)
|
136
|
+
# strip out newlines from within the tags and replace them with '<br />', otherwise
|
137
|
+
# simple_format will simply append a '<br />' to the newlines, creating double spaces
|
138
|
+
string.gsub!(/#{Tags[:start_list].last}.+?#{Tags[:end_list].last}/im) { |s| s.gsub(/\r\n?/, '<br />') }
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def quote(string)
|
143
|
+
# quotes must match, else don't do any replacing
|
144
|
+
if string.scan(Tags[:start_quote].first).size == string.scan(Tags[:end_quote].first).size
|
145
|
+
apply_tags(string, :start_quote_with_cite, :start_quote_sans_cite, :end_quote)
|
146
|
+
# strip out newlines from within the tags and replace them with '<br />', otherwise
|
147
|
+
# simple_format will simply append a '<br />' to the newlines, creating double spaces
|
148
|
+
string.gsub!(/#{Tags[:start_quote].last}.+?#{Tags[:end_quote].last}/im) { |s| s.gsub(/\r\n?/, '<br />') }
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def apply_tags(string, *tags)
|
153
|
+
tags.each do |tag|
|
154
|
+
string.gsub!(*Tags[tag])
|
155
|
+
end
|
156
|
+
end
|
157
|
+
alias_method :apply_tag, :apply_tags
|
158
|
+
|
159
|
+
def decode_tags(*tags)
|
160
|
+
tags.inject(Array.new) do |decoded_tags, tag|
|
161
|
+
decoded_tag = TagGroups.key?(tag) ? TagGroups[tag] : tag
|
162
|
+
decoded_tags + Array(decoded_tag)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# http://stackoverflow.com/questions/88311/how-best-to-generate-a-random-string-in-ruby
|
167
|
+
def random_string
|
168
|
+
(0...16).map{ ('a'..'z').to_a[rand(26)] }.join
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
3
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
4
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
5
|
+
<head>
|
6
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
7
|
+
|
8
|
+
<title>Module: BBCodeizeHelper</title>
|
9
|
+
|
10
|
+
<link rel="stylesheet" href="./rdoc.css" type="text/css" media="screen" />
|
11
|
+
|
12
|
+
<script src="./js/jquery.js" type="text/javascript" charset="utf-8"></script>
|
13
|
+
<script src="./js/thickbox-compressed.js" type="text/javascript" charset="utf-8"></script>
|
14
|
+
<script src="./js/quicksearch.js" type="text/javascript" charset="utf-8"></script>
|
15
|
+
<script src="./js/darkfish.js" type="text/javascript" charset="utf-8"></script>
|
16
|
+
|
17
|
+
</head>
|
18
|
+
<body id="top" class="module">
|
19
|
+
|
20
|
+
<div id="metadata">
|
21
|
+
<div id="home-metadata">
|
22
|
+
<div id="home-section" class="section">
|
23
|
+
<h3 class="section-header">
|
24
|
+
<a href="./index.html">Home</a>
|
25
|
+
<a href="./index.html#classes">Classes</a>
|
26
|
+
<a href="./index.html#methods">Methods</a>
|
27
|
+
</h3>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<div id="file-metadata">
|
32
|
+
<div id="file-list-section" class="section">
|
33
|
+
<h3 class="section-header">In Files</h3>
|
34
|
+
<div class="section-body">
|
35
|
+
<ul>
|
36
|
+
|
37
|
+
<li><a href="./lib/bbcodeizer_helper_rb.html?TB_iframe=true&height=550&width=785"
|
38
|
+
class="thickbox" title="lib/bbcodeizer_helper.rb">lib/bbcodeizer_helper.rb</a></li>
|
39
|
+
|
40
|
+
</ul>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
|
44
|
+
|
45
|
+
</div>
|
46
|
+
|
47
|
+
<div id="class-metadata">
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
<!-- Method Quickref -->
|
56
|
+
<div id="method-list-section" class="section">
|
57
|
+
<h3 class="section-header">Methods</h3>
|
58
|
+
<ul class="link-list">
|
59
|
+
|
60
|
+
<li><a href="#method-i-bbcodeize">#bbcodeize</a></li>
|
61
|
+
|
62
|
+
</ul>
|
63
|
+
</div>
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
</div>
|
68
|
+
|
69
|
+
<div id="project-metadata">
|
70
|
+
|
71
|
+
|
72
|
+
<div id="fileindex-section" class="section project-section">
|
73
|
+
<h3 class="section-header">Files</h3>
|
74
|
+
<ul>
|
75
|
+
|
76
|
+
<li class="file"><a href="./README.html">README</a></li>
|
77
|
+
|
78
|
+
</ul>
|
79
|
+
</div>
|
80
|
+
|
81
|
+
|
82
|
+
<div id="classindex-section" class="section project-section">
|
83
|
+
<h3 class="section-header">Class/Module Index
|
84
|
+
<span class="search-toggle"><img src="./images/find.png"
|
85
|
+
height="16" width="16" alt="[+]"
|
86
|
+
title="show/hide quicksearch" /></span></h3>
|
87
|
+
<form action="#" method="get" accept-charset="utf-8" class="initially-hidden">
|
88
|
+
<fieldset>
|
89
|
+
<legend>Quicksearch</legend>
|
90
|
+
<input type="text" name="quicksearch" value=""
|
91
|
+
class="quicksearch-field" />
|
92
|
+
</fieldset>
|
93
|
+
</form>
|
94
|
+
|
95
|
+
<ul class="link-list">
|
96
|
+
|
97
|
+
<li><a href="./BBCodeizeHelper.html">BBCodeizeHelper</a></li>
|
98
|
+
|
99
|
+
<li><a href="./Bbcodeizer.html">Bbcodeizer</a></li>
|
100
|
+
|
101
|
+
</ul>
|
102
|
+
<div id="no-class-search-results" style="display: none;">No matching classes.</div>
|
103
|
+
</div>
|
104
|
+
|
105
|
+
|
106
|
+
</div>
|
107
|
+
</div>
|
108
|
+
|
109
|
+
<div id="documentation">
|
110
|
+
<h1 class="module">BBCodeizeHelper</h1>
|
111
|
+
|
112
|
+
<div id="description" class="description">
|
113
|
+
|
114
|
+
</div><!-- description -->
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
<div id="5Buntitled-5D" class="documentation-section">
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
<!-- Methods -->
|
129
|
+
|
130
|
+
<div id="public-instance-method-details" class="method-section section">
|
131
|
+
<h3 class="section-header">Public Instance Methods</h3>
|
132
|
+
|
133
|
+
|
134
|
+
<div id="bbcodeize-method" class="method-detail ">
|
135
|
+
<a name="method-i-bbcodeize"></a>
|
136
|
+
|
137
|
+
|
138
|
+
<div class="method-heading">
|
139
|
+
<span class="method-name">bbcodeize</span><span
|
140
|
+
class="method-args">(text, options = Hash.new)</span>
|
141
|
+
<span class="method-click-advice">click to toggle source</span>
|
142
|
+
</div>
|
143
|
+
|
144
|
+
|
145
|
+
<div class="method-description">
|
146
|
+
|
147
|
+
<p>Parses all bbcode in <tt>text</tt> and returns a new HTML-formatted string.</p>
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
<div class="method-source-code" id="bbcodeize-source">
|
152
|
+
<pre>
|
153
|
+
<span class="ruby-comment"># File lib/bbcodeizer_helper.rb, line 5</span>
|
154
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">bbcodeize</span>(<span class="ruby-identifier">text</span>, <span class="ruby-identifier">options</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span>)
|
155
|
+
<span class="ruby-constant">BBCodeizer</span>.<span class="ruby-identifier">bbcodeize</span>(<span class="ruby-identifier">text</span>, <span class="ruby-identifier">options</span>)
|
156
|
+
<span class="ruby-keyword">end</span></pre>
|
157
|
+
</div><!-- bbcodeize-source -->
|
158
|
+
|
159
|
+
</div>
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
</div><!-- bbcodeize-method -->
|
165
|
+
|
166
|
+
|
167
|
+
</div><!-- public-instance-method-details -->
|
168
|
+
|
169
|
+
</div><!-- 5Buntitled-5D -->
|
170
|
+
|
171
|
+
|
172
|
+
</div><!-- documentation -->
|
173
|
+
|
174
|
+
<div id="validator-badges">
|
175
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
176
|
+
<p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish
|
177
|
+
Rdoc Generator</a> 2</small>.</p>
|
178
|
+
</div>
|
179
|
+
|
180
|
+
</body>
|
181
|
+
</html>
|
182
|
+
|