',
'Unordered list item',
'[list][*]item 1[*] item2[/list]',
:list],
'Ordered list (numerical)' => [
/\[list=1(:.*)?\](.+)\[\/list(:.)?\1?\]/mi,
'\2',
'Ordered list numerically',
'[list=1][*]item 1[*] item2[/list]',
:list],
'Ordered list (alphabetical)' => [
/\[list=a(:.*)?\](.+)\[\/list(:.)?\1?\]/mi,
'\2',
'Ordered list alphabetically',
'[list=a][*]item 1[*] item2[/list]',
:list],
'Definition List' => [
/\[dl\](.*?)\[\/dl\]/im,
'
\1
',
'List of terms/items and their definitions',
'[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]',
:definelist],
'Definition Term' => [
/\[dt\](.*?)\[\/dt\]/mi,
'
',
'Definition definitions',
'[dd]my definition[/dd',
:definition],
'Quote' => [
/\[quote(:.*)?="?(.*?)"?\](.*?)\[\/quote\1?\]/mi,
'',
'Quote with citation',
"[quote=mike]Now is the time...[/quote]",
:quote],
'Quote (Sourceless)' => [
/\[quote(:.*)?\](.*?)\[\/quote\1?\]/mi,
'',
'Quote (sourceclass)',
"[quote]Now is the time...[/quote]",
:quote],
'Link' => [
/\[url=(.*?)\](.*?)\[\/url\]/mi,
'\2',
'Hyperlink to somewhere else',
'Maybe try looking on [url=http://google.com]Google[/url]?',
:link],
'Link (Implied)' => [
/\[url\](.*?)\[\/url\]/mi,
'\1',
'Hyperlink (implied)',
"Maybe try looking on [url]http://google.com[/url]",
:link],
#
# TODO: fix automatic links
#
# 'Link (Automatic)' => [
# /http:\/\/(.*?)[^<\/a>]/,
# '\1',
# 'Hyperlink (automatic)',
# nil, nil,
# :link],
'Image (Resized)' => [
/\[img(:.+)? size=(['"]?)(\d+)x(\d+)\2\](.*?)\[\/img\1?\]/im,
'',
'Display an image with a set width and height',
'[img size=96x96]http://www.google.com/intl/en_ALL/images/logo.gif[/img]',
:image],
'Image (Alternative)' => [
/\[img=([^\[\]].*?)\.(#{@@imageformats})\]/im,
'',
'Display an image (alternative format)',
'[img=http://myimage.com/logo.gif]',
:image],
'Image' => [
/\[img(:.+)?\]([^\[\]].*?)\.(#{@@imageformats})\[\/img\1?\]/im,
'',
'Display an image',
'Check out this crazy cat: [img]http://catsweekly.com/crazycat.jpg[/img]',
:image],
'YouTube' => [
/\[youtube\](.*?)\?v=([\w\d\-]+).*\[\/youtube\]/im,
# '',
'',
'Display a video from YouTube.com',
'[youtube]http://youtube.com/watch?v=E4Fbk52Mk1w[/youtube]',
:video],
'YouTube (Alternative)' => [
/\[youtube\](.*?)\/v\/([\w\d\-]+)\[\/youtube\]/im,
# '',
'',
'Display a video from YouTube.com (alternative format)',
'[youtube]http://youtube.com/watch/v/E4Fbk52Mk1w[/youtube]',
:video],
'Google Video' => [
/\[gvideo\](.*?)\?docid=([-]{0,1}\d+).*\[\/gvideo\]/mi,
'',
'Display a video from Google Video',
'[gvideo]http://video.google.com/videoplay?docid=-2200109535941088987[/gvideo]',
:video],
'Email' => [
/\[email(:.+)?\](.+)\[\/email\1?\]/i,
'\2',
'Link to email address',
'[email]wadus@wadus.com[/email]',
:email]
}
class << self
# Convert a string with BBCode markup into its corresponding HTML markup
#
# === Basic Usage
#
# The first parameter is the string off BBCode markup to be processed
#
# text = "[b]some bold text to markup[/b]"
# output = BBRuby.to_html(text)
# # output => "some bold text to markup"
#
# === Custom BBCode translations
#
# You can supply your own BBCode markup translations to create your own custom markup
# or override the default BBRuby translations (parameter is a hash of custom translations).
#
# The hash takes the following format: "name" => [regexp, replacement, description, example, enable_symbol]
#
# custom_blockquote = {
# 'Quote' => [
# /\[quote(:.*)?=(.*?)\](.*?)\[\/quote\1?\]/mi,
# '
\2
\3
',
# 'Quote with citation',
# '[quote=mike]please quote me[/quote]',
# :quote
# ]
# }
#
# === Enable and Disable specific tags
#
# BBRuby will allow you to only enable certain BBCode tags, or to explicitly disable certain tags.
# Pass in either :disable or :enable to set your method, followed by the comma-separated list of tags
# you wish to disable or enable
#
# BBRuby.to_html(text, {}, true, :enable, :image, :bold, :quote)
# BBRuby.to_html(text, {}, true, :disable, :image, :video, :color)
#
def to_html(text, tags_alternative_definition = {}, escape_html=true, method=:disable, *tags)
text = text.clone
# escape < and > to remove any html
if escape_html
text.gsub!( '<', '<' )
text.gsub!( '>', '>' )
end
tags_definition = @@tags.merge(tags_alternative_definition)
# parse bbcode tags
case method
when :enable
tags_definition.each_value { |t| text.gsub!(t[0], t[1]) if tags[0].include?(t[4]) }
when :disable
# this works nicely because the default is disable and the default set of tags is [] (so none disabled) :)
tags_definition.each_value { |t| text.gsub!(t[0], t[1]) unless tags[0].include?(t[4]) }
end
# parse spacing
text.gsub!( /\r\n?/, "\n" )
text.gsub!( /\n/, " " )
# return markup
text
end
# Returns the list of tags processed by BBRuby in a Hash object
def tag_list
@@tags
end
end # class << self
end # class BBRuby
class String
# Convert a string with BBCode markup into its corresponding HTML markup
#
# === Basic Usage
#
# text = "[b]some bold text to markup[/b]"
# output = text.bbcode_to_html
# # output => "some bold text to markup"
#
# === Custom BBCode translations
#
# You can supply your own BBCode markup translations to create your own custom markup
# or override the default BBRuby translations (parameter is a hash of custom translations).
#
# The hash takes the following format: "name" => [regexp, replacement, description, example, enable_symbol]
#
# custom_blockquote = {
# 'Quote' => [
# /\[quote(:.*)?=(.*?)\](.*?)\[\/quote\1?\]/mi,
# '
\2
\3
',
# 'Quote with citation',
# '[quote=mike]please quote me[/quote]',
# :quote
# ]
# }
#
# output = text.bbcode_to_html(custom_blockquote)
#
# === Enable and Disable specific tags
#
# BBRuby will allow you to only enable certain BBCode tags, or to explicitly disable certain tags.
# Pass in either :disable or :enable to set your method, followed by the comma-separated list of tags
# you wish to disable or enable
#
# output = text.bbcode_to_html({}, true, :enable, :image, :bold, :quote)
# output = text.bbcode_to_html({}, true, :disable, :image, :video, :color)
#
# === HTML auto-escaping
#
# By default, BBRuby will auto-escape HTML. You can prevent this by passing in false as the second
# parameter
#
# output = text.bbcode_to_html({}, false)
#
def bbcode_to_html(tags_alternative_definition = {}, escape_html=true, method=:disable, *tags)
BBRuby.to_html(self, tags_alternative_definition, escape_html, method, tags)
end
# Replace the string contents with the HTML-converted markup
def bbcode_to_html!(tags_alternative_definition = {}, escape_html=true, method=:disable, *tags)
self.replace(BBRuby.to_html(self, tags_alternative_definition, escape_html, method, tags))
end
end