Class: Liquid::Context

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

Overview

Context keeps the variable stack and resolves variables, as well as keywords

context['variable'] = 'testing'
context['variable'] #=> 'testing'
context['true']     #=> true
context['10.2232']  #=> 10.2232

context.stack do
   context['bob'] = 'bobsen'
end

context['bob']  #=> nil  class Context

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(environments = {}, outer_scope = {}, registers = {}, rethrow_errors = false) ⇒ Context

Returns a new instance of Context.



18
19
20
21
22
23
24
25
26
27
# File 'lib/liquid/context.rb', line 18

def initialize(environments = {}, outer_scope = {}, registers = {}, rethrow_errors = false)
  @environments   = [environments].flatten
  @scopes         = [(outer_scope || {})]
  @registers      = registers
  @errors         = []
  @rethrow_errors = rethrow_errors
  squash_instance_assigns_with_environments

  @interrupts = []
end

Instance Attribute Details

#environmentsObject (readonly)

Returns the value of attribute environments.



16
17
18
# File 'lib/liquid/context.rb', line 16

def environments
  @environments
end

#errorsObject (readonly)

Returns the value of attribute errors.



16
17
18
# File 'lib/liquid/context.rb', line 16

def errors
  @errors
end

#registersObject (readonly)

Returns the value of attribute registers.



16
17
18
# File 'lib/liquid/context.rb', line 16

def registers
  @registers
end

#scopesObject (readonly)

Returns the value of attribute scopes.



16
17
18
# File 'lib/liquid/context.rb', line 16

def scopes
  @scopes
end

Instance Method Details

#[](key) ⇒ Object



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

def [](key)
  resolve(key)
end

#[]=(key, value) ⇒ Object

Only allow String, Numeric, Hash, Array, Proc, Boolean or Liquid::Drop



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

def []=(key, value)
  @scopes[0][key] = value
end

#add_filters(filters) ⇒ Object

Adds filters to this context.

Note that this does not register the filters with the main Template object. see Template.register_filter for that



37
38
39
40
41
42
43
44
# File 'lib/liquid/context.rb', line 37

def add_filters(filters)
  filters = [filters].flatten.compact

  filters.each do |f|
    raise ArgumentError, "Expected module but got: #{f.class}" unless f.is_a?(Module)
    strainer.extend(f)
  end
end

#clear_instance_assignsObject



113
114
115
# File 'lib/liquid/context.rb', line 113

def clear_instance_assigns
  @scopes[0] = {}
end

#handle_error(e) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/liquid/context.rb', line 61

def handle_error(e)
  errors.push(e)
  raise if @rethrow_errors

  case e
  when SyntaxError
    "Liquid syntax error: #{e.message}"
  else
    "Liquid error: #{e.message}"
  end
end

#has_interrupt?Boolean

are there any not handled interrupts?

Returns:

  • (Boolean)


47
48
49
# File 'lib/liquid/context.rb', line 47

def has_interrupt?
  !@interrupts.empty?
end

#has_key?(key) ⇒ Boolean

Returns:

  • (Boolean)


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

def has_key?(key)
  resolve(key) != nil
end

#invoke(method, *args) ⇒ Object



73
74
75
76
77
78
79
# File 'lib/liquid/context.rb', line 73

def invoke(method, *args)
  if strainer.respond_to?(method)
    strainer.__send__(method, *args)
  else
    args.first
  end
end

#merge(new_scopes) ⇒ Object

Merge a hash of variables in the current local scope



88
89
90
# File 'lib/liquid/context.rb', line 88

def merge(new_scopes)
  @scopes[0].merge!(new_scopes)
end

#popObject

Pop from the stack. use Context#stack instead

Raises:



93
94
95
96
# File 'lib/liquid/context.rb', line 93

def pop
  raise ContextError if @scopes.size == 1
  @scopes.shift
end

#pop_interruptObject

pop an interrupt from the stack



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

def pop_interrupt
  @interrupts.pop
end

#push(new_scope = {}) ⇒ Object

Push new local scope on the stack. use Context#stack instead

Raises:



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

def push(new_scope={})
  @scopes.unshift(new_scope)
  raise StackLevelError, "Nesting too deep" if @scopes.length > 100
end

#push_interrupt(e) ⇒ Object

push an interrupt to the stack. this interrupt is considered not handled.



52
53
54
# File 'lib/liquid/context.rb', line 52

def push_interrupt(e)
  @interrupts.push(e)
end

#stack(new_scope = {}) ⇒ Object

Pushes a new local scope on the stack, pops it at the end of the block

Example:

context.stack do
   context['var'] = 'hi'
end

context['var]  #=> nil


106
107
108
109
110
111
# File 'lib/liquid/context.rb', line 106

def stack(new_scope={})
  push(new_scope)
  yield
ensure
  pop
end

#strainerObject



29
30
31
# File 'lib/liquid/context.rb', line 29

def strainer
  @strainer ||= Strainer.create(self)
end