bbcodeizer 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -0
- data/lib/bbcodeizer/version.rb +1 -1
- data/lib/bbcodeizer.rb +88 -19
- data/lib/{bbcodeize_helper.rb → bbcodeizer_helper.rb} +0 -0
- data/test/bbcodeizer_test.rb +4 -4
- metadata +2 -2
data/LICENSE
CHANGED
data/lib/bbcodeizer/version.rb
CHANGED
data/lib/bbcodeizer.rb
CHANGED
@@ -3,29 +3,64 @@ module BBCodeizer
|
|
3
3
|
|
4
4
|
#:nodoc:
|
5
5
|
Tags = {
|
6
|
-
:
|
7
|
-
:
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
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">\2</a>' ],
|
25
|
+
:url_sans_title => [ /\[url\](.+?)\[\/url\]/i, '<a href="\1">\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>' ],
|
22
53
|
}
|
23
54
|
|
24
55
|
# Tags in this list are invoked. To deactivate a particular tag, call BBCodeizer.deactivate.
|
25
56
|
# These names correspond to either names above or methods in this module.
|
26
|
-
|
27
|
-
|
28
|
-
:
|
57
|
+
# The ':literal' tag MUST be first for it to work correctly
|
58
|
+
TagList = [ :literal, :bold, :italic, :underline, :del, :strike, :email_with_name,
|
59
|
+
:email_sans_name, :url_with_title, :url_sans_title, :image, :size, :color,
|
60
|
+
:code, :quote, :youtube, :googlevid, :flash, :spoiler, :nsfw, :hide, :mp3,
|
61
|
+
:superdeluxe, :comedycentral, :revver, :myspacetv, :collegehumor, :hulu,
|
62
|
+
:metacafe, :yahoovid, :flickr, :gametrailers, :slideshare, :funnyordie,
|
63
|
+
:atomfilms, :vimeo, :li, :list, :current ]
|
29
64
|
|
30
65
|
# Parses all bbcode in +text+ and returns a new HTML-formatted string.
|
31
66
|
def bbcodeize(text)
|
@@ -36,6 +71,9 @@ module BBCodeizer
|
|
36
71
|
else
|
37
72
|
self.send(tag, text)
|
38
73
|
end
|
74
|
+
# Replace the matching random ids for the following tags: spoiler, nsfw, mp3
|
75
|
+
@random_id = random_string
|
76
|
+
2.times { text = text.sub('_RANDOM_ID_', @random_id) }
|
39
77
|
end
|
40
78
|
text
|
41
79
|
end
|
@@ -57,6 +95,29 @@ module BBCodeizer
|
|
57
95
|
# code tags must match, else don't do any replacing.
|
58
96
|
if string.scan(Tags[:start_code].first).size == string.scan(Tags[:end_code].first).size
|
59
97
|
apply_tags(string, :start_code, :end_code)
|
98
|
+
# strip out newlines from within the tags and replace them with '<br />', otherwise
|
99
|
+
# simple_format will simply append a '<br />' to the newlines, creating double spaces
|
100
|
+
string.gsub!(/#{Tags[:start_code].last}.+?#{Tags[:end_code].last}/im) { |s| s.gsub(/\r\n?/, '<br />') }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def li(string)
|
105
|
+
# list tags must match, else don't do any replacing.
|
106
|
+
if string.scan(Tags[:start_li].first).size == string.scan(Tags[:end_li].first).size
|
107
|
+
apply_tags(string, :start_li, :end_li)
|
108
|
+
# strip out newlines from within the tags and replace them with '<br />', otherwise
|
109
|
+
# simple_format will simply append a '<br />' to the newlines, creating double spaces
|
110
|
+
string.gsub!(/#{Tags[:start_li].last}.+?#{Tags[:end_li].last}/im) { |s| s.gsub(/\r\n?/, '<br />') }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def list(string)
|
115
|
+
# list tags must match, else don't do any replacing.
|
116
|
+
if string.scan(Tags[:start_list].first).size == string.scan(Tags[:end_list].first).size
|
117
|
+
apply_tags(string, :start_list, :end_list)
|
118
|
+
# strip out newlines from within the tags and replace them with '<br />', otherwise
|
119
|
+
# simple_format will simply append a '<br />' to the newlines, creating double spaces
|
120
|
+
string.gsub!(/#{Tags[:start_list].last}.+?#{Tags[:end_list].last}/im) { |s| s.gsub(/\r\n?/, '<br />') }
|
60
121
|
end
|
61
122
|
end
|
62
123
|
|
@@ -64,6 +125,9 @@ module BBCodeizer
|
|
64
125
|
# quotes must match, else don't do any replacing
|
65
126
|
if string.scan(Tags[:start_quote].first).size == string.scan(Tags[:end_quote].first).size
|
66
127
|
apply_tags(string, :start_quote_with_cite, :start_quote_sans_cite, :end_quote)
|
128
|
+
# strip out newlines from within the tags and replace them with '<br />', otherwise
|
129
|
+
# simple_format will simply append a '<br />' to the newlines, creating double spaces
|
130
|
+
string.gsub!(/#{Tags[:start_quote].last}.+?#{Tags[:end_quote].last}/im) { |s| s.gsub(/\r\n?/, '<br />') }
|
67
131
|
end
|
68
132
|
end
|
69
133
|
|
@@ -73,5 +137,10 @@ module BBCodeizer
|
|
73
137
|
end
|
74
138
|
end
|
75
139
|
alias_method :apply_tag, :apply_tags
|
140
|
+
|
141
|
+
# http://stackoverflow.com/questions/88311/how-best-to-generate-a-random-string-in-ruby
|
142
|
+
def random_string
|
143
|
+
(0...16).map{ ('a'..'z').to_a[rand(26)] }.join
|
144
|
+
end
|
76
145
|
end
|
77
146
|
end
|
File without changes
|
data/test/bbcodeizer_test.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'test/unit'
|
2
|
-
require '
|
2
|
+
require 'bbcodeizer_helper'
|
3
3
|
|
4
4
|
class BbcodeizerTest < Test::Unit::TestCase
|
5
5
|
include BBCodeizeHelper
|
6
6
|
|
7
7
|
def test_quote_with_cite
|
8
8
|
assert_equal(
|
9
|
-
"<blockquote><cite
|
9
|
+
"<blockquote><p><cite>\"JD\" wrote:</cite></p>\nBBCode is great!\n</blockquote>",
|
10
10
|
bbcodeize("[quote=\"JD\"]\nBBCode is great!\n[/quote]"))
|
11
11
|
end
|
12
12
|
|
@@ -24,7 +24,7 @@ class BbcodeizerTest < Test::Unit::TestCase
|
|
24
24
|
|
25
25
|
def test_code
|
26
26
|
assert_equal(
|
27
|
-
"<pre>\ncode goes here\n</pre>",
|
27
|
+
"<pre><code>\ncode goes here\n</code></pre>",
|
28
28
|
bbcodeize("[code]\ncode goes here\n[/code]"))
|
29
29
|
end
|
30
30
|
|
@@ -72,7 +72,7 @@ class BbcodeizerTest < Test::Unit::TestCase
|
|
72
72
|
|
73
73
|
def test_image
|
74
74
|
assert_equal(
|
75
|
-
"<img src=\"http://example.com/example.gif\" />",
|
75
|
+
"<img src=\"http://example.com/example.gif\" alt=\"http://example.com/example.gif\" />",
|
76
76
|
bbcodeize("[img]http://example.com/example.gif[/img]"))
|
77
77
|
end
|
78
78
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: bbcodeizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0
|
5
|
+
version: 0.1.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jonathan Dance
|
@@ -54,9 +54,9 @@ files:
|
|
54
54
|
- Rakefile
|
55
55
|
- bbcodeizer.gemspec
|
56
56
|
- init.rb
|
57
|
-
- lib/bbcodeize_helper.rb
|
58
57
|
- lib/bbcodeizer.rb
|
59
58
|
- lib/bbcodeizer/version.rb
|
59
|
+
- lib/bbcodeizer_helper.rb
|
60
60
|
- rdoc/BBCodeizeHelper.html
|
61
61
|
- rdoc/Bbcodeizer.html
|
62
62
|
- rdoc/README.html
|