th-bbcode 0.4.3 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -26,15 +26,18 @@ Create and register a handler. In this example, I'm creating a HtmlHandler and
26
26
  I'm going to register it as `:html`.
27
27
 
28
28
  ```ruby
29
- require "bbcode"
29
+ require 'rubygems'
30
+ require 'bundler/setup'
31
+ require 'bbcode'
30
32
 
31
33
  Bbcode::Base.register_handler :html, Bbcode::HtmlHandler.new(
32
- :b => :strong,
33
- :i => :em,
34
- :url => [ :a, { :href => "%{0}" } ],
35
- :txt => ->(element){ "#{element.content.source}" },
36
- :img => ->(element){ %(<img src="#{CGI.escapeHTML(element.content.source)}">) },
37
- :color => [ :span, { :style => "color: %{0};" } ]
34
+ :b => :strong,
35
+ :i => :em,
36
+ :url => [ :a, { :href => "%{0}" } ],
37
+ :txt => ->(element){ "#{element.content.source}" },
38
+ :img => ->(element){ %(<img src="#{CGI.escapeHTML(element.content.source)}">) },
39
+ :admin => ->(element, locals){ locals[:is_admin] ? element.content : "" },
40
+ :color => [ :span, { :style => "color: %{0};" } ]
38
41
  )
39
42
  ```
40
43
 
@@ -44,6 +47,10 @@ the `:html`-handler like this:
44
47
  ```ruby
45
48
  "[b]Hello, bold world![/]".as_bbcode.to :html
46
49
  # => <strong>Hello, bold world!</strong>
50
+ "[admin]Hello, admin![/]".as_bbcode.to :html, :is_admin => true
51
+ # => Hello, admin!
52
+ "[admin]Hello, admin![/]".as_bbcode.to :html, :is_admin => false
53
+ # =>
47
54
  ```
48
55
 
49
56
  If you're using this gem in a rails project, I would recommend registering your
@@ -62,6 +69,8 @@ Features:
62
69
  * Parsing incorrectly nested bbcode elements like `[b]bold[i]and italic[/b]only
63
70
  italic[/]`, which might result to `<b>bold<i>and italic</i></b><i>only
64
71
  italic</i>`.
72
+ * Passing variables to the handler and accessing them to the element handler
73
+ callbacks.
65
74
 
66
75
  Using WillScanString:
67
76
  ---------------------
@@ -1,21 +1,24 @@
1
1
  module Bbcode
2
2
  class Base
3
- @@handlers = {}.with_indifferent_access
3
+ @@handlers = HashWithIndifferentAccess.new
4
4
 
5
- def initialize( string )
5
+ attr_reader :locals
6
+
7
+ def initialize(string, locals = {})
6
8
  @string = string
7
9
  end
8
10
 
9
- def to( handler )
11
+ def to(handler, locals = {})
10
12
  handler = @@handlers[handler]
11
13
  raise "Handler #{handler} isn't registered" if handler.blank?
14
+ handler.locals = locals.with_indifferent_access
12
15
  Parser.new(Tokenizer.new).parse @string, handler
13
16
  result = handler.get_document.content.to_s
14
17
  handler.clear
15
18
  result
16
19
  end
17
20
 
18
- def self.register_handler( name, handler )
21
+ def self.register_handler(name, handler)
19
22
  @@handlers[name] = handler
20
23
  end
21
24
  end
@@ -31,7 +31,7 @@ module Bbcode
31
31
  end
32
32
 
33
33
  def to_s
34
- @handler_element.handler.get_element_handler(tagname).call(self)
34
+ @handler_element.handler.apply_element_handler_for_element self
35
35
  end
36
36
  end
37
37
  end
@@ -2,7 +2,7 @@ require "bbcode/handler_element"
2
2
 
3
3
  module Bbcode
4
4
  class Handler
5
- attr_accessor :element_handlers
5
+ attr_accessor :element_handlers, :locals
6
6
 
7
7
  def initialize( element_handlers = nil )
8
8
  @element_handlers = {}.with_indifferent_access
@@ -10,6 +10,7 @@ module Bbcode
10
10
  self.clear
11
11
  register_element_handlers element_handlers unless element_handlers.blank?
12
12
  @interruption_stack = []
13
+ self.locals = {}
13
14
  end
14
15
 
15
16
  def register_element_handlers( element_handlers )
@@ -63,6 +64,15 @@ module Bbcode
63
64
  @element_handlers[name] || ->(element){ element.is_a?(String) ? element : element.source_wraps_content }
64
65
  end
65
66
 
67
+ def locals=(locals)
68
+ @locals = locals.with_indifferent_access
69
+ end
70
+
71
+ def apply_element_handler_for_element(element)
72
+ callable = get_element_handler(element.is_a?(String) ? :"#text" : element.tagname)
73
+ callable.arity == 2 ? callable.call(element, locals) : callable.call(element)
74
+ end
75
+
66
76
  protected
67
77
  def current_handler_element
68
78
  @handler_element_stack.last
@@ -11,9 +11,7 @@ module Bbcode
11
11
  end
12
12
 
13
13
  def to_s
14
- self.map{ |element|
15
- @handler.get_element_handler(element.is_a?(String) ? :"#text" : element.tagname).call(element)
16
- }.join
14
+ self.map{ |element| @handler.apply_element_handler_for_element element }.join
17
15
  end
18
16
 
19
17
  def with_handler( handler )
@@ -1,3 +1,3 @@
1
1
  module Bbcode
2
- VERSION = "0.4.3"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -10,6 +10,7 @@ handler = Bbcode::Handler.new({
10
10
  :img => ->(element){ %(<img src="#{element.content.source}">) },
11
11
  :quote => ->(element){ %(<blockquote>#{element.content.with_handler(quote_handler)}</blockquote>) },
12
12
  :color => ->(element){ %(<span style="color: #{CGI.escapeHTML(element[0])};">#{element.content}</span>) },
13
+ :admin => ->(element, locals){ locals[:is_admin] ? element.content : "" },
13
14
  :"#text" => ->(text){ CGI.escapeHTML(text) }
14
15
  })
15
16
 
@@ -37,4 +38,9 @@ describe Bbcode::Helpers do
37
38
  it "should be able to process non-ascii characters" do
38
39
  # load UTF-8 content from a file and parse it
39
40
  end
41
+
42
+ it "should be able to pass locals" do
43
+ "[admin]Only admins can see this![/]".as_bbcode.to(:html, :is_admin => true).should eql("Only admins can see this!")
44
+ "[admin]Only admins can see this![/]".as_bbcode.to(:html, :is_admin => false).should eql("")
45
+ end
40
46
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: th-bbcode
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-02-26 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70342804090620 !ruby/object:Gem::Requirement
16
+ requirement: &70094233269240 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70342804090620
24
+ version_requirements: *70094233269240
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &70342804090200 !ruby/object:Gem::Requirement
27
+ requirement: &70094233268820 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70342804090200
35
+ version_requirements: *70094233268820
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: actionpack
38
- requirement: &70342804089780 !ruby/object:Gem::Requirement
38
+ requirement: &70094233268400 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70342804089780
46
+ version_requirements: *70094233268400
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: i18n
49
- requirement: &70342804089360 !ruby/object:Gem::Requirement
49
+ requirement: &70094233267980 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70342804089360
57
+ version_requirements: *70094233267980
58
58
  description: Gem for parsing bbcode-formatted strings to HTML or any other formatting
59
59
  you like (or don't like).
60
60
  email: