lib/liquid/block_body.rb in liquid-4.0.0.rc2 vs lib/liquid/block_body.rb in liquid-4.0.0.rc3
- old
+ new
@@ -1,9 +1,9 @@
module Liquid
class BlockBody
- FullToken = /\A#{TagStart}\s*(\w+)\s*(.*)?#{TagEnd}\z/om
- ContentOfVariable = /\A#{VariableStart}(.*)#{VariableEnd}\z/om
+ FullToken = /\A#{TagStart}#{WhitespaceControl}?\s*(\w+)\s*(.*?)#{WhitespaceControl}?#{TagEnd}\z/om
+ ContentOfVariable = /\A#{VariableStart}#{WhitespaceControl}?(.*?)#{WhitespaceControl}?#{VariableEnd}\z/om
TAGSTART = "{%".freeze
VARSTART = "{{".freeze
attr_reader :nodelist
@@ -16,10 +16,11 @@
parse_context.line_number = tokenizer.line_number
while token = tokenizer.shift
unless token.empty?
case
when token.start_with?(TAGSTART)
+ whitespace_handler(token, parse_context)
if token =~ FullToken
tag_name = $1
markup = $2
# fetch the tag from registered blocks
if tag = registered_tags[tag_name]
@@ -33,20 +34,35 @@
end
else
raise_missing_tag_terminator(token, parse_context)
end
when token.start_with?(VARSTART)
+ whitespace_handler(token, parse_context)
@nodelist << create_variable(token, parse_context)
@blank = false
else
+ if parse_context.trim_whitespace
+ token.lstrip!
+ end
+ parse_context.trim_whitespace = false
@nodelist << token
@blank &&= !!(token =~ /\A\s*\z/)
end
end
parse_context.line_number = tokenizer.line_number
end
yield nil, nil
+ end
+
+ def whitespace_handler(token, parse_context)
+ if token[2] == WhitespaceControl
+ previous_token = @nodelist.last
+ if previous_token.is_a? String
+ previous_token.rstrip!
+ end
+ end
+ parse_context.trim_whitespace = (token[-3] == WhitespaceControl)
end
def blank?
@blank
end