th-bbcode 0.4.3 → 0.5.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/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: