bb-ruby 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ == 0.8.2 2008-12-16
2
+
3
+ * No major enhancements:
4
+ * Small point release for moving gem from Github to RubyForge
5
+ * Gem is no longer served from github via cpjolicoeur-bbruby. Gem is now served directly from Rubyforge via bb-ruby
@@ -0,0 +1,8 @@
1
+ History.txt
2
+ Manifest.txt
3
+ PostInstall.txt
4
+ README.rdoc
5
+ Rakefile
6
+ lib/bb-ruby.rb
7
+ test/test_bb-ruby.rb
8
+ test/test_helper.rb
@@ -0,0 +1,2 @@
1
+
2
+ For more information on bb-ruby, see http://bb-ruby.rubyforge.org
@@ -0,0 +1,113 @@
1
+ = bb-ruby
2
+
3
+ * http://bb-ruby.rubyforge.org
4
+
5
+ == DESCRIPTION:
6
+
7
+ bb-ruby is a BBCode (http://www.bbcode.org) implementation for Ruby. It will convert strings with BBCode markup to their HTML equivalent.
8
+
9
+ == INSTALL:
10
+
11
+ To install as a gem:
12
+
13
+ sudo gem install bb-ruby
14
+
15
+ To Install as a plugin:
16
+
17
+ ./script/plugin install git://github.com/cpjolicoeur/bb-ruby.git
18
+
19
+ == USAGE:
20
+
21
+ require 'bb-ruby' # (only needed if installed as a gem)
22
+
23
+ BBRuby has been included directly into the String class for use on any string object:
24
+
25
+ text = "[b]Here is some bold text[/b] followed by some [u]underlined text[/u]"
26
+ output = text.bbcode_to_html
27
+ text.bbcode_to_html!
28
+
29
+ BBRuby will auto-escape HTML tags. To prevent this just pass false as the second param:
30
+
31
+ output = text.bbcode_to_html({}, false)
32
+
33
+ Only allow certain tags:
34
+
35
+ output = text.bbcode_to_html({}, true, :enable, :image, :bold, :quote)
36
+
37
+ Disable certain tags:
38
+
39
+ output = text.bbcode_to_html({}, true, :disable, :image, :bold, :quote)
40
+
41
+ Alternative Direct usage:
42
+
43
+ output = BBRuby.to_html(bbcode_markup)
44
+
45
+ Define your own translation, in order to be more flexible:
46
+
47
+ my_blockquote = {
48
+ 'Quote' => [
49
+ /\[quote(:.*)?=(.*?)\](.*?)\[\/quote\1?\]/mi,
50
+ '<div class="quote"><p><cite>\2</cite></p><blockquote>\3</blockquote></div>',
51
+ 'Quote with citation',
52
+ '[quote=mike]please quote me[/quote]',
53
+ :quote
54
+ ],
55
+ }
56
+
57
+ text.bbcode_to_html(my_blockquote)
58
+
59
+ == TAGS PROCESSED:
60
+
61
+ The following is the list of BBCode tags processed by BBRuby and their associated symbol for enabling/disabling them
62
+
63
+ * [b] :bold
64
+ * [i] :italics
65
+ * [u] :underline
66
+ * [s] :strikeout
67
+ * [del] :delete
68
+ * [ins] :insert
69
+ * [code] :code
70
+ * [size] :size
71
+ * [color] :color
72
+ * [ol] :orderedlist
73
+ * [ul] :unorderedlist
74
+ * [li] :listitem
75
+ * [*] :listitem
76
+ * [list] :listitem
77
+ * [list=1] :listitem
78
+ * [list=a] :listitem
79
+ * [dl] :definelist
80
+ * [dt] :defineterm
81
+ * [dd] :definition
82
+ * [quote] :quote
83
+ * [quote=source] :quote
84
+ * [url=link] :link
85
+ * [url] :link
86
+ * [img size=] :image
87
+ * [img=] :image
88
+ * [img] :image
89
+ * [youtube] :video
90
+ * [gvideo] :video
91
+ * [email] :email
92
+
93
+ == LICENSE:
94
+
95
+ Copyright (c) 2008 Craig P Jolicoeur, Fernando Blat
96
+
97
+ Permission is hereby granted, free of charge, to any person obtaining a copy
98
+ of this software and associated documentation files (the "Software"), to deal
99
+ in the Software without restriction, including without limitation the rights
100
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
101
+ copies of the Software, and to permit persons to whom the Software is
102
+ furnished to do so, subject to the following conditions:
103
+
104
+ The above copyright notice and this permission notice shall be included in
105
+ all copies or substantial portions of the Software.
106
+
107
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
108
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
109
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
110
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
111
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
112
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
113
+ THE SOFTWARE.
@@ -0,0 +1,25 @@
1
+ %w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
2
+ require File.dirname(__FILE__) + '/lib/bb-ruby'
3
+
4
+ # Generate all the Rake tasks
5
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
6
+ $hoe = Hoe.new('bb-ruby', BBRuby::VERSION) do |p|
7
+ p.developer('Craig P Jolicoeur', 'cpjolicoeur@gmail.com')
8
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
+ p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
10
+ p.rubyforge_name = p.name # TODO this is default value
11
+ p.extra_dev_deps = [
12
+ ['newgem', ">= #{::Newgem::VERSION}"]
13
+ ]
14
+
15
+ p.clean_globs |= %w[**/.DS_Store tmp *.log]
16
+ path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
17
+ p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
18
+ p.rsync_args = '-av --delete --ignore-errors'
19
+ end
20
+
21
+ require 'newgem/tasks' # load /tasks/*.rake
22
+ Dir['tasks/**/*.rake'].each { |t| load t }
23
+
24
+ # TODO - want other tests/tasks run by default? Add them to the list
25
+ # task :default => [:spec, :features]
@@ -0,0 +1,247 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ module BBRuby
5
+ VERSION = '0.8.2'
6
+
7
+ @@imageformats = 'png|bmp|jpg|gif|jpeg'
8
+ @@tags = {
9
+ # tag name => [regex, replace, description, example, enable/disable symbol]
10
+ 'Bold' => [
11
+ /\[b(:.*)?\](.*?)\[\/b\1?\]/mi,
12
+ '<strong>\2</strong>',
13
+ 'Embolden text',
14
+ 'Look [b]here[/b]',
15
+ :bold],
16
+ 'Italics' => [
17
+ /\[i(:.+)?\](.*?)\[\/i\1?\]/mi,
18
+ '<em>\2</em>',
19
+ 'Italicize or emphasize text',
20
+ 'Even my [i]cat[/i] was chasing the mailman!',
21
+ :italics],
22
+ 'Underline' => [
23
+ /\[u(:.+)?\](.*?)\[\/u\1?\]/mi,
24
+ '<u>\2</u>',
25
+ 'Underline',
26
+ 'Use it for [u]important[/u] things or something',
27
+ :underline],
28
+ 'Strikeout' => [
29
+ /\[s(:.+)?\](.*?)\[\/s\1?\]/mi,
30
+ '<del>\2</del>',
31
+ 'Strikeout',
32
+ '[s]nevermind[/s]',
33
+ :strikeout],
34
+ 'Delete' => [
35
+ /\[del(:.+)?\](.*?)\[\/del\1?\]/mi,
36
+ '<del>\2</del>',
37
+ 'Deleted text',
38
+ '[del]deleted text[/del]',
39
+ :delete],
40
+ 'Insert' => [
41
+ /\[ins(:.+)?\](.*?)\[\/ins\1?\]/mi,
42
+ '<ins>\2</ins>',
43
+ 'Inserted Text',
44
+ '[ins]inserted text[/del]',
45
+ :insert],
46
+ 'Code' => [
47
+ /\[code(:.+)?\](.*?)\[\/code\1?\]/mi,
48
+ '<code>\2</code>',
49
+ 'Code Text',
50
+ '[code]some code[/code]',
51
+ :code],
52
+ 'Size' => [
53
+ /\[size=['"]?(.*?)['"]?\](.*?)\[\/size\]/im,
54
+ '<span style="font-size: \1px;">\2</span>',
55
+ 'Change text size',
56
+ '[size=20]Here is some larger text[/size]',
57
+ :size],
58
+ 'Color' => [
59
+ /\[color=['"]?(\w+|\#\w{6})['"]?(:.+)?\](.*?)\[\/color\2?\]/im,
60
+ '<span style="color: \1;">\3</span>',
61
+ 'Change text color',
62
+ '[color=red]This is red text[/color]',
63
+ :color],
64
+ 'Ordered List' => [
65
+ /\[ol\](.*?)\[\/ol\]/mi,
66
+ '<ol>\1</ol>',
67
+ 'Ordered list',
68
+ 'My favorite people (alphabetical order): [ol][li]Jenny[/li][li]Alex[/li][li]Beth[/li][/ol]',
69
+ :orderedlist],
70
+ 'Unordered List' => [
71
+ /\[ul\](.*?)\[\/ul\]/mi,
72
+ '<ul>\1</ul>',
73
+ 'Unordered list',
74
+ 'My favorite people (order of importance): [ul][li]Jenny[/li][li]Alex[/li][li]Beth[/li][/ul]',
75
+ :unorderedlist],
76
+ 'List Item' => [
77
+ /\[li\](.*?)\[\/li\]/mi,
78
+ '<li>\1</li>',
79
+ 'List item',
80
+ 'See ol or ul',
81
+ :listitem],
82
+ 'List Item (alternative)' => [
83
+ /\[\*(:[^\[]+)?\]([^(\[|\<)]+)/mi,
84
+ '<li>\2</li>',
85
+ 'List item (alternative)',
86
+ '[*]list item',
87
+ :listitem],
88
+ 'Unordered list (alternative)' => [
89
+ /\[list(:.*)?\]((?:(?!list).)*)\[\/list(:.)?\1?\]/mi,
90
+ '<ul>\2</ul>',
91
+ 'Unordered list item',
92
+ '[list][*]item 1[*] item2[/list]',
93
+ :list],
94
+ 'Ordered list (numerical)' => [
95
+ /\[list=1(:.*)?\](.+)\[\/list(:.)?\1?\]/mi,
96
+ '<ol>\2</ol>',
97
+ 'Ordered list numerically',
98
+ '[list=1][*]item 1[*] item2[/list]',
99
+ :list],
100
+ 'Ordered list (alphabetical)' => [
101
+ /\[list=a(:.*)?\](.+)\[\/list(:.)?\1?\]/mi,
102
+ '<ol sytle="list-style-type: lower-alpha;">\2</ol>',
103
+ 'Ordered list alphabetically',
104
+ '[list=a][*]item 1[*] item2[/list]',
105
+ :list],
106
+ 'Definition List' => [
107
+ /\[dl\](.*?)\[\/dl\]/im,
108
+ '<dl>\1</dl>',
109
+ 'List of terms/items and their definitions',
110
+ '[dl][dt]Fusion Reactor[/dt][dd]Chamber that provides power to your... nerd stuff[/dd][dt]Mass Cannon[/dt][dd]A gun of some sort[/dd][/dl]',
111
+ :definelist],
112
+ 'Definition Term' => [
113
+ /\[dt\](.*?)\[\/dt\]/mi,
114
+ '<dt>\1</dt>',
115
+ 'List of definition terms',
116
+ '[dt]definition term[/dt]',
117
+ :defineterm],
118
+ 'Definition Definition' => [
119
+ /\[dd\](.*?)\[\/dd\]/mi,
120
+ '<dd>\1</dd>',
121
+ 'Definition definitions',
122
+ '[dd]my definition[/dd',
123
+ :definition],
124
+ 'Quote' => [
125
+ /\[quote(:.*)?="?(.*?)"?\](.*?)\[\/quote\1?\]/mi,
126
+ '<fieldset><legend>\2</legend><blockquote>\3</blockquote></fieldset>',
127
+ 'Quote with citation',
128
+ "[quote=mike]Now is the time...[/quote]",
129
+ :quote],
130
+ 'Quote (Sourceless)' => [
131
+ /\[quote(:.*)?\](.*?)\[\/quote\1?\]/mi,
132
+ '<fieldset><blockquote>\2</blockquote></fieldset>',
133
+ 'Quote (sourceclass)',
134
+ "[quote]Now is the time...[/quote]",
135
+ :quote],
136
+ 'Link' => [
137
+ /\[url=(.*?)\](.*?)\[\/url\]/mi,
138
+ '<a href="\1">\2</a>',
139
+ 'Hyperlink to somewhere else',
140
+ 'Maybe try looking on [url=http://google.com]Google[/url]?',
141
+ :link],
142
+ 'Link (Implied)' => [
143
+ /\[url\](.*?)\[\/url\]/mi,
144
+ '<a href="\1">\1</a>',
145
+ 'Hyperlink (implied)',
146
+ "Maybe try looking on [url]http://google.com[/url]",
147
+ :link],
148
+ #
149
+ # TODO: fix automatic links
150
+ #
151
+ # 'Link (Automatic)' => [
152
+ # /http:\/\/(.*?)[^<\/a>]/,
153
+ # '<a href="\1">\1</a>',
154
+ # 'Hyperlink (automatic)',
155
+ # nil, nil,
156
+ # :link],
157
+ 'Image (Resized)' => [
158
+ /\[img(:.+)? size=(['"]?)(\d+)x(\d+)\2\](.*?)\[\/img\1?\]/im,
159
+ '<img src="\5" style="width: \3px; height: \4px;" />',
160
+ 'Display an image with a set width and height',
161
+ '[img size=96x96]http://www.google.com/intl/en_ALL/images/logo.gif[/img]',
162
+ :image],
163
+ 'Image (Alternative)' => [
164
+ /\[img=([^\[\]].*?)\.(#{@@imageformats})\]/im,
165
+ '<img src="\1.\2" alt="" />',
166
+ 'Display an image (alternative format)',
167
+ '[img=http://myimage.com/logo.gif]',
168
+ :image],
169
+ 'Image' => [
170
+ /\[img(:.+)?\]([^\[\]].*?)\.(#{@@imageformats})\[\/img\1?\]/im,
171
+ '<img src="\2.\3" alt="" />',
172
+ 'Display an image',
173
+ 'Check out this crazy cat: [img]http://catsweekly.com/crazycat.jpg[/img]',
174
+ :image],
175
+ 'YouTube' => [
176
+ /\[youtube\](.*?)\?v=([\w\d\-]+).*\[\/youtube\]/im,
177
+ '<object width="400" height="330"><param name="movie" value="http://www.youtube.com/v/\2"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/\2" type="application/x-shockwave-flash" wmode="transparent" width="400" height="330"></embed></object>',
178
+ 'Display a video from YouTube.com',
179
+ '[youtube]http://youtube.com/watch?v=E4Fbk52Mk1w[/youtube]',
180
+ :video],
181
+ 'YouTube (Alternative)' => [
182
+ /\[youtube\](.*?)\/v\/([\w\d\-]+)\[\/youtube\]/im,
183
+ '<object width="400" height="330"><param name="movie" value="http://www.youtube.com/v/\2"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/\2" type="application/x-shockwave-flash" wmode="transparent" width="400" height="330"></embed></object>',
184
+ 'Display a video from YouTube.com (alternative format)',
185
+ '[youtube]http://youtube.com/watch/v/E4Fbk52Mk1w[/youtube]',
186
+ :video],
187
+ 'Google Video' => [
188
+ /\[gvideo\](.*?)\?docid=([-]{0,1}\d+).*\[\/gvideo\]/mi,
189
+ '<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=\2" flashvars=""> </embed>',
190
+ 'Display a video from Google Video',
191
+ '[gvideo]http://video.google.com/videoplay?docid=-2200109535941088987[/gvideo]',
192
+ :video],
193
+ 'Email' => [
194
+ /\[email(:.+)?\](.+)\[\/email\1?\]/i,
195
+ '<a href="mailto:\2">\2</a>',
196
+ 'Link to email address',
197
+ '[email]wadus@wadus.com[/email]',
198
+ :email]
199
+ }
200
+
201
+ def self.to_html(text, tags_alternative_definition = {}, escape_html=true, method=:disable, *tags)
202
+ text = text.clone
203
+ # escape < and > to remove any html
204
+ if escape_html
205
+ text.gsub!( '<', '&lt;' )
206
+ text.gsub!( '>', '&gt;' )
207
+ end
208
+
209
+ tags_definition = @@tags.merge(tags_alternative_definition)
210
+
211
+ # parse bbcode tags
212
+ case method
213
+ when :enable
214
+ tags_definition.each_value { |t| text.gsub!(t[0], t[1]) if tags[0].include?(t[4]) }
215
+ when :disable
216
+ # this works nicely because the default is disable and the default set of tags is [] (so none disabled) :)
217
+ tags_definition.each_value { |t| text.gsub!(t[0], t[1]) unless tags[0].include?(t[4]) }
218
+ end
219
+
220
+ # parse spacing
221
+ text.gsub!( /\r\n?/, "\n" )
222
+ text.gsub!( /\n/, "<br />" )
223
+
224
+ # return markup
225
+ text
226
+ end
227
+
228
+ def self.tags
229
+ @@tags.each { |tn, ti|
230
+ # yields the tag name, a description of it and example
231
+ yield tn, ti[2], ti[3] if ti[2]
232
+ }
233
+ end
234
+
235
+ def self.tag_list
236
+ @@tags
237
+ end
238
+ end
239
+
240
+ class String
241
+ def bbcode_to_html(tags_alternative_definition = {}, escape_html=true, method=:disable, *tags)
242
+ BBRuby.to_html(self, tags_alternative_definition, escape_html, method, tags)
243
+ end
244
+ def bbcode_to_html!(tags_alternative_definition = {}, escape_html=true, method=:disable, *tags)
245
+ self.replace(BBRuby.to_html(self, tags_alternative_definition, escape_html, method, tags))
246
+ end
247
+ end
@@ -0,0 +1,209 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/test_helper.rb'
4
+
5
+ class TestBBRuby < Test::Unit::TestCase
6
+
7
+ def test_strong
8
+ assert_equal '<strong>simple</strong>', '[b]simple[/b]'.bbcode_to_html
9
+ assert_equal '<strong>simple</strong>', '[b:7a9ca2c5c3]simple[/b:7a9ca2c5c3]'.bbcode_to_html
10
+ assert_equal "<strong>line 1<br />line 2</strong>", "[b:7a9ca2c5c3]line 1\nline 2[/b:7a9ca2c5c3]".bbcode_to_html
11
+ assert_equal '<strong>1. text 1:</strong> text 2<br /><strong>2. text 3</strong>', "[b:post_uid0]1. text 1:[/b:post_uid0] text 2\n[b:post_uid0]2. text 3[/b:post_uid0]".bbcode_to_html
12
+ end
13
+
14
+ def test_em
15
+ assert_equal '<em>simple</em>', '[i]simple[/i]'.bbcode_to_html
16
+ assert_equal '<em>simple</em>', '[i:7a9ca2c5c3]simple[/i:7a9ca2c5c3]'.bbcode_to_html
17
+ assert_equal "<em>line 1<br />line 2</em>", "[i:7a9ca2c5c3]line 1\nline 2[/i:7a9ca2c5c3]".bbcode_to_html
18
+ end
19
+
20
+ def test_u
21
+ assert_equal '<u>simple</u>', '[u]simple[/u]'.bbcode_to_html
22
+ assert_equal '<u>simple</u>', '[u:7a9ca2c5c3]simple[/u:7a9ca2c5c3]'.bbcode_to_html
23
+ assert_equal "<u>line 1<br />line 2</u>", "[u:7a9ca2c5c3]line 1\nline 2[/u:7a9ca2c5c3]".bbcode_to_html
24
+ end
25
+
26
+ def test_del
27
+ assert_equal '<del>simple</del>', '[del]simple[/del]'.bbcode_to_html
28
+ assert_equal '<del>simple</del>', '[del:7a9ca2c5c3]simple[/del:7a9ca2c5c3]'.bbcode_to_html
29
+ assert_equal '<del>simple</del>', '[s]simple[/s]'.bbcode_to_html
30
+ assert_equal '<del>simple</del>', '[s:7a9ca2c5c3]simple[/s:7a9ca2c5c3]'.bbcode_to_html
31
+ end
32
+
33
+ def test_ins
34
+ assert_equal '<ins>simple</ins>', '[ins]simple[/ins]'.bbcode_to_html
35
+ assert_equal '<ins>simple</ins>', '[ins:7a9ca2c5c3]simple[/ins:7a9ca2c5c3]'.bbcode_to_html
36
+ end
37
+
38
+ def test_code
39
+ assert_equal '<code>simple</code>', '[code]simple[/code]'.bbcode_to_html
40
+ assert_equal '<code>simple</code>', '[code:7a9ca2c5c3]simple[/code:7a9ca2c5c3]'.bbcode_to_html
41
+ assert_equal "<code>var bxi = 0;<br />//Holds current speed of scrolling menu</code>", "[code:1:91cbdd72b7]var bxi = 0;\n//Holds current speed of scrolling menu[/code:1:91cbdd72b7]".bbcode_to_html
42
+ end
43
+
44
+ def test_size
45
+ assert_equal '<span style="font-size: 32px;">12px Text</span>', '[size=32]12px Text[/size]'.bbcode_to_html
46
+ end
47
+
48
+ def test_color
49
+ assert_equal '<span style="color: red;">Red Text</span>', '[color=red]Red Text[/color]'.bbcode_to_html
50
+ assert_equal '<span style="color: #ff0023;">Hex Color Text</span>', '[color=#ff0023]Hex Color Text[/color]'.bbcode_to_html
51
+ assert_equal '<span style="color: #B23803;">text</span>', '[color=#B23803:05d7c56429]text[/color:05d7c56429]'.bbcode_to_html
52
+ end
53
+
54
+ def test_ordered_list
55
+ assert_equal '<ol><li>item 1</li><li>item 2</li></ol>', '[ol][li]item 1[/li][li]item 2[/li][/ol]'.bbcode_to_html
56
+ assert_equal '<ol><li>item 1</li><li>item 2</li></ol>', '[ol][*]item 1[*]item 2[/ol]'.bbcode_to_html
57
+ end
58
+
59
+ def test_unordered_list
60
+ assert_equal '<ul><li>item 1</li><li>item 2</li></ul>', '[ul][li]item 1[/li][li]item 2[/li][/ul]'.bbcode_to_html
61
+ assert_equal '<ul><li>item 1</li><li>item 2</li></ul>', '[ul][*]item 1[*]item 2[/ul]'.bbcode_to_html
62
+ end
63
+
64
+ def test_list_unordered
65
+ assert_equal '<ul><li>item 1</li><li>item 2</li></ul>', '[list][li]item 1[/li][li]item 2[/li][/list]'.bbcode_to_html
66
+ assert_equal '<ul><li>item 1</li><li>item 2</li></ul>', '[list:7a9ca2c5c3][li]item 1[/li][li]item 2[/li][/list:o:7a9ca2c5c3]'.bbcode_to_html
67
+ assert_equal '<ul><li>item 1</li><li>item 2</li></ul><ul><li>item 3</li><li>item 4</li></ul>',
68
+ '[list:7a9ca2c5c3][li]item 1[/li][li]item 2[/li][/list:o:7a9ca2c5c3][list:7a9ca2c5c3][li]item 3[/li][li]item 4[/li][/list:o:7a9ca2c5c3]'.bbcode_to_html
69
+ assert_equal '<ul><li>item 1</li><li>item 2</li></ul><ul><li>item 3</li><li>item 4</li></ul><ul><li>item 5</li><li>item 6</li></ul><ul><li>item 7</li><li>item 8</li></ul>',
70
+ '[list:7a9ca2c5c3][li]item 1[/li][li]item 2[/li][/list:o:7a9ca2c5c3][list:7a9ca2c5c3][li]item 3[/li][li]item 4[/li][/list:o:7a9ca2c5c3][list:7a9ca2c5c3][li]item 5[/li][li]item 6[/li][/list:o:7a9ca2c5c3][list:7a9ca2c5c3][li]item 7[/li][li]item 8[/li][/list:o:7a9ca2c5c3]'.bbcode_to_html
71
+ end
72
+
73
+ def test_list_unordered_alternative
74
+ assert_equal '<li>item1</li><li>item2</li>', '[*:asdf]item1[*:asdf]item2'.bbcode_to_html
75
+ assert_equal '<ul><li>item1</li><li>item2</li></ul>', '[list:5d7cf5560a][*]item1[*]item2[/list:u:5d7cf5560a]'.bbcode_to_html
76
+ assert_equal '<ul><li>item1</li><li>item2</li></ul>', '[list:5d7cf5560a][*:5d7cf5560a]item1[*:5d7cf5560a]item2[/list:u:5d7cf5560a]'.bbcode_to_html
77
+ end
78
+
79
+ def test_list_ordered_numerically
80
+ assert_equal '<ol><li>item 1</li><li>item 2</li></ol>', '[list=1][li]item 1[/li][li]item 2[/li][/list]'.bbcode_to_html
81
+ assert_equal '<ol><li>item 1</li><li>item 2</li></ol>', '[list=1:7a9ca2c5c3][li]item 1[/li][li]item 2[/li][/list:7a9ca2c5c3]'.bbcode_to_html
82
+ end
83
+
84
+ def test_list_ordered_alphabetically
85
+ assert_equal '<ol sytle="list-style-type: lower-alpha;"><li>item 1</li><li>item 2</li></ol>', '[list=a][li]item 1[/li][li]item 2[/li][/list]'.bbcode_to_html
86
+ assert_equal '<ol sytle="list-style-type: lower-alpha;"><li>item 1</li><li>item 2</li></ol>', '[list=a:7a9ca2c5c3][li]item 1[/li][li]item 2[/li][/list:o:7a9ca2c5c3]'.bbcode_to_html
87
+ end
88
+
89
+ def test_two_lists
90
+ assert_equal '<ul><li>item1</li><li>item2</li></ul><ul><li>item1</li><li>item2</li></ul>',
91
+ '[list:5d7cf5560a][*:5d7cf5560a]item1[*:5d7cf5560a]item2[/list:u:5d7cf5560a][list:5d7cf5560a][*:5d7cf5560a]item1[*:5d7cf5560a]item2[/list:u:5d7cf5560a]'.bbcode_to_html
92
+ end
93
+
94
+ def test_definition_list_term_definition
95
+ assert_equal '<dl><dt>term 1</dt><dd>definition 1</dd><dt>term 2</dt><dd>definition 2</dd></dl>', '[dl][dt]term 1[/dt][dd]definition 1[/dd][dt]term 2[/dt][dd]definition 2[/dd][/dl]'.bbcode_to_html
96
+ end
97
+
98
+ def test_quote
99
+ assert_equal '<fieldset><blockquote>quoting</blockquote></fieldset>', '[quote]quoting[/quote]'.bbcode_to_html
100
+ assert_equal '<fieldset><blockquote>quoting</blockquote></fieldset>', '[quote]quoting[/quote]'.bbcode_to_html.bbcode_to_html({}, false, :disable)
101
+ assert_equal '<fieldset><legend>black</legend><blockquote>si el niño hubiera sido de "penalty" le hubieran llamado <strong>system Error</strong>!!! :)</blockquote></fieldset>', "[quote:7a9ca2c5c3=\"black\"]si el niño hubiera sido de \"penalty\" le hubieran llamado [b:7a9ca2c5c3]system Error[/b:7a9ca2c5c3]!!! :)[/quote:7a9ca2c5c3]".bbcode_to_html
102
+ assert_equal '<fieldset><legend>black</legend><blockquote>si el niño hubiera sido de "penalty" le hubieran llamado <strong>system Error</strong>!!! :)</blockquote></fieldset>', "[quote:7a9ca2c5c3=\"black\"]si el niño hubiera sido de \"penalty\" le hubieran llamado [b:7a9ca2c5c3]system Error[/b:7a9ca2c5c3]!!! :)[/quote:7a9ca2c5c3]".bbcode_to_html.bbcode_to_html({}, false, :disable)
103
+ assert_equal '<fieldset><legend>Who</legend><blockquote>said that</blockquote></fieldset>', '[quote=Who]said that[/quote]'.bbcode_to_html
104
+ assert_equal '<fieldset><legend>Who</legend><blockquote>said that</blockquote></fieldset>', '[quote=Who]said that[/quote]'.bbcode_to_html.bbcode_to_html({}, false, :disable)
105
+ end
106
+
107
+ def test_double_quote
108
+ assert_equal '<fieldset><legend>Kitten</legend><blockquote><fieldset><legend>creatiu</legend><blockquote>f1</blockquote></fieldset>f2</blockquote></fieldset>',
109
+ '[quote:26fe26a6a9="Kitten"][quote:26fe26a6a9="creatiu"]f1[/quote:26fe26a6a9]f2[/quote:26fe26a6a9]'.bbcode_to_html.bbcode_to_html({}, false, :disable)
110
+ end
111
+
112
+ def test_link
113
+ assert_equal '<a href="http://google.com">Google</a>', '[url=http://google.com]Google[/url]'.bbcode_to_html
114
+ assert_equal '<a href="http://google.com">http://google.com</a>', '[url]http://google.com[/url]'.bbcode_to_html
115
+ assert_equal '<a href="http://www.altctrlsupr.com/dmstk/kdd070803/00.html"> ABRIR ALBUM </a>','[URL=http://www.altctrlsupr.com/dmstk/kdd070803/00.html] ABRIR ALBUM [/URL]'.bbcode_to_html
116
+ assert_equal '<a href="http://www.altctrlsupr.com/dmstk/kdd070803/00.html"> ABRIR<br />ALBUM </a>',"[URL=http://www.altctrlsupr.com/dmstk/kdd070803/00.html] ABRIR\nALBUM [/URL]".bbcode_to_html
117
+ assert_equal '<a href="http://www.urimalet.com/cadaverex.mp3">aha</a>', "[URL=http://www.urimalet.com/cadaverex.mp3]aha[/URL]".bbcode_to_html
118
+ end
119
+
120
+ def test_image
121
+ assert_equal '<img src="http://zoople/hochzeit.png" alt="" />', '[img]http://zoople/hochzeit.png[/img]'.bbcode_to_html
122
+ assert_equal '<img src="http://zoople/hochzeit.png" alt="" />', '[img=http://zoople/hochzeit.png]'.bbcode_to_html
123
+ assert_equal '<img src="http://zoople/hochzeit.png" style="width: 95px; height: 96px;" />', '[img size=95x96]http://zoople/hochzeit.png[/img]'.bbcode_to_html
124
+ assert_equal '<img src="http://zoople/hochzeit.png" alt="" />', '[img:7a9ca2c5c3]http://zoople/hochzeit.png[/img:7a9ca2c5c3]'.bbcode_to_html
125
+ assert_equal '<img src="http://zoople/hochzeit.png" style="width: 95px; height: 96px;" />', '[img:7a9ca2c5c3 size=95x96]http://zoople/hochzeit.png[/img:7a9ca2c5c3]'.bbcode_to_html
126
+ assert_equal '<img src="http://www.marcodigital.com/sitanddie/sitanddiepequeño.jpg" alt="" />', '[img:post_uid0]http://www.marcodigital.com/sitanddie/sitanddiepequeño.jpg[/img:post_uid0]'.bbcode_to_html
127
+ end
128
+
129
+ def test_youtube
130
+ assert_equal '<object width="400" height="330"><param name="movie" value="http://www.youtube.com/v/E4Fbk52Mk1w"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/E4Fbk52Mk1w" type="application/x-shockwave-flash" wmode="transparent" width="400" height="330"></embed></object>','[youtube]http://youtube.com/watch?v=E4Fbk52Mk1w[/youtube]'.bbcode_to_html
131
+ end
132
+
133
+ def test_google_video
134
+ assert_equal '<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-2200109535941088987" flashvars=""> </embed>', '[gvideo]http://video.google.com/videoplay?docid=-2200109535941088987[/gvideo]'.bbcode_to_html
135
+ end
136
+
137
+ def test_email
138
+ assert_equal '<a href="mailto:wadus@wadus.com">wadus@wadus.com</a>', '[email]wadus@wadus.com[/email]'.bbcode_to_html
139
+ end
140
+
141
+ def test_html_escaping
142
+ assert_equal "<strong>&lt;i&gt;foobar&lt;/i&gt;</strong>", '[b]<i>foobar</i>[/b]'.bbcode_to_html
143
+ assert_equal "<strong><i>foobar</i></strong>", '[b]<i>foobar</i>[/b]'.bbcode_to_html({}, false)
144
+ assert_equal "1 is &lt; 2", '1 is < 2'.bbcode_to_html
145
+ assert_equal "1 is < 2", '1 is < 2'.bbcode_to_html({}, false)
146
+ assert_equal "2 is &gt; 1", '2 is > 1'.bbcode_to_html
147
+ assert_equal "2 is > 1", '2 is > 1'.bbcode_to_html({}, false)
148
+ end
149
+
150
+ def test_disable_tags
151
+ assert_equal "[b]foobar[/b]", "[b]foobar[/b]".bbcode_to_html({}, true, :disable, :bold)
152
+ assert_equal "[b]<em>foobar</em>[/b]", "[b][i]foobar[/i][/b]".bbcode_to_html({}, true, :disable, :bold)
153
+ assert_equal "[b][i]foobar[/i][/b]", "[b][i]foobar[/i][/b]".bbcode_to_html({}, true, :disable, :bold, :italics)
154
+ end
155
+
156
+ def test_enable_tags
157
+ assert_equal "<strong>foobar</strong>", "[b]foobar[/b]".bbcode_to_html({}, true, :enable, :bold)
158
+ assert_equal "<strong>[i]foobar[/i]</strong>", "[b][i]foobar[/i][/b]".bbcode_to_html({}, true, :enable, :bold)
159
+ assert_equal "<strong><em>foobar</em></strong>", "[b][i]foobar[/i][/b]".bbcode_to_html({}, true, :enable, :bold, :italics)
160
+ end
161
+
162
+ def test_to_html_bang_method
163
+ foo = "[b]foobar[/b]"
164
+ assert_equal "<strong>foobar</strong>", foo.bbcode_to_html!
165
+ assert_equal "<strong>foobar</strong>", foo
166
+ end
167
+
168
+ def test_self_tag_list
169
+ assert_equal 30, BBRuby.tag_list.size
170
+ end
171
+
172
+ def test_redefinition_of_tag_html
173
+ mydef = {
174
+ 'Quote' => [
175
+ /\[quote(:.*)?="?(.*?)"?\](.*?)\[\/quote\1?\]/mi,
176
+ '<div class="quote"><p><cite>\2</cite></p><blockquote>\3</blockquote></div>',
177
+ 'Quote with citation',
178
+ nil, nil,
179
+ :quote],
180
+ 'Image (Resized)' => [
181
+ /\[img(:.+)? size=(['"]?)(\d+)x(\d+)\2\](.*?)\[\/img\1?\]/im,
182
+ '<div class="post_image"><img src="\5" style="width: \3px; height: \4px;" /></div>',
183
+ 'Display an image with a set width and height',
184
+ '[img size=96x96]http://www.google.com/intl/en_ALL/images/logo.gif[/img]',
185
+ :image],
186
+ 'Image (Alternative)' => [
187
+ /\[img=([^\[\]].*?)\.(png|bmp|jpg|gif|jpeg)\]/im,
188
+ '<div class="post_image"><img src="\1.\2" alt="" /></div>',
189
+ 'Display an image (alternative format)',
190
+ '[img=http://myimage.com/logo.gif]',
191
+ :image],
192
+ 'Image' => [
193
+ /\[img(:.+)?\]([^\[\]].*?)\.(png|bmp|jpg|gif|jpeg)\[\/img\1?\]/im,
194
+ '<div class="post_image"><img src="\2.\3" alt="" /></div>',
195
+ 'Display an image',
196
+ 'Check out this crazy cat: [img]http://catsweekly.com/crazycat.jpg[/img]',
197
+ :image],
198
+ }
199
+ assert_equal '<div class="quote"><p><cite>Who</cite></p><blockquote>said that</blockquote></div>', '[quote=Who]said that[/quote]'.bbcode_to_html(mydef)
200
+ assert_equal '<div class="quote"><p><cite>flandepan</cite></p><blockquote>hola</blockquote></div>', '[quote:0fc8a224d2="flandepan"]hola[/quote:0fc8a224d2]'.bbcode_to_html(mydef)
201
+ assert_equal '<div class="post_image"><img src="http://zoople/hochzeit.png" alt="" /></div>', '[img]http://zoople/hochzeit.png[/img]'.bbcode_to_html(mydef)
202
+ end
203
+
204
+ def test_multiple_tag_test
205
+ assert_equal "<strong>bold</strong><em>italic</em><u>underline</u><fieldset><blockquote>quote</blockquote></fieldset><a href=\"foobar\">link</a>", "[b]bold[/b][i]italic[/i][u]underline[/u][quote]quote[/quote][url=foobar]link[/url]".bbcode_to_html
206
+ assert_equal "<strong>bold</strong><em>italic</em><u>underline</u><fieldset><blockquote>quote</blockquote></fieldset><a href=\"foobar\">link</a>", "[b]bold[/b][i]italic[/i][u]underline[/u][quote]quote[/quote][url=foobar]link[/url]".bbcode_to_html({}, true, :enable, :bold, :italics, :underline, :link, :quote)
207
+ end
208
+
209
+ end
@@ -0,0 +1,3 @@
1
+ require 'stringio'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/../lib/bb-ruby'
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bb-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.2
5
+ platform: ruby
6
+ authors:
7
+ - Craig P Jolicoeur
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-12-16 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: newgem
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.1.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: hoe
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.8.0
34
+ version:
35
+ description: bb-ruby is a BBCode (http://www.bbcode.org) implementation for Ruby. It will convert strings with BBCode markup to their HTML equivalent.
36
+ email:
37
+ - cpjolicoeur@gmail.com
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files:
43
+ - History.txt
44
+ - Manifest.txt
45
+ - PostInstall.txt
46
+ - README.rdoc
47
+ files:
48
+ - History.txt
49
+ - Manifest.txt
50
+ - PostInstall.txt
51
+ - README.rdoc
52
+ - Rakefile
53
+ - lib/bb-ruby.rb
54
+ - test/test_bb-ruby.rb
55
+ - test/test_helper.rb
56
+ has_rdoc: true
57
+ homepage: http://bb-ruby.rubyforge.org
58
+ post_install_message: PostInstall.txt
59
+ rdoc_options:
60
+ - --main
61
+ - README.rdoc
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: "0"
75
+ version:
76
+ requirements: []
77
+
78
+ rubyforge_project: bb-ruby
79
+ rubygems_version: 1.3.1
80
+ signing_key:
81
+ specification_version: 2
82
+ summary: bb-ruby is a BBCode (http://www.bbcode.org) implementation for Ruby
83
+ test_files:
84
+ - test/test_bb-ruby.rb
85
+ - test/test_helper.rb