mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-15 00:40:40 -07:00
This commit reverts the Inline Snippets tag (#2001) and bumps Liquid to 5.11. For now, the inclusion of Inline Snippets in the latest Liquid release is being treated as a bug. While #2001 does implement the scope contained in RFC#1916, we need to take a step back to make sure we’re setting our sights high enough with this feature, and that we’re truly supporting theme developers in the ways they need. If you have any feedback, please leave a comment on RFC#1916. - Liquid Developer Tools
93 lines
2.8 KiB
Ruby
93 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Liquid
|
|
class ParseContext
|
|
attr_accessor :locale, :line_number, :trim_whitespace, :depth
|
|
attr_reader :partial, :warnings, :error_mode, :environment
|
|
|
|
def initialize(options = Const::EMPTY_HASH)
|
|
@environment = options.fetch(:environment, Environment.default)
|
|
@template_options = options ? options.dup : {}
|
|
|
|
@locale = @template_options[:locale] ||= I18n.new
|
|
@warnings = []
|
|
|
|
# constructing new StringScanner in Lexer, Tokenizer, etc is expensive
|
|
# This StringScanner will be shared by all of them
|
|
@string_scanner = StringScanner.new("")
|
|
|
|
@expression_cache = if options[:expression_cache].nil?
|
|
{}
|
|
elsif options[:expression_cache].respond_to?(:[]) && options[:expression_cache].respond_to?(:[]=)
|
|
options[:expression_cache]
|
|
elsif options[:expression_cache]
|
|
{}
|
|
end
|
|
|
|
self.depth = 0
|
|
self.partial = false
|
|
end
|
|
|
|
def [](option_key)
|
|
@options[option_key]
|
|
end
|
|
|
|
def new_block_body
|
|
Liquid::BlockBody.new
|
|
end
|
|
|
|
def new_parser(input)
|
|
@string_scanner.string = input
|
|
Parser.new(@string_scanner)
|
|
end
|
|
|
|
def new_tokenizer(source, start_line_number: nil, for_liquid_tag: false)
|
|
Tokenizer.new(
|
|
source: source,
|
|
string_scanner: @string_scanner,
|
|
line_number: start_line_number,
|
|
for_liquid_tag: for_liquid_tag,
|
|
)
|
|
end
|
|
|
|
def safe_parse_expression(parser)
|
|
Expression.safe_parse(parser, @string_scanner, @expression_cache)
|
|
end
|
|
|
|
def parse_expression(markup, safe: false)
|
|
if !safe && @error_mode == :strict2
|
|
# parse_expression is a widely used API. To maintain backward
|
|
# compatibility while raising awareness about strict2 parser standards,
|
|
# the safe flag supports API users make a deliberate decision.
|
|
#
|
|
# In strict2 mode, markup MUST come from a string returned by the parser
|
|
# (e.g., parser.expression). We're not calling the parser here to
|
|
# prevent redundant parser overhead.
|
|
raise Liquid::InternalError, "unsafe parse_expression cannot be used in strict2 mode"
|
|
end
|
|
|
|
Expression.parse(markup, @string_scanner, @expression_cache)
|
|
end
|
|
|
|
def partial=(value)
|
|
@partial = value
|
|
@options = value ? partial_options : @template_options
|
|
|
|
@error_mode = @options[:error_mode] || @environment.error_mode
|
|
end
|
|
|
|
def partial_options
|
|
@partial_options ||= begin
|
|
dont_pass = @template_options[:include_options_blacklist]
|
|
if dont_pass == true
|
|
{ locale: locale }
|
|
elsif dont_pass.is_a?(Array)
|
|
@template_options.reject { |k, _v| dont_pass.include?(k) }
|
|
else
|
|
@template_options
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|