Class: Liquid::StrainerTemplate
- Inherits:
-
Object
- Object
- Liquid::StrainerTemplate
- Defined in:
- lib/liquid/strainer_template.rb
Overview
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
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(context) ⇒ StrainerTemplate
constructor
A new instance of StrainerTemplate.
- #invoke(method, *args) ⇒ Object
Constructor Details
#initialize(context) ⇒ StrainerTemplate
Returns a new instance of StrainerTemplate.
12 13 14 |
# File 'lib/liquid/strainer_template.rb', line 12 def initialize(context) @context = context end |
Class Method Details
.add_filter(filter) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 |
# 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) ⇒ Boolean
30 31 32 |
# File 'lib/liquid/strainer_template.rb', line 30 def invokable?(method) filter_methods.include?(method.to_s) end |
Instance Method Details
#invoke(method, *args) ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 |
# 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., e.backtrace end |