Disable rendering of tag based on register

This commit is contained in:
Mike Angell
2019-09-18 18:33:19 +10:00
parent adb40c41b7
commit a39eb8581a
7 changed files with 59 additions and 0 deletions

View File

@@ -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 }

View File

@@ -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
View File

@@ -0,0 +1,6 @@
# frozen_string_literal: true
module Liquid
class Register
end
end

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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