lib/liquid/block_body.rb in liquid-5.4.0 vs lib/liquid/block_body.rb in liquid-5.5.0
- old
+ new
@@ -4,10 +4,11 @@
module Liquid
class BlockBody
LiquidTagToken = /\A\s*(#{TagName})\s*(.*?)\z/o
FullToken = /\A#{TagStart}#{WhitespaceControl}?(\s*)(#{TagName})(\s*)(.*?)#{WhitespaceControl}?#{TagEnd}\z/om
+ FullTokenPossiblyInvalid = /\A(.*)#{TagStart}#{WhitespaceControl}?\s*(\w+)\s*(.*)?#{WhitespaceControl}?#{TagEnd}\z/om
ContentOfVariable = /\A#{VariableStart}#{WhitespaceControl}?(.*?)#{WhitespaceControl}?#{VariableEnd}\z/om
WhitespaceOrNothing = /\A\s*\z/
TAGSTART = "{%"
VARSTART = "{{"
@@ -43,10 +44,16 @@
# caller raise a syntax error
return yield token, token
end
tag_name = Regexp.last_match(1)
markup = Regexp.last_match(2)
+
+ if tag_name == 'liquid'
+ parse_context.line_number -= 1
+ next parse_liquid_tag(markup, parse_context)
+ end
+
unless (tag = registered_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
end
@@ -107,17 +114,25 @@
BlockBody.unknown_tag_in_liquid_tag(end_tag_name, parse_context)
end
end
end
- private def parse_for_document(tokenizer, parse_context)
+ private def handle_invalid_tag_token(token, parse_context)
+ if token.end_with?('%}')
+ yield token, token
+ else
+ BlockBody.raise_missing_tag_terminator(token, parse_context)
+ end
+ end
+
+ private def parse_for_document(tokenizer, parse_context, &block)
while (token = tokenizer.shift)
next if token.empty?
case
when token.start_with?(TAGSTART)
whitespace_handler(token, parse_context)
unless token =~ FullToken
- BlockBody.raise_missing_tag_terminator(token, parse_context)
+ return handle_invalid_tag_token(token, parse_context, &block)
end
tag_name = Regexp.last_match(2)
markup = Regexp.last_match(4)
if parse_context.line_number