class Deas::Erubis::Source

Constants

BUFVAR_NAME
DEFAULT_ERUBY

Attributes

cache[R]
context_class[R]
eruby_class[R]
ext[R]
root[R]

Public Class Methods

new(root, opts) click to toggle source
# File lib/deas-erubis/source.rb, line 15
def initialize(root, opts)
  @root          = Pathname.new(root.to_s)
  @ext           = opts[:ext] ? ".#{opts[:ext]}" : nil
  @eruby_class   = opts[:eruby] || DEFAULT_ERUBY
  @cache         = opts[:cache] ? Hash.new : NullCache.new
  @context_class = build_context_class(opts)

  @default_source = opts[:default_source]
end

Public Instance Methods

compile(template_name, content) click to toggle source
# File lib/deas-erubis/source.rb, line 29
def compile(template_name, content)
  template(template_name, content).evaluate(@context_class.new(@default_source, {}))
end
inspect() click to toggle source
# File lib/deas-erubis/source.rb, line 40
def inspect
  "#<#{self.class}:#{'0x0%x' % (object_id << 1)}"\
  " @root=#{@root.inspect}"\
  " @eruby=#{@eruby_class.inspect}>"
end
render(template_name, locals, &content) click to toggle source
# File lib/deas-erubis/source.rb, line 25
def render(template_name, locals, &content)
  load(template_name).evaluate(@context_class.new(@default_source, locals), &content)
end
template(filename, content) click to toggle source
# File lib/deas-erubis/source.rb, line 33
def template(filename, content)
  Template.new(@eruby_class.new(content, {
    :bufvar   => BUFVAR_NAME,
    :filename => filename
  }))
end

Private Instance Methods

build_context_class(opts) click to toggle source
# File lib/deas-erubis/source.rb, line 69
def build_context_class(opts)
  Class.new do
    include ::Deas::Erubis::TemplateHelpers
    [*(opts[:helpers] || [])].each{ |helper| include helper }
    (opts[:locals]  || {}).each{ |k, v| define_method(k){ v } }

    def initialize(default_source, locals)
      @default_source = default_source

      metaclass = class << self; self; end
      metaclass.class_eval do
        locals.each do |key, value|
          define_method(key){ value }
        end
      end
    end
  end
end
load(template_name) click to toggle source
# File lib/deas-erubis/source.rb, line 48
def load(template_name)
  @cache[template_name] ||= begin
    if (filename = source_file_path(template_name)).nil?
      template_desc = "a template file named #{template_name.inspect}"
      if !@ext.nil?
        template_desc += " that ends in #{@ext.inspect}"
      end
      raise ArgumentError, "#{template_desc} does not exist"
    end
    template(filename, File.read(filename.to_s))
  end
end
source_file_glob_string(name) click to toggle source
# File lib/deas-erubis/source.rb, line 65
def source_file_glob_string(name)
  !@ext.nil? && name.end_with?(@ext) ? name : "#{name}*#{@ext}"
end
source_file_path(name) click to toggle source
# File lib/deas-erubis/source.rb, line 61
def source_file_path(name)
  Dir.glob(self.root.join(source_file_glob_string(name))).first
end