bbgun 1.0.0

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.
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ pkg/*
2
+ Manifest
3
+ *.gem
4
+ *~
5
+ tmp/*
6
+ *.bundle
7
+ /.idea/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
data/Gemfile.lock ADDED
@@ -0,0 +1,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ bbgun (1.0.0)
5
+ coderay
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ coderay (1.0.8)
11
+ diff-lcs (1.1.2)
12
+ rspec (2.3.0)
13
+ rspec-core (~> 2.3.0)
14
+ rspec-expectations (~> 2.3.0)
15
+ rspec-mocks (~> 2.3.0)
16
+ rspec-core (2.3.1)
17
+ rspec-expectations (2.3.0)
18
+ diff-lcs (~> 1.1.2)
19
+ rspec-mocks (2.3.0)
20
+
21
+ PLATFORMS
22
+ ruby
23
+
24
+ DEPENDENCIES
25
+ bbgun!
26
+ rspec
data/README.rdoc ADDED
@@ -0,0 +1,43 @@
1
+ = BBGun
2
+
3
+ {Homepage}[http://www.github.com/PeteMichaud/bbgun]
4
+
5
+ Rails Gem for BBCode
6
+
7
+ == Install
8
+
9
+ Add:
10
+
11
+ gem "bbgun"
12
+
13
+ to your Gemfile and then install the gem using:
14
+
15
+ bundle install
16
+
17
+ == Usage
18
+
19
+ The easiest way to use tbbc is with the string method provided, for example
20
+
21
+ >> "[b]Bold[/b]".tbbc
22
+ => "<strong>Bold</strong>"
23
+
24
+ == Configuration
25
+
26
+ === On the fly
27
+
28
+ If you want to quickly change something, e.g. disable a tag for a specific .tbbc call then you can configure it in the call:
29
+
30
+ >> "[b]Bold[/b] [i]Italic[/i]".tbbc(:strong_enabled => false)
31
+ => "[b]Bold[/b] <i>Italic</i>"
32
+
33
+ Whilst this method works its not the cleanest way of doing it. Its fine for simple things like disabling a single tag (e.g. tables in signatures) but when defining custom tags or the coderay css its better to use the other config method
34
+
35
+ === Globaly
36
+
37
+ This is done using config/initializers/tbbc.rb, this file needs to look like this:
38
+
39
+ BBGun.configure do |c|
40
+ c.strong_enabled = false
41
+ end
42
+
43
+ That would produce the same output as the on the fly config but would work when ever you used .tbbc in the project.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/bbgun.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "bbgun/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "bbgun"
7
+ s.version = BBGun::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Pete Michaud"]
10
+ s.email = ["michaudp@gmail.com"]
11
+ s.homepage = "http://www.github.com/PeteMichaud/bbgun"
12
+ s.summary = "Provides BBCode for Ruby."
13
+ s.summary = "Provides BBCode for Ruby."
14
+
15
+ s.add_development_dependency "rspec"
16
+ s.add_dependency "coderay"
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.require_paths = ["lib"]
22
+ end
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'bbgun'
@@ -0,0 +1,9 @@
1
+ module BBGun
2
+ module BBGun
3
+ def tbbc_css(config = nil)
4
+ bbc=TBBC.new
5
+ bbc.conf(config) if config
6
+ bbc.css
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,30 @@
1
+ module BBGun
2
+ module Coderay
3
+ def self.parse(input)
4
+ input=input.gsub("\r","")
5
+ scan=input.scan(/\[code lang=(.+?)\](.+?)\[\/code\]/m)
6
+ scan.each do |splits|
7
+ parse=splits[1].gsub("&lt;","<").gsub("&gt;",">")
8
+ lang=splits[0]
9
+ parsed="[nobbc]" + CodeRay.scan(parse, lang).div(:line_numbers => @config[:syntax_highlighting_line_numbers], :css => :class) + "[/nobbc]"
10
+ input=input.gsub("[code lang=#{lang}]#{splits[1]}[/code]",parsed)
11
+ end
12
+ out = coderay_styled(input)
13
+ return out.to_s
14
+ end
15
+
16
+ def self.coderay_styled(input)
17
+ output = input.gsub(/class="CodeRay"/,"style=\"background-color: #232323; border: 1px solid black; font-family: 'Courier New', 'Terminal', monospace; color: #E6E0DB; padding: 3px 5px; overflow: auto; font-size: 12px; margin: 12px 0;\"")
18
+ output = output.gsub(/<pre>/,"<pre style=\"margin: 0px; padding: 0px;\">")
19
+ output = output.gsub(/class="an"/,"style=\"#{BBGun.config.syntax_highlighting_html}\"").gsub(/class="c"/,"style=\"#{BBGun.config.syntax_highlighting_comment}\"")
20
+ output = output.gsub(/class="ch"/,"style=\"#{BBGun.config.syntax_highlighting_escaped}\"").gsub(/class="cl"/,"style=\"#{BBGun.config.syntax_highlighting_class}\"")
21
+ output = output.gsub(/class="co"/,"style=\"#{BBGun.config.syntax_highlighting_constant}\"").gsub(/class="fl"/,"style=\"#{BBGun.config.syntax_highlighting_float}\"")
22
+ output = output.gsub(/class="fu"/,"style=\"#{BBGun.config.syntax_highlighting_function}\"").gsub(/class="gv"/,"style=\"#{BBGun.config.syntax_highlighting_global}\"")
23
+ output = output.gsub(/class="i"/,"style=\"#{BBGun.config.syntax_highlighting_integer}\"").gsub(/class="il"/,"style=\"#{BBGun.config.syntax_highlighting_inline}\"")
24
+ output = output.gsub(/class="iv"/,"style=\"#{BBGun.config.syntax_highlighting_instance}\"").gsub(/class="pp"/,"style=\"#{BBGun.config.syntax_highlighting_doctype}\"")
25
+ output = output.gsub(/class="r"/,"style=\"#{BBGun.config.syntax_highlighting_keyword}\"").gsub(/class="rx"/,"style=\"#{BBGun.config.syntax_highlighting_regex}\"")
26
+ output = output.gsub(/class="s"/,"style=\"#{BBGun.config.syntax_highlighting_string}\"").gsub(/class="sy"/,"style=\"#{BBGun.config.syntax_highlighting_symbol}\"")
27
+ output = output.gsub(/class="ta"/,"style=\"#{BBGun.config.syntax_highlighting_html}\"").gsub(/class="pc"/,"style=\"#{BBGun.config.syntax_highlighting_boolean}\"")
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,63 @@
1
+ module BBGun
2
+ class Config
3
+ attr_accessor :configed_by, :image_alt, :url_target, :allow_defaults, :table_width, :syntax_highlighting, :syntax_highlighting_html,
4
+ :syntax_highlighting_comment, :syntax_highlighting_escaped, :syntax_highlighting_class, :syntax_highlighting_constant,
5
+ :syntax_highlighting_float, :syntax_highlighting_function, :syntax_highlighting_global, :syntax_highlighting_integer,
6
+ :syntax_highlighting_inline, :syntax_highlighting_instance, :syntax_highlighting_doctype, :syntax_highlighting_keyword,
7
+ :syntax_highlighting_regex, :syntax_highlighting_string, :syntax_highlighting_symbol, :syntax_highlighting_html,
8
+ :syntax_highlighting_boolean, :syntax_highlighting_line_numbers, :swear_words, :custom_tags, :disable_html, :newline_enabled,
9
+ :nobbc_enabled, :swear_filter_enabled
10
+
11
+ def initialize
12
+ set_defaults
13
+ end
14
+
15
+ def check_enabled(sym)
16
+ eval "@#{sym.to_s}"
17
+ end
18
+
19
+ def from_sym(sym)
20
+ eval "@#{sym.to_s}"
21
+ end
22
+
23
+ def set_from_sym(k, v)
24
+ eval "@#{k.to_s} = #{v.inspect}"
25
+ end
26
+
27
+ private
28
+
29
+ def set_defaults
30
+ @configed_by ||= "user"
31
+ @image_alt ||= "Posted Image"
32
+ @url_target ||= "_BLANK"
33
+ @allow_defaults ||= true
34
+ @table_width ||= "100%"
35
+ @syntax_highlighting ||= true
36
+ @syntax_highlighting_html ||= "color:#E7BE69"
37
+ @syntax_highlighting_comment ||= "color:#BC9358; font-style: italic;"
38
+ @syntax_highlighting_escaped ||= "color:#509E4F"
39
+ @syntax_highlighting_class ||= "color:#FFF"
40
+ @syntax_highlighting_constant ||= "color:#FFF"
41
+ @syntax_highlighting_float ||= "color:#A4C260"
42
+ @syntax_highlighting_function ||= "color:#FFC56D"
43
+ @syntax_highlighting_global ||= "color:#D0CFFE"
44
+ @syntax_highlighting_integer ||= "color:#A4C260"
45
+ @syntax_highlighting_inline ||= "background:#151515"
46
+ @syntax_highlighting_instance ||= "color:#D0CFFE"
47
+ @syntax_highlighting_doctype ||= "color:#E7BE69"
48
+ @syntax_highlighting_keyword ||= "color:#CB7832"
49
+ @syntax_highlighting_regex ||= "color:#A4C260"
50
+ @syntax_highlighting_string ||= "color:#A4C260"
51
+ @syntax_highlighting_symbol ||= "color:#6C9CBD"
52
+ @syntax_highlighting_html ||= "color:#E7BE69"
53
+ @syntax_highlighting_boolean ||= "color:#6C9CBD"
54
+ @syntax_highlighting_line_numbers ||= :inline
55
+ @swear_words ||= []
56
+ @custom_tags ||= []
57
+ @disable_html ||= true
58
+ @newline_enabled ||= true
59
+ @nobbc_enabled ||= true
60
+ @swear_filter_enabled ||= true
61
+ end
62
+ end
63
+ end
data/lib/bbgun/css.rb ADDED
@@ -0,0 +1,8 @@
1
+ module BBGun
2
+
3
+ # Returns the css required for coderay
4
+ def css(config = nil)
5
+ warn "[DEPRECATION] `css` is no longer used, styles are applied inline."
6
+ ""
7
+ end
8
+ end
@@ -0,0 +1,42 @@
1
+ module BBGun
2
+ # Parses the input and returns it in tbbc form.
3
+ #
4
+ # TBBC.new.parse("[b]Bold[/b]")
5
+ #
6
+ # Would return "<strong>Bold</strong>"
7
+ def self.parse(input)
8
+ #Remove the < and > which will disable all HTML
9
+ input=input.gsub("<","&lt;").gsub(">","&gt;") unless @config.disable_html == false
10
+ #CodeRay
11
+ input=Coderay.parse(input) unless @config.syntax_highlighting == false
12
+ #Convert new lines to <br />'s
13
+ input=input.gsub(/\n/,'<br />') unless @config.newline_enabled == false
14
+ #[nobbc] tags
15
+ input=nobbc input unless @config.nobbc_enabled == false
16
+ #Swear Filtering
17
+ input=SwearFilter.parse(input) unless @config.swear_filter_enabled == false
18
+ #Loading Custom Tags
19
+ #begin
20
+ if @config.custom_tags then
21
+ @config.custom_tags.each do |tag|
22
+ input=runtag(input,tag)
23
+ end
24
+ end
25
+ #rescue
26
+ #input+="<br />Custom Tags failed to run"
27
+ #end
28
+ #Loading Default Tags and applying them
29
+ if @config.allow_defaults then
30
+ BBGun::Tags.each do |tag|
31
+ input=runtag(input,tag)
32
+ end
33
+ end
34
+ input = correctbrs input
35
+ input = escape input
36
+ if needs_html_safe? then
37
+ return input.html_safe
38
+ else
39
+ return input
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,21 @@
1
+ class String
2
+ # Allows for "[b]Bold[/b]".tbbc
3
+ #
4
+ # This method is also configurable, taking the normal configuration options.
5
+ #
6
+ # "[b]Bold [i]and italic[/i][/b]".tbbc(:strong_enabled => false, :italic_enabled => false)
7
+ #
8
+ # Will return "[b]Bold [i]and italic[/i][/b]"
9
+ def tbbc(conf = nil)
10
+ if !(BBGun.configured?) || conf != nil
11
+ BBGun.configure do |c|
12
+ if conf
13
+ conf.each do |k, v|
14
+ c.set_from_sym(k,v)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ BBGun.parse(self)
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ module BBGun
2
+ module SwearFilter
3
+ SwearChracters = %w[! $ % ^ * ~]
4
+ def self.parse(input)
5
+ BBGun.config.swear_words.each do |swear|
6
+ input=input.gsub(/#{swear}/,swear_string(swear))
7
+ end
8
+ input
9
+ end
10
+
11
+ def self.swear_string(s)
12
+ out=""
13
+ s.split("").map { |split| out+= SwearChracters[rand(SwearChracters.count)] }
14
+ out
15
+ end
16
+ end
17
+ end
data/lib/bbgun/tags.rb ADDED
@@ -0,0 +1,73 @@
1
+ module BBGun
2
+ Tags = [[/\[b\](.*?)\[\/b\]/,'<strong>\1</strong>',:strong_enabled,"[b]BOLD[/b]","<strong>BOLD</strong>"],
3
+ [/\[i\](.*?)\[\/i\]/,'<i>\1</i>',:italic_enabled,"[i]italics[/i]","<i>italics</i>"],
4
+ [/\[u\](.*?)\[\/u\]/,'<u>\1</u>',:underline_enabled,"[u]underline[/u]","<u>underline</u>"],
5
+ [/\[url\](.*?)\[\/url\]/,'<a href="\1" target="@config[:url_target]">\1</a>',:url_enabled,"[url]http://www.example.com[/url]","<a href=\"http://www.example.com\" target=\"_BLANK\">http://www.example.com</a>"],
6
+ [/\[url=(.*?)\](.*?)\[\/url\]/,'<a href="\1" target="@config[:url_target]">\2</a>',:url_enabled,"[url=http://www.example.com]Example[/url]","<a href=\"http://www.example.com\" target=\"_BLANK\">Example</a>"],
7
+ [/\[url=(.*?) target=(.*?)\](.*?)\[\/url\]/,'<a href="\1" target="\2">\3</a>',:url_enabled,"[url=http://www.example.com]Example[/url]","<a href=\"http://www.example.com\" target=\"_BLANK\">Example</a>"],
8
+ [/\[img\](.*?)\[\/img\]/,'<img src="\1" alt="@config[:image_alt]" />',:image_enabled,"[img]test.jpg[/img]","<img src=\"test.jpg\" alt=\"Posted Image\" />"],
9
+ [/\[img alt=(.*?)\](.*?)\[\/img\]/,'<img src="\2" alt="\1" />',:image_enabled,"[img alt=Posted Image]test.jpg[/img]","<img src=\"test.jpg\" alt=\"Posted Image\" />"],
10
+ [/\[ul\](.*?)\[\/ul\]/,'<ul>\1</ul>',:list_enabled,"[ul]list[/ul]","<ul>list</ul>"],
11
+ [/\[ol\](.*?)\[\/ol\]/,'<ol>\1</ol>',:list_enabled,"[ol]list[/ol]","<ol>list</ol>"],
12
+ [/\[li\](.*?)\[\/li\]/,'<li>\1</li>',:list_enabled,"[li]list[/li]","<li>list</li>"],
13
+ [/\[quote\](.*?)\[\/quote\]/,'<blockquote>\1</blockquote>',:quote_enabled,"[quote]quote[/quote]","<blockquote>quote</blockquote>"],
14
+ [/\[quote=(.*?)\](.*?)\[\/quote\]/,'<blockquote><i>Posted by <b>\1</b></i><br />\2</blockquote>',:quote_enabled,"[quote=user]quote[/quote]","<blockquote><i>Posted by <b>user</b></i><br />quote</blockquote>"],
15
+ [/\[color=(.*?)\](.*?)\[\/color\]/,'<span style="color:\1;">\2</span>',:color_enabled,"[color=red]red text[/color]","<span style=\"color:red;\">red text</span>"],
16
+ [/\[center\](.*?)\[\/center\]/,'<div style="text-align:center">\1</div>',:alignment_enabled,"[center]centered text[/center]","<div style=\"text-align:center\">centered text</div>"],
17
+ [/\[left\](.*?)\[\/left\]/,'<div style="text-align:left">\1</div>',:alignment_enabled,"[left]left text[/left]","<div style=\"text-align:left\">left text</div>"],
18
+ [/\[right\](.*?)\[\/right\]/,'<div style="text-align:right">\1</div>',:alignment_enabled,"[right]right text[/right]","<div style=\"text-align:right\">right text</div>"],
19
+ [/\[acronym=(.*?)\](.*?)\[\/acronym\]/,'<acronym title="\1">\2</acronym>',:acronym_enabled,"[acronym=this]that[/acronym]","<acronym title=\"this\">that</acronym>"],
20
+ [/\[table\](.*?)\[\/table\]/,'<table width="@config[:table_width]">\1</table>',:table_enabled,"[table]...[/table]","<table width=\"100%\">...</table>"],
21
+ [/\[tr\](.*?)\[\/tr\]/,'<tr>\1</tr>',:table_enabled,"[tr]...[/tr]","<tr>...</tr>"],
22
+ [/\[td\](.*?)\[\/td\]/,'<td>\1</td>',:table_enabled,"[td]...[/td]","<td>...</td>"],
23
+ [/\[th\](.*?)\[\/th\]/,'<th>\1</th>',:table_enabled,"[th]...[/th]","<th>...</th>"],
24
+ [/\[h1\](.*?)\[\/h1\]/,'<h1>\1</h1>',:header_enabled,'[h1]heading[/h1]',"<h1>heading</h1>"],
25
+ [/\[h2\](.*?)\[\/h2\]/,'<h2>\1</h2>',:header_enabled,'[h2]heading[/h2]',"<h2>heading</h2>"],
26
+ [/\[h3\](.*?)\[\/h3\]/,'<h3>\1</h3>',:header_enabled,'[h3]heading[/h3]',"<h3>heading</h3>"],
27
+ [/\[h4\](.*?)\[\/h4\]/,'<h4>\1</h4>',:header_enabled,'[h4]heading[/h4]',"<h4>heading</h4>"]]
28
+
29
+ private
30
+
31
+ # Runs the given tag array on the given string.
32
+ def self.runtag(s,tag)
33
+ check = tag[2]
34
+ check = @config.check_enabled(tag[2]) if is_symbol? tag[2]
35
+ if tag[1] =~ /^Callback:/
36
+ s = run_callback(s, tag[0], tag[1])
37
+ else
38
+ pattern = tag[1]
39
+ s=s.gsub(tag[0],replace_config_values(pattern)) unless check == false
40
+ end
41
+ s
42
+ end
43
+
44
+ def self.is_symbol?(v)
45
+ return false if (v == true or v == false)
46
+ v == v.to_sym
47
+ end
48
+
49
+ def self.replace_config_values(s)
50
+ if s.scan(/@config\[:(.*?)\]/) != [] then
51
+ return s.gsub(/@config\[:(.*?)\]/,@config.from_sym($1.to_sym))
52
+ else
53
+ return s
54
+ end
55
+ end
56
+
57
+ def self.run_callback(string, regex, callback)
58
+ code = callback.gsub(/^Callback: /, '')
59
+ output = string
60
+ string.scan(regex).each do |arguments|
61
+ arguments_pass = build_pass_string(arguments)
62
+ replace = eval "#{code}#{arguments_pass}"
63
+ output = output.sub(regex, replace)
64
+ end
65
+ output
66
+ end
67
+
68
+ def self.build_pass_string(args)
69
+ output = "("
70
+ args.map { |arg| output = "#{output}\"#{arg}\", " }
71
+ output.gsub(/, $/,')')
72
+ end
73
+ end
@@ -0,0 +1,3 @@
1
+ module BBGun
2
+ VERSION = "1.0.0"
3
+ end
data/lib/bbgun.rb ADDED
@@ -0,0 +1,61 @@
1
+ require 'bbgun/parse.rb'
2
+ require 'bbgun/tags.rb'
3
+ require 'bbgun/config.rb'
4
+ require 'bbgun/string.rb'
5
+ require 'bbgun/css.rb'
6
+ require 'bbgun/swear_filter.rb'
7
+ require 'bbgun/coderay'
8
+ require 'rubygems'
9
+ require 'coderay'
10
+
11
+ #Helper Method
12
+ if defined? Rails
13
+ require 'bbgun/application_helper.rb'
14
+ ActionView::Base.send :include, TBBCHelper
15
+ end
16
+
17
+ module BBGun
18
+ def self.configure
19
+ @config = Config.new
20
+ yield(@config)
21
+ end
22
+
23
+ def self.configured?
24
+ @config ? true : false
25
+ end
26
+
27
+ def self.config
28
+ @config
29
+ end
30
+
31
+ private
32
+
33
+ def self.nobbc(s)
34
+ find=s.scan(/\[nobbc\](.*?)\[\/nobbc\]/)
35
+ find.each do |f|
36
+ replace=f[0].gsub("[","&#91;").gsub("]","&#93")
37
+ s=s.gsub("[nobbc]#{f[0]}[/nobbc]",replace)
38
+ end
39
+ return s
40
+ end
41
+
42
+ def self.correctbrs(s)
43
+ #Corrects the extra brs
44
+ s=s.gsub(/<br \/><(ul|li|table|tr|td|th)/,'<\1')
45
+ s=s.gsub(/<br \/><\/(ul|li|table|tr|td|th)/,'</\1')
46
+ end
47
+
48
+ def self.escape(s)
49
+ clean = s.scan(/href=\"(.*?)\" target/).join
50
+ clean = clean.gsub('"', '&quot;')
51
+ s.gsub(/href=\"(.*?)\" target/, "href=\"#{clean}\" target")
52
+ end
53
+
54
+ def self.needs_html_safe?
55
+ if defined? Rails
56
+ return Rails.version =~ /^3\./
57
+ else
58
+ return false
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,43 @@
1
+ require 'lib/bbgun.rb'
2
+
3
+ def upcaser(input)
4
+ input.upcase
5
+ end
6
+
7
+ describe BBGun, "#parse" do
8
+ BBGun::Tags.each do |tag|
9
+ it "Should return #{tag[4]} for #{tag[3]}" do
10
+ tag[3].tbbc.should == tag[4]
11
+ end
12
+ end
13
+ end
14
+
15
+ describe String, "#tbbc" do
16
+ it "Should return <i>italics</i> for [i]italics[/i]" do
17
+ "[i]italics[/i]".tbbc.should == "<i>italics</i>"
18
+ end
19
+
20
+ it "Should return <strong>BOLD [i]italics[/i]</strong> when italics are disabled" do
21
+ "[b]BOLD [i]italics[/i][/b]".tbbc(:italic_enabled => false).should == "<strong>BOLD [i]italics[/i]</strong>"
22
+ end
23
+
24
+ it "Should allow custom tags to run and return <strong><i>BOLD italics</i></strong> for [bi]BOLD italics[/bi]" do
25
+ "[bi]BOLD italics[/bi]".tbbc(:custom_tags => [[/\[bi\](.*?)\[\/bi\]/,'<strong><i>\1</i></strong>',true]]).should == "<strong><i>BOLD italics</i></strong>"
26
+ end
27
+
28
+ it "Should allow custom tags to pass to callbacks" do
29
+ "[up]HeLlo WorLd[/up]".tbbc(:custom_tags => [[/\[up\](.*?)\[\/up\]/,"Callback: upcaser",true]]).should == "HELLO WORLD"
30
+ end
31
+
32
+ it "Should not fail when a callback is defined but not used" do
33
+ "[dw]HeLlo WorLd[/dw]".tbbc(:custom_tags => [[/\[up\](.*?)\[\/up\]/,"Callback: upcaser",true]]).should == "[dw]HeLlo WorLd[/dw]"
34
+ end
35
+
36
+ it "Should allow for 2 identical callbacks per string" do
37
+ "[up]HeLlo WorLd[/up] and [up]Bye bYe WorLd[/up]".tbbc(:custom_tags => [[/\[up\](.*?)\[\/up\]/,"Callback: upcaser",true]]).should == "HELLO WORLD and BYE BYE WORLD"
38
+ end
39
+
40
+ it "should stop injection" do
41
+ '[url=" onclick="alert(\'Hello World!\');]Hello world[/url]'.tbbc.should_not eq "<a href=\"\" onclick=\"alert('Hello World!');\" target=\"_BLANK\">Hello world</a>"
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bbgun
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Pete Michaud
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: coderay
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description:
47
+ email:
48
+ - michaudp@gmail.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - .gitignore
54
+ - Gemfile
55
+ - Gemfile.lock
56
+ - README.rdoc
57
+ - Rakefile
58
+ - bbgun.gemspec
59
+ - init.rb
60
+ - lib/bbgun.rb
61
+ - lib/bbgun/application_helper.rb
62
+ - lib/bbgun/coderay.rb
63
+ - lib/bbgun/config.rb
64
+ - lib/bbgun/css.rb
65
+ - lib/bbgun/parse.rb
66
+ - lib/bbgun/string.rb
67
+ - lib/bbgun/swear_filter.rb
68
+ - lib/bbgun/tags.rb
69
+ - lib/bbgun/version.rb
70
+ - spec/bbgun_spec.rb
71
+ homepage: http://www.github.com/PeteMichaud/bbgun
72
+ licenses: []
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 1.8.24
92
+ signing_key:
93
+ specification_version: 3
94
+ summary: Provides BBCode for Ruby.
95
+ test_files:
96
+ - spec/bbgun_spec.rb
97
+ has_rdoc: