From b08e6c383976fe66dbf6a9438d72f309c1664f45 Mon Sep 17 00:00:00 2001 From: Dylan Thacker-Smith Date: Mon, 26 Oct 2020 17:08:08 -0400 Subject: [PATCH] Add Liquid::ParseContext#parse_expression for liquid-c node disabling We would like to be able to disable liquid-c VM rendering at runtime, but right now expresion parsing is done using Expression.parse, which isn't aware of the parse context. That prevents us from conditionally compiling to VM code based on a parse option. --- lib/liquid/condition.rb | 4 ++-- lib/liquid/parse_context.rb | 4 ++++ lib/liquid/tag.rb | 6 ++++++ lib/liquid/tags/case.rb | 4 ++-- lib/liquid/tags/cycle.rb | 4 ++-- lib/liquid/tags/for.rb | 8 ++++---- lib/liquid/tags/if.rb | 2 +- lib/liquid/tags/include.rb | 6 +++--- lib/liquid/tags/render.rb | 6 +++--- lib/liquid/tags/table_row.rb | 4 ++-- 10 files changed, 29 insertions(+), 19 deletions(-) diff --git a/lib/liquid/condition.rb b/lib/liquid/condition.rb index 56900c7f0..8b7dd65fc 100644 --- a/lib/liquid/condition.rb +++ b/lib/liquid/condition.rb @@ -45,8 +45,8 @@ def self.operators @@operators end - def self.parse_expression(markup) - @@method_literals[markup] || Expression.parse(markup) + def self.parse_expression(parse_context, markup) + @@method_literals[markup] || parse_context.parse_expression(markup) end attr_reader :attachment, :child_condition diff --git a/lib/liquid/parse_context.rb b/lib/liquid/parse_context.rb index 4724ec221..f8fb9b010 100644 --- a/lib/liquid/parse_context.rb +++ b/lib/liquid/parse_context.rb @@ -23,6 +23,10 @@ def new_block_body Liquid::BlockBody.new end + def parse_expression(markup) + Expression.parse(markup) + end + def partial=(value) @partial = value @options = value ? partial_options : @template_options diff --git a/lib/liquid/tag.rb b/lib/liquid/tag.rb index bd77335b1..085c0efc5 100644 --- a/lib/liquid/tag.rb +++ b/lib/liquid/tag.rb @@ -55,5 +55,11 @@ def render_to_output_buffer(context, output) def blank? false end + + private + + def parse_expression(markup) + parse_context.parse_expression(markup) + end end end diff --git a/lib/liquid/tags/case.rb b/lib/liquid/tags/case.rb index b46fa0592..5dc3cb338 100644 --- a/lib/liquid/tags/case.rb +++ b/lib/liquid/tags/case.rb @@ -12,7 +12,7 @@ def initialize(tag_name, markup, options) @blocks = [] if markup =~ Syntax - @left = Expression.parse(Regexp.last_match(1)) + @left = parse_expression(Regexp.last_match(1)) else raise SyntaxError, options[:locale].t("errors.syntax.case") end @@ -68,7 +68,7 @@ def record_when_condition(markup) markup = Regexp.last_match(2) - block = Condition.new(@left, '==', Condition.parse_expression(Regexp.last_match(1))) + block = Condition.new(@left, '==', Condition.parse_expression(parse_context, Regexp.last_match(1))) block.attach(body) @blocks << block end diff --git a/lib/liquid/tags/cycle.rb b/lib/liquid/tags/cycle.rb index 6aee14c02..96f0d570e 100644 --- a/lib/liquid/tags/cycle.rb +++ b/lib/liquid/tags/cycle.rb @@ -24,7 +24,7 @@ def initialize(tag_name, markup, options) case markup when NamedSyntax @variables = variables_from_string(Regexp.last_match(2)) - @name = Expression.parse(Regexp.last_match(1)) + @name = parse_expression(Regexp.last_match(1)) when SimpleSyntax @variables = variables_from_string(markup) @name = @variables.to_s @@ -61,7 +61,7 @@ def render_to_output_buffer(context, output) def variables_from_string(markup) markup.split(',').collect do |var| var =~ /\s*(#{QuotedFragment})\s*/o - Regexp.last_match(1) ? Expression.parse(Regexp.last_match(1)) : nil + Regexp.last_match(1) ? parse_expression(Regexp.last_match(1)) : nil end.compact end diff --git a/lib/liquid/tags/for.rb b/lib/liquid/tags/for.rb index 6f66ebd57..d92fa6897 100644 --- a/lib/liquid/tags/for.rb +++ b/lib/liquid/tags/for.rb @@ -97,7 +97,7 @@ def lax_parse(markup) collection_name = Regexp.last_match(2) @reversed = !!Regexp.last_match(3) @name = "#{@variable_name}-#{collection_name}" - @collection_name = Expression.parse(collection_name) + @collection_name = parse_expression(collection_name) markup.scan(TagAttributes) do |key, value| set_attribute(key, value) end @@ -112,7 +112,7 @@ def strict_parse(markup) raise SyntaxError, options[:locale].t("errors.syntax.for_invalid_in") unless p.id?('in') collection_name = p.expression - @collection_name = Expression.parse(collection_name) + @collection_name = parse_expression(collection_name) @name = "#{@variable_name}-#{collection_name}" @reversed = p.id?('reversed') @@ -198,10 +198,10 @@ def set_attribute(key, expr) @from = if expr == 'continue' :continue else - Expression.parse(expr) + parse_expression(expr) end when 'limit' - @limit = Expression.parse(expr) + @limit = parse_expression(expr) end end diff --git a/lib/liquid/tags/if.rb b/lib/liquid/tags/if.rb index aa437b169..90692fd46 100644 --- a/lib/liquid/tags/if.rb +++ b/lib/liquid/tags/if.rb @@ -71,7 +71,7 @@ def push_block(tag, markup) end def parse_expression(markup) - Condition.parse_expression(markup) + Condition.parse_expression(parse_context, markup) end def lax_parse(markup) diff --git a/lib/liquid/tags/include.rb b/lib/liquid/tags/include.rb index f697e513a..1a315443b 100644 --- a/lib/liquid/tags/include.rb +++ b/lib/liquid/tags/include.rb @@ -32,12 +32,12 @@ def initialize(tag_name, markup, options) variable_name = Regexp.last_match(3) @alias_name = Regexp.last_match(5) - @variable_name_expr = variable_name ? Expression.parse(variable_name) : nil - @template_name_expr = Expression.parse(template_name) + @variable_name_expr = variable_name ? parse_expression(variable_name) : nil + @template_name_expr = parse_expression(template_name) @attributes = {} markup.scan(TagAttributes) do |key, value| - @attributes[key] = Expression.parse(value) + @attributes[key] = parse_expression(value) end else diff --git a/lib/liquid/tags/render.rb b/lib/liquid/tags/render.rb index 8ce560ab9..6380249c9 100644 --- a/lib/liquid/tags/render.rb +++ b/lib/liquid/tags/render.rb @@ -19,13 +19,13 @@ def initialize(tag_name, markup, options) variable_name = Regexp.last_match(4) @alias_name = Regexp.last_match(6) - @variable_name_expr = variable_name ? Expression.parse(variable_name) : nil - @template_name_expr = Expression.parse(template_name) + @variable_name_expr = variable_name ? parse_expression(variable_name) : nil + @template_name_expr = parse_expression(template_name) @for = (with_or_for == FOR) @attributes = {} markup.scan(TagAttributes) do |key, value| - @attributes[key] = Expression.parse(value) + @attributes[key] = parse_expression(value) end end diff --git a/lib/liquid/tags/table_row.rb b/lib/liquid/tags/table_row.rb index 353f9e388..eda0bc463 100644 --- a/lib/liquid/tags/table_row.rb +++ b/lib/liquid/tags/table_row.rb @@ -10,10 +10,10 @@ def initialize(tag_name, markup, options) super if markup =~ Syntax @variable_name = Regexp.last_match(1) - @collection_name = Expression.parse(Regexp.last_match(2)) + @collection_name = parse_expression(Regexp.last_match(2)) @attributes = {} markup.scan(TagAttributes) do |key, value| - @attributes[key] = Expression.parse(value) + @attributes[key] = parse_expression(value) end else raise SyntaxError, options[:locale].t("errors.syntax.table_row")