mirror of
https://github.com/kemko/liquid.git
synced 2026-01-01 15:55:40 +03:00
The parse_context no longer needs to be passed in because it is available through through an attr_reader on the instance. However, the markup and tokenizer weren't made available. This refactor also makes the parameters given to Document#unknown_tag consistent with Block#unknown_tag.
65 lines
1.4 KiB
Ruby
65 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Liquid
|
|
class Document
|
|
def self.parse(tokens, parse_context)
|
|
doc = new(parse_context)
|
|
doc.parse(tokens, parse_context)
|
|
doc
|
|
end
|
|
|
|
attr_reader :parse_context, :body
|
|
|
|
def initialize(parse_context)
|
|
@parse_context = parse_context
|
|
@body = new_body
|
|
end
|
|
|
|
def nodelist
|
|
@body.nodelist
|
|
end
|
|
|
|
def parse(tokenizer, parse_context)
|
|
while parse_body(tokenizer)
|
|
end
|
|
rescue SyntaxError => e
|
|
e.line_number ||= parse_context.line_number
|
|
raise
|
|
end
|
|
|
|
def unknown_tag(tag, _markup, _tokenizer)
|
|
case tag
|
|
when 'else', 'end'
|
|
raise SyntaxError, parse_context.locale.t("errors.syntax.unexpected_outer_tag", tag: tag)
|
|
else
|
|
raise SyntaxError, parse_context.locale.t("errors.syntax.unknown_tag", tag: tag)
|
|
end
|
|
end
|
|
|
|
def render_to_output_buffer(context, output)
|
|
@body.render_to_output_buffer(context, output)
|
|
end
|
|
|
|
def render(context)
|
|
@body.render(context)
|
|
end
|
|
|
|
private
|
|
|
|
def new_body
|
|
parse_context.new_block_body
|
|
end
|
|
|
|
def parse_body(tokenizer)
|
|
@body.parse(tokenizer, parse_context) do |unknown_tag_name, unknown_tag_markup|
|
|
if unknown_tag_name
|
|
unknown_tag(unknown_tag_name, unknown_tag_markup, tokenizer)
|
|
true
|
|
else
|
|
false
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|