liquid_assets 0.1.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 05277be46cbe2e2d7d1cce109ca15d5e7ce156cf
4
+ data.tar.gz: 376327fb4e7fe7c2d6edeff878d530330d54d290
5
+ SHA512:
6
+ metadata.gz: 390677abed5cd524a34c634b8210a551ddfb0168a8ce8030d14cf315615e9db6d32d5acd8b211b01d7c788ad2185473cef2c45d95252d3ee78eb773cf94cd2f5
7
+ data.tar.gz: 52236d4d965716c356fd7246c8c64eee782a2758ff4336d5df6f9c1ab563ea97ffa214f4554d22c5aac7ea302b2596cfbb51ace171635d12c45716e2385186ec
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile CHANGED
@@ -1,18 +1,11 @@
1
- source "http://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- # gem "activesupport", ">= 2.3.5"
5
-
6
- gem 'liquid'
7
- gem 'tilt'
8
- gem 'sprockets'
9
- gem 'execjs'
1
+ source 'https://rubygems.org'
10
2
 
3
+ # Specify your gem's dependencies in liquid_assets.gemspec
4
+ gemspec
11
5
 
12
6
  # Add dependencies to develop your gem here.
13
7
  # Include everything needed to run rake, tests, features, etc.
14
8
  group :development do
15
- gem "rdoc"
16
- gem "bundler"
17
- gem "jeweler"
9
+ gem "rdoc"
10
+ gem "bundler"
18
11
  end
data/Gemfile.lock CHANGED
@@ -1,37 +1,59 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ liquid_assets (0.3.2)
5
+ actionpack (>= 3.2)
6
+ execjs
7
+ liquid
8
+ tilt
9
+
1
10
  GEM
2
- remote: http://rubygems.org/
11
+ remote: https://rubygems.org/
3
12
  specs:
13
+ actionpack (3.2.13)
14
+ activemodel (= 3.2.13)
15
+ activesupport (= 3.2.13)
16
+ builder (~> 3.0.0)
17
+ erubis (~> 2.7.0)
18
+ journey (~> 1.0.4)
19
+ rack (~> 1.4.5)
20
+ rack-cache (~> 1.2)
21
+ rack-test (~> 0.6.1)
22
+ sprockets (~> 2.2.1)
23
+ activemodel (3.2.13)
24
+ activesupport (= 3.2.13)
25
+ builder (~> 3.0.0)
26
+ activesupport (3.2.13)
27
+ i18n (= 0.6.1)
28
+ multi_json (~> 1.0)
29
+ builder (3.0.4)
30
+ erubis (2.7.0)
4
31
  execjs (1.4.0)
5
32
  multi_json (~> 1.0)
6
- git (1.2.5)
7
33
  hike (1.2.1)
8
- jeweler (1.8.4)
9
- bundler (~> 1.0)
10
- git (>= 1.2.5)
11
- rake
12
- rdoc
13
- json (1.7.7)
34
+ i18n (0.6.1)
35
+ journey (1.0.4)
14
36
  liquid (2.5.0)
15
- multi_json (1.6.1)
16
- rack (1.5.2)
17
- rake (10.0.3)
37
+ multi_json (1.7.2)
38
+ rack (1.4.5)
39
+ rack-cache (1.2)
40
+ rack (>= 0.4)
41
+ rack-test (0.6.2)
42
+ rack (>= 1.0)
43
+ rake (10.0.4)
18
44
  rdoc (4.0.0)
19
- json (~> 1.4)
20
45
  sprockets (2.2.2)
21
46
  hike (~> 1.2)
22
47
  multi_json (~> 1.0)
23
48
  rack (~> 1.0)
24
49
  tilt (~> 1.1, != 1.3.0)
25
- tilt (1.3.5)
50
+ tilt (1.3.6)
26
51
 
27
52
  PLATFORMS
28
53
  ruby
29
54
 
30
55
  DEPENDENCIES
31
56
  bundler
32
- execjs
33
- jeweler
34
- liquid
57
+ liquid_assets!
58
+ rake
35
59
  rdoc
