From 3d2aa05d64c71b77b16a98f13d1b2821584422a3 Mon Sep 17 00:00:00 2001 From: Matt Rose Date: Thu, 29 Sep 2022 11:35:46 -0400 Subject: [PATCH] Add ability to pass tags to parse_context Co-authored-by: Dylan Thacker-Smith --- Gemfile | 2 +- History.md | 3 +++ lib/liquid/block_body.rb | 8 ++------ lib/liquid/parse_context.rb | 3 ++- test/integration/tag_test.rb | 29 +++++++++++++++++++++++++++++ 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index 5a12d54a..c0c8fe09 100644 --- a/Gemfile +++ b/Gemfile @@ -22,6 +22,6 @@ group :test do gem 'rubocop-performance', require: false platform :mri, :truffleruby do - gem 'liquid-c', github: 'Shopify/liquid-c', ref: 'master' + gem 'liquid-c', github: 'Shopify/liquid-c', ref: 'parse-specific-tags' end end diff --git a/History.md b/History.md index 65e29243..536eed02 100644 --- a/History.md +++ b/History.md @@ -1,5 +1,8 @@ # Liquid Change Log +### Features +* Add ability to pass `tags` to parse context to take precedence over `Liquid::Template.tags` + ## 5.4.0 2022-07-29 ### Breaking Changes diff --git a/lib/liquid/block_body.rb b/lib/liquid/block_body.rb index a0d35a79..2b4855da 100644 --- a/lib/liquid/block_body.rb +++ b/lib/liquid/block_body.rb @@ -45,7 +45,7 @@ module Liquid end tag_name = Regexp.last_match(1) markup = Regexp.last_match(2) - unless (tag = registered_tags[tag_name]) + unless (tag = parse_context.tags[tag_name]) # end parsing if we reach an unknown tag and let the caller decide # determine how to proceed return yield tag_name, markup @@ -132,7 +132,7 @@ module Liquid next end - unless (tag = registered_tags[tag_name]) + unless (tag = parse_context.tags[tag_name]) # end parsing if we reach an unknown tag and let the caller decide # determine how to proceed return yield tag_name, markup @@ -247,9 +247,5 @@ module Liquid def raise_missing_variable_terminator(token, parse_context) BlockBody.raise_missing_variable_terminator(token, parse_context) end - - def registered_tags - Template.tags - end end end diff --git a/lib/liquid/parse_context.rb b/lib/liquid/parse_context.rb index 87570ad5..efb1aa97 100644 --- a/lib/liquid/parse_context.rb +++ b/lib/liquid/parse_context.rb @@ -2,7 +2,7 @@ module Liquid class ParseContext - attr_accessor :locale, :line_number, :trim_whitespace, :depth + attr_accessor :locale, :line_number, :trim_whitespace, :depth, :tags attr_reader :partial, :warnings, :error_mode def initialize(options = {}) @@ -10,6 +10,7 @@ module Liquid @locale = @template_options[:locale] ||= I18n.new @warnings = [] + @tags = @template_options[:tags] || Liquid::Template.tags self.depth = 0 self.partial = false diff --git a/test/integration/tag_test.rb b/test/integration/tag_test.rb index 6e28eb52..4391fb02 100644 --- a/test/integration/tag_test.rb +++ b/test/integration/tag_test.rb @@ -42,4 +42,33 @@ class TagTest < Minitest::Test assert_equal(buf.object_id, output.object_id) end end + + def test_tags_can_be_overwritten_using_parse_context + tag_name = 'testtag' + + original_tag = Class.new(Block) do + def render(*) + 'original_tag' + end + end + + new_tag = Class.new(Block) do + def render(*) + 'new_tag' + end + end + + tags_overwrite = Liquid::Template::TagRegistry.new + tags_overwrite[tag_name] = new_tag + + with_custom_tag(tag_name, original_tag) do + liquid = "{% #{tag_name} %} {% end#{tag_name} %}" + + template = Liquid::Template.parse(liquid) + assert_equal('original_tag', template.render) + + template_with_overwrite = Liquid::Template.parse(liquid, tags: tags_overwrite) + assert_equal('new_tag', template_with_overwrite.render) + end + end end