class Liquid::StrainerTemplate

StrainerTemplate is the computed class for the filters system. New filters are mixed into the strainer class which is then instantiated for each liquid template render run.

The Strainer only allows method calls defined in filters given to it via StrainerFactory.add_global_filter, Context#add_filters or Template.register_filter

Public Class Methods

add_filter(filter) click to toggle source
# File lib/liquid/strainer_template.rb, line 17
def add_filter(filter)
  return if include?(filter)

  invokable_non_public_methods = (filter.private_instance_methods + filter.protected_instance_methods).select { |m| invokable?(m) }
  if invokable_non_public_methods.any?
    raise MethodOverrideError, "Filter overrides registered public methods as non public: #{invokable_non_public_methods.join(', ')}"
  end

  include(filter)

  filter_methods.merge(filter.public_instance_methods.map(&:to_s))
end
invokable?(method) click to toggle source
# File lib/liquid/strainer_template.rb, line 30
def invokable?(method)
  filter_methods.include?(method.to_s)
end
new(context) click to toggle source
# File lib/liquid/strainer_template.rb, line 12
def initialize(context)
  @context = context
end

Private Class Methods

filter_methods() click to toggle source
# File lib/liquid/strainer_template.rb, line 36
def filter_methods
  @filter_methods ||= Set.new
end

Public Instance Methods

invoke(method, *args) click to toggle source
# File lib/liquid/strainer_template.rb, line 41
def invoke(method, *args)
  if self.class.invokable?(method)
    send(method, *args)
  elsif @context.strict_filters
    raise Liquid::UndefinedFilter, "undefined filter #{method}"
  else
    args.first
  end
rescue ::ArgumentError => e
  raise Liquid::ArgumentError, e.message, e.backtrace
end