liquid_assets 0.3.3 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +31 -31
- data/README.md +188 -16
- data/Rakefile +1 -1
- data/lib/liquid_assets/config.rb +1 -1
- data/lib/liquid_assets/engine.rb +0 -2
- data/lib/liquid_assets/eval.rb +14 -1
- data/lib/liquid_assets/filters.rb +12 -0
- data/lib/liquid_assets/liquid_file_system.rb +4 -4
- data/lib/liquid_assets/pipeline_template_engine.rb +7 -9
- data/lib/liquid_assets/resolver.rb +12 -21
- data/lib/liquid_assets/template.rb +18 -0
- data/lib/liquid_assets/template_handler.rb +10 -17
- data/lib/liquid_assets/version.rb +1 -1
- data/lib/liquid_assets.rb +5 -5
- data/liquid_assets.gemspec +1 -0
- data/test/test_liquid_assets.rb +8 -14
- data/vendor/assets/javascripts/liquid_assets.js.erb +17 -0
- data/vendor/tinyliquid.js +5 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50e6eb3911190f87a95427241a4f72f2f3c99b13
|
4
|
+
data.tar.gz: 917feafdbd36d8a8f9b48619e33efa4599e23c8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 089c3243284ea3dacbe2cfc37b8ec520b3649883fb1e1bf75c43da9f0f9e9c45c8dc96a4f1ae4b7e5d3444a99317714d6c9111bd064d7d05e6c2331008f303da
|
7
|
+
data.tar.gz: 5ba19ade6130e6dd873c62aeed7e523cf13d037ded8ff747a480ffd3b7bb99c05f69b02f6e0c9c006fff866d1470b0775b95b109b272ed78c53fd40f80696dcb
|
data/Gemfile.lock
CHANGED
@@ -1,53 +1,53 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
liquid_assets (0.
|
4
|
+
liquid_assets (0.4.2)
|
5
5
|
actionpack (>= 3.2)
|
6
6
|
execjs
|
7
7
|
liquid
|
8
|
+
sprockets
|
8
9
|
tilt
|
9
10
|
|
10
11
|
GEM
|
11
12
|
remote: https://rubygems.org/
|
12
13
|
specs:
|
13
|
-
actionpack (
|
14
|
-
|
15
|
-
|
16
|
-
builder (~> 3.0.0)
|
14
|
+
actionpack (4.0.0)
|
15
|
+
activesupport (= 4.0.0)
|
16
|
+
builder (~> 3.1.0)
|
17
17
|
erubis (~> 2.7.0)
|
18
|
-
|
19
|
-
rack (~>
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
multi_json (~> 1.0)
|
29
|
-
builder (3.0.4)
|
18
|
+
rack (~> 1.5.2)
|
19
|
+
rack-test (~> 0.6.2)
|
20
|
+
activesupport (4.0.0)
|
21
|
+
i18n (~> 0.6, >= 0.6.4)
|
22
|
+
minitest (~> 4.2)
|
23
|
+
multi_json (~> 1.3)
|
24
|
+
thread_safe (~> 0.1)
|
25
|
+
tzinfo (~> 0.3.37)
|
26
|
+
atomic (1.1.13)
|
27
|
+
builder (3.1.4)
|
30
28
|
erubis (2.7.0)
|
31
|
-
execjs (
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
multi_json (1.7.
|
38
|
-
rack (1.
|
39
|
-
rack-cache (1.2)
|
40
|
-
rack (>= 0.4)
|
29
|
+
execjs (2.0.1)
|
30
|
+
hike (1.2.3)
|
31
|
+
i18n (0.6.5)
|
32
|
+
json (1.8.0)
|
33
|
+
liquid (2.5.2)
|
34
|
+
minitest (4.7.5)
|
35
|
+
multi_json (1.7.9)
|
36
|
+
rack (1.5.2)
|
41
37
|
rack-test (0.6.2)
|
42
38
|
rack (>= 1.0)
|
43
|
-
rake (10.0
|
44
|
-
rdoc (4.0.
|
45
|
-
|
39
|
+
rake (10.1.0)
|
40
|
+
rdoc (4.0.1)
|
41
|
+
json (~> 1.4)
|
42
|
+
sprockets (2.10.0)
|
46
43
|
hike (~> 1.2)
|
47
44
|
multi_json (~> 1.0)
|
48
45
|
rack (~> 1.0)
|
49
46
|
tilt (~> 1.1, != 1.3.0)
|
50
|
-
|
47
|
+
thread_safe (0.1.2)
|
48
|
+
atomic
|
49
|
+
tilt (1.4.1)
|
50
|
+
tzinfo (0.3.37)
|
51
51
|
|
52
52
|
PLATFORMS
|
53
53
|
ruby
|
data/README.md
CHANGED
@@ -1,29 +1,201 @@
|
|
1
|
-
#
|
1
|
+
# liquid_assets
|
2
2
|
|
3
|
-
|
3
|
+
## Description
|
4
4
|
|
5
|
-
|
5
|
+
Allows you to use the Liquid template language in Rails, both as
|
6
|
+
templates and as JavaScript via the asset_pipeline.
|
6
7
|
|
7
|
-
|
8
|
+
The Ruby bits are via the standard Liquid http://liquidmarkup.org/
|
9
|
+
gem.
|
8
10
|
|
9
|
-
|
11
|
+
The JavaScript support is possible through the TinyLiquid
|
12
|
+
https://github.com/leizongmin/tinyliquid JavaScript library, which
|
13
|
+
execjs calls to compiles the templates to JavaScript. I did have to
|
14
|
+
perform a few small modifications to the library in order to get it to
|
15
|
+
support partials in the same manner as the Ruby library
|
10
16
|
|
11
|
-
|
17
|
+
Javascript version of templates may be rendered by calling
|
12
18
|
|
13
|
-
|
19
|
+
LQT.Render( path, data );
|
14
20
|
|
15
|
-
|
21
|
+
and partials by:
|
16
22
|
|
17
|
-
|
23
|
+
LQT.RenderPartial( path, data );
|
18
24
|
|
19
|
-
##
|
25
|
+
## Rationale
|
26
|
+
I am currently developing a largish project that has a requirement for
|
27
|
+
user edited html that needs to be rendered both as a standard website
|
28
|
+
and as a single page Backbone application.
|
29
|
+
|
30
|
+
I'd originally attempted to use Mustache templates but discarded that
|
31
|
+
idea after not being able to do simple things like formatting numbers
|
32
|
+
in the views.
|
33
|
+
|
34
|
+
Liquid templates were ideal, but they lacked a suitable JS
|
35
|
+
environment. I then ran across the TinyLiquid project and created
|
36
|
+
this gem in order to cleanly unite the them.
|
37
|
+
|
38
|
+
|
39
|
+
## Configuration
|
40
|
+
|
41
|
+
Set the root in an initializer, i.e. config/initializers/liquid_assets.rb
|
42
|
+
The root defaults to app/assets/templates.
|
43
|
+
|
44
|
+
LiquidAssets::Config.configure do |config|
|
45
|
+
config.path_prefix = 'app/assets/templates'
|
46
|
+
config.filters = MyFilterModule
|
47
|
+
config.namespace = 'LQT'
|
48
|
+
config.globals = lambda{ { 'website_name': 'A Website of Excellence!' } }
|
49
|
+
config.content_provider = lambda{ |path|
|
50
|
+
path == 'hello-world' ? LiquidAssets::Template.new( 'Hello World!', Time.now ) : false
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
By default the Ruby filters are set to Liquid::StandardFilters
|
55
|
+
http://liquid.rubyforge.org/classes/Liquid/StandardFilters.html. Javascript
|
56
|
+
versions are also included in the liquid_assets.js file under the
|
57
|
+
LQT.Filters namespace.
|
58
|
+
|
59
|
+
### Content_provider config
|
60
|
+
|
61
|
+
A content provider option can be set on the configuration. It can be used to retrieve a template
|
62
|
+
|
63
|
+
Example
|
64
|
+
-----
|
65
|
+
|
66
|
+
##### Simple rendering
|
67
|
+
|
68
|
+
tmpl = LiquidAssets.parse <<END_TEMPLATE
|
69
|
+
Hello {{visitor.name | capitalize }},
|
70
|
+
So long and thanks for all the fish!
|
71
|
+
END_TEMPLATE
|
72
|
+
|
73
|
+
tmpl.render({'visitor'=>{'name'=>'Bob'}})
|
74
|
+
|
75
|
+
|
76
|
+
Or with a file 'foo/bar.liquid', containing the content *(under Config.path_prefix)*:
|
77
|
+
tmpl = LiquidAssets.template( 'foo/bar' ) ``
|
78
|
+
|
79
|
+
|
80
|
+
##### Rendering via rails engine
|
81
|
+
|
82
|
+
Given the below configuration:
|
83
|
+
LiquidAssets::Config.configure do |config|
|
84
|
+
config.globals = { copyright_holder: 'BigCorp Inc.' }
|
85
|
+
end
|
86
|
+
|
87
|
+
A liquid template with content:
|
88
|
+
|
89
|
+
Hello {{visitor.name | capitalize }},
|
90
|
+
Thanks for stopping by!
|
91
|
+
|
92
|
+
{{ author.name | capitalize }}'s age is {{author.age}}.
|
93
|
+
|
94
|
+
They will be {{ author.age| plus:10 }} in ten years.
|
95
|
+
|
96
|
+
{{ include 'blog/legalease' }}
|
97
|
+
|
98
|
+
|
99
|
+
stored at: app/assets/templates/blog/about.liquid
|
100
|
+
|
101
|
+
And a partial:
|
102
|
+
|
103
|
+
This post is copyright {{ copyright_holder }}
|
104
|
+
|
105
|
+
stored at: app/assets/templates/blog/_legalease.liquid
|
106
|
+
|
107
|
+
|
108
|
+
### as Rails view
|
109
|
+
|
110
|
+
|
111
|
+
blog_controller.rb:
|
112
|
+
|
113
|
+
def show
|
114
|
+
@visitor = { 'name' => 'bob' }
|
115
|
+
@author = { 'name' => 'jimmy smith', 'age'=>23 }
|
116
|
+
render :template=>'blog/about'
|
117
|
+
end
|
118
|
+
|
119
|
+
**Note:** Since the template is written in Liquid, it DOES NOT have access to
|
120
|
+
the normal rails helper methods.
|
121
|
+
|
122
|
+
It does have access to instance variables, but can only interact with
|
123
|
+
simple Strings, Numbers, Arrays, & Hashes. An additional restriction
|
124
|
+
is that Hashes must use strings for keys, not symbols.
|
125
|
+
|
126
|
+
I'm sure some of these limitations could be worked around, but my
|
127
|
+
needs do not include supporting them at this time. *Patches are welcomed*
|
128
|
+
|
129
|
+
|
130
|
+
### as AssetPipeline pre-compiled javascript
|
131
|
+
|
132
|
+
You can include your liquid templates in the asset_pipeline by
|
133
|
+
using the standard //= syntax in one of your existing JavaScript files
|
134
|
+
|
135
|
+
//=require liquid_assets
|
136
|
+
//=require blog/_welcome // Could also require_tree, or an index.js manifest file
|
137
|
+
//=require blog/post
|
138
|
+
|
139
|
+
Will compile post.liquid to JavaScript using TinyLiquid and include it at:
|
140
|
+
|
141
|
+
LQT.Templates['blog/post']
|
142
|
+
|
143
|
+
It can then be rendered by
|
144
|
+
|
145
|
+
LQT.Render('blog/post',{ author: { name: jimmy smith', age: 23}, visitor: {name: 'bob' } } )
|
146
|
+
|
147
|
+
A set of standard filters are included at LQT.Filters, which may be extended with
|
148
|
+
custom filter functions.
|
149
|
+
|
150
|
+
**Note:** The LQT namespace is short for LiQuid Template, à la JST from underscore.
|
151
|
+
It can be modified by configuring:
|
152
|
+
|
153
|
+
LiquidAssets::Config.configure do |config|
|
154
|
+
config.namespace = 'FANCY_NAME'
|
155
|
+
end
|
156
|
+
|
157
|
+
If you do modify the namespace, you *may* have to clean Rails asset
|
158
|
+
cache by running *'rake assets:clean'* In my experience, sometimes
|
159
|
+
Rails doesn't notice when vendor assets ERB variables change and may
|
160
|
+
not regenerate the template.
|
161
|
+
|
162
|
+
## Result
|
163
|
+
|
164
|
+
The output from the template should be identical from both Ruby & Javascript:
|
165
|
+
|
166
|
+
Hello Bob,
|
167
|
+
Thanks for stopping by!
|
168
|
+
|
169
|
+
Jimmy Smith's age is 23.
|
170
|
+
|
171
|
+
They will be 33 in ten years.
|
172
|
+
|
173
|
+
This post is copyright BigCorp Inc.
|
174
|
+
|
175
|
+
|
176
|
+
### evaluating liquid templates from string
|
177
|
+
|
178
|
+
template = LiquidAssets.parse( 'A {{name|upcase}} template' )
|
179
|
+
template.render({ :name=>'liquid' })
|
180
|
+
|
181
|
+
=> 'A Liquid template'
|
182
|
+
|
183
|
+
|
184
|
+
## Thanks
|
185
|
+
|
186
|
+
[Shopify](http://www.shopify.com/)
|
187
|
+
for creating the liquid template language and Ruby implementation. [leizongmin](https://github.com/leizongmin/tinyliquid) for the
|
188
|
+
tinyliquid Javascript support.
|
189
|
+
|
190
|
+
I cribbed from [hogan_assets](https://github.com/leshill/hogan_assets/), [Poirot](https://github.com/olivernn/poirot) and [Stache](https://github.com/agoragames/stache/) in creating this gem. Good parts
|
191
|
+
are thanks to those projects, mistakes are mine.
|
20
192
|
|
21
|
-
TODO: Write usage instructions here
|
22
193
|
|
23
194
|
## Contributing
|
195
|
+
Fork on [github](https://github.com/nathanstitt/liquid_assets), implement your change, submit a pull request.
|
196
|
+
|
197
|
+
|
198
|
+
## Copyright
|
24
199
|
|
25
|
-
|
26
|
-
|
27
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create new Pull Request
|
200
|
+
Copyright (c) 2013 Nathan Stitt. See LICENSE.txt for
|
201
|
+
further details, *it's MIT*
|
data/Rakefile
CHANGED
data/lib/liquid_assets/config.rb
CHANGED
data/lib/liquid_assets/engine.rb
CHANGED
data/lib/liquid_assets/eval.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module LiquidAssets
|
3
2
|
|
4
3
|
|
@@ -16,5 +15,19 @@ module LiquidAssets
|
|
16
15
|
LiquidWrapper.new( ::Liquid::Template.parse( source ) )
|
17
16
|
end
|
18
17
|
|
18
|
+
def self.template( path )
|
19
|
+
tmpl = Config.content_provider.call( path )
|
20
|
+
if tmpl && tmpl.present?
|
21
|
+
source = tmpl.source
|
22
|
+
else
|
23
|
+
full_path = Config.template_root_path.join( "#{path}.liquid" )
|
24
|
+
if full_path.exist?
|
25
|
+
source = File.read( full_path )
|
26
|
+
else
|
27
|
+
raise Liquid::FileSystemError, "No such template '#{path}' #{full_path}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
LiquidWrapper.new( ::Liquid::Template.parse( source ) )
|
31
|
+
end
|
19
32
|
|
20
33
|
end
|
@@ -8,11 +8,11 @@ module LiquidAssets
|
|
8
8
|
|
9
9
|
|
10
10
|
def read_template_file( template_path, context )
|
11
|
-
|
12
|
-
if
|
13
|
-
return
|
11
|
+
tmpl = Config.content_provider.call( Resolver.convert_path_to_partial( template_path.dup ) )
|
12
|
+
if tmpl && tmpl.present?
|
13
|
+
return tmpl.source
|
14
14
|
else
|
15
|
-
return
|
15
|
+
return super
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -6,16 +6,14 @@ module LiquidAssets
|
|
6
6
|
|
7
7
|
self.default_mime_type = 'application/javascript'
|
8
8
|
|
9
|
-
# def initialize_engine
|
10
|
-
# end
|
11
|
-
|
12
9
|
def evaluate(scope, locals, &block)
|
13
|
-
template_path = TemplatePath.new scope
|
14
|
-
|
15
|
-
source =
|
16
|
-
|
17
|
-
|
18
|
-
|
10
|
+
template_path = TemplatePath.new( scope )
|
11
|
+
tmpl = Config.content_provider.call( template_path.name )
|
12
|
+
source = if tmpl && tmpl.present?
|
13
|
+
tmpl.source
|
14
|
+
else
|
15
|
+
data
|
16
|
+
end
|
19
17
|
"#{LiquidAssets::Config.namespace}.Templates[#{template_path.name.dump}] = #{ TinyLiquid.compile( source ) };"
|
20
18
|
end
|
21
19
|
|
@@ -12,22 +12,12 @@ module LiquidAssets
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def find_templates(name, prefix, partial, details)
|
15
|
-
|
16
|
-
|
17
|
-
if
|
18
|
-
return []
|
15
|
+
path = normalize_path( prefix, name )
|
16
|
+
tmpl = Config.content_provider.call( partial_path( path, partial ) )
|
17
|
+
if tmpl && tmpl.present?
|
18
|
+
return [ make_template( tmpl, path, details, partial ) ]
|
19
19
|
else
|
20
|
-
return [
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def clear_cache_for( expired_path )
|
25
|
-
@cached.each do |context, prefix_hash |
|
26
|
-
prefix_hash.each do | prefix, name_hash |
|
27
|
-
name_hash.delete_if{ | name, partial_hash |
|
28
|
-
normalize_path( prefix, name ) == expired_path
|
29
|
-
}
|
30
|
-
end
|
20
|
+
return []
|
31
21
|
end
|
32
22
|
end
|
33
23
|
|
@@ -43,17 +33,18 @@ module LiquidAssets
|
|
43
33
|
end
|
44
34
|
end
|
45
35
|
|
46
|
-
def make_template(
|
36
|
+
def make_template( tmpl, path, details, partial )
|
47
37
|
handler = ::ActionView::Template.registered_template_handler('.liquid')
|
48
38
|
details = {
|
49
39
|
:virtual_path => partial_path(path, partial ),
|
50
|
-
:locale
|
51
|
-
:format
|
52
|
-
:handler
|
53
|
-
:
|
40
|
+
:locale => details[:locale].first.to_s,
|
41
|
+
:format => details[:formats].first.to_s,
|
42
|
+
:handler => details[:handlers].map(&:to_s),
|
43
|
+
:updated_at => tmpl.mtime,
|
44
|
+
:partial => partial || false
|
54
45
|
}
|
55
46
|
handler = ActionView::Template.registered_template_handler(:liquid)
|
56
|
-
return ActionView::Template.new(source, "LiquidTemplate - #{path}", handler, details)
|
47
|
+
return ActionView::Template.new( tmpl.source, "LiquidTemplate - #{path}", handler, details)
|
57
48
|
end
|
58
49
|
|
59
50
|
def partial_path( path, partial )
|
@@ -6,33 +6,26 @@ module LiquidAssets
|
|
6
6
|
class TemplateHandler
|
7
7
|
|
8
8
|
def self.call(template)
|
9
|
-
|
9
|
+
dump = Marshal.dump( LiquidAssets.parse( template ) )
|
10
|
+
return "LiquidAssets::TemplateHandler.render(#{dump.inspect}, self, local_assigns)"
|
10
11
|
end
|
11
12
|
|
12
|
-
def
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
def render(template, local_assigns = {})
|
17
|
-
@view.controller.headers["Content-Type"] ||= 'text/html; charset=utf-8'
|
13
|
+
def self.render( src, view, local_assigns )
|
14
|
+
view.controller.headers["Content-Type"] ||= 'text/html; charset=utf-8'
|
18
15
|
|
19
|
-
assigns =
|
16
|
+
assigns = view.assigns.dup
|
20
17
|
assigns.merge!( local_assigns.stringify_keys )
|
21
18
|
|
22
|
-
if content =
|
19
|
+
if content = view.content_for?(:layout)
|
23
20
|
assigns["content_for_layout"] = content
|
24
21
|
end
|
25
|
-
LiquidAssets.parse(template).render( assigns, :registers=>{
|
26
|
-
:action_view => @view,
|
27
|
-
:controller => @view.controller
|
28
|
-
} ).html_safe
|
29
|
-
end
|
30
22
|
|
31
|
-
|
32
|
-
|
23
|
+
Marshal.load( src ).render( assigns, :registers=>{
|
24
|
+
:action_view => view,
|
25
|
+
:controller => view.controller
|
26
|
+
} ).html_safe
|
33
27
|
end
|
34
28
|
|
35
|
-
|
36
29
|
end
|
37
30
|
|
38
31
|
end
|
data/lib/liquid_assets.rb
CHANGED
@@ -4,21 +4,21 @@ require 'liquid_assets/config'
|
|
4
4
|
require 'liquid_assets/template_handler'
|
5
5
|
require 'liquid_assets/liquid_file_system'
|
6
6
|
require 'liquid_assets/resolver'
|
7
|
+
require 'liquid_assets/filters'
|
8
|
+
require 'liquid_assets/pipeline_template_engine'
|
9
|
+
require 'liquid_assets/tiny_liquid'
|
10
|
+
require 'liquid_assets/template'
|
7
11
|
|
8
12
|
module LiquidAssets
|
9
13
|
|
10
14
|
extend Config
|
11
15
|
|
12
|
-
autoload :TinyLiquid, 'liquid_assets/tiny_liquid'
|
13
|
-
autoload :PipelineTemplateEngine, 'liquid_assets/pipeline_template_engine'
|
14
|
-
|
15
16
|
if defined? Rails
|
16
17
|
require 'liquid_assets/engine'
|
17
18
|
else
|
18
19
|
require 'sprockets'
|
19
20
|
Config.load_yml! if Config.yml_exists?
|
20
|
-
|
21
21
|
Sprockets.register_engine ".liquid", Tilt
|
22
|
-
|
23
22
|
end
|
23
|
+
|
24
24
|
end
|
data/liquid_assets.gemspec
CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_dependency 'liquid'
|
22
22
|
spec.add_dependency 'tilt'
|
23
23
|
spec.add_dependency 'execjs'
|
24
|
+
spec.add_dependency 'sprockets'
|
24
25
|
spec.add_dependency 'actionpack', '>=3.2'
|
25
26
|
|
26
27
|
spec.add_development_dependency "bundler", "~> 1.3"
|
data/test/test_liquid_assets.rb
CHANGED
@@ -25,28 +25,29 @@ tmpl="LQT.Templates[\"path/to/template\"] = function(locals,fil
|
|
25
25
|
def test_template_rendering
|
26
26
|
locals = {foo:'bar'}
|
27
27
|
source = 'foo={{foo}}'
|
28
|
-
|
28
|
+
compiled = LiquidAssets::TemplateHandler.call(DummyView.new)
|
29
|
+
p compiled
|
29
30
|
assert_equal 'foo=bar', template
|
30
31
|
end
|
31
32
|
|
32
33
|
|
33
34
|
def test_resolver
|
34
35
|
LiquidAssets::Config.content_provider = lambda do | path |
|
35
|
-
'good' == path ? 'Hello {{bob|upcase}}' : false
|
36
|
+
'good' == path ? LiquidAssets::Template.new('Hello {{bob|upcase}}') : false
|
36
37
|
end
|
37
38
|
|
38
39
|
details = {:formats=>[:liquid], :locale=>[:en], :handlers=>[] }
|
39
40
|
resolver = LiquidAssets::Resolver.instance
|
40
41
|
|
41
|
-
assert_empty resolver.find_all('bad','',false, details )
|
42
|
-
assert_not_empty resolver.find_all('good','',false, details )
|
42
|
+
assert_empty resolver.find_all('bad', '' ,false, details )
|
43
|
+
assert_not_empty resolver.find_all('good','', false, details )
|
43
44
|
end
|
44
45
|
|
45
46
|
def test_resolver_caches
|
46
47
|
times_called = 0
|
47
48
|
LiquidAssets::Config.content_provider = lambda do | path |
|
48
49
|
times_called += 1
|
49
|
-
'foo/bar/good' == path ? 'Hello {{bob|upcase}}' : false
|
50
|
+
'foo/bar/good' == path ? LiquidAssets::Template.new('Hello {{bob|upcase}}') : false
|
50
51
|
end
|
51
52
|
|
52
53
|
details = {:formats=>[:liquid], :locale=>[:en], :handlers=>[] }
|
@@ -59,18 +60,11 @@ tmpl="LQT.Templates[\"path/to/template\"] = function(locals,fil
|
|
59
60
|
|
60
61
|
times_called = 0
|
61
62
|
|
62
|
-
resolver.
|
63
|
-
|
64
|
-
resolver.find_all('foo/bar/good',nil,false, details, key )
|
65
|
-
|
66
|
-
assert_equal 0, times_called
|
67
|
-
|
68
|
-
resolver.clear_cache_for( 'foo/bar/good' )
|
63
|
+
resolver.clear_cache
|
69
64
|
|
70
65
|
resolver.find_all('foo/bar/good',nil,false, details, key )
|
71
66
|
|
72
67
|
assert_equal 1, times_called
|
73
|
-
|
74
|
-
|
75
68
|
end
|
69
|
+
|
76
70
|
end
|
@@ -1,5 +1,9 @@
|
|
1
1
|
(function( namespace, document, undefined) {
|
2
2
|
|
3
|
+
Array.isArray || (Array.isArray = function ( a ) {
|
4
|
+
return'' + a !== a && {}.toString.call( a ) == '[object Array]'
|
5
|
+
});
|
6
|
+
|
3
7
|
namespace = namespace.<%= LiquidAssets::Config.namespace%> || (namespace.<%=LiquidAssets::Config.namespace%>={});
|
4
8
|
namespace.Templates || ( namespace.Templates={} );
|
5
9
|
|
@@ -110,6 +114,14 @@ word-wrap:break-word; z-index:9999">' + msg + '</pre>';
|
|
110
114
|
upcase: function(input) {
|
111
115
|
return toString(input).toUpperCase();
|
112
116
|
},
|
117
|
+
capitalize: function(input){
|
118
|
+
return string.charAt(0).toUpperCase() + string.slice(1);
|
119
|
+
},
|
120
|
+
titleize: function(input){
|
121
|
+
if (input == null) return '';
|
122
|
+
input = String(input).toLowerCase();
|
123
|
+
return input.replace(/(?:^|\s|-)\S/g, function(c){ return c.toUpperCase(); });
|
124
|
+
},
|
113
125
|
append: function(input, other) {
|
114
126
|
return [toString(input), toString(other)].join();
|
115
127
|
},
|
@@ -188,12 +200,17 @@ word-wrap:break-word; z-index:9999">' + msg + '</pre>';
|
|
188
200
|
}
|
189
201
|
return input.split(pattern);
|
190
202
|
},
|
203
|
+
escape: function(input) {
|
204
|
+
var chr = { '"': '"', '&': '&', '<': '<', '>': '>' };
|
205
|
+
return text ? text.replace(/[\"&<>]/g, function (a) { return chr[a]; }) : '';
|
206
|
+
},
|
191
207
|
join: function(input, glue) {
|
192
208
|
if (glue == null) {
|
193
209
|
glue = ' ';
|
194
210
|
}
|
195
211
|
return _(input).flatten().join(glue);
|
196
212
|
},
|
213
|
+
|
197
214
|
first: function(array) {
|
198
215
|
if (array.length > 0) {
|
199
216
|
return array[0];
|
data/vendor/tinyliquid.js
CHANGED
@@ -7,6 +7,10 @@
|
|
7
7
|
|
8
8
|
var TinyLiquid = (function (exports) {
|
9
9
|
|
10
|
+
Array.isArray || (Array.isArray = function ( a ) {
|
11
|
+
return'' + a !== a && {}.toString.call( a ) == '[object Array]'
|
12
|
+
});
|
13
|
+
|
10
14
|
var modules = {};
|
11
15
|
|
12
16
|
/*--------------- ./lib/md5.js ----------------*/
|
@@ -373,7 +377,7 @@ exports.condition = function (cond, context) {
|
|
373
377
|
return '(' + localsWrap(ca[0]) + ')';
|
374
378
|
}
|
375
379
|
if (ca.length === 3) {
|
376
|
-
var op1 = localsWrap(ca[0]);
|
380
|
+
var op1 = localsWrap( ca[0].replace(/\.(size)$/,".length") );
|
377
381
|
var op2 = localsWrap(ca[2]);
|
378
382
|
ca[1] = ca[1].toLowerCase();
|
379
383
|
if (ca[1] === 'contains') {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: liquid_assets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Stitt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: liquid
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sprockets
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: actionpack
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,9 +126,11 @@ files:
|
|
112
126
|
- lib/liquid_assets/config.rb
|
113
127
|
- lib/liquid_assets/engine.rb
|
114
128
|
- lib/liquid_assets/eval.rb
|
129
|
+
- lib/liquid_assets/filters.rb
|
115
130
|
- lib/liquid_assets/liquid_file_system.rb
|
116
131
|
- lib/liquid_assets/pipeline_template_engine.rb
|
117
132
|
- lib/liquid_assets/resolver.rb
|
133
|
+
- lib/liquid_assets/template.rb
|
118
134
|
- lib/liquid_assets/template_handler.rb
|
119
135
|
- lib/liquid_assets/tiny_liquid.rb
|
120
136
|
- lib/liquid_assets/version.rb
|