mirror of
https://github.com/Shopify/liquid.git
synced 2026-10-03 00:55:11 -07:00
Fix lax parsing expressions surrounded by spaces (#1335)
to make it compatible with strict parsing and liquid-c
This commit is contained in:
+19
-16
@@ -10,25 +10,28 @@ module Liquid
|
|||||||
'empty' => ''
|
'empty' => ''
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
SINGLE_QUOTED_STRING = /\A'(.*)'\z/m
|
SINGLE_QUOTED_STRING = /\A\s*'(.*)'\s*\z/m
|
||||||
DOUBLE_QUOTED_STRING = /\A"(.*)"\z/m
|
DOUBLE_QUOTED_STRING = /\A\s*"(.*)"\s*\z/m
|
||||||
INTEGERS_REGEX = /\A(-?\d+)\z/
|
INTEGERS_REGEX = /\A\s*(-?\d+)\s*\z/
|
||||||
FLOATS_REGEX = /\A(-?\d[\d\.]+)\z/
|
FLOATS_REGEX = /\A\s*(-?\d[\d\.]+)\s*\z/
|
||||||
RANGES_REGEX = /\A\((\S+)\.\.(\S+)\)\z/
|
RANGES_REGEX = /\A\s*\(\s*(\S+)\s*\.\.\s*(\S+)\s*\)\s*\z/
|
||||||
|
|
||||||
def self.parse(markup)
|
def self.parse(markup)
|
||||||
if LITERALS.key?(markup)
|
case markup
|
||||||
LITERALS[markup]
|
when nil
|
||||||
|
nil
|
||||||
|
when SINGLE_QUOTED_STRING, DOUBLE_QUOTED_STRING
|
||||||
|
Regexp.last_match(1)
|
||||||
|
when INTEGERS_REGEX
|
||||||
|
Regexp.last_match(1).to_i
|
||||||
|
when RANGES_REGEX
|
||||||
|
RangeLookup.parse(Regexp.last_match(1), Regexp.last_match(2))
|
||||||
|
when FLOATS_REGEX
|
||||||
|
Regexp.last_match(1).to_f
|
||||||
else
|
else
|
||||||
case markup
|
markup = markup.strip
|
||||||
when SINGLE_QUOTED_STRING, DOUBLE_QUOTED_STRING
|
if LITERALS.key?(markup)
|
||||||
Regexp.last_match(1)
|
LITERALS[markup]
|
||||||
when INTEGERS_REGEX
|
|
||||||
Regexp.last_match(1).to_i
|
|
||||||
when RANGES_REGEX
|
|
||||||
RangeLookup.parse(Regexp.last_match(1), Regexp.last_match(2))
|
|
||||||
when FLOATS_REGEX
|
|
||||||
Regexp.last_match(1).to_f
|
|
||||||
else
|
else
|
||||||
VariableLookup.parse(markup)
|
VariableLookup.parse(markup)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class ExpressionTest < Minitest::Test
|
||||||
|
def test_keyword_literals
|
||||||
|
assert_equal(true, parse_and_eval("true"))
|
||||||
|
assert_equal(true, parse_and_eval(" true "))
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_string
|
||||||
|
assert_equal("single quoted", parse_and_eval("'single quoted'"))
|
||||||
|
assert_equal("double quoted", parse_and_eval('"double quoted"'))
|
||||||
|
assert_equal("spaced", parse_and_eval(" 'spaced' "))
|
||||||
|
assert_equal("spaced2", parse_and_eval(' "spaced2" '))
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_int
|
||||||
|
assert_equal(123, parse_and_eval("123"))
|
||||||
|
assert_equal(456, parse_and_eval(" 456 "))
|
||||||
|
assert_equal(12, parse_and_eval("012"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_float
|
||||||
|
assert_equal(1.5, parse_and_eval("1.5"))
|
||||||
|
assert_equal(2.5, parse_and_eval(" 2.5 "))
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_range
|
||||||
|
assert_equal(1..2, parse_and_eval("(1..2)"))
|
||||||
|
assert_equal(3..4, parse_and_eval(" ( 3 .. 4 ) "))
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def parse_and_eval(markup, **assigns)
|
||||||
|
if Liquid::Template.error_mode == :strict
|
||||||
|
p = Liquid::Parser.new(markup)
|
||||||
|
markup = p.expression
|
||||||
|
p.consume(:end_of_string)
|
||||||
|
end
|
||||||
|
expression = Liquid::Expression.parse(markup)
|
||||||
|
context = Liquid::Context.new(assigns)
|
||||||
|
context.evaluate(expression)
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user