mirror of
https://github.com/kemko/liquid.git
synced 2026-01-01 15:55:40 +03:00
Disable rendering of tag based on register
This commit is contained in:
@@ -78,8 +78,10 @@ require 'liquid/tokenizer'
|
||||
require 'liquid/parse_context'
|
||||
require 'liquid/partial_cache'
|
||||
require 'liquid/usage'
|
||||
require 'liquid/register'
|
||||
require 'liquid/static_registers'
|
||||
|
||||
# Load all the tags of the standard library
|
||||
#
|
||||
Dir["#{__dir__}/liquid/tags/*.rb"].each { |f| require f }
|
||||
Dir["#{__dir__}/liquid/registers/*.rb"].each { |f| require f }
|
||||
|
||||
@@ -25,3 +25,5 @@
|
||||
render: "Syntax error in tag 'render' - Template name must be a quoted string"
|
||||
argument:
|
||||
include: "Argument error in tag 'include' - Illegal template name"
|
||||
disabled:
|
||||
include: "'include' usage has been disabled in this context, consider using 'render'."
|
||||
|
||||
6
lib/liquid/register.rb
Normal file
6
lib/liquid/register.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Liquid
|
||||
class Register
|
||||
end
|
||||
end
|
||||
31
lib/liquid/registers/disabled_tags.rb
Normal file
31
lib/liquid/registers/disabled_tags.rb
Normal file
@@ -0,0 +1,31 @@
|
||||
# frozen_string_literal: true
|
||||
module Liquid
|
||||
class DisabledTags < Register
|
||||
def initialize
|
||||
@disabled_tags = Hash.new { |h, k| h[k] = 0 }
|
||||
end
|
||||
|
||||
def disabled?(tag)
|
||||
@disabled_tags[tag] > 0
|
||||
end
|
||||
|
||||
def disable(tag)
|
||||
incr(tag)
|
||||
yield
|
||||
ensure
|
||||
decr(tag)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def incr(tag)
|
||||
@disabled_tags[tag] = @disabled_tags[tag] + 1
|
||||
end
|
||||
|
||||
def decr(tag)
|
||||
@disabled_tags[tag] = @disabled_tags[tag] - 1
|
||||
end
|
||||
end
|
||||
|
||||
Template.register_register('disabled_tags', DisabledTags.new)
|
||||
end
|
||||
@@ -45,6 +45,7 @@ module Liquid
|
||||
end
|
||||
|
||||
def render_to_output_buffer(context, output)
|
||||
return output << options[:locale].t("errors.disabled.include") if context.registers['disabled_tags']&.disabled?('include')
|
||||
template_name = context.evaluate(@template_name_expr)
|
||||
raise ArgumentError, options[:locale].t("errors.argument.include") unless template_name
|
||||
|
||||
|
||||
@@ -22,6 +22,13 @@ module Liquid
|
||||
end
|
||||
|
||||
def render_to_output_buffer(context, output)
|
||||
context.registers['disabled_tags']&.disable('include') do
|
||||
return render_tag(context, output)
|
||||
end
|
||||
render_tag(context, output)
|
||||
end
|
||||
|
||||
def render_tag(context, output)
|
||||
# Though we evaluate this here we will only ever parse it as a string literal.
|
||||
template_name = context.evaluate(@template_name_expr)
|
||||
raise ArgumentError, options[:locale].t("errors.argument.include") unless template_name
|
||||
|
||||
@@ -92,6 +92,14 @@ module Liquid
|
||||
@tags ||= TagRegistry.new
|
||||
end
|
||||
|
||||
def register_register(name, klass)
|
||||
registers[name.to_s] = klass
|
||||
end
|
||||
|
||||
def registers
|
||||
@registers ||= {}
|
||||
end
|
||||
|
||||
def error_mode
|
||||
@error_mode ||= :lax
|
||||
end
|
||||
@@ -203,6 +211,8 @@ module Liquid
|
||||
context.add_filters(args.pop)
|
||||
end
|
||||
|
||||
registers.merge!(Template.registers) if Template.registers.is_a?(Hash)
|
||||
|
||||
# Retrying a render resets resource usage
|
||||
context.resource_limits.reset
|
||||
|
||||
|
||||
Reference in New Issue
Block a user