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

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeTemplate

Returns a new instance of Template.


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

def initialize
  @rethrow_errors  = false
  @resource_limits = ResourceLimits.new(Template.default_resource_limits)
end

Class Attribute Details

.default_exception_rendererObject

Returns the value of attribute default_exception_renderer


67
68
69
# File 'lib/liquid/template.rb', line 67

def default_exception_renderer
  @default_exception_renderer
end

.default_resource_limitsObject

Returns the value of attribute default_resource_limits


89
90
91
# File 'lib/liquid/template.rb', line 89

def default_resource_limits
  @default_resource_limits
end

.error_modeObject

Sets how strict the parser should be. :lax acts like liquid 2.5 and silently ignores malformed tags in most cases. :warn is the default and will give deprecation warnings when invalid syntax is used. :strict will enforce correct syntax.


64
65
66
# File 'lib/liquid/template.rb', line 64

def error_mode
  @error_mode
end

.file_systemObject

Returns the value of attribute file_system


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

def file_system
  @file_system
end

.tagsObject

Returns the value of attribute tags


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

def tags
  @tags
end

Instance Attribute Details

#profilerObject (readonly)

Returns the value of attribute profiler


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

def profiler
  @profiler
end

#resource_limitsObject (readonly)

Returns the value of attribute resource_limits


19
20
21
# File 'lib/liquid/template.rb', line 19

def resource_limits
  @resource_limits
end

#rootObject

Returns the value of attribute root


18
19
20
# File 'lib/liquid/template.rb', line 18

def root
  @root
end

#warningsObject (readonly)

Returns the value of attribute warnings


19
20
21
# File 'lib/liquid/template.rb', line 19

def warnings
  @warnings
end

Class Method Details

.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


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

def parse(source, options = {})
  new.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


85
86
87
# File 'lib/liquid/template.rb', line 85

def register_filter(mod)
  StrainerFactory.add_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

Instance Method Details

#assignsObject


122
123
124
# File 'lib/liquid/template.rb', line 122

def assigns
  @assigns ||= {}
end

#errorsObject


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

def errors
  @errors ||= []
end

#instance_assignsObject


126
127
128
# File 'lib/liquid/template.rb', line 126

def instance_assigns
  @instance_assigns ||= {}
end

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

Parse source code. Returns self for easy chaining


108
109
110
111
112
113
114
115
116
# File 'lib/liquid/template.rb', line 108

def parse(source, options = {})
  @options      = options
  @profiling    = options[:profile]
  @line_numbers = options[:line_numbers] || @profiling
  parse_context = options.is_a?(ParseContext) ? options : ParseContext.new(options)
  @root         = Document.parse(tokenize(source), parse_context)
  @warnings     = parse_context.warnings
  self
end

#registersObject


118
119
120
# File 'lib/liquid/template.rb', line 118

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

148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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
# File 'lib/liquid/template.rb', line 148

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

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

    if @rethrow_errors
      c.exception_renderer = ->(_e) { raise }
    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

  output = nil

  context_register = context.registers.is_a?(StaticRegisters) ? context.registers.static : context.registers

  case args.last
  when Hash
    options = args.pop
    output  = options[:output] if options[:output]

    options[:registers]&.each do |key, register|
      context_register[key] = register
    end

    apply_options_to_context(context, options)
  when Module, 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.
    with_profiling(context) do
      @root.render_to_output_buffer(context, output || +'')
    end
  rescue Liquid::MemoryError => e
    context.handle_error(e)
  ensure
    @errors = context.errors
  end
end

#render!(*args) ⇒ Object


205
206
207
208
# File 'lib/liquid/template.rb', line 205

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

#render_to_output_buffer(context, output) ⇒ Object


210
211
212
# File 'lib/liquid/template.rb', line 210

def render_to_output_buffer(context, output)
  render(context, output: output)
end