36
- sprockets
37
- tilt
data/LICENSE.txt CHANGED
@@ -1,5 +1,7 @@
1
1
  Copyright (c) 2013 Nathan Stitt
2
2
 
3
+ MIT License
4
+
3
5
  Permission is hereby granted, free of charge, to any person obtaining
4
6
  a copy of this software and associated documentation files (the
5
7
  "Software"), to deal in the Software without restriction, including
data/README.md CHANGED
@@ -1,160 +1,29 @@
1
- # liquid_assets version 0.1.0
1
+ # LiquidAssets
2
2
 
3
- ## Description
3
+ TODO: Write a gem description
4
4
 
5
- Allows you to use the Liquid template language in Rails, both as
6
- templates and as JavaScript via the asset_pipeline.
5
+ ## Installation
7
6
 
8
- **Warning!** This is very rough, and only minimally tested. Version
9
- 0.1 really does mean 0.1 in this case!
7
+ Add this line to your application's Gemfile:
10
8
 
11
- Although I'm going to attempt to minimize breaking changes, there may
12
- be a few as I discover bugs and/or better methods of implementing
13
- features.
9
+ gem 'liquid_assets'
14
10
 
15
- My future goals for it are to add template inheritance/override
16
- support and read template's from active_record. *(probably via a
17
- supplied Proc)*
11
+ And then execute:
18
12
 
19
- The Ruby bits are via the standard Liquid http://liquidmarkup.org/
20
- gem.
13
+ $ bundle
21
14
 
22
- The JavaScript support is possible through the TinyLiquid
23
- https://github.com/leizongmin/tinyliquid JavaScript library, which
24
- execjs calls to compiles the templates to JavaScript. I did have to
25
- perform a few small modifications to the library in order to get it to
26
- support partials in the same manner as the Ruby library
27
-
28
- ## Rationale
29
- I am currently developing a largish project that has a requirement for
30
- user edited html that needs to be rendered both as a standard website
31
- and as a single page Backbone application.
32
-
33
- I'd originally attempted to use Mustache templates but discarded that
34
- idea after not being able to do simple things like formatting numbers
35
- in the views.
36
-
37
- Liquid templates were ideal, but they lacked a suitable JS
38
- environment. I then ran across the TinyLiquid project and decided to
39
- create a gem to unite the two.
15
+ Or install it yourself as:
40
16
 
17
+ $ gem install liquid_assets
41
18
 
42
19
  ## Usage
43
20
 
