mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-16 17:30:43 -07:00
Extract Parser#range_lookup out of Expression.parse
This commit is contained in:
+12
-1
@@ -58,8 +58,10 @@ module Liquid
|
|||||||
string
|
string
|
||||||
when :number
|
when :number
|
||||||
number
|
number
|
||||||
|
when :open_round
|
||||||
|
range_lookup
|
||||||
else
|
else
|
||||||
parse_expression(expression_string)
|
raise SyntaxError, "#{token} is not a valid expression"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -88,6 +90,15 @@ module Liquid
|
|||||||
VariableLookup.new(name, lookups, command_flags)
|
VariableLookup.new(name, lookups, command_flags)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def range_lookup
|
||||||
|
consume(:open_round)
|
||||||
|
first = expression
|
||||||
|
consume(:dotdot)
|
||||||
|
last = expression
|
||||||
|
consume(:close_round)
|
||||||
|
RangeLookup.create(first, last)
|
||||||
|
end
|
||||||
|
|
||||||
def expression_string
|
def expression_string
|
||||||
token = @tokens[@p]
|
token = @tokens[@p]
|
||||||
case token[0]
|
case token[0]
|
||||||
|
|||||||
@@ -2,13 +2,15 @@
|
|||||||
|
|
||||||
module Liquid
|
module Liquid
|
||||||
class RangeLookup
|
class RangeLookup
|
||||||
def self.create(start_obj, end_obj, start_markup, end_markup)
|
def self.create(start_obj, end_obj, start_markup = nil, end_markup = nil)
|
||||||
if start_obj.respond_to?(:evaluate) || end_obj.respond_to?(:evaluate)
|
if start_obj.respond_to?(:evaluate) || end_obj.respond_to?(:evaluate)
|
||||||
new(start_obj, end_obj)
|
new(start_obj, end_obj)
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
start_obj.to_i..end_obj.to_i
|
start_obj.to_i..end_obj.to_i
|
||||||
rescue NoMethodError
|
rescue NoMethodError
|
||||||
|
start_markup = start_obj.to_s unless start_markup
|
||||||
|
end_markup = end_obj.to_s unless end_markup
|
||||||
invalid_expr = start_markup unless start_obj.respond_to?(:to_i)
|
invalid_expr = start_markup unless start_obj.respond_to?(:to_i)
|
||||||
invalid_expr ||= end_markup unless end_obj.respond_to?(:to_i)
|
invalid_expr ||= end_markup unless end_obj.respond_to?(:to_i)
|
||||||
if invalid_expr
|
if invalid_expr
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class ExpressionTest < Minitest::Test
|
|||||||
"{{ (false..true) }}",
|
"{{ (false..true) }}",
|
||||||
)
|
)
|
||||||
assert_match_syntax_error(
|
assert_match_syntax_error(
|
||||||
"Liquid syntax error (line 1): Invalid expression type '(1..2)' in range expression",
|
"Liquid syntax error (line 1): Invalid expression type '1..2' in range expression",
|
||||||
"{{ ((1..2)..3) }}",
|
"{{ ((1..2)..3) }}",
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -102,6 +102,15 @@ class ParserUnitTest < Minitest::Test
|
|||||||
assert_equal('title', v.lookups[0])
|
assert_equal('title', v.lookups[0])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_range_lookup
|
||||||
|
p = new_parser('(0..5) (a..b)')
|
||||||
|
assert_equal((0..5), p.expression)
|
||||||
|
|
||||||
|
r2 = p.expression
|
||||||
|
assert(r2.is_a?(RangeLookup))
|
||||||
|
assert_equal((1..4), r2.evaluate(Context.new({ 'a' => 1, 'b' => 4 })))
|
||||||
|
end
|
||||||
|
|
||||||
def test_ranges
|
def test_ranges
|
||||||
p = new_parser("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)")
|
p = new_parser("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)")
|
||||||
assert_equal('(5..7)', p.expression_string)
|
assert_equal('(5..7)', p.expression_string)
|
||||||
|
|||||||
Reference in New Issue
Block a user