Class: Liquid::Template

Inherits:
Object
  • Object
show all
Defined in:
lib/liquid/template.rb

Overview

Templates are central to liquid. Interpretating templates is a two step process. First you compile the source code you got. During compile time some extensive error checking is performed. your code should expect to get some SyntaxErrors.

After you have a compiled template you can then render it. You can use a compiled template over and over again and keep it cached.

Example:

template = Liquid::Template.parse(source)
template.render('user_name' => 'bob')

Defined Under Namespace

Classes: TagRegistry

Constant Summary

DEFAULT_OPTIONS =
{
  :locale => I18n.new
}
@@file_system =
BlankFileSystem.new

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeTemplate



114
115
116
# File 'lib/liquid/template.rb', line 114

def initialize
  @resource_limits = ResourceLimits.new(self.class.default_resource_limits)
end

Class Attribute Details

.error_modeObject



87
88
89
# File 'lib/liquid/template.rb', line 87

def error_mode
  @error_mode || :lax
end

.taint_modeObject



91
92
93
# File 'lib/liquid/template.rb', line 91

def taint_mode
  @taint_mode || :lax
end

Instance Attribute Details

#profilerObject (readonly)

Returns the value of attribute profiler



56
57
58
# File 'lib/liquid/template.rb', line 56

def profiler
  @profiler
end

#resource_limitsObject (readonly)

Returns the value of attribute resource_limits



22
23
24
# File 'lib/liquid/template.rb', line 22

def resource_limits
  @resource_limits
end

#rootObject

Returns the value of attribute root



21
22
23
# File 'lib/liquid/template.rb', line 21

def root
  @root
end

Class Method Details

.default_resource_limitsObject



101
102
103
# File 'lib/liquid/template.rb', line 101

def default_resource_limits
  @default_resource_limits ||= {}
end

.file_systemObject



71
72
73
# File 'lib/liquid/template.rb', line 71

def file_system
  @@file_system
end

.file_system=(obj) ⇒ Object



75
76
77
# File 'lib/liquid/template.rb', line 75

def file_system=(obj)
  @@file_system = obj
end

.parse(source, options = {}) ⇒ Object

creates a new Template object from liquid source code To enable profiling, pass in profile: true as an option. See Liquid::Profiler for more information



108
109
110
111
# File 'lib/liquid/template.rb', line 108

def parse(source, options = {})
  template = Template.new
  template.parse(source, options)
end

.register_filter(mod) ⇒ Object

Pass a module with filter methods which should be available to all liquid views. Good for registering the standard library



97
98
99
# File 'lib/liquid/template.rb', line 97

def register_filter(mod)
  Strainer.global_filter(mod)
end

.register_tag(name, klass) ⇒ Object



79
80
81
# File 'lib/liquid/template.rb', line 79

def register_tag(name, klass)
  tags[name.to_s] = klass
end

.tagsObject



83
84
85
# File 'lib/liquid/template.rb', line 83

def tags
  @tags ||= TagRegistry.new
end

Instance Method Details

#assignsObject



138
139
140
# File 'lib/liquid/template.rb', line 138

def assigns
  @assigns ||= {}
end

#errorsObject



146
147
148
# File 'lib/liquid/template.rb', line 146

def errors
  @errors ||= []
end

#instance_assignsObject



142
143
144
# File 'lib/liquid/template.rb', line 142

def instance_assigns
  @instance_assigns ||= {}
end

#parse(source, options = {}) ⇒ Object

Parse source code. Returns self for easy chaining



120
121
122
123
124
125
126
127
# File 'lib/liquid/template.rb', line 120

def parse(source, options = {})
  @options = options
  @profiling = options[:profile]
  @line_numbers = options[:line_numbers] || @profiling
  @root = Document.parse(tokenize(source), DEFAULT_OPTIONS.merge(options))
  @warnings = nil
  self
end

#registersObject



134
135
136
# File 'lib/liquid/template.rb', line 134

def registers
  @registers ||= {}
end

#render(*args) ⇒ Object

Render takes a hash with local variables.

if you use the same filters over and over again consider registering them globally with Template.register_filter

if profiling was enabled in Template#parse then the resulting profiling information will be available via Template#profiler

Following options can be passed:

* <tt>filters</tt> : array with local filters
* <tt>registers</tt> : hash with register variables. Those can be accessed from
  filters and tags and might be useful to integrate liquid more with its host application


164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/liquid/template.rb', line 164

def render(*args)
  return ''.freeze if @root.nil?

  context = case args.first
  when Liquid::Context
    c = args.shift

    if @rethrow_errors
      c.exception_handler = ->(e) { true }
    end

    c
  when Liquid::Drop
    drop = args.shift
    drop.context = Context.new([drop, assigns], instance_assigns, registers, @rethrow_errors, @resource_limits)
  when Hash
    Context.new([args.shift, assigns], instance_assigns, registers, @rethrow_errors, @resource_limits)
  when nil
    Context.new(assigns, instance_assigns, registers, @rethrow_errors, @resource_limits)
  else
    raise ArgumentError, "Expected Hash or Liquid::Context as parameter"
  end

  case args.last
  when Hash
    options = args.pop

    if options[:registers].is_a?(Hash)
      self.registers.merge!(options[:registers])
    end

    if options[:filters]
      context.add_filters(options[:filters])
    end

    if options[:exception_handler]
      context.exception_handler = options[:exception_handler]
    end
  when Module
    context.add_filters(args.pop)
  when Array
    context.add_filters(args.pop)
  end

  # Retrying a render resets resource usage
  context.resource_limits.reset

  begin
    # render the nodelist.
    # for performance reasons we get an array back here. join will make a string out of it.
    result = with_profiling do
      @root.render(context)
    end
    result.respond_to?(:join) ? result.join : result
  rescue Liquid::MemoryError => e
    context.handle_error(e)
  ensure
    @errors = context.errors
  end
end

#render!(*args) ⇒ Object



225
226
227
228
# File 'lib/liquid/template.rb', line 225

def render!(*args)
  @rethrow_errors = true
  render(*args)
end

#warningsObject



129
130
131
132
# File 'lib/liquid/template.rb', line 129

def warnings
  return [] unless @root
  @warnings ||= @root.warnings
end