-
Notifications
You must be signed in to change notification settings - Fork 35
/
tilt.rb
64 lines (49 loc) · 1.67 KB
/
tilt.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
require 'tilt'
module HoganAssets
class Tilt < Tilt::Template
self.default_mime_type = 'application/javascript'
def initialize_engine
require_template_library 'haml'
rescue LoadError
# haml not available
end
def evaluate(scope, locals, &block)
template_path = TemplatePath.new scope
template_namespace = HoganAssets::Config.template_namespace
text = if template_path.is_hamstache?
raise "Unable to complile #{template_path.full_path} because haml is not available. Did you add the haml gem?" unless HoganAssets::Config.haml_available?
Haml::Engine.new(data, @options).render
else
data
end
compiled_template = Hogan.compile(text)
template_name = scope.logical_path.inspect
# Only emit the source template if we are using lambdas
text = '' unless HoganAssets::Config.lambda_support?
<<-TEMPLATE
this.#{template_namespace} || (this.#{template_namespace} = {});
this.#{template_namespace}[#{template_path.name}] = new Hogan.Template(#{compiled_template}, #{text.inspect}, Hogan, {});
TEMPLATE
end
protected
def prepare; end
class TemplatePath
attr_accessor :full_path
def initialize(scope)
self.template_path = scope.logical_path
self.full_path = scope.pathname
end
def is_hamstache?
full_path.to_s.end_with? '.hamstache'
end
def name
@name ||= relative_path.dump
end
private
attr_accessor :template_path
def relative_path
@relative_path ||= template_path.gsub(/^#{HoganAssets::Config.path_prefix}\/(.*)$/i, "\\1")
end
end
end
end