mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-18 18:30:40 -07:00
assign regex to a constant
This commit is contained in:
@@ -2,6 +2,7 @@ module Liquid
|
|||||||
class BlockBody
|
class BlockBody
|
||||||
FullToken = /\A#{TagStart}#{WhitespaceControl}?\s*(\w+)\s*(.*?)#{WhitespaceControl}?#{TagEnd}\z/om
|
FullToken = /\A#{TagStart}#{WhitespaceControl}?\s*(\w+)\s*(.*?)#{WhitespaceControl}?#{TagEnd}\z/om
|
||||||
ContentOfVariable = /\A#{VariableStart}#{WhitespaceControl}?(.*?)#{WhitespaceControl}?#{VariableEnd}\z/om
|
ContentOfVariable = /\A#{VariableStart}#{WhitespaceControl}?(.*?)#{WhitespaceControl}?#{VariableEnd}\z/om
|
||||||
|
WhitespaceOrNothing = /\A\s*\z/
|
||||||
TAGSTART = "{%".freeze
|
TAGSTART = "{%".freeze
|
||||||
VARSTART = "{{".freeze
|
VARSTART = "{{".freeze
|
||||||
|
|
||||||
@@ -43,7 +44,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
parse_context.trim_whitespace = false
|
parse_context.trim_whitespace = false
|
||||||
@nodelist << token
|
@nodelist << token
|
||||||
@blank &&= !!(token =~ /\A\s*\z/)
|
@blank &&= !!(token =~ WhitespaceOrNothing)
|
||||||
end
|
end
|
||||||
parse_context.line_number = tokenizer.line_number
|
parse_context.line_number = tokenizer.line_number
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -21,20 +21,24 @@ module Liquid
|
|||||||
'empty'.freeze => MethodLiteral.new(:empty?, '').freeze
|
'empty'.freeze => MethodLiteral.new(:empty?, '').freeze
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SINGLE_QUOTED_STRING = /\A'(.*)'\z/m
|
||||||
|
DOUBLE_QUOTED_STRING = /\A"(.*)"\z/m
|
||||||
|
INTEGERS_REGEX = /\A(-?\d+)\z/
|
||||||
|
FLOATS_REGEX = /\A(-?\d+\.\d+)\z/
|
||||||
|
RANGES_REGEX = /\A\((\S+)\.\.(\S+)\)\z/
|
||||||
|
|
||||||
def self.parse(markup)
|
def self.parse(markup)
|
||||||
if LITERALS.key?(markup)
|
if LITERALS.key?(markup)
|
||||||
LITERALS[markup]
|
LITERALS[markup]
|
||||||
else
|
else
|
||||||
case markup
|
case markup
|
||||||
when /\A'(.*)'\z/m # Single quoted strings
|
when SINGLE_QUOTED_STRING, DOUBLE_QUOTED_STRING
|
||||||
$1
|
$1
|
||||||
when /\A"(.*)"\z/m # Double quoted strings
|
when INTEGERS_REGEX
|
||||||
$1
|
|
||||||
when /\A(-?\d+)\z/ # Integer and floats
|
|
||||||
$1.to_i
|
$1.to_i
|
||||||
when /\A\((\S+)\.\.(\S+)\)\z/ # Ranges
|
when RANGES_REGEX
|
||||||
RangeLookup.parse($1, $2)
|
RangeLookup.parse($1, $2)
|
||||||
when /\A(-?\d[\d\.]+)\z/ # Floats
|
when FLOATS_REGEX
|
||||||
$1.to_f
|
$1.to_f
|
||||||
else
|
else
|
||||||
VariableLookup.parse(markup)
|
VariableLookup.parse(markup)
|
||||||
|
|||||||
+2
-1
@@ -19,6 +19,7 @@ module Liquid
|
|||||||
NUMBER_LITERAL = /-?\d+(\.\d+)?/
|
NUMBER_LITERAL = /-?\d+(\.\d+)?/
|
||||||
DOTDOT = /\.\./
|
DOTDOT = /\.\./
|
||||||
COMPARISON_OPERATOR = /==|!=|<>|<=?|>=?|contains(?=\s)/
|
COMPARISON_OPERATOR = /==|!=|<>|<=?|>=?|contains(?=\s)/
|
||||||
|
WHITESPACE_OR_NOTHING = /\s*/
|
||||||
|
|
||||||
def initialize(input)
|
def initialize(input)
|
||||||
@ss = StringScanner.new(input)
|
@ss = StringScanner.new(input)
|
||||||
@@ -28,7 +29,7 @@ module Liquid
|
|||||||
@output = []
|
@output = []
|
||||||
|
|
||||||
until @ss.eos?
|
until @ss.eos?
|
||||||
@ss.skip(/\s*/)
|
@ss.skip(WHITESPACE_OR_NOTHING)
|
||||||
break if @ss.eos?
|
break if @ss.eos?
|
||||||
tok = case
|
tok = case
|
||||||
when t = @ss.scan(COMPARISON_OPERATOR) then [:comparison, t]
|
when t = @ss.scan(COMPARISON_OPERATOR) then [:comparison, t]
|
||||||
|
|||||||
+10
-4
@@ -10,10 +10,16 @@ module Liquid
|
|||||||
# {{ user | link }}
|
# {{ user | link }}
|
||||||
#
|
#
|
||||||
class Variable
|
class Variable
|
||||||
|
FilterMarkupRegex = /#{FilterSeparator}\s*(.*)/om
|
||||||
FilterParser = /(?:\s+|#{QuotedFragment}|#{ArgumentSeparator})+/o
|
FilterParser = /(?:\s+|#{QuotedFragment}|#{ArgumentSeparator})+/o
|
||||||
|
FilterArgsRegex = /(?:#{FilterArgumentSeparator}|#{ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{QuotedFragment})/o
|
||||||
|
JustTagAttributes = /\A#{TagAttributes}\z/o
|
||||||
|
MarkupWithQuotedFragment = /(#{QuotedFragment})(.*)/om
|
||||||
|
|
||||||
attr_accessor :filters, :name, :line_number
|
attr_accessor :filters, :name, :line_number
|
||||||
attr_reader :parse_context
|
attr_reader :parse_context
|
||||||
alias_method :options, :parse_context
|
alias_method :options, :parse_context
|
||||||
|
|
||||||
include ParserSwitching
|
include ParserSwitching
|
||||||
|
|
||||||
def initialize(markup, parse_context)
|
def initialize(markup, parse_context)
|
||||||
@@ -35,17 +41,17 @@ module Liquid
|
|||||||
|
|
||||||
def lax_parse(markup)
|
def lax_parse(markup)
|
||||||
@filters = []
|
@filters = []
|
||||||
return unless markup =~ /(#{QuotedFragment})(.*)/om
|
return unless markup =~ MarkupWithQuotedFragment
|
||||||
|
|
||||||
name_markup = $1
|
name_markup = $1
|
||||||
filter_markup = $2
|
filter_markup = $2
|
||||||
@name = Expression.parse(name_markup)
|
@name = Expression.parse(name_markup)
|
||||||
if filter_markup =~ /#{FilterSeparator}\s*(.*)/om
|
if filter_markup =~ FilterMarkupRegex
|
||||||
filters = $1.scan(FilterParser)
|
filters = $1.scan(FilterParser)
|
||||||
filters.each do |f|
|
filters.each do |f|
|
||||||
next unless f =~ /\w+/
|
next unless f =~ /\w+/
|
||||||
filtername = Regexp.last_match(0)
|
filtername = Regexp.last_match(0)
|
||||||
filterargs = f.scan(/(?:#{FilterArgumentSeparator}|#{ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{QuotedFragment})/o).flatten
|
filterargs = f.scan(FilterArgsRegex).flatten
|
||||||
@filters << parse_filter_expressions(filtername, filterargs)
|
@filters << parse_filter_expressions(filtername, filterargs)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -91,7 +97,7 @@ module Liquid
|
|||||||
filter_args = []
|
filter_args = []
|
||||||
keyword_args = {}
|
keyword_args = {}
|
||||||
unparsed_args.each do |a|
|
unparsed_args.each do |a|
|
||||||
if matches = a.match(/\A#{TagAttributes}\z/o)
|
if matches = a.match(JustTagAttributes)
|
||||||
keyword_args[matches[1]] = Expression.parse(matches[2])
|
keyword_args[matches[1]] = Expression.parse(matches[2])
|
||||||
else
|
else
|
||||||
filter_args << Expression.parse(a)
|
filter_args << Expression.parse(a)
|
||||||
|
|||||||
Reference in New Issue
Block a user