class Rtpl
Constants
- VERSION
Attributes
ast[R]
parsed_blocks[R]
vars[R]
Public Class Methods
new(template)
click to toggle source
# File lib/rtpl.rb, line 11 def initialize(template) @ast = Rtpl::Parser.new.parse(template) @vars = {} @parsed_blocks = {} @parsed_blocks.default = "" @transform = Rtpl::Transform.new @sub_blocks = false end
Public Instance Methods
assign(key, value)
click to toggle source
# File lib/rtpl.rb, line 20 def assign(key, value) @vars[key] = value end
out(key = "main")
click to toggle source
# File lib/rtpl.rb, line 37 def out(key = "main") @parsed_blocks[key].to_s end
parse(block_name)
click to toggle source
# File lib/rtpl.rb, line 24 def parse(block_name) if block_name =~ /\./ @sub_blocks = true @parsed_blocks[block_name] += nested_output(@transform.apply(sub_block(block_name), :vars => @vars), block_name) else @parsed_blocks[block_name] += block_output(@transform.apply(@ast, :vars => @vars). detect{|b| b[:open][:name] == block_name }) end end
Private Instance Methods
block_output(block)
click to toggle source
# File lib/rtpl.rb, line 43 def block_output(block) raise ArgumentError if (block.nil? || block.empty?) return block[:content].join unless @sub_blocks before = block[:content].detect {|h| h.has_key?(:before) } after = block[:content].detect {|h| h.has_key?(:after) } inner_block = block[:content].detect {|h| h.has_key?(:open) } before = before ? before[:before].join : "" after = after ? after[:after].join : "" key = block[:open][:name].to_s + "." + inner_block[:open][:name] inner_block = @parsed_blocks[key] #clear the inner block when parsing a parent block @parsed_blocks[key] = "" before.to_s + inner_block + after.to_s end
nested_output(block, block_name)
click to toggle source
# File lib/rtpl.rb, line 60 def nested_output(block, block_name) nested_block = block[:content]. detect {|b| !b.instance_of?(String) && b.has_key?(:open)} if nested_block.nil? output = block[:content].join if block[:content] else before = block[:content].detect {|h| h.has_key?(:before) } after = block[:content].detect {|h| h.has_key?(:after) } before = before ? before[:before].join : "" after = after ? after[:after].join : "" output = before + @parsed_blocks["#{block_name}.#{nested_block[:open][:name]}"] + after # clear the key when parsing a parent block @parsed_blocks["#{block_name}.#{nested_block[:open][:name]}"] = "" end output end
sub_block(block_name)
click to toggle source
# File lib/rtpl.rb, line 83 def sub_block(block_name) name_parts = block_name.split(".") block = nil tree = @transform.apply(@ast, :vars => @vars) name_parts.each do |n| if block before = block.detect {|b| b.has_key?(:before) } after = block.detect {|b| b.has_key?(:after) } old_block = block block = if n == name_parts.last block.detect {|b| b.has_key?(:open) && b[:open][:name] == n } else block. detect {|b| b.has_key?(:open) && b[:open][:name] == n }[:content] end raise ArgumentError, "Could not find #{block_name}" if block.nil? unless block.instance_of?(Array) block.merge!(before) if before block.merge!(after) if after end else block = tree.detect {|b| (b[:open] != "" && b[:open][:name]) == n }[:content] end end block end