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-render-tag/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-render-tag/strainer_template.rb, line 30 def invokable?(method) filter_methods.include?(method.to_s) end
new(context)
click to toggle source
# File lib/liquid-render-tag/strainer_template.rb, line 12 def initialize(context) @context = context end
Private Class Methods
filter_methods()
click to toggle source
# File lib/liquid-render-tag/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-render-tag/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