ruby-bbcode-to-md 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.md +41 -0
- data/Rakefile +44 -0
- data/lib/ruby-bbcode.rb +100 -0
- data/lib/ruby-bbcode/bbtree.rb +94 -0
- data/lib/ruby-bbcode/debugging.rb +93 -0
- data/lib/ruby-bbcode/tag_collection.rb +116 -0
- data/lib/ruby-bbcode/tag_info.rb +132 -0
- data/lib/ruby-bbcode/tag_node.rb +67 -0
- data/lib/ruby-bbcode/tag_sifter.rb +303 -0
- data/lib/ruby-bbcode/version.rb +3 -0
- data/lib/tags/tags.rb +113 -0
- data/test/current_test.rb +8 -0
- data/test/ruby_bbcode_test.rb +208 -0
- data/test/test_helper.rb +18 -0
- data/test/unit/debugging_test.rb +47 -0
- data/test/unit/tag_sifter_test.rb +51 -0
- metadata +117 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 [name of plugin creator]
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# Ruby-BBcode-to-MD
|
2
|
+
This gem converts BBcode to Markdown. BBcode is parsed before conversion, checking whether the BBcode is valid.
|
3
|
+
|
4
|
+
The parser recognizes most "official tags":http://www.bbcode.org/reference.php and allows to easily extend this set with custom tags by editing tags.rb.
|
5
|
+
|
6
|
+
## Example
|
7
|
+
```ruby
|
8
|
+
"This is [b]bold[/b] and this is [i]italic[/i].".bbcode_to_html
|
9
|
+
```
|
10
|
+
=>
|
11
|
+
```markdown
|
12
|
+
This is **bold** and this is *italic*.
|
13
|
+
```
|
14
|
+
|
15
|
+
## Installation
|
16
|
+
Add this to your Rails app's Gemfile
|
17
|
+
```
|
18
|
+
gem 'ruby-bbcode-to-md'
|
19
|
+
```
|
20
|
+
or use the repo link
|
21
|
+
```
|
22
|
+
gem 'ruby-bbcode-to-md', :git => git://github.com/rikkit/ruby-bbcode-to-md.git
|
23
|
+
```
|
24
|
+
Then run
|
25
|
+
```
|
26
|
+
bundle install
|
27
|
+
```
|
28
|
+
|
29
|
+
And the gem is available in you application
|
30
|
+
|
31
|
+
_Note: Do not forget to restart your server!_
|
32
|
+
|
33
|
+
## Acknowledgements
|
34
|
+
|
35
|
+
Code is based on BBcode to HTML gem by Maarten Bezemer: http://github.com/veger/ruby-bbcode.git
|
36
|
+
|
37
|
+
Some of the ideas and the tests came from "bb-ruby":http://github.com/cpjolicoeur/bb-ruby of Craig P Jolicoeur
|
38
|
+
|
39
|
+
## Licence
|
40
|
+
|
41
|
+
MIT Licence. See the included MIT-LICENCE file.
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
require 'rdoc/task'
|
13
|
+
RDoc::Task = Rake::RDocTask
|
14
|
+
end
|
15
|
+
|
16
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
17
|
+
rdoc.rdoc_dir = 'rdoc'
|
18
|
+
rdoc.title = 'RubyBbcode'
|
19
|
+
rdoc.options << '--line-numbers'
|
20
|
+
rdoc.rdoc_files.include('README.rdoc')
|
21
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
Bundler::GemHelper.install_tasks
|
27
|
+
|
28
|
+
require 'rake/testtask'
|
29
|
+
|
30
|
+
Rake::TestTask.new(:test) do |t|
|
31
|
+
t.libs << 'lib'
|
32
|
+
t.libs << 'test'
|
33
|
+
t.pattern = 'test/**/*_test.rb'
|
34
|
+
t.verbose = true
|
35
|
+
end
|
36
|
+
|
37
|
+
Rake::TestTask.new(:current) do |t|
|
38
|
+
t.libs << 'lib'
|
39
|
+
t.libs << 'test'
|
40
|
+
t.pattern = 'test/**/current_test.rb'
|
41
|
+
t.verbose = true
|
42
|
+
end
|
43
|
+
|
44
|
+
task :default => :test
|
data/lib/ruby-bbcode.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'active_support/core_ext/array/conversions'
|
2
|
+
|
3
|
+
require 'tags/tags'
|
4
|
+
require 'ruby-bbcode/debugging'
|
5
|
+
require 'ruby-bbcode/tag_info'
|
6
|
+
require 'ruby-bbcode/tag_sifter'
|
7
|
+
require 'ruby-bbcode/tag_node'
|
8
|
+
require 'ruby-bbcode/tag_collection'
|
9
|
+
require 'ruby-bbcode/bbtree'
|
10
|
+
|
11
|
+
|
12
|
+
module RubyBBCode
|
13
|
+
include ::RubyBBCode::Tags
|
14
|
+
|
15
|
+
# This method converts the given text (with BBCode tags) into a HTML representation
|
16
|
+
# The escape_html parameter (default: true) escapes HTML tags that were present in the given text and therefore blocking (mallicious) HTML in the original text
|
17
|
+
# The additional_tags parameter is used to add additional BBCode tags that should be accepted
|
18
|
+
# The method paramter determines whether the tags parameter needs to be used to blacklist (when set to :disable) or whitelist (when not set to :disable) the list of BBCode tags
|
19
|
+
def self.to_html(text, escape_html = true, additional_tags = {}, method = :disable, *tags)
|
20
|
+
text = text.clone
|
21
|
+
|
22
|
+
use_tags = determine_applicable_tags(additional_tags, method, *tags)
|
23
|
+
|
24
|
+
@tag_sifter = TagSifter.new(text, use_tags, escape_html)
|
25
|
+
|
26
|
+
@tag_sifter.process_text
|
27
|
+
|
28
|
+
if @tag_sifter.invalid?
|
29
|
+
raise @tag_sifter.errors.join(', ') # We cannot convert to HTML if the BBCode is not valid!
|
30
|
+
else
|
31
|
+
@tag_sifter.bbtree.to_html(use_tags)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns true when valid, else returns array with error(s)
|
37
|
+
def self.validity_check(text, additional_tags = {})
|
38
|
+
@tag_sifter = TagSifter.new(text, @@tags.merge(additional_tags))
|
39
|
+
|
40
|
+
@tag_sifter.process_text
|
41
|
+
return @tag_sifter.errors if @tag_sifter.invalid?
|
42
|
+
true
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
48
|
+
# This method provides the final set of bbcode tags, it merges the default tags with the given additional_tags
|
49
|
+
# and blacklists(method = :disable) or whitelists the list of tags with the given tags parameter.
|
50
|
+
def self.determine_applicable_tags(additional_tags, method, *tags)
|
51
|
+
use_tags = @@tags.merge(additional_tags)
|
52
|
+
if method == :disable then # if method is set to :disable
|
53
|
+
tags.each { |t| use_tags.delete(t) } # blacklist (remove) the supplied tags
|
54
|
+
else # method is not :disable, but has any other value
|
55
|
+
# Only use the supplied tags (whitelist)
|
56
|
+
new_use_tags = {}
|
57
|
+
tags.each { |t| new_use_tags[t] = use_tags[t] if use_tags.key?(t) }
|
58
|
+
use_tags = new_use_tags
|
59
|
+
end
|
60
|
+
use_tags
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.parse(text, tags)
|
64
|
+
@tag_sifter = TagSifter.new(text, tags)
|
65
|
+
|
66
|
+
@tag_sifter.process_text
|
67
|
+
|
68
|
+
if @tag_sifter.invalid?
|
69
|
+
@tag_sifter.errors
|
70
|
+
else
|
71
|
+
true
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
String.class_eval do
|
79
|
+
# Convert a string with BBCode markup into its corresponding HTML markup
|
80
|
+
def bbcode_to_md(escape_html = true, additional_tags = {}, method = :disable, *tags)
|
81
|
+
RubyBBCode.to_html(self, escape_html, additional_tags, method, *tags)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Replace the BBCode content of a string with its corresponding HTML markup
|
85
|
+
def bbcode_to_md!(escape_html = true, additional_tags = {}, method = :disable, *tags)
|
86
|
+
self.replace(RubyBBCode.to_html(self, escape_html, additional_tags, method, *tags))
|
87
|
+
end
|
88
|
+
|
89
|
+
# Deprecated! Please use check_bbcode_validity (will be removed in version 0.1.0)
|
90
|
+
# Check if string contains valid BBCode. Returns true when valid, else returns array with error(s)
|
91
|
+
def is_valid_bbcode?
|
92
|
+
# TODO: add a puts "Warning: This method has been deprecated, please use check_bbcode_validity which does the same thing but is more syntactical." or something
|
93
|
+
check_bbcode_validity
|
94
|
+
end
|
95
|
+
|
96
|
+
# Check if string contains valid BBCode. Returns true when valid, else returns array with error(s)
|
97
|
+
def check_bbcode_validity
|
98
|
+
RubyBBCode.validity_check(self)
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module RubyBBCode
|
2
|
+
# As you parse a string of text, say:
|
3
|
+
# "[b]I'm bold and the next word is [i]ITALLICS[/i][b]"
|
4
|
+
# ...you build up a tree of nodes (@bbtree). The above string converts to 4 nodes when the parse has completed.
|
5
|
+
# Node 1) An opening tag node representing "[b]"
|
6
|
+
# Node 2) A text node representing "I'm bold and the next word is "
|
7
|
+
# Node 3) An opening tag node representing "[i]"
|
8
|
+
# Node 4) A text node representing "ITALLICS"
|
9
|
+
#
|
10
|
+
# The closing of the nodes seems to be implied which is fine by me --less to keep track of.
|
11
|
+
#
|
12
|
+
class BBTree
|
13
|
+
include ::RubyBBCode::DebugBBTree
|
14
|
+
attr_accessor :current_node, :tags_list
|
15
|
+
|
16
|
+
def initialize(hash = { :nodes => TagCollection.new }, dictionary)
|
17
|
+
@bbtree = hash
|
18
|
+
@current_node = TagNode.new(@bbtree)
|
19
|
+
@tags_list = []
|
20
|
+
@dictionary = dictionary
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](key)
|
24
|
+
@bbtree[key]
|
25
|
+
end
|
26
|
+
|
27
|
+
def []=(key, value)
|
28
|
+
@bbtree[key] = value
|
29
|
+
end
|
30
|
+
|
31
|
+
def nodes
|
32
|
+
@bbtree[:nodes]
|
33
|
+
end
|
34
|
+
alias :children :nodes # needed due to the similarities between BBTree[:nodes] and TagNode[:nodes]... they're walked through in debugging.rb right now
|
35
|
+
|
36
|
+
def type
|
37
|
+
:bbtree
|
38
|
+
end
|
39
|
+
|
40
|
+
def within_open_tag?
|
41
|
+
@tags_list.length > 0
|
42
|
+
end
|
43
|
+
alias :expecting_a_closing_tag? :within_open_tag? # just giving this method multiple names for semantical purposes
|
44
|
+
|
45
|
+
def parent_tag
|
46
|
+
return nil if !within_open_tag?
|
47
|
+
@tags_list.last.to_sym
|
48
|
+
end
|
49
|
+
|
50
|
+
def parent_has_constraints_on_children?
|
51
|
+
@dictionary[parent_tag][:only_allow] != nil
|
52
|
+
end
|
53
|
+
|
54
|
+
# Advance to next level (the node we just added)
|
55
|
+
def escalate_bbtree(element)
|
56
|
+
element[:parent_tag] = parent_tag
|
57
|
+
@tags_list.push element[:tag]
|
58
|
+
@current_node = TagNode.new(element)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Step down the bbtree a notch because we've reached a closing tag
|
62
|
+
def retrogress_bbtree
|
63
|
+
@tags_list.pop # remove latest tag in tags_list since it's closed now...
|
64
|
+
# The parsed data manifests in @bbtree.current_node.children << TagNode.new(element) which I think is more confusing than needed
|
65
|
+
|
66
|
+
if within_open_tag?
|
67
|
+
# Set the current node to be the node we've just parsed over which is infact within another node??...
|
68
|
+
@current_node = TagNode.new(self.nodes.last)
|
69
|
+
else # If we're still at the root of the BBTree or have returned back to the root via encountring closing tags...
|
70
|
+
@current_node = TagNode.new({:nodes => self.nodes})
|
71
|
+
end
|
72
|
+
|
73
|
+
# OKOKOK!
|
74
|
+
# Since @bbtree = @current_node, if we ever set @current_node to something, we're actually changing @bbtree...
|
75
|
+
# therefore... my brain is now numb
|
76
|
+
end
|
77
|
+
|
78
|
+
def redefine_parent_tag_as_text
|
79
|
+
@tags_list.pop
|
80
|
+
@current_node[:is_tag] = false
|
81
|
+
@current_node[:closing_tag] = false
|
82
|
+
@current_node.element[:text] = "[#{@current_node[:tag].to_s}]"
|
83
|
+
end
|
84
|
+
|
85
|
+
def build_up_new_tag(element)
|
86
|
+
@current_node.children << TagNode.new(element)
|
87
|
+
end
|
88
|
+
|
89
|
+
def to_html(tags = {})
|
90
|
+
self.nodes.to_html(tags)
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module RubyBBCode
|
2
|
+
def self.log(string, clear_file = true)
|
3
|
+
clear_log_file_at_beginning_of_execution clear_file
|
4
|
+
|
5
|
+
File.open('/tmp/ruby-bbcode.log', 'a') do |f|
|
6
|
+
f.puts string
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.clear_log_file_at_beginning_of_execution(clear_file)
|
11
|
+
return if !clear_file
|
12
|
+
if defined?(@@cleared_file).nil?
|
13
|
+
@@cleared_file = true
|
14
|
+
File.open('/tmp/ruby-bbcode.log', 'w+') do |f|
|
15
|
+
puts ''
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
# This module can be included in the BBTree and TagNode to give them debugging features
|
22
|
+
module DebugBBTree
|
23
|
+
# For Debugging/ visualization purposes.
|
24
|
+
# This can be used to render the #nodes array in a pretty manor, showing the hirarchy.
|
25
|
+
def to_v
|
26
|
+
tree = self
|
27
|
+
visual_string = ''
|
28
|
+
|
29
|
+
walk_tree(tree) do |node, depth|
|
30
|
+
indentation = ' ' * depth
|
31
|
+
case node[:is_tag]
|
32
|
+
when true
|
33
|
+
visual_string += "#{indentation}" + node[:tag].to_s + "\n"
|
34
|
+
when false
|
35
|
+
visual_string += "#{indentation}\"#{node[:text]}\"\n"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
visual_string
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
# this blocky method counts how many children are
|
44
|
+
# in the TagNode.children, recursively walking the tree
|
45
|
+
def count_child_nodes(hash = self)
|
46
|
+
count = 0
|
47
|
+
walk_tree(hash) do
|
48
|
+
count += 1
|
49
|
+
end
|
50
|
+
count
|
51
|
+
end
|
52
|
+
|
53
|
+
# For BBTree, teh to_s method shows the count of the children plus a graphical
|
54
|
+
# depiction of the tree, and the relation of the nodes.
|
55
|
+
# For TagNodes, the root-most tag is displayed, and the children are counted.
|
56
|
+
def to_s
|
57
|
+
object_identifier = "#<#{self.class.to_s}:0x#{'%x' % (self.object_id << 1)}\n"
|
58
|
+
close_object = ">\n"
|
59
|
+
|
60
|
+
case self
|
61
|
+
when RubyBBCode::BBTree
|
62
|
+
object_identifier + "Children: #{count_child_nodes}\n" + self.to_v + close_object
|
63
|
+
when RubyBBCode::TagNode # when inspecting TagNodes, it's better not to show the tree display
|
64
|
+
if self[:is_tag]
|
65
|
+
object_identifier + "Tag: #{self[:tag].to_s}, Children: #{count_child_nodes}\n" + close_object
|
66
|
+
else
|
67
|
+
object_identifier + '"' + self[:text].to_s + "\"\n" + close_object
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
# This function is used by to_v and anything else that needs to iterate through the
|
75
|
+
# @bbtree
|
76
|
+
def walk_tree(tree, depth = -1, &blk)
|
77
|
+
return enum_for(:walk_tree) unless blk # ignore me for now, I'm a convention for being versatile
|
78
|
+
|
79
|
+
# Perform the block action specified at top level!!!
|
80
|
+
yield tree, depth unless depth == -1
|
81
|
+
|
82
|
+
# next if we're a text node
|
83
|
+
return if tree.type == :text
|
84
|
+
|
85
|
+
# Enter into recursion (including block action) for each child node in this node
|
86
|
+
tree.children.each do |node|
|
87
|
+
walk_tree(node, depth + 1, &blk)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module RubyBBCode
|
2
|
+
# This class holds TagNodes and helps build them into html when the time comes. It's really just a simple array, with the addition of the #to_html method
|
3
|
+
class TagCollection < Array
|
4
|
+
|
5
|
+
def to_html(tags)
|
6
|
+
html_string = ""
|
7
|
+
self.each do |node|
|
8
|
+
if node.type == :tag
|
9
|
+
t = HtmlTemplate.new node
|
10
|
+
|
11
|
+
t.inlay_between_text!
|
12
|
+
|
13
|
+
if node.allow_tag_param? and node.param_set?
|
14
|
+
t.inlay_inline_params!
|
15
|
+
elsif node.allow_tag_param? and node.param_not_set?
|
16
|
+
t.remove_unused_tokens!
|
17
|
+
end
|
18
|
+
|
19
|
+
html_string += t.opening_html
|
20
|
+
|
21
|
+
# invoke "recursive" call if this node contains child nodes
|
22
|
+
html_string += node.children.to_html(tags) if node.has_children?
|
23
|
+
|
24
|
+
t.inlay_closing_html!
|
25
|
+
|
26
|
+
html_string += t.closing_html
|
27
|
+
elsif node.type == :text
|
28
|
+
html_string += node[:text] unless node[:text].nil?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
html_string
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
# This class is designed to help us build up the HTML data. It starts out as a template such as...
|
38
|
+
# @opening_html = '<a href="%url%">%between%'
|
39
|
+
# @closing_html = '</a>'
|
40
|
+
# and then slowly turns into...
|
41
|
+
# @opening_html = '<a href="http://www.blah.com">cool beans'
|
42
|
+
# @closing_html = '</a>'
|
43
|
+
# TODO: Think about creating a separate file for this or something... maybe look into folder structures cause this project
|
44
|
+
# got huge when I showed up.
|
45
|
+
class HtmlTemplate
|
46
|
+
attr_accessor :opening_html, :closing_html
|
47
|
+
|
48
|
+
def initialize(node)
|
49
|
+
@node = node
|
50
|
+
@tag_definition = node.definition # tag_definition
|
51
|
+
|
52
|
+
@opening_html = ""
|
53
|
+
@closing_html = ""
|
54
|
+
|
55
|
+
# if this is a nested tag, then don't prefix first_html_open
|
56
|
+
if !node.definition[:first_html_open].nil? && node.type != node.parent_type then
|
57
|
+
@opening_html << node.definition[:first_html_open]
|
58
|
+
end
|
59
|
+
|
60
|
+
if node.definition[:html_open].is_a?(Hash) then
|
61
|
+
@opening_html << node.definition[:html_open][node.parent_type].dup
|
62
|
+
else
|
63
|
+
@opening_html << node.definition[:html_open].dup
|
64
|
+
end
|
65
|
+
|
66
|
+
if node.definition[:html_close].is_a?(Hash) then
|
67
|
+
@closing_html << node.definition[:html_close][node.parent_type].dup
|
68
|
+
else
|
69
|
+
@closing_html << node.definition[:html_close].dup
|
70
|
+
end
|
71
|
+
|
72
|
+
if !node.definition[:last_html_close].nil? && node.type != node.parent_type then
|
73
|
+
@closing_html << node.definition[:last_html_close]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def inlay_between_text!
|
78
|
+
@opening_html.gsub!('%between%',@node[:between]) if between_text_goes_into_html_output_as_param? # set the between text to where it goes if required to do so...
|
79
|
+
end
|
80
|
+
|
81
|
+
def inlay_inline_params!
|
82
|
+
# Get list of paramaters to feed
|
83
|
+
match_array = @node[:params][:tag_param].scan(@tag_definition[:tag_param])[0]
|
84
|
+
|
85
|
+
# for each parameter to feed
|
86
|
+
match_array.each.with_index do |match, i|
|
87
|
+
if i < @tag_definition[:tag_param_tokens].length
|
88
|
+
|
89
|
+
# Substitute the %param% keyword for the appropriate data specified
|
90
|
+
@opening_html.gsub!("%#{@tag_definition[:tag_param_tokens][i][:token].to_s}%",
|
91
|
+
@tag_definition[:tag_param_tokens][i][:prefix].to_s +
|
92
|
+
match +
|
93
|
+
@tag_definition[:tag_param_tokens][i][:postfix].to_s)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def inlay_closing_html!
|
99
|
+
@closing_html.gsub!('%between%',@node[:between]) if @tag_definition[:require_between]
|
100
|
+
end
|
101
|
+
|
102
|
+
def remove_unused_tokens!
|
103
|
+
@tag_definition[:tag_param_tokens].each do |token|
|
104
|
+
@opening_html.gsub!("%#{token[:token]}%", '')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def between_text_goes_into_html_output_as_param?
|
111
|
+
@tag_definition[:require_between]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|