44
- Set the root in an initializer, i.e. config/initializers/liquid_assets.rb
45
- The root defaults to app/assets/templates.
46
-
47
- LiquidAssets::Config.configure do |config|
48
- config.path_prefix = 'app/assets/templates'
49
- config.filters = MyFilterModule
50
- config.template_namespace = 'LQT'
51
- end
52
-
53
-
54
- ### Use as Rails views
55
-
56
- Create a view just like you would with erb, except with .liquid as the extension.
57
-
58
- app/assets/templates/blog/post.liquid
59
-
60
- Since the template is written in Liquid, it DOES NOT have access to
61
- the normal rails helper methods.
62
-
63
- It does have access to instance variables, but can only interact with
64
- simple Strings, Numbers, Arrays, & Hashes. An additional restriction
65
- is that Hashes must use strings for keys, not symbols.
66
-
67
- I'm sure some of these limitations could be worked around, but my
68
- needs do not include supporting them at this time. *Patches are welcomed*
69
-
70
-
71
- By default the filters are set to the Liquid::StandardFilters
72
- http://liquid.rubyforge.org/classes/Liquid/StandardFilters.html This
73
- can be changed by including a liquid_filters method on the controller,
74
- or in application_controller to set system-wide. *(assuming you are
75
- inheriting from it)*
76
-
77
- A short example:
78
-
79
- blog_controller.rb:
80
-
81
- def show
82
- @ages={'bob'=>28,'joe'=>23}
83
- render :template=>'blog/post'
84
- end
85
-
86
- app/assets/templates/blog/post.liquid :
87
-
88
- Bob is {{ages.bob}}, older than Joe - who's only {{ages.joe}}.
89
-
90
- But this will not since @bob is not a hash.
91
-
92
- controller:
93
-
94
- def show
95
- @old=People.where({:name=>'bob',:age=>100}).first
96
- render :template=>'blog/post'
97
- end
98
-
99
- (contrived) liquid view:
100
-
101
- Bob's age is {{old.age}}
102
-
103
- **Hint:** To get it to work, call as_json on your models:
104
-
105
- @old=People.where({:name=>'bob',:age=>100}).first.as_json
106
-
107
-
108
- ### Use as AssetPipeline pre-compiled javascript
109
-
110
- You can include your liquid templates in the asset_pipeline by
111
- using the standard //= syntax in one of your existing JavaScript files
112
-
113
- //=require liquid_assets
114
- //=require templates/blog/post
115
-
116
- Will compile post.liquid to JavaScript using TinyLiquid and include it like so
117
-
118
- LQT['templates/blog/post'] = function(locals,filters){ ... }
119
-
120
- It can be used similar to underscore's JST template.
121
-
122
- With filters:
123
-
124
- LQT['templates/blog/post']( { bob:{ age: 23 } }, {
125
- plusTen: function(num){ return num+10; }
126
- })
127
-
128
- Template:
129
-
130
- Bob will be {{bob.age | plusTen}} in ten years.
131
-
132
- Renders to:
133
- Bob will be 33 in ten years.
134
-
135
- The LQT namespace is short for LiQuid Template, à la JST from underscore.
136
-
137
- It can be modified by configuring:
138
-
139
- LiquidAssets::Config.configure do |config|
140
- config.template_namespace = 'FANCY_NAME'
141
- end
142
-
143
- ## Thanks
144
-
145
- [Shopify](http://www.shopify.com/)
146
- for creating the liquid template language and Ruby implementation. [leizongmin](https://github.com/leizongmin/tinyliquid) for the
147
- tinyliquid Javascript support.
148
-
149
- 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
150
- are thanks to those projects, mistakes are mine.
151
-
21
+ TODO: Write usage instructions here
152
22
 
153
23
  ## Contributing
154
- Fork on [github](https://github.com/nathanstitt/liquid_assets), implement your change, submit a pull request.
155
-
156
-
157
- ## Copyright
158
24
 
159
- Copyright (c) 2013 Nathan Stitt. See LICENSE.txt for
160
- further details.
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
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
data/Rakefile CHANGED
@@ -1,7 +1,8 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'rubygems'
4
- require 'bundler'
4
+ require 'bundler/gem_tasks'
5
+
5
6
  begin
6
7
  Bundler.setup(:default, :development)
7
8
  rescue Bundler::BundlerError => e
@@ -11,21 +12,6 @@ rescue Bundler::BundlerError => e
11
12
  end
12
13
  require 'rake'
13
14
 
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "liquid_assets"
18
- gem.homepage = "http://github.com/nathanstitt/liquid_assets"
19
- gem.license = "MIT"
20
- gem.summary = %Q{Liquid formmated views and assets}
21
- gem.description = %Q{Allows you to use Liquid format templates in Rails, both as
22
- view templates and as compiled JavaScript via the asset_pipeline.}
23
- gem.email = "nathan@stitt.org"
24
- gem.authors = ["Nathan Stitt"]
25
- # dependencies defined in Gemfile
26
- end
27
- Jeweler::RubygemsDotOrgTasks.new
28
-
29
15
  require 'rake/testtask'
30
16
  Rake::TestTask.new(:test) do |test|
31
17
  test.libs << 'lib' << 'test'
@@ -3,21 +3,23 @@ require 'yaml'
3
3
  module LiquidAssets
4
4
  # Change config options in an initializer:
5
5
  #
6
- # LiquidAssets::Config.template_namespace = 'LT'
6
+ # LiquidAssets::Config.namespace = 'LT'
7
7
  #
8
8
  # Or in a block:
9
9
  #
10
10
  # LiquidAssets::Config.configure do |config|
11
11
  # config.path_prefix = 'app/assets/templates'
12
12
  # config.filters = MyFilterModule
13
- # config.template_namespace = 'LQT'
13
+ # config.namespace = 'LQT'
14
14
  # end
15
15
  #
16
16
  # Or change config options in a YAML file (config/liquid_assets.yml):
17
17
  #
18
18
  # defaults: &defaults
19
19
  # path_prefix: 'templates'
20
- # template_namespace: 'LQT'
20
+ # namespace: 'LQT'
21
+ # globals:
22
+ # company: 'BigCorp Inc'
21
23
  # development:
22
24
  # <<: *defaults
23
25
  # test:
@@ -33,10 +35,23 @@ module LiquidAssets
33
35
  # Directory to read templates from. Default = app/assets/templates
34
36
  attr_writer :path_prefix
35
37
  # The name of the global JS object that will contain the templates. Defaults = LQT
36
- attr_writer :template_namespace
38
+ attr_writer :namespace
37
39
  # A Ruby module implementing the Liquid Filters that are accessible when templates are evaluated as views
38
- # Javascript filters must be passed as the second parameter given when evaluating a precompiled template
40
+ # Javascript filters can be set by modifying the LQT.Filters object.
41
+ # A set of the standard Shopify filters are provided for both Ruby & Javascript.
42
+ # https://github.com/Shopify/liquid/wiki/Liquid-for-Designers
39
43
  attr_writer :filters
44
+ # May be set to a Proc/Lambda which will be passed the path to a
45
+ # potential template
46
+ #
47
+ # The lambda should return the contents of a liquid template
48
+ # or false to indicate it is not found
49
+ attr_writer :content_provider
50
+ #
51
+ # A hash of 'global' variables that should always be available to
52
+ # templates. This will be merged into the template local variables
53
+ # when the template is rendered and may overwrite them
54
+ attr_writer :globals
40
55
 
41
56
  def configure
42
57
  yield self
@@ -53,8 +68,9 @@ module LiquidAssets
53
68
  end
54
69
 
55
70
  def load_yml!
56
- @path_prefix = yml['path_prefix'] if yml.has_key? 'path_prefix'
57
- @template_namespace = yml['template_namespace'] if yml.has_key? 'template_namespace'
71
+ %{path_prefix namespace globals}.each do | name |
72
+ self.instance_variable_set( "@#{name}", yml[name] ) if yaml.has_key?(name)
73
+ end
58
74
  end
59
75
 
60
76
  def path_prefix
@@ -68,11 +84,22 @@ module LiquidAssets
68
84
  Pathname.new('.')
69
85
  end
70
86
  end
87
+
88
+ def content_provider
89
+ @content_provider ||= lambda{|path| false }
90
+ end
91
+ def globals
92
+ ( @globals && @globals.is_a?(Proc) ) ? @globals.call : @globals ||= {}
93
+ end
94
+ def template_root_path
95
+ root_path.join( 'app','assets','templates' )
96
+ end
97
+
71
98
  def filters
72
99
  @filters ||= Liquid::StandardFilters
73
100
  end
74
- def template_namespace
75
- @template_namespace ||= 'LQT'
101
+ def namespace
102
+ @namespace ||= 'LQT'
76
103
  end
77
104
 
78
105
  def yml
@@ -1,4 +1,4 @@
1
- require 'liquid_assets/tilt_engine'
1
+ require 'liquid_assets/pipeline_template_engine'
2
2
 
3
3
  module LiquidAssets
4
4
 
@@ -9,14 +9,14 @@ module LiquidAssets
9
9
 
10
10
  LiquidAssets::Config.load_yml! if LiquidAssets::Config.yml_exists?
11
11
 
12
-
13
12
  ActionView::Template.register_template_handler(:liquid, LiquidAssets::TemplateHandler )
14
13
 
15
- app.assets.register_engine(".liquid", ::LiquidAssets::TiltEngine )
14
+ app.assets.register_engine(".liquid", ::LiquidAssets::PipelineTemplateEngine )
16
15
 
17
16
  app.config.to_prepare do
18
- Liquid::Template.file_system = Liquid::LocalFileSystem.new( Config.root_path )
17
+ Liquid::Template.file_system = Liquid::LocalFileSystem.new( Config.template_root_path )
19
18
  ApplicationController.send( :append_view_path, LiquidAssets::Config.path_prefix )
19
+ ApplicationController.send( :prepend_view_path, LiquidAssets::Resolver.instance )
20
20
  end
21
21
  end
22
22
 
@@ -0,0 +1,20 @@
1
+
2
+ module LiquidAssets
3
+
4
+
5
+ class LiquidWrapper < Struct.new(:template)
6
+
7
+ def render( variables={}, config={} )
8
+ assigns = Config.globals.dup
9
+ assigns.merge!( variables )
10
+ config[:filters] ||= ::LiquidAssets::Config.filters
11
+ template.render(assigns, config )
12
+ end
13
+ end
14
+
15
+ def self.parse( source )
16
+ LiquidWrapper.new( ::Liquid::Template.parse( source ) )
17
+ end
18
+
19
+
20
+ end
@@ -2,7 +2,7 @@ require 'tilt'
2
2
 
3
3
  module LiquidAssets
4
4
 
5
- class TiltEngine < Tilt::Template
5
+ class PipelineTemplateEngine < Tilt::Template
6
6
 
7
7
  self.default_mime_type = 'application/javascript'
8
8
 
@@ -10,16 +10,13 @@ module LiquidAssets
10
10
  # end
11
11
 
12
12
  def evaluate(scope, locals, &block)
13
-
14
13
  template_path = TemplatePath.new scope
15
- template_namespace = LiquidAssets::Config.template_namespace
16
-
17
- compiled_template = TinyLiquid.compile(data)
18
14
 
19
- <<-TEMPLATE
20
- this.#{template_namespace} || (this.#{template_namespace} = {});
21
- this.#{template_namespace}[#{template_path.name}] = #{compiled_template};
22
- TEMPLATE
15
+ source = Config.content_provider.call( template_path.name )
16
+ if false == source
17
+ source = data
18
+ end
19
+ "#{LiquidAssets::Config.namespace}.Templates[#{template_path.name.dump}] = #{ TinyLiquid.compile( source ) };"
23
20
  end
24
21
 
25
22
  protected
@@ -38,15 +35,14 @@ module LiquidAssets
38
35
  end
39
36
 
40
37
  def name
41
- @name ||= relative_path.dump
38
+ @name ||= relative_path
42
39
  end
43
40
 
44
- private
45
41
 
46
42
  attr_accessor :template_path
47
43
 
48
44
  def relative_path
49
- @relative_path ||= template_path.gsub(/^#{LiquidAssets::Config.path_prefix}\/(.*)$/i, "\\1")
45
+ @relative_path ||= template_path.sub(/^#{LiquidAssets::Config.path_prefix}\/(.*)$/i, '\1' )
50
46
  end
51
47
  end
52
48
  end
@@ -0,0 +1,68 @@
1
+ require 'singleton'
2
+ require 'action_view'
3
+ require 'action_view/template'
4
+
5
+ module LiquidAssets
6
+ class Resolver < ActionView::Resolver
7
+
8
+ include Singleton
9
+
10
+ def to_s
11
+ 'LiquidAssets::Resolver'
12
+ end
13
+
14
+ def find_templates(name, prefix, partial, details)
15
+
16
+ source = Config.content_provider.call( name )
17
+ if false == source
18
+ return []
19
+ else
20
+ return [ make_template( source, normalize_path( prefix, name ), details, partial ) ]
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
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def normalize_path( prefix, name )
37
+ if prefix.present? && name.present?
38
+ prefix + '/' + name
39
+ elsif prefix.present?
40
+ prefix
41
+ else
42
+ name
43
+ end
44
+ end
45
+
46
+ def make_template( source, path, details, partial )
47
+ handler = ::ActionView::Template.registered_template_handler('.liquid')
48
+ details = {
49
+ :virtual_path => partial_path(path, partial ),
50
+ :locale => details[:locale].first.to_s,
51
+ :format => details[:formats].first.to_s,
52
+ :handler => details[:handlers].map(&:to_s),
53
+ :partial => partial || false
54
+ }
55
+ handler = ActionView::Template.registered_template_handler(:liquid)
56
+ return ActionView::Template.new(source, "LiquidTemplate - #{path}", handler, details)
57
+ end
58
+
59
+ def partial_path( path, partial )
60
+ return path if ! partial
61
+ if index.path.rindex('/') # had: gsub(/\/([^\/]+)$/,'/_\1')
62
+ path.insert(index+1,'_') # this is better
63
+ else
64
+ '_' + path
65
+ end
66
+ end
67
+ end
68
+ end
@@ -6,9 +6,6 @@ module LiquidAssets
6
6
  class TemplateHandler
7
7
 
8
8
  def self.call(template)
9
- # view_path = "#{template.virtual_path}_view"
10
- # abs_view_path = Rails.root.join('app/views', view_path)
11
- # Rails.logger.warn "looking for: #{abs_view_path}"
12
9
  return "LiquidAssets::TemplateHandler.new(self).render(#{template.source.inspect}, local_assigns)"
13
10
  end
14
11
 
@@ -19,27 +16,16 @@ module LiquidAssets
19
16
  def render(template, local_assigns = {})
20
17
  @view.controller.headers["Content-Type"] ||= 'text/html; charset=utf-8'
21
18
 
22
- assigns = @view.assigns
19
+ assigns = @view.assigns.dup
20
+ assigns.merge!( local_assigns.stringify_keys )
23
21
 
24
22
  if content = @view.content_for?(:layout)
25
23
  assigns["content_for_layout"] = content
26
24
  end
27
- assigns.merge!(local_assigns.stringify_keys)
28
-
29
- controller = @view.controller
30
- filters = if controller.respond_to?(:liquid_filters, true)
31
- controller.send(:liquid_filters)
32
- else
33
- Config.filters
34
- end
35
-
36
- liquid = ::Liquid::Template.parse(template)
37
- liquid.render(assigns,
38
- :filters => filters,
39
- :registers => {
40
- :action_view => @view,
41
- :controller => @view.controller
42
- } ).html_safe
25
+ LiquidAssets.parse(template).render( assigns, :registers=>{
26
+ :action_view => @view,
27
+ :controller => @view.controller
28
+ } ).html_safe
43
29
  end
44
30
 
45
31
  def compilable?
@@ -8,13 +8,17 @@ module LiquidAssets
8
8
 
9
9
  class << self
10
10
  def compile(source, options = {})
11
- js = context.eval("TinyLiquid.parse(#{source.inspect},{partials_namespace:'#{Config.template_namespace}'}).code")
12
- # js = context.eval("TinyLiquid.compile(#{source.inspect}, {original: true}).toString()")
13
- "function(locals,filters){
14
- var $_tmpbuf, $_html = LQT._FNS.html, $_err = LQT._FNS.err, $_rethrow=LQT._FNS.rethrow, $_merge=LQT._FNS.merge, $_range=LQT._FNS.range, $_array=LQT._FNS.array;
15
- #{js}
16
- return $_buf;
17
- }"
11
+ ns = ::LiquidAssets::Config.namespace
12
+ js = context.eval("TinyLiquid.parse(#{source.inspect},{namespace:'#{Config.namespace}'}).code")
13
+ <<-TEMPLATE
14
+ function(locals,filters){
15
+ var $_tmpbuf, $_html = #{ns}._FNS.html, $_err = #{ns}._FNS.err,
16
+ $_rethrow=#{ns}._FNS.rethrow, $_merge=#{ns}._FNS.merge,
17
+ $_range=#{ns}._FNS.range, $_array=#{ns}._FNS.array;
18
+ #{js}
19
+ return $_buf;
20
+ }
21
+ TEMPLATE
18
22
  end
19
23
 
20
24
  private
@@ -1,3 +1,3 @@
1
1
  module LiquidAssets
2
- VERSION = "0.1.0"
2
+ VERSION = "0.3.2"
3
3
  end