handlebars_assets 0.16 → 0.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -1
- data/README.md +7 -0
- data/lib/handlebars_assets.rb +33 -13
- data/lib/handlebars_assets/config.rb +66 -14
- data/lib/handlebars_assets/engine.rb +3 -6
- data/lib/handlebars_assets/handlebars_template.rb +205 -0
- data/lib/handlebars_assets/version.rb +1 -1
- data/test/handlebars_assets/hamlbars_test.rb +2 -2
- data/test/handlebars_assets/slimbars_test.rb +1 -1
- data/test/handlebars_assets/tilt_handlebars_test.rb +33 -19
- data/test/test_helper.rb +1 -1
- metadata +3 -3
- data/lib/handlebars_assets/tilt_handlebars.rb +0 -129
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8b59f300773aa0df84cd8569d3e7ae44bac3a0d
|
4
|
+
data.tar.gz: 85435577ad0029b162fd3bb7139131da0a930191
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95922af6d18e0966e7e17fc4c99bf70e2969a8c6d44f3a367455f842c3e704c9d09662fe1ca4ee809f900eb11d7386946a48b2b3a156cf18f4ce82141877e28e
|
7
|
+
data.tar.gz: e997c63c1bdca6278f653e1dbefd21bd759de896d07b1ecd7fd110cbacefc422d850f737da5b8fad6072576c1d6623dfc2b74a81c6b11ae0d2fbabc8e7702c3f
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,14 @@
|
|
1
|
+
## 0.17 (2014-06-22)
|
2
|
+
|
3
|
+
* Massive revamp - @AlexRiedler
|
4
|
+
* Changed how sprockets is registered - @AlexRiedler
|
5
|
+
* AMD loading - @AlexRiedler, based on @pboling changes (THANKS!)
|
6
|
+
* Fix extension being too liberal issues - @langalex
|
7
|
+
|
1
8
|
## 0.16 (2014-05-27)
|
2
9
|
|
3
10
|
* README clarification - @jithugopal
|
4
|
-
* Upgrade `handlebars` to 1.
|
11
|
+
* Upgrade `handlebars` to 1.3 - @neodude
|
5
12
|
|
6
13
|
## 0.15 (2013-12-06)
|
7
14
|
|
data/README.md
CHANGED
@@ -6,6 +6,12 @@ Yea, I think so too. That is why I wrote **handlebars_assets**. Give your Handle
|
|
6
6
|
|
7
7
|
Using `sprockets` with Sinatra or another framework? **handlebars_assets** works outside of Rails too (as of v0.2.0)
|
8
8
|
|
9
|
+
# BREAKING CHANGES AS OF OF v0.17
|
10
|
+
|
11
|
+
@AlexRiedler has made some larger changes to this repository for going forward; If you have existing monkey patches they may not work, and the configuration schema has changed slightly to handle multiple extensions for the same compilation pipeline.
|
12
|
+
|
13
|
+
If you have any problems, please post an issue! I will attempt to fix ASAP
|
14
|
+
|
9
15
|
# BREAKING CHANGE AS OF v0.9.0
|
10
16
|
|
11
17
|
My pull request to allow `/` in partials was pulled into Handlebars. The hack that converted partial names to underscored paths (`shared/_time` -> `_shared_time`) is no longer necessary and has been removed. You should change all the partial references in your app when upgrading from a version prior to v0.9.0.
|
@@ -286,6 +292,7 @@ Les Hill, follow me on [Github](https://github.com/leshill) and [Twitter](https:
|
|
286
292
|
* Parker Selbert (@sorentwo) : README section for `multiple_frameworks`
|
287
293
|
* Francisco QV (@panchoqv) : README clarification
|
288
294
|
* Dylan Markow (@dmarkow) : README cleanup
|
295
|
+
* Peter Boling (@pboling) : AMD Loading
|
289
296
|
|
290
297
|
# Contributing
|
291
298
|
|
data/lib/handlebars_assets.rb
CHANGED
@@ -1,23 +1,43 @@
|
|
1
|
-
require
|
1
|
+
require 'handlebars_assets/version'
|
2
2
|
|
3
3
|
module HandlebarsAssets
|
4
|
-
|
4
|
+
autoload(:Config, 'handlebars_assets/config')
|
5
|
+
autoload(:Handlebars, 'handlebars_assets/handlebars')
|
6
|
+
autoload(:HandlebarsTemplate, 'handlebars_assets/handlebars_template')
|
7
|
+
|
8
|
+
PATH = File.expand_path('../../vendor/assets/javascripts', __FILE__)
|
5
9
|
|
6
10
|
def self.path
|
7
11
|
PATH
|
8
12
|
end
|
9
13
|
|
10
|
-
|
11
|
-
|
12
|
-
|
14
|
+
def self.configure
|
15
|
+
yield Config
|
16
|
+
end
|
13
17
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
def self.register_extensions(sprockets_environment)
|
19
|
+
Config.handlebars_extensions.each do |ext|
|
20
|
+
sprockets_environment.register_engine(ext, HandlebarsTemplate)
|
21
|
+
end
|
22
|
+
if Config.haml_enabled? && Config.haml_available?
|
23
|
+
Config.hamlbars_extensions.each do |ext|
|
24
|
+
sprockets_environment.register_engine(ext, HandlebarsTemplate)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
if Config.slim_enabled? && Config.slim_available?
|
28
|
+
Config.slimbars_extensions.each do |ext|
|
29
|
+
sprockets_environment.register_engine(ext, HandlebarsTemplate)
|
30
|
+
end
|
31
|
+
end
|
22
32
|
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
# Register the engine (which will register extension in the app)
|
37
|
+
# or ASSUME using sprockets
|
38
|
+
if defined?(Rails)
|
39
|
+
require 'handlebars_assets/engine'
|
40
|
+
else
|
41
|
+
require 'sprockets'
|
42
|
+
::HandlebarsAssets.register_extensions(Sprockets)
|
23
43
|
end
|
@@ -2,27 +2,31 @@ module HandlebarsAssets
|
|
2
2
|
# Change config options in an initializer:
|
3
3
|
#
|
4
4
|
# HandlebarsAssets::Config.path_prefix = 'app/templates'
|
5
|
+
|
5
6
|
module Config
|
6
7
|
extend self
|
7
8
|
|
8
9
|
attr_writer :compiler, :compiler_path, :ember, :multiple_frameworks,
|
9
10
|
:haml_options, :known_helpers, :known_helpers_only, :options,
|
10
|
-
:patch_files, :patch_path, :path_prefix, :slim_options, :template_namespace
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
11
|
+
:patch_files, :patch_path, :path_prefix, :slim_options, :template_namespace,
|
12
|
+
:precompile, :haml_enabled, :slim_enabled,
|
13
|
+
:handlebars_extensions, :hamlbars_extensions, :slimbars_extensions,
|
14
|
+
:amd, :handlebars_amd_path, :amd_with_template_namespace
|
15
15
|
|
16
16
|
def compiler
|
17
17
|
@compiler || 'handlebars.js'
|
18
18
|
end
|
19
19
|
|
20
|
+
def self.configure
|
21
|
+
yield self
|
22
|
+
end
|
23
|
+
|
20
24
|
def compiler_path
|
21
25
|
@compiler_path || HandlebarsAssets.path
|
22
26
|
end
|
23
27
|
|
24
28
|
def ember?
|
25
|
-
@ember
|
29
|
+
@ember || false
|
26
30
|
end
|
27
31
|
|
28
32
|
def multiple_frameworks?
|
@@ -33,16 +37,35 @@ module HandlebarsAssets
|
|
33
37
|
defined? ::Haml::Engine
|
34
38
|
end
|
35
39
|
|
40
|
+
def haml_enabled?
|
41
|
+
@haml_enabled = true if @haml_enabled.nil?
|
42
|
+
@haml_enabled
|
43
|
+
end
|
44
|
+
|
36
45
|
def haml_options
|
37
46
|
@haml_options || {}
|
38
47
|
end
|
39
48
|
|
49
|
+
def slim_available?
|
50
|
+
defined? ::Slim::Engine
|
51
|
+
end
|
52
|
+
|
53
|
+
def slim_enabled?
|
54
|
+
@slim_enabled = true if @slim_enabled.nil?
|
55
|
+
@slim_enabled
|
56
|
+
end
|
57
|
+
|
58
|
+
def slim_options
|
59
|
+
@slim_options || {}
|
60
|
+
end
|
61
|
+
|
40
62
|
def known_helpers
|
41
63
|
@known_helpers || []
|
42
64
|
end
|
43
65
|
|
44
66
|
def known_helpers_only
|
45
|
-
@known_helpers_only
|
67
|
+
@known_helpers_only = false if @known_helpers_only.nil?
|
68
|
+
@known_helpers_only
|
46
69
|
end
|
47
70
|
|
48
71
|
def options
|
@@ -58,21 +81,50 @@ module HandlebarsAssets
|
|
58
81
|
end
|
59
82
|
|
60
83
|
def path_prefix
|
61
|
-
@path_prefix
|
84
|
+
@path_prefix ||= 'templates'
|
62
85
|
end
|
63
86
|
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
def slim_options
|
69
|
-
@slim_options || {}
|
87
|
+
def precompile
|
88
|
+
@precompile = true if @precompile.nil?
|
89
|
+
@precompile
|
70
90
|
end
|
71
91
|
|
72
92
|
def template_namespace
|
73
93
|
@template_namespace || 'HandlebarsTemplates'
|
74
94
|
end
|
75
95
|
|
96
|
+
def handlebars_extensions
|
97
|
+
@hbs_extensions ||= ['hbs', 'handlebars']
|
98
|
+
end
|
99
|
+
|
100
|
+
def hamlbars_extensions
|
101
|
+
@hamlbars_extensions ||= ['hamlbars']
|
102
|
+
end
|
103
|
+
|
104
|
+
def slimbars_extensions
|
105
|
+
@slimbars_extensions ||= ['slimbars']
|
106
|
+
end
|
107
|
+
|
108
|
+
def ember_extensions
|
109
|
+
@ember_extensions ||= ['ember']
|
110
|
+
end
|
111
|
+
|
112
|
+
def amd?
|
113
|
+
@amd || false
|
114
|
+
end
|
115
|
+
|
116
|
+
# indicate whether the template should
|
117
|
+
# be added to the global template namespace
|
118
|
+
def amd_with_template_namespace
|
119
|
+
@amd_with_template_namespace || false
|
120
|
+
end
|
121
|
+
|
122
|
+
# path specified by the require.js paths
|
123
|
+
# during configuration for the handlebars
|
124
|
+
def handlebars_amd_path
|
125
|
+
@handlebars_amd_path || 'handlebars'
|
126
|
+
end
|
127
|
+
|
76
128
|
private
|
77
129
|
|
78
130
|
def generate_known_helpers_hash
|
@@ -1,11 +1,8 @@
|
|
1
1
|
module HandlebarsAssets
|
2
|
+
# NOTE: must be an engine because we are including assets in the gem
|
2
3
|
class Engine < ::Rails::Engine
|
3
|
-
initializer "
|
4
|
-
|
5
|
-
app.assets.register_engine('.hbs', TiltHandlebars)
|
6
|
-
app.assets.register_engine('.handlebars', TiltHandlebars)
|
7
|
-
app.assets.register_engine('.hamlbars', TiltHandlebars) if HandlebarsAssets::Config.haml_available?
|
8
|
-
app.assets.register_engine('.slimbars', TiltHandlebars) if HandlebarsAssets::Config.slim_available?
|
4
|
+
initializer "handlebars_assets.assets.register" do |app|
|
5
|
+
::HandlebarsAssets::register_extensions(app.assets)
|
9
6
|
end
|
10
7
|
end
|
11
8
|
end
|
@@ -0,0 +1,205 @@
|
|
1
|
+
require 'tilt'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module HandlebarsAssets
|
5
|
+
module Unindent
|
6
|
+
# http://bit.ly/aze9FV
|
7
|
+
# Strip leading whitespace from each line that is the same as the
|
8
|
+
# amount of whitespace on the first line of the string.
|
9
|
+
# Leaves _additional_ indentation on later lines intact.
|
10
|
+
def unindent(heredoc)
|
11
|
+
heredoc.gsub(/^#{heredoc[/\A\s*/]}/, '')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class HandlebarsTemplate < Tilt::Template
|
16
|
+
|
17
|
+
include Unindent
|
18
|
+
|
19
|
+
def self.default_mime_type
|
20
|
+
'application/javascript'
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize_engine
|
24
|
+
begin
|
25
|
+
require 'haml'
|
26
|
+
rescue LoadError
|
27
|
+
# haml not available
|
28
|
+
end
|
29
|
+
begin
|
30
|
+
require 'slim'
|
31
|
+
rescue LoadError
|
32
|
+
# slim not available
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def prepare
|
37
|
+
@template_path = TemplatePath.new(@file)
|
38
|
+
@engine =
|
39
|
+
if @template_path.is_haml?
|
40
|
+
Haml::Engine.new(data, HandlebarsAssets::Config.haml_options)
|
41
|
+
elsif @template_path.is_slim?
|
42
|
+
Slim::Template.new(HandlebarsAssets::Config.slim_options) { data }
|
43
|
+
else
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def evaluate(scope, locals, &block)
|
49
|
+
source =
|
50
|
+
if @engine
|
51
|
+
@engine.render(scope, locals, &block)
|
52
|
+
else
|
53
|
+
data
|
54
|
+
end
|
55
|
+
|
56
|
+
# remove trailing \n on file, for some reason the directives pipeline adds this
|
57
|
+
source.chomp!($/)
|
58
|
+
|
59
|
+
# handle the case of multiple frameworks combined with ember
|
60
|
+
# DEFER: use extension setup for ember
|
61
|
+
if (HandlebarsAssets::Config.multiple_frameworks? && @template_path.is_ember?) ||
|
62
|
+
(HandlebarsAssets::Config.ember? && !HandlebarsAssets::Config.multiple_frameworks?)
|
63
|
+
compile_ember(source)
|
64
|
+
else
|
65
|
+
compile_default(source)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def compile_ember(source)
|
70
|
+
"window.Ember.TEMPLATES[#{@template_path.name}] = Ember.Handlebars.compile(#{JSON.dump(source)});"
|
71
|
+
end
|
72
|
+
|
73
|
+
def compile_default(source)
|
74
|
+
template =
|
75
|
+
if HandlebarsAssets::Config.precompile
|
76
|
+
compiled_hbs = Handlebars.precompile(source, HandlebarsAssets::Config.options)
|
77
|
+
"Handlebars.template(#{compiled_hbs})"
|
78
|
+
else
|
79
|
+
"Handlebars.compile(#{JSON.dump(source)})"
|
80
|
+
end
|
81
|
+
|
82
|
+
template_namespace = HandlebarsAssets::Config.template_namespace
|
83
|
+
|
84
|
+
if HandlebarsAssets::Config.amd?
|
85
|
+
handlebars_amd_path = HandlebarsAssets::Config.handlebars_amd_path
|
86
|
+
if HandlebarsAssets::Config.amd_with_template_namespace
|
87
|
+
if @template_path.is_partial?
|
88
|
+
unindent <<-PARTIAL
|
89
|
+
define(['#{handlebars_amd_path}'],function(Handlebars){
|
90
|
+
var t = #{template};
|
91
|
+
Handlebars.registerPartial(#{@template_path.name}, t);
|
92
|
+
return t;
|
93
|
+
;})
|
94
|
+
PARTIAL
|
95
|
+
else
|
96
|
+
unindent <<-TEMPLATE
|
97
|
+
define(['#{handlebars_amd_path}'],function(Handlebars){
|
98
|
+
return #{template};
|
99
|
+
});
|
100
|
+
TEMPLATE
|
101
|
+
end
|
102
|
+
else
|
103
|
+
if @template_path.is_partial?
|
104
|
+
unindent <<-PARTIAL
|
105
|
+
define(['#{handlebars_amd_path}'],function(Handlebars){
|
106
|
+
var t = #{template};
|
107
|
+
Handlebars.registerPartial(#{@template_path.name}, t);
|
108
|
+
return t;
|
109
|
+
;})
|
110
|
+
PARTIAL
|
111
|
+
else
|
112
|
+
unindent <<-TEMPLATE
|
113
|
+
define(['#{handlebars_amd_path}'],function(Handlebars){
|
114
|
+
this.#{template_namespace} || (this.#{template_namespace} = {});
|
115
|
+
this.#{template_namespace}[#{@template_path.name}] = #{template};
|
116
|
+
return this.#{template_namespace}[#{@template_path.name}];
|
117
|
+
});
|
118
|
+
TEMPLATE
|
119
|
+
end
|
120
|
+
end
|
121
|
+
else
|
122
|
+
if @template_path.is_partial?
|
123
|
+
unindent <<-PARTIAL
|
124
|
+
(function() {
|
125
|
+
Handlebars.registerPartial(#{@template_path.name}, #{template});
|
126
|
+
}).call(this);
|
127
|
+
PARTIAL
|
128
|
+
else
|
129
|
+
unindent <<-TEMPLATE
|
130
|
+
(function() {
|
131
|
+
this.#{template_namespace} || (this.#{template_namespace} = {});
|
132
|
+
this.#{template_namespace}[#{@template_path.name}] = #{template};
|
133
|
+
return this.#{template_namespace}[#{@template_path.name}];
|
134
|
+
}).call(this);
|
135
|
+
TEMPLATE
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
protected
|
141
|
+
|
142
|
+
class TemplatePath
|
143
|
+
def initialize(path)
|
144
|
+
@full_path = path
|
145
|
+
end
|
146
|
+
|
147
|
+
def is_haml?
|
148
|
+
result = false
|
149
|
+
::HandlebarsAssets::Config.hamlbars_extensions.each do |ext|
|
150
|
+
if ext.start_with? '.'
|
151
|
+
ext = '\\#{ext}'
|
152
|
+
result ||= !(@full_path =~ /#{ext}(\..*)*$/).nil?
|
153
|
+
else
|
154
|
+
result ||= !(@full_path =~ /\.#{ext}(\..*)*$/).nil?
|
155
|
+
end
|
156
|
+
end
|
157
|
+
result
|
158
|
+
end
|
159
|
+
|
160
|
+
def is_slim?
|
161
|
+
result = false
|
162
|
+
::HandlebarsAssets::Config.slimbars_extensions.each do |ext|
|
163
|
+
if ext.start_with? '.'
|
164
|
+
ext = '\\#{ext}'
|
165
|
+
result ||= !(@full_path =~ /#{ext}(\..*)*$/).nil?
|
166
|
+
else
|
167
|
+
result ||= !(@full_path =~ /\.#{ext}(\..*)*$/).nil?
|
168
|
+
end
|
169
|
+
end
|
170
|
+
result
|
171
|
+
end
|
172
|
+
|
173
|
+
def is_partial?
|
174
|
+
@full_path.gsub(%r{.*/}, '').start_with?('_')
|
175
|
+
end
|
176
|
+
|
177
|
+
def is_ember?
|
178
|
+
result = false
|
179
|
+
::HandlebarsAssets::Config.ember_extensions.each do |ext|
|
180
|
+
if ext.start_with? '.'
|
181
|
+
ext = '\\#{ext}'
|
182
|
+
result ||= !(@full_path =~ /#{ext}(\..*)*$/).nil?
|
183
|
+
else
|
184
|
+
result ||= !(@full_path =~ /\.#{ext}(\..*)*$/).nil?
|
185
|
+
end
|
186
|
+
end
|
187
|
+
result
|
188
|
+
end
|
189
|
+
|
190
|
+
def name
|
191
|
+
template_name
|
192
|
+
end
|
193
|
+
|
194
|
+
private
|
195
|
+
|
196
|
+
def relative_path
|
197
|
+
@full_path.match(/.*#{HandlebarsAssets::Config.path_prefix}\/((.*\/)*([^.]*)).*$/)[1]
|
198
|
+
end
|
199
|
+
|
200
|
+
def template_name
|
201
|
+
relative_path.dump
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
@@ -6,7 +6,7 @@ module HandlebarsAssets
|
|
6
6
|
include CompilerSupport
|
7
7
|
|
8
8
|
def compile_haml(source)
|
9
|
-
Haml::Engine.new(source, HandlebarsAssets::Config.haml_options).render
|
9
|
+
(Haml::Engine.new(source, HandlebarsAssets::Config.haml_options).render).chomp
|
10
10
|
end
|
11
11
|
|
12
12
|
def teardown
|
@@ -20,7 +20,7 @@ module HandlebarsAssets
|
|
20
20
|
scope = make_scope root, file
|
21
21
|
source = "%p This is {{handlebars}}"
|
22
22
|
|
23
|
-
template = HandlebarsAssets::
|
23
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
24
24
|
|
25
25
|
assert_equal hbs_compiled('test_render', compile_haml(source)), template.render(scope, {})
|
26
26
|
end
|
@@ -20,7 +20,7 @@ module HandlebarsAssets
|
|
20
20
|
scope = make_scope root, file
|
21
21
|
source = "p This is {{handlebars}}"
|
22
22
|
|
23
|
-
template = HandlebarsAssets::
|
23
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
24
24
|
|
25
25
|
assert_equal hbs_compiled('test_render', compile_slim(source)), template.render(scope, {})
|
26
26
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
module HandlebarsAssets
|
4
|
-
class
|
4
|
+
class HandlebarsTemplateTest < Test::Unit::TestCase
|
5
5
|
include CompilerSupport
|
6
6
|
include SprocketsScope
|
7
7
|
|
@@ -24,7 +24,7 @@ module HandlebarsAssets
|
|
24
24
|
scope = make_scope root, file
|
25
25
|
source = "This is {{handlebars}}"
|
26
26
|
|
27
|
-
template = HandlebarsAssets::
|
27
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
28
28
|
|
29
29
|
assert_equal hbs_compiled('test_render', source), template.render(scope, {})
|
30
30
|
end
|
@@ -37,7 +37,7 @@ module HandlebarsAssets
|
|
37
37
|
scope = make_scope root, file
|
38
38
|
source = "This is {{handlebars}}"
|
39
39
|
|
40
|
-
template = HandlebarsAssets::
|
40
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
41
41
|
|
42
42
|
assert_equal hbs_compiled('test_template_misnaming', source), template.render(scope, {})
|
43
43
|
end
|
@@ -50,7 +50,7 @@ module HandlebarsAssets
|
|
50
50
|
|
51
51
|
HandlebarsAssets::Config.path_prefix = 'app/templates'
|
52
52
|
|
53
|
-
template = HandlebarsAssets::
|
53
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
54
54
|
|
55
55
|
assert_equal hbs_compiled('test_path_prefix', source), template.render(scope, {})
|
56
56
|
end
|
@@ -65,11 +65,11 @@ module HandlebarsAssets
|
|
65
65
|
|
66
66
|
HandlebarsAssets::Config.path_prefix = 'app/templates'
|
67
67
|
|
68
|
-
template1 = HandlebarsAssets::
|
68
|
+
template1 = HandlebarsAssets::HandlebarsTemplate.new(scope1.pathname.to_s) { source }
|
69
69
|
|
70
70
|
assert_equal hbs_compiled_partial('_test_underscore', source), template1.render(scope1, {})
|
71
71
|
|
72
|
-
template2 = HandlebarsAssets::
|
72
|
+
template2 = HandlebarsAssets::HandlebarsTemplate.new(scope2.pathname.to_s) { source }
|
73
73
|
|
74
74
|
assert_equal hbs_compiled_partial('some/thing/_test_underscore', source), template2.render(scope2, {})
|
75
75
|
end
|
@@ -80,7 +80,7 @@ module HandlebarsAssets
|
|
80
80
|
scope = make_scope root, file
|
81
81
|
source = "{{#with author}}By {{first_name}} {{last_name}}{{/with}}"
|
82
82
|
|
83
|
-
template = HandlebarsAssets::
|
83
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
84
84
|
|
85
85
|
assert_equal hbs_compiled('test_without_known', source), template.render(scope, {})
|
86
86
|
end
|
@@ -93,7 +93,7 @@ module HandlebarsAssets
|
|
93
93
|
|
94
94
|
HandlebarsAssets::Config.known_helpers_only = true
|
95
95
|
|
96
|
-
template = HandlebarsAssets::
|
96
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
97
97
|
|
98
98
|
assert_equal hbs_compiled('test_known', source), template.render(scope, {})
|
99
99
|
end
|
@@ -104,7 +104,7 @@ module HandlebarsAssets
|
|
104
104
|
scope = make_scope root, file
|
105
105
|
source = "{{#custom author}}By {{first_name}} {{last_name}}{{/custom}}"
|
106
106
|
|
107
|
-
template = HandlebarsAssets::
|
107
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
108
108
|
|
109
109
|
assert_equal hbs_compiled('test_custom_helper', source), template.render(scope, {})
|
110
110
|
end
|
@@ -118,20 +118,20 @@ module HandlebarsAssets
|
|
118
118
|
HandlebarsAssets::Config.known_helpers_only = true
|
119
119
|
HandlebarsAssets::Config.known_helpers = %w(custom)
|
120
120
|
|
121
|
-
template = HandlebarsAssets::
|
121
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
122
122
|
|
123
123
|
assert_equal hbs_compiled('test_custom_known_helper', source), template.render(scope, {})
|
124
124
|
end
|
125
125
|
|
126
126
|
def test_template_namespace
|
127
|
-
root = '/myapp/app/assets/javascripts'
|
127
|
+
root = '/myapp/app/assets/javascripts/templates'
|
128
128
|
file = 'test_template_namespace.hbs'
|
129
129
|
scope = make_scope root, file
|
130
130
|
source = "This is {{handlebars}}"
|
131
131
|
|
132
132
|
HandlebarsAssets::Config.template_namespace = 'JST'
|
133
133
|
|
134
|
-
template = HandlebarsAssets::
|
134
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
135
135
|
|
136
136
|
assert_equal hbs_compiled('test_template_namespace', source), template.render(scope, {})
|
137
137
|
end
|
@@ -143,7 +143,7 @@ module HandlebarsAssets
|
|
143
143
|
source = "This is {{handlebars}}"
|
144
144
|
|
145
145
|
HandlebarsAssets::Config.ember = true
|
146
|
-
template = HandlebarsAssets::
|
146
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
147
147
|
|
148
148
|
expected_compiled = %{window.Ember.TEMPLATES["test_render"] = Ember.Handlebars.compile("This is {{handlebars}}");};
|
149
149
|
assert_equal expected_compiled, template.render(scope, {})
|
@@ -152,10 +152,12 @@ module HandlebarsAssets
|
|
152
152
|
def test_multiple_frameworks_with_ember_render
|
153
153
|
root = '/myapp/app/assets/templates'
|
154
154
|
non_ember = 'test_render.hbs'
|
155
|
+
non_ember_but_with_ember = 'test_member.hbs'
|
155
156
|
ember_ext_no_hbs = 'test_render.ember'
|
156
157
|
ember_ext = 'test_render.ember.hbs'
|
157
158
|
ember_with_haml = 'test_render.ember.hamlbars'
|
158
159
|
ember_with_slim = 'test_render.ember.slimbars'
|
160
|
+
ember_ext_with_erb = 'test_render.ember.hbs.erb'
|
159
161
|
|
160
162
|
HandlebarsAssets::Config.ember = true
|
161
163
|
HandlebarsAssets::Config.multiple_frameworks = true
|
@@ -163,33 +165,45 @@ module HandlebarsAssets
|
|
163
165
|
# File without ember extension should compile to default namespace
|
164
166
|
scope = make_scope root, non_ember
|
165
167
|
source = "This is {{handlebars}}"
|
166
|
-
template = HandlebarsAssets::
|
168
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
167
169
|
assert_equal hbs_compiled('test_render', source), template.render(scope, {})
|
168
170
|
|
171
|
+
# File without ember extension but with ember in it should compile to default namespace
|
172
|
+
scope = make_scope root, non_ember_but_with_ember
|
173
|
+
source = "This is {{handlebars}}"
|
174
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
175
|
+
assert_equal hbs_compiled('test_member', source), template.render(scope, {})
|
176
|
+
|
169
177
|
# File with ember extension should compile to ember specific namespace
|
170
178
|
expected_compiled = %{window.Ember.TEMPLATES["test_render"] = Ember.Handlebars.compile("This is {{handlebars}}");};
|
171
179
|
scope = make_scope root, ember_ext_no_hbs
|
172
|
-
template = HandlebarsAssets::
|
180
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
181
|
+
assert_equal expected_compiled, template.render(scope, {})
|
182
|
+
|
183
|
+
# File with ember and erb extension should compile to ember specific namespace
|
184
|
+
expected_compiled = %{window.Ember.TEMPLATES["test_render"] = Ember.Handlebars.compile("This is {{handlebars}}");};
|
185
|
+
scope = make_scope root, ember_ext_with_erb
|
186
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
173
187
|
assert_equal expected_compiled, template.render(scope, {})
|
174
188
|
|
175
189
|
# File with ember.hbs extension should compile to ember specific namespace
|
176
190
|
expected_compiled = %{window.Ember.TEMPLATES["test_render"] = Ember.Handlebars.compile("This is {{handlebars}}");};
|
177
191
|
scope = make_scope root, ember_ext
|
178
|
-
template = HandlebarsAssets::
|
192
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { source }
|
179
193
|
assert_equal expected_compiled, template.render(scope, {})
|
180
194
|
|
181
195
|
# File with ember.hamlbars extension should compile to ember specific namespace
|
182
|
-
expected_compiled = %{window.Ember.TEMPLATES["test_render"] = Ember.Handlebars.compile("<p>This is {{handlebars}}</p
|
196
|
+
expected_compiled = %{window.Ember.TEMPLATES["test_render"] = Ember.Handlebars.compile("<p>This is {{handlebars}}</p>");};
|
183
197
|
scope = make_scope root, ember_with_haml
|
184
198
|
source = "%p This is {{handlebars}}"
|
185
|
-
template = HandlebarsAssets::
|
199
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { compile_haml(source) }
|
186
200
|
assert_equal expected_compiled, template.render(scope, {})
|
187
201
|
|
188
202
|
# File with ember.slimbars extension should compile to ember specific namespace
|
189
203
|
expected_compiled = %{window.Ember.TEMPLATES["test_render"] = Ember.Handlebars.compile("<p>This is {{handlebars}}</p>");};
|
190
204
|
source = "p This is {{handlebars}}"
|
191
205
|
scope = make_scope root, ember_with_slim
|
192
|
-
template = HandlebarsAssets::
|
206
|
+
template = HandlebarsAssets::HandlebarsTemplate.new(scope.pathname.to_s) { compile_slim(source) }
|
193
207
|
assert_equal expected_compiled, template.render(scope, {})
|
194
208
|
end
|
195
209
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: handlebars_assets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.17'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Les Hill
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: execjs
|
@@ -155,7 +155,7 @@ files:
|
|
155
155
|
- lib/handlebars_assets/config.rb
|
156
156
|
- lib/handlebars_assets/engine.rb
|
157
157
|
- lib/handlebars_assets/handlebars.rb
|
158
|
-
- lib/handlebars_assets/
|
158
|
+
- lib/handlebars_assets/handlebars_template.rb
|
159
159
|
- lib/handlebars_assets/version.rb
|
160
160
|
- test/edge/handlebars.js
|
161
161
|
- test/handlebars_assets/compiling_test.rb
|
@@ -1,129 +0,0 @@
|
|
1
|
-
require 'tilt'
|
2
|
-
require 'multi_json'
|
3
|
-
|
4
|
-
module HandlebarsAssets
|
5
|
-
module Unindent
|
6
|
-
# http://bit.ly/aze9FV
|
7
|
-
# Strip leading whitespace from each line that is the same as the
|
8
|
-
# amount of whitespace on the first line of the string.
|
9
|
-
# Leaves _additional_ indentation on later lines intact.
|
10
|
-
def unindent(heredoc)
|
11
|
-
heredoc.gsub /^#{heredoc[/\A\s*/]}/, ''
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class TiltHandlebars < Tilt::Template
|
16
|
-
|
17
|
-
include Unindent
|
18
|
-
|
19
|
-
def self.default_mime_type
|
20
|
-
'application/javascript'
|
21
|
-
end
|
22
|
-
|
23
|
-
def evaluate(scope, locals, &block)
|
24
|
-
template_path = TemplatePath.new(scope)
|
25
|
-
|
26
|
-
source = if template_path.is_haml?
|
27
|
-
Haml::Engine.new(data, HandlebarsAssets::Config.haml_options).render(scope, locals)
|
28
|
-
elsif template_path.is_slim?
|
29
|
-
Slim::Template.new(HandlebarsAssets::Config.slim_options) { data }.render(scope, locals)
|
30
|
-
else
|
31
|
-
data
|
32
|
-
end
|
33
|
-
|
34
|
-
if HandlebarsAssets::Config.multiple_frameworks? && HandlebarsAssets::Config.ember?
|
35
|
-
if template_path.is_ember?
|
36
|
-
compile_ember(source, template_path)
|
37
|
-
else
|
38
|
-
compile_default(source, template_path)
|
39
|
-
end
|
40
|
-
elsif HandlebarsAssets::Config.ember? && !HandlebarsAssets::Config.multiple_frameworks?
|
41
|
-
compile_ember(source, template_path)
|
42
|
-
else
|
43
|
-
compile_default(source, template_path)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def initialize_engine
|
48
|
-
begin
|
49
|
-
require 'haml'
|
50
|
-
rescue LoadError
|
51
|
-
# haml not available
|
52
|
-
end
|
53
|
-
begin
|
54
|
-
require 'slim'
|
55
|
-
rescue LoadError
|
56
|
-
# slim not available
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def compile_ember(source, template_path)
|
61
|
-
"window.Ember.TEMPLATES[#{template_path.name}] = Ember.Handlebars.compile(#{::MultiJson.dump source});"
|
62
|
-
end
|
63
|
-
|
64
|
-
def compile_default(source, template_path)
|
65
|
-
compiled_hbs = Handlebars.precompile(source, HandlebarsAssets::Config.options)
|
66
|
-
|
67
|
-
template_namespace = HandlebarsAssets::Config.template_namespace
|
68
|
-
|
69
|
-
if template_path.is_partial?
|
70
|
-
unindent <<-PARTIAL
|
71
|
-
(function() {
|
72
|
-
Handlebars.registerPartial(#{template_path.name}, Handlebars.template(#{compiled_hbs}));
|
73
|
-
}).call(this);
|
74
|
-
PARTIAL
|
75
|
-
else
|
76
|
-
unindent <<-TEMPLATE
|
77
|
-
(function() {
|
78
|
-
this.#{template_namespace} || (this.#{template_namespace} = {});
|
79
|
-
this.#{template_namespace}[#{template_path.name}] = Handlebars.template(#{compiled_hbs});
|
80
|
-
return this.#{template_namespace}[#{template_path.name}];
|
81
|
-
}).call(this);
|
82
|
-
TEMPLATE
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
protected
|
87
|
-
|
88
|
-
def prepare; end
|
89
|
-
|
90
|
-
class TemplatePath
|
91
|
-
def initialize(scope)
|
92
|
-
self.full_path = scope.pathname
|
93
|
-
self.template_path = scope.logical_path
|
94
|
-
end
|
95
|
-
|
96
|
-
def is_haml?
|
97
|
-
full_path.to_s.end_with?('.hamlbars')
|
98
|
-
end
|
99
|
-
|
100
|
-
def is_slim?
|
101
|
-
full_path.to_s.end_with?('.slimbars')
|
102
|
-
end
|
103
|
-
|
104
|
-
def is_partial?
|
105
|
-
template_path.gsub(%r{.*/}, '').start_with?('_')
|
106
|
-
end
|
107
|
-
|
108
|
-
def is_ember?
|
109
|
-
full_path.to_s =~ %r{.ember(.hbs|.hamlbars|.slimbars)?$}
|
110
|
-
end
|
111
|
-
|
112
|
-
def name
|
113
|
-
template_name
|
114
|
-
end
|
115
|
-
|
116
|
-
private
|
117
|
-
|
118
|
-
attr_accessor :full_path, :template_path
|
119
|
-
|
120
|
-
def relative_path
|
121
|
-
template_path.gsub(/^#{HandlebarsAssets::Config.path_prefix}\/(.*)$/i, "\\1")
|
122
|
-
end
|
123
|
-
|
124
|
-
def template_name
|
125
|
-
relative_path.dump
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|