lib/ember/appkit/rails/template.rb
require 'sprockets'
require 'sprockets/engines'
require 'barber'
class Ember::Appkit::Rails::Template < Tilt::Template
def self.default_mime_type
'application/javascript'
end
def prepare; end
def evaluate(scope, locals, &block)
raw = handlebars?(scope)
if raw
template = data
else
template = mustache_to_handlebars(scope, data)
end
if configuration.precompile
if raw
template = precompile_handlebars(template)
else
template = precompile_ember_handlebars(template)
end
else
if raw
template = compile_handlebars(data)
else
template = compile_ember_handlebars(template)
end
end
if configuration.output_type == :amd
target = amd_template_target(scope)
"define('#{target}', ['exports'], function(__exports__){ __exports__.default = #{template} });"
else
target = global_template_target(scope)
"#{target} = #{template}\n"
end
end
private
def handlebars?(scope)
scope.pathname.to_s =~ /\.raw\.(handlebars|hjs|hbs)/
end
def amd_template_target(scope)
"#{configuration.amd_namespace}/#{scope.logical_path.split(".").first}"
end
def global_template_target(scope)
"Ember.TEMPLATES[#{template_path(scope.logical_path).inspect}]"
end
def compile_handlebars(string)
"Handlebars.compile(#{indent(string).inspect});"
end
def precompile_handlebars(string)
Barber::FilePrecompiler.call(string)
end
def compile_ember_handlebars(string)
"Ember.Handlebars.compile(#{indent(string).inspect});"
end
def precompile_ember_handlebars(string)
Barber::Ember::FilePrecompiler.call(string)
end
def mustache_to_handlebars(scope, template)
if scope.pathname.to_s =~ /\.mustache\.(handlebars|hjs|hbs)/
template.gsub(/\{\{(\w[^\}\}]+)\}\}/){ |x| "{{unbound #{$1}}}" }
else
template
end
end
def template_path(path)
root = configuration.templates_root
if root.kind_of? Array
root.each do |root|
path.sub!(/#{Regexp.quote(root)}\//, '')
end
else
unless root.empty?
path.sub!(/#{Regexp.quote(root)}\/?/, '')
end
end
path = path.split('/')
path.join(configuration.templates_path_separator)
end
def configuration
::Rails.configuration.handlebars
end
def indent(string)
string.gsub(/$(.)/m, "\\1 ").strip
end
end