class Malt::Engine::Builder

Builder

http://builder.rubyforge.org/

Public Instance Methods

create_engine(params={}) click to toggle source
# File lib/malt/engines/builder.rb, line 41
def create_engine(params={})
  opts = engine_options(params)

  #cached(opts) do
    ::Builder::XmlMarkup.new(opts)
  #end
end
prepare_engine(params={}, &content) click to toggle source

Prepare engine for rendering.

# File lib/malt/engines/builder.rb, line 28
def prepare_engine(params={}, &content)
  prefix = parameters(params, :prefix)

  if prefix
    prepare_engine_prefix(params, &content)
  else
    prepare_engine_scope(params, &content)
  end
end
prepare_engine_prefix(params, &content) click to toggle source
# File lib/malt/engines/builder.rb, line 50
def prepare_engine_prefix(params, &content)
  prefix, text, file, scope, locals = parameters(params, :prefix, :text, :file, :scope, :locals)

  bind = make_binding(scope, locals, &content)

  #scope, locals = split_data(data)

  #scope  ||= Object.new
  #locals ||= {}

  engine = create_engine(params)

  code = %{
    lambda do |#{prefix}|
      #{text}
    end
  }

  eval(code, bind, file || '(builder)').call(engine)
end
prepare_engine_scope(params, &content) click to toggle source
# File lib/malt/engines/builder.rb, line 75
def prepare_engine_scope(params, &content)
  text, file, scope, locals = parameters(params, :text, :file, :scope, :locals)

  scope, locals = make_external(scope, locals, &content)

  engine = create_engine

  locals.each do |k,v|
    next if k.to_sym == :target
    engine.instance_eval("@#{k} = v")
  end

  unless scope.respond_to?(:to_struct)
    scope.instance_variables.each do |k|
      next if k == "@target"
      v = scope.instance_variable_get(k)
      engine.instance_eval("#{k} = v") 
    end
  end

  engine.instance_eval(text, file || '(builder)')

  engine.target!
end
render(params={}, &content) click to toggle source
Calls superclass method Malt::Engine::Abstract#render
# File lib/malt/engines/builder.rb, line 14
def render(params={}, &content)
  into = parameters(params, :to) || :html

  case into
  when :xml, :html, :xhtml
    prepare_engine(params, &content) #.target!
  else
    super(params, &content)
  end
end

Private Instance Methods

engine_option_names() click to toggle source

:target=>target_object: Object receiving the markup. target_object must respond to the <<(a_string) operator and return itself. The default target is a plain string target.

:indent=>indentation: Number of spaces used for indentation. The default is no indentation and no line breaks.

:margin=>initial_indentation_level: Amount of initial indentation (specified in levels, not spaces).

# File lib/malt/engines/builder.rb, line 126
def engine_option_names
  [:target, :indent, :margin]
end
require_engine() click to toggle source

Load Builder library if not already loaded.

# File lib/malt/engines/builder.rb, line 103
def require_engine
  return if defined? ::Builder
  require_library 'builder'

  # Inexplicably Ruby 1.8 acts like the p method is present
  # if undef_method is not used, but acts like it isn't if
  # undef_method is used (raising an error).
  ::Builder::XmlBase.class_eval do
    undef_method :p rescue nil
  end
end