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 +16 -7
- data/lib/bbcode/base.rb +7 -4
- data/lib/bbcode/element.rb +1 -1
- data/lib/bbcode/handler.rb +11 -1
- data/lib/bbcode/node_list.rb +1 -3
- data/lib/bbcode/version.rb +1 -1
- data/spec/lib/bbcode/helpers_spec.rb +6 -0
- metadata +9 -9
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
|
29
|
+
require 'rubygems'
|
30
|
+
require 'bundler/setup'
|
31
|
+
require 'bbcode'
|
30
32
|
|
31
33
|
Bbcode::Base.register_handler :html, Bbcode::HtmlHandler.new(
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
---------------------
|
data/lib/bbcode/base.rb
CHANGED
@@ -1,21 +1,24 @@
|
|
1
1
|
module Bbcode
|
2
2
|
class Base
|
3
|
-
@@handlers =
|
3
|
+
@@handlers = HashWithIndifferentAccess.new
|
4
4
|
|
5
|
-
|
5
|
+
attr_reader :locals
|
6
|
+
|
7
|
+
def initialize(string, locals = {})
|
6
8
|
@string = string
|
7
9
|
end
|
8
10
|
|
9
|
-
def to(
|
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(
|
21
|
+
def self.register_handler(name, handler)
|
19
22
|
@@handlers[name] = handler
|
20
23
|
end
|
21
24
|
end
|
data/lib/bbcode/element.rb
CHANGED
data/lib/bbcode/handler.rb
CHANGED
@@ -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
|
data/lib/bbcode/node_list.rb
CHANGED
@@ -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 )
|
data/lib/bbcode/version.rb
CHANGED
@@ -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
|
+
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: &
|
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: *
|
24
|
+
version_requirements: *70094233269240
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activesupport
|
27
|
-
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: *
|
35
|
+
version_requirements: *70094233268820
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: actionpack
|
38
|
-
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: *
|
46
|
+
version_requirements: *70094233268400
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: i18n
|
49
|
-
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: *
|
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:
|