Module: Wunderbar::Template

Defined in:
lib/wunderbar/sinatra.rb,
lib/wunderbar/script.rb

Overview

Tilt template implementation

Defined Under Namespace

Modules: Js, Json, Text Classes: Base, Html, Xhtml

Constant Summary collapse

PASSABLE =
[Numeric, String, Hash, Array]

Class Method Summary collapse

Class Method Details

.locals(scope, args) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/wunderbar/sinatra.rb', line 163

def self.locals(scope, args)
  args.push({}) if args.length == 1

  return unless Hash === args.last and not args.last[:locals]

  locals = {}

  scope.instance_variables.each do |ivar|
    next if [:@env, :@params].include? ivar
    value = scope.instance_variable_get(ivar)
    next unless PASSABLE.find {|klass| klass === value}
    locals[ivar] = value
  end

  args.last[:locals] = locals
end

.register(language, base = Base) ⇒ Object



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# File 'lib/wunderbar/sinatra.rb', line 180

def self.register(language, base=Base)
  template = Class.new(Template::Base) do 
    self.default_mime_type = language.mime
    include language
  end

  SinatraHelpers.send :define_method, language.ext do |*args, &block|
    # parse json
    if env['CONTENT_TYPE'] =~ /^\w+\/json/
      json = JSON.parse(env['rack.input'].read)
      @params.merge! json if Hash === json
    end

    Wunderbar::Template.locals(self, args)
    if Hash === args.last and args.last[:locals]
      @params.each do |name, value| 
        args.last[:locals]["@#{name}".to_sym] = value
      end
    end

    template.evaluate(language.ext, self, *args, &block)
  end

  Tilt.register language.ext.to_s, template